[6.0.0] taxi司机端重构初始化
@@ -41,6 +41,10 @@ android {
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
viewBinding {
|
||||
enabled = true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -55,6 +59,9 @@ dependencies {
|
||||
implementation rootProject.ext.dependencies.androidxconstraintlayout
|
||||
implementation rootProject.ext.dependencies.amapnavi3dmap
|
||||
|
||||
//koin
|
||||
// implementation "io.insert-koin:koin-android:3.3.1"
|
||||
|
||||
implementation project(":OCH:mogo-och-common-module")
|
||||
compileOnly project(":libraries:mogo-map")
|
||||
|
||||
|
||||
@@ -1,7 +1,31 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.content.DialogInterface
|
||||
import android.content.DialogInterface.OnShowListener
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wang ming jun
|
||||
* @date: 2023/7/24
|
||||
*/class AvoidLeakDialog {
|
||||
}
|
||||
*/
|
||||
open class AvoidLeakDialog : Dialog {
|
||||
private var hostFragmentReference: WeakReference<DialogFragment?>? = null
|
||||
fun setHostFragmentReference(hostFragment: DialogFragment?) {
|
||||
hostFragmentReference = WeakReference(hostFragment)
|
||||
}
|
||||
|
||||
constructor(context: Context) : super(context) {}
|
||||
|
||||
override fun setOnCancelListener(listener: DialogInterface.OnCancelListener?) {}
|
||||
override fun setOnDismissListener(listener: DialogInterface.OnDismissListener?) {}
|
||||
override fun setOnShowListener(listener: OnShowListener?) {}
|
||||
override fun dismiss() {
|
||||
super.dismiss()
|
||||
if (null != hostFragmentReference && null != hostFragmentReference!!.get()) {
|
||||
hostFragmentReference!!.get()!!.dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.mogo.commons.mvp.BaseFragment
|
||||
|
||||
abstract class BaseBindingFragment<VB : ViewBinding>(
|
||||
val block: (LayoutInflater) -> VB
|
||||
) : BaseFragment() {
|
||||
private var _binding: VB? = null
|
||||
protected val binding: VB
|
||||
get() = requireNotNull(_binding) { "The property of binding has been destroyed." }
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||
): View? {
|
||||
_binding = block(layoutInflater)
|
||||
return binding.root
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
_binding = null
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,612 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import android.animation.ObjectAnimator
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.os.SystemClock
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.animation.LinearInterpolator
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.RelativeLayout
|
||||
import android.widget.TextView
|
||||
import androidx.constraintlayout.widget.Group
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import com.mogo.commons.mvp.IView
|
||||
import com.mogo.commons.mvp.MvpFragment
|
||||
import com.mogo.commons.mvp.Presenter
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
|
||||
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.initBadCase
|
||||
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showToolsView
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
|
||||
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView
|
||||
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView
|
||||
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView
|
||||
import com.mogo.eagle.core.function.smp.view.SmallMapView
|
||||
import com.mogo.eagle.core.function.view.MapBizView
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener
|
||||
import com.mogo.eagle.core.utilcode.util.ToastUtils
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.mogo.map.listener.IMogoMapListener
|
||||
import com.mogo.map.uicontroller.VisualAngleMode
|
||||
import com.mogo.och.common.module.utils.AnimatorDrawableUtil
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.constant.TaxiConst
|
||||
import com.mogo.och.taxi.ui.TaxiAmapNaviFragment
|
||||
import com.mogo.och.taxi.ui.TaxiRottingNaviFragment
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class BaseTaxiTabFragment {
|
||||
*/
|
||||
abstract class BaseTaxiTabFragment<V: IView, P: Presenter<V>> : MvpFragment<V, P>(),
|
||||
IMogoMapListener,IMoGoAutopilotRecordListener {
|
||||
|
||||
private val TAG = "BaseOchFragment"
|
||||
private var ctvAutopilotStatusRL: RelativeLayout? = null
|
||||
private var mAnimFlowIv: ImageView? = null
|
||||
protected var tvOperationStatus: TextView? = null
|
||||
protected var mDriverRole: TextView? = null
|
||||
private var flStationPanelContainer: FrameLayout? = null
|
||||
private var flNaviPanelContainer: FrameLayout? = null
|
||||
private var mapBizView: MapBizView? = null
|
||||
private var groupTestPanel: Group? = null
|
||||
private var mSpeedView: TextView? = null
|
||||
private var mAutopilotImage: ImageView? = null
|
||||
private var mAutopilotTv: TextView? = null
|
||||
private var mMapswitchBtn: LinearLayout? = null
|
||||
private var mSwitchBtnIcon: ImageView? = null
|
||||
private var mCloseNaviIcon: ImageView? = null
|
||||
private var mSettingBtn: RelativeLayout? = null
|
||||
private var mBadcaseBtn: LinearLayout? = null
|
||||
|
||||
//消息盒子
|
||||
private var driverMsgBoxButtonView: DriverMsgBoxButtonView? = null
|
||||
protected var viewDriverMsgBoxList: DriverMsgBoxListView? = null
|
||||
protected var viewDriverMsgBoxBubble: DriverMsgBoxBubbleView? = null
|
||||
|
||||
private var ochAmapNaviFragment: TaxiAmapNaviFragment? = null
|
||||
private var taxiRottingNaviFragment: TaxiRottingNaviFragment? = null
|
||||
// protected TaxiTrafficLightView mTrafficLightView;
|
||||
|
||||
// protected TaxiTrafficLightView mTrafficLightView;
|
||||
private var smallMapView: SmallMapView? = null
|
||||
|
||||
private val mHandler = Handler(Looper.getMainLooper())
|
||||
|
||||
private val startAutopilotDrawableIds = arrayOf(
|
||||
R.drawable.anim_flow_00000, R.drawable.anim_flow_00001, R.drawable.anim_flow_00002,
|
||||
R.drawable.anim_flow_00003, R.drawable.anim_flow_00004, R.drawable.anim_flow_00005,
|
||||
R.drawable.anim_flow_00006, R.drawable.anim_flow_00007, R.drawable.anim_flow_00008,
|
||||
R.drawable.anim_flow_00009, R.drawable.anim_flow_00010, R.drawable.anim_flow_00011,
|
||||
R.drawable.anim_flow_00012, R.drawable.anim_flow_00013, R.drawable.anim_flow_00014,
|
||||
R.drawable.anim_flow_00015, R.drawable.anim_flow_00016, R.drawable.anim_flow_00017,
|
||||
R.drawable.anim_flow_00018, R.drawable.anim_flow_00019, R.drawable.anim_flow_00020,
|
||||
R.drawable.anim_flow_00021, R.drawable.anim_flow_00022, R.drawable.anim_flow_00023,
|
||||
R.drawable.anim_flow_00024, R.drawable.anim_flow_00025, R.drawable.anim_flow_00026,
|
||||
R.drawable.anim_flow_00027, R.drawable.anim_flow_00028, R.drawable.anim_flow_00029,
|
||||
R.drawable.anim_flow_00030, R.drawable.anim_flow_00031, R.drawable.anim_flow_00032,
|
||||
R.drawable.anim_flow_00033, R.drawable.anim_flow_00034, R.drawable.anim_flow_00035,
|
||||
R.drawable.anim_flow_00036, R.drawable.anim_flow_00037, R.drawable.anim_flow_00038,
|
||||
R.drawable.anim_flow_00039, R.drawable.anim_flow_00040, R.drawable.anim_flow_00041,
|
||||
R.drawable.anim_flow_00042, R.drawable.anim_flow_00043, R.drawable.anim_flow_00044,
|
||||
R.drawable.anim_flow_00045, R.drawable.anim_flow_00046, R.drawable.anim_flow_00047,
|
||||
R.drawable.anim_flow_00048, R.drawable.anim_flow_00049, R.drawable.anim_flow_00050,
|
||||
R.drawable.anim_flow_00051, R.drawable.anim_flow_00052, R.drawable.anim_flow_00053,
|
||||
R.drawable.anim_flow_00054, R.drawable.anim_flow_00055, R.drawable.anim_flow_00056,
|
||||
R.drawable.anim_flow_00057, R.drawable.anim_flow_00058, R.drawable.anim_flow_00059
|
||||
)
|
||||
|
||||
private val startManCODrawableIds = arrayOf(
|
||||
R.drawable.anim_flow_man_co_00000, R.drawable.anim_flow_man_co_00001,
|
||||
R.drawable.anim_flow_man_co_00002, R.drawable.anim_flow_man_co_00003,
|
||||
R.drawable.anim_flow_man_co_00004, R.drawable.anim_flow_man_co_00005,
|
||||
R.drawable.anim_flow_man_co_00006, R.drawable.anim_flow_man_co_00007,
|
||||
R.drawable.anim_flow_man_co_00008, R.drawable.anim_flow_man_co_00009,
|
||||
R.drawable.anim_flow_man_co_00010, R.drawable.anim_flow_man_co_00011,
|
||||
R.drawable.anim_flow_man_co_00012, R.drawable.anim_flow_man_co_00013,
|
||||
R.drawable.anim_flow_man_co_00014, R.drawable.anim_flow_man_co_00015,
|
||||
R.drawable.anim_flow_man_co_00016, R.drawable.anim_flow_man_co_00017,
|
||||
R.drawable.anim_flow_man_co_00018, R.drawable.anim_flow_man_co_00019,
|
||||
R.drawable.anim_flow_man_co_00020, R.drawable.anim_flow_man_co_00021,
|
||||
R.drawable.anim_flow_man_co_00022, R.drawable.anim_flow_man_co_00023,
|
||||
R.drawable.anim_flow_man_co_00024, R.drawable.anim_flow_man_co_00025,
|
||||
R.drawable.anim_flow_man_co_00026, R.drawable.anim_flow_man_co_00027,
|
||||
R.drawable.anim_flow_man_co_00028, R.drawable.anim_flow_man_co_00029,
|
||||
R.drawable.anim_flow_man_co_00030, R.drawable.anim_flow_man_co_00031,
|
||||
R.drawable.anim_flow_man_co_00032, R.drawable.anim_flow_man_co_00033,
|
||||
R.drawable.anim_flow_man_co_00034, R.drawable.anim_flow_man_co_00035,
|
||||
R.drawable.anim_flow_man_co_00036, R.drawable.anim_flow_man_co_00037,
|
||||
R.drawable.anim_flow_man_co_00038, R.drawable.anim_flow_man_co_00039,
|
||||
R.drawable.anim_flow_man_co_00040, R.drawable.anim_flow_man_co_00041,
|
||||
R.drawable.anim_flow_man_co_00042, R.drawable.anim_flow_man_co_00043,
|
||||
R.drawable.anim_flow_man_co_00044, R.drawable.anim_flow_man_co_00045,
|
||||
R.drawable.anim_flow_man_co_00046, R.drawable.anim_flow_man_co_00047,
|
||||
R.drawable.anim_flow_man_co_00048, R.drawable.anim_flow_man_co_00049,
|
||||
R.drawable.anim_flow_man_co_00050, R.drawable.anim_flow_man_co_00051,
|
||||
R.drawable.anim_flow_man_co_00052, R.drawable.anim_flow_man_co_00053,
|
||||
R.drawable.anim_flow_man_co_00054, R.drawable.anim_flow_man_co_00055,
|
||||
R.drawable.anim_flow_man_co_00056, R.drawable.anim_flow_man_co_00057,
|
||||
R.drawable.anim_flow_man_co_00058, R.drawable.anim_flow_man_co_00059
|
||||
)
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.taxi_base_fragment
|
||||
}
|
||||
|
||||
private var panelView: View? = null
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
override fun initViews() {
|
||||
mapBizView = findViewById(R.id.mapBizView)
|
||||
groupTestPanel = findViewById(R.id.groupTestPanel)
|
||||
ctvAutopilotStatusRL = findViewById(R.id.module_mogo_och_autopilot_status)
|
||||
ctvAutopilotStatusRL!!.background =
|
||||
resources.getDrawable(R.drawable.taxi_autopilot_bg_selector,null)
|
||||
updateCtvAutopilotStatusTag(false)
|
||||
mAutopilotImage = findViewById(R.id.module_och_autopilot_iv)
|
||||
mAnimFlowIv = findViewById(R.id.anim_flow_iv)
|
||||
mAutopilotTv = findViewById(R.id.module_och_autopilot_tv)
|
||||
flStationPanelContainer =
|
||||
findViewById(R.id.module_mogo_och_station_panel_container)
|
||||
driverMsgBoxButtonView = findViewById(R.id.viewDriverMsgBoxButton)
|
||||
viewDriverMsgBoxList = findViewById(R.id.viewDriverMsgBoxList)
|
||||
viewDriverMsgBoxBubble = findViewById(R.id.viewDriverMsgBoxBubble)
|
||||
mSpeedView = findViewById(R.id.module_mogo_och_speed_tv)
|
||||
mCloseNaviIcon = findViewById(R.id.taxi_close_navi_icon)
|
||||
flNaviPanelContainer = findViewById(R.id.module_mogo_och_navi_panel_container)
|
||||
mSpeedView!!.isLongClickable = true //调试按钮任意模式下都开
|
||||
tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status)
|
||||
mDriverRole = findViewById(R.id.taxi_driver_role_tv)
|
||||
mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_layout)
|
||||
mSwitchBtnIcon = findViewById(R.id.taxi_switch_icon)
|
||||
updateSwitchMapIcon()
|
||||
mMapswitchBtn!!.setOnClickListener {
|
||||
//视角切换
|
||||
val start = SystemClock.elapsedRealtime()
|
||||
try {
|
||||
val controller = getMapUIController()
|
||||
if (controller != null) {
|
||||
//切换地图的远近视图
|
||||
if (controller.currentMapVisualAngle.isLongSight) {
|
||||
getMapUIController()?.setLockMode(true)
|
||||
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null)
|
||||
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
|
||||
} else if (controller.currentMapVisualAngle.isMediumSight) {
|
||||
getMapUIController()?.setLockMode(false)
|
||||
controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null)
|
||||
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_long)
|
||||
} else {
|
||||
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"cost:" + (SystemClock.elapsedRealtime() - start)
|
||||
)
|
||||
}
|
||||
}
|
||||
mSettingBtn = findViewById(R.id.module_och_taxi_setting_layout)
|
||||
mSettingBtn!!.setOnClickListener {
|
||||
showToolsView()
|
||||
}
|
||||
|
||||
// mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
|
||||
mBadcaseBtn = findViewById(R.id.module_och_taxi_badcase_ll)
|
||||
if (mBadcaseBtn != null) {
|
||||
initBadCase(mBadcaseBtn!!)
|
||||
CallerAutopilotRecordListenerManager.addListener(TAG, this)
|
||||
}
|
||||
panelView = LayoutInflater.from(context)
|
||||
.inflate(getStationPanelViewId(), flStationPanelContainer)
|
||||
ctvAutopilotStatusRL!!.setOnClickListener(object : OnPreventFastClickListener() {
|
||||
override fun onClickImpl(v: View) {
|
||||
// 如果能自动驾驶,就自动驾驶,不能就提示
|
||||
if (getState() ==
|
||||
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
|
||||
) {
|
||||
return //远程代驾状态下不可开启自动驾驶,只能等远程代驾主动退出
|
||||
} else if (!(ctvAutopilotStatusRL!!.tag as Boolean)) {
|
||||
ToastUtils.showShort(resources.getString(R.string.module_och_taxi_auto_disable_tip1))
|
||||
} else {
|
||||
startAutopilot()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// debug下调用测试面板 长按速度值 任意模式下调试都打开
|
||||
// if (DebugConfig.isDebug()) {
|
||||
mSpeedView!!.setOnLongClickListener {
|
||||
if (groupTestPanel!!.visibility == View.VISIBLE) {
|
||||
groupTestPanel!!.visibility = View.GONE
|
||||
} else {
|
||||
groupTestPanel!!.visibility = View.VISIBLE
|
||||
}
|
||||
false
|
||||
}
|
||||
// }
|
||||
onAutopilotStatusChanged(getState())
|
||||
|
||||
// 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
|
||||
findViewById<View>(R.id.btnAutopilotDisable)?.setOnClickListener {
|
||||
onAutopilotStatusChanged(
|
||||
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
|
||||
)
|
||||
}
|
||||
|
||||
// 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
|
||||
findViewById<View>(R.id.btnAutopilotEnable)?.setOnClickListener {
|
||||
onAutopilotStatusChanged(
|
||||
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE
|
||||
)
|
||||
}
|
||||
|
||||
// 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
|
||||
findViewById<View>(R.id.btnAutopilotRunning)?.setOnClickListener {
|
||||
onAutopilotStatusChanged(
|
||||
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.btnAutopilotmanco)?.setOnClickListener {
|
||||
onAutopilotStatusChanged(
|
||||
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
|
||||
)
|
||||
}
|
||||
tvOperationStatus!!.setOnClickListener { onChangeOperationStatus() }
|
||||
mCloseNaviIcon!!.setOnClickListener {
|
||||
showAmapNaviToStationFragment(false)
|
||||
showRottingToStationFragment(false)
|
||||
}
|
||||
driverMsgBoxButtonView!!.setClickListener(object : DriverMsgBoxButtonView.ClickListener {
|
||||
override fun showMsgBoxList(show: Boolean) {
|
||||
if (show) {
|
||||
viewDriverMsgBoxList!!.visibility = View.VISIBLE
|
||||
viewDriverMsgBoxList!!.notifyData()
|
||||
viewDriverMsgBoxBubble!!.visibility = View.GONE
|
||||
viewDriverMsgBoxBubble!!.isShowData(false)
|
||||
} else {
|
||||
viewDriverMsgBoxList!!.visibility = View.GONE
|
||||
viewDriverMsgBoxBubble!!.visibility = View.VISIBLE
|
||||
viewDriverMsgBoxBubble!!.isShowData(true)
|
||||
}
|
||||
}
|
||||
})
|
||||
smallMapView = findViewById(R.id.smallMapView)
|
||||
}
|
||||
|
||||
override fun initViews(savedInstanceState: Bundle?) {
|
||||
super.initViews(savedInstanceState)
|
||||
mapBizView!!.onCreate(savedInstanceState)
|
||||
smallMapView!!.onCreateView(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
mapBizView!!.onResume()
|
||||
smallMapView!!.onResume()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
mapBizView!!.onPause()
|
||||
smallMapView!!.onPause()
|
||||
}
|
||||
|
||||
protected open fun onChangeOperationStatus() {}
|
||||
|
||||
private fun updateSwitchMapIcon() {
|
||||
val controller = getMapUIController()
|
||||
if (controller != null) {
|
||||
if (controller.currentMapVisualAngle.isLongSight) {
|
||||
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_long)
|
||||
} else if (controller.currentMapVisualAngle.isMediumSight) {
|
||||
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
|
||||
} else {
|
||||
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onLowMemory() {
|
||||
super.onLowMemory()
|
||||
mapBizView!!.onLowMemory()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
mapBizView!!.onSaveInstanceState(outState)
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
mapBizView!!.onDestroy()
|
||||
super.onDestroyView()
|
||||
CallerAutopilotRecordListenerManager.removeListener(TAG)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
smallMapView!!.onDestroy()
|
||||
}
|
||||
|
||||
private var mPrevAPStatus = -1
|
||||
|
||||
/**
|
||||
* 改变自动驾驶状态
|
||||
*
|
||||
* @param status 2 - running 1 - enable 2 - disable
|
||||
*/
|
||||
fun onAutopilotStatusChanged(status: Int) {
|
||||
activity?.runOnUiThread(Runnable runOnUiThread@{
|
||||
if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) {
|
||||
// 1. 主动开启自动驾驶中,不为2(为0、1)则继续loading
|
||||
return@runOnUiThread
|
||||
}
|
||||
if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status && mPrevAPStatus != status
|
||||
) {
|
||||
// 2. 主动开启自动驾驶中,为2则停止loading,并isStarting = false
|
||||
startAutopilotDone(true)
|
||||
return@runOnUiThread
|
||||
}
|
||||
// 3. 其他过程直接更新
|
||||
startOrStopLoadingAnim(false)
|
||||
autopilotStatusAnimchanged(status)
|
||||
mPrevAPStatus = status
|
||||
})
|
||||
}
|
||||
|
||||
fun stopAnimAndUpdateBtnStatus() {
|
||||
startOrStopLoadingAnim(false)
|
||||
startAutopilotDone(false)
|
||||
}
|
||||
|
||||
fun onManMachineCoDriving(manMachineCoDriving: Int) {
|
||||
if (mPrevAPStatus != manMachineCoDriving) {
|
||||
autopilotStatusAnimchanged(manMachineCoDriving)
|
||||
}
|
||||
mPrevAPStatus = manMachineCoDriving
|
||||
}
|
||||
|
||||
fun updateCtvAutopilotStatusTag(tag: Boolean) {
|
||||
ctvAutopilotStatusRL!!.tag = tag
|
||||
}
|
||||
|
||||
private var animatorDrawableUtil: AnimatorDrawableUtil? = null
|
||||
|
||||
private fun autopilotStatusAnimchanged(status: Int) {
|
||||
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
|
||||
mAutopilotTv!!.text = "自动驾驶"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot)
|
||||
if (animatorDrawableUtil == null) {
|
||||
animatorDrawableUtil = AnimatorDrawableUtil()
|
||||
}
|
||||
animatorDrawableUtil!!.setAnimation(
|
||||
mAnimFlowIv,
|
||||
listOf(*startAutopilotDrawableIds)
|
||||
)
|
||||
animatorDrawableUtil!!.start(true, 100, null)
|
||||
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
|
||||
mAutopilotTv!!.text = "自动驾驶"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot)
|
||||
if (animatorDrawableUtil != null) {
|
||||
animatorDrawableUtil!!.stop()
|
||||
mAnimFlowIv!!.setImageResource(0)
|
||||
}
|
||||
animatorDrawableUtil = null
|
||||
} else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == status) {
|
||||
mAutopilotTv!!.text = "远程代驾"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot)
|
||||
if (animatorDrawableUtil == null) {
|
||||
animatorDrawableUtil = AnimatorDrawableUtil()
|
||||
}
|
||||
animatorDrawableUtil!!.setAnimation(mAnimFlowIv, listOf(*startManCODrawableIds))
|
||||
animatorDrawableUtil!!.start(true, 100, null)
|
||||
} else {
|
||||
mAutopilotTv!!.text = "自动驾驶"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_disable,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_disable)
|
||||
if (animatorDrawableUtil != null) {
|
||||
animatorDrawableUtil!!.stop()
|
||||
mAnimFlowIv!!.setImageResource(0)
|
||||
}
|
||||
|
||||
animatorDrawableUtil = null
|
||||
}
|
||||
}
|
||||
|
||||
private fun startAutopilotDone(success: Boolean) {
|
||||
if (autopilotLoadingAnimator != null) {
|
||||
autopilotLoadingAnimator!!.end()
|
||||
mAutopilotImage!!.clearAnimation()
|
||||
autopilotLoadingAnimator = null
|
||||
}
|
||||
if (success) {
|
||||
mAutopilotTv!!.text = "成功"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_success)
|
||||
} else {
|
||||
mAutopilotTv!!.text = "失败"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_failed)
|
||||
}
|
||||
mHandler.postDelayed({
|
||||
startOrStopLoadingAnim(false)
|
||||
onAutopilotStatusChanged(getState())
|
||||
}, 1000L)
|
||||
}
|
||||
|
||||
var isStarting = false
|
||||
private var autopilotLoadingAnimator: ObjectAnimator? = null
|
||||
|
||||
@SuppressLint("ObjectAnimatorBinding")
|
||||
fun startOrStopLoadingAnim(start: Boolean) {
|
||||
if (start) {
|
||||
isStarting = true
|
||||
mAutopilotTv!!.text = "启动中"
|
||||
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
|
||||
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_loading)
|
||||
if (autopilotLoadingAnimator == null) {
|
||||
autopilotLoadingAnimator = ObjectAnimator.ofFloat(
|
||||
mAutopilotImage,
|
||||
"rotation", 0f, 360f
|
||||
)
|
||||
}
|
||||
autopilotLoadingAnimator!!.interpolator = LinearInterpolator()
|
||||
autopilotLoadingAnimator!!.repeatCount = -1 //无限循环
|
||||
autopilotLoadingAnimator!!.startDelay = 100
|
||||
autopilotLoadingAnimator!!.duration = 1000 //设置持续时间
|
||||
autopilotLoadingAnimator!!.start() //动画开始
|
||||
startingAutoApilotCountDown()
|
||||
} else {
|
||||
isStarting = false
|
||||
if (autopilotLoadingAnimator != null) {
|
||||
autopilotLoadingAnimator!!.end()
|
||||
mAutopilotImage!!.clearAnimation()
|
||||
autopilotLoadingAnimator = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun startingAutoApilotCountDown() {
|
||||
UiThreadHandler.postDelayed({
|
||||
//未启动成功10s后做处理
|
||||
if (isStarting) { //判断动画是否在进行
|
||||
//并且根据状态来设置自动驾驶启动成功还是失败
|
||||
if (getState()
|
||||
== IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
|
||||
) {
|
||||
startAutopilotDone(true)
|
||||
} else {
|
||||
startAutopilotDone(false)
|
||||
}
|
||||
}
|
||||
}, TaxiConst.TIMER_START_AUTOPILOT_INTERVAL)
|
||||
}
|
||||
|
||||
fun hidPanel() {
|
||||
activity?.runOnUiThread { flStationPanelContainer!!.visibility = View.GONE }
|
||||
}
|
||||
|
||||
fun showPanel() {
|
||||
activity?.runOnUiThread {
|
||||
flStationPanelContainer!!.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
fun getPanelView(): View? {
|
||||
return panelView
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取站点面板view,在[.initViews]时候添加到container中
|
||||
*
|
||||
* @return 站点面板view
|
||||
*/
|
||||
abstract fun getStationPanelViewId(): Int
|
||||
|
||||
/**
|
||||
* 重新开启自动驾驶
|
||||
*/
|
||||
abstract fun startAutopilot()
|
||||
|
||||
|
||||
fun changeOperationViewVisible(visible: Int) {
|
||||
activity?.runOnUiThread(Runnable runOnUiThread@{
|
||||
if (tvOperationStatus == null) {
|
||||
return@runOnUiThread
|
||||
}
|
||||
tvOperationStatus!!.visibility = visible
|
||||
})
|
||||
}
|
||||
|
||||
fun updateSpeedView(newSpeed: Float) {
|
||||
val speed = (Math.abs(newSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值
|
||||
mSpeedView!!.text = speed.toString()
|
||||
}
|
||||
|
||||
override fun onMapVisualAngleChanged(visualAngleMode: VisualAngleMode?) {
|
||||
//todo ui 切换
|
||||
}
|
||||
|
||||
fun showAmapNaviToStationFragment(isShow: Boolean) {
|
||||
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
|
||||
closeAmapViewIFHadeAdd()
|
||||
if (isShow) {
|
||||
closeRouteViewIFHadeAdd()
|
||||
// if (ochNaviFragment == null){
|
||||
ochAmapNaviFragment = TaxiAmapNaviFragment.newInstance()
|
||||
// }
|
||||
if (ochAmapNaviFragment!!.isAdded) {
|
||||
return
|
||||
}
|
||||
transaction.add(R.id.module_mogo_och_navi_panel_container, ochAmapNaviFragment!!)
|
||||
.show(ochAmapNaviFragment!!)
|
||||
transaction.commitAllowingStateLoss()
|
||||
mCloseNaviIcon!!.visibility = View.VISIBLE
|
||||
flNaviPanelContainer!!.visibility = View.VISIBLE
|
||||
smallMapView!!.visibility = View.GONE
|
||||
} else {
|
||||
mCloseNaviIcon!!.visibility = View.GONE
|
||||
flNaviPanelContainer!!.visibility = View.GONE
|
||||
smallMapView!!.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
private fun closeAmapViewIFHadeAdd() {
|
||||
if (ochAmapNaviFragment != null) {
|
||||
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
|
||||
ochAmapNaviFragment!!.onDestroy()
|
||||
transaction.remove(ochAmapNaviFragment!!)
|
||||
transaction.commitAllowingStateLoss()
|
||||
ochAmapNaviFragment = null
|
||||
}
|
||||
}
|
||||
|
||||
private fun closeRouteViewIFHadeAdd() {
|
||||
if (taxiRottingNaviFragment != null) {
|
||||
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
|
||||
taxiRottingNaviFragment!!.onDestroy()
|
||||
transaction.remove(taxiRottingNaviFragment!!)
|
||||
transaction.commitAllowingStateLoss()
|
||||
taxiRottingNaviFragment = null
|
||||
}
|
||||
}
|
||||
|
||||
fun showRottingToStationFragment(isShow: Boolean) {
|
||||
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
|
||||
if (isShow) {
|
||||
closeAmapViewIFHadeAdd()
|
||||
// if (ochNaviFragment == null){
|
||||
taxiRottingNaviFragment = TaxiRottingNaviFragment.newInstance()
|
||||
// }
|
||||
if (taxiRottingNaviFragment!!.isAdded) {
|
||||
return
|
||||
}
|
||||
transaction.add(R.id.module_mogo_och_navi_panel_container, taxiRottingNaviFragment!!)
|
||||
.show(taxiRottingNaviFragment!!)
|
||||
transaction.commitAllowingStateLoss()
|
||||
mCloseNaviIcon!!.visibility = View.VISIBLE
|
||||
flNaviPanelContainer!!.visibility = View.VISIBLE
|
||||
smallMapView!!.visibility = View.GONE
|
||||
} else {
|
||||
closeRouteViewIFHadeAdd()
|
||||
mCloseNaviIcon!!.visibility = View.GONE
|
||||
flNaviPanelContainer!!.visibility = View.GONE
|
||||
smallMapView!!.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
abstract fun startNaviToEndStation(isShow: Boolean)
|
||||
}
|
||||
@@ -1,7 +1,43 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class BaseTaxiUIFragment {
|
||||
*/
|
||||
abstract class BaseTaxiUIFragment : Fragment() {
|
||||
private var mRootView: View? = null
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
if (mRootView == null) {
|
||||
mRootView = inflater.inflate(getLayoutId(), container, false)
|
||||
} else {
|
||||
val viewGroup = mRootView!!.parent as ViewGroup
|
||||
viewGroup?.removeView(mRootView)
|
||||
}
|
||||
mRootView?.let { initViews(it) }
|
||||
initViews(savedInstanceState)
|
||||
return mRootView
|
||||
}
|
||||
|
||||
/**
|
||||
* 布局资源
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected abstract fun getLayoutId(): Int
|
||||
protected abstract fun initViews(view: View)
|
||||
protected open fun initViews(savedInstanceState: Bundle?) {}
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
mRootView = null
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.fragment.app.Fragment
|
||||
|
||||
abstract class BaseUiFragment : Fragment() {
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
initView(view, savedInstanceState)
|
||||
initData(savedInstanceState)
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
}
|
||||
|
||||
abstract fun initView(view: View, savedInstanceState: Bundle?)
|
||||
abstract fun initData(savedInstanceState: Bundle?)
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.mogo.och.taxi.base
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.flow.receiveAsFlow
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/21
|
||||
*/
|
||||
abstract class BaseViewModel<UiState : IUiState, UiIntent : IUiIntent> : ViewModel() {
|
||||
|
||||
private val _uiStateFlow = MutableStateFlow(initUiState())
|
||||
val uiStateFlow: StateFlow<UiState> = _uiStateFlow
|
||||
|
||||
protected abstract fun initUiState(): UiState
|
||||
|
||||
protected fun sendUiState(copy: UiState.() -> UiState){
|
||||
_uiStateFlow.update { copy(_uiStateFlow.value) }
|
||||
}
|
||||
|
||||
private val _uiIntentFlow: Channel<UiIntent> = Channel()
|
||||
val uiIntentFlow: Flow<UiIntent> = _uiIntentFlow.receiveAsFlow()
|
||||
|
||||
fun sendUiIntent(uiIntent: UiIntent){
|
||||
viewModelScope.launch {
|
||||
_uiIntentFlow.send(uiIntent)
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
uiIntentFlow.collect {
|
||||
handleIntent(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract fun handleIntent(intent: IUiIntent)
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.mogo.och.taxi.base
|
||||
import androidx.annotation.Keep
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/20
|
||||
*/
|
||||
|
||||
@Keep
|
||||
interface IUiState
|
||||
|
||||
@Keep
|
||||
interface IUiIntent
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.mogo.och.taxi.bean
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
data class OrderDetail(var orderId: Long)
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.mogo.och.taxi.bean
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
data class TaskDetail(var taskId: Int)
|
||||
@@ -13,39 +13,10 @@ import java.util.List;
|
||||
* Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
|
||||
*/
|
||||
public interface ITaxiOrderStatusCallback {
|
||||
// 进行中单变更:暂未用到
|
||||
void onOrdersInServiceChanged(@NonNull List<OrderQueryRespBean.Result> inServiceList);
|
||||
// 待服务单变更
|
||||
void onOrdersWaitServiceChanged(@NonNull List<OrderQueryRespBean.Result> waitServiceList);
|
||||
|
||||
// 当前进行单状态变更:新到进行中订单、进行中单状态变更
|
||||
void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
|
||||
// 当前订单取消完成:用于司机主动取消订单的结果反馈
|
||||
void onCurrentOrderCancelDone();
|
||||
// 待服务单被取消
|
||||
void onOrderCancelDone(String orderNo);
|
||||
// 当前订单route信息查询反馈
|
||||
void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
|
||||
// 当前位置距离上车点的距离(米)、预估时间(秒)
|
||||
void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
|
||||
// 当前位置距离上车点的距离(米)、预估时间(秒)
|
||||
void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
|
||||
|
||||
// 新到预约单
|
||||
void onNewBookingOrderGot(OrderQueryRespBean.Result order);
|
||||
|
||||
// 执行抢单动作完成:可进入抢单中状态
|
||||
void onGrabOrderExecuteDone();
|
||||
|
||||
// 抢到预约单
|
||||
void onGrabOrderSuccess(OrderQueryRespBean.Result order);
|
||||
|
||||
// 未抢到预约单
|
||||
void onGrabOrderFailed(OrderQueryRespBean.Result order);
|
||||
|
||||
// 司机已确认开启自动驾驶环境
|
||||
void onDriverHasCheckedPilotCondition(boolean isSafe);
|
||||
|
||||
/**
|
||||
* 导航到目的地
|
||||
* @param isAmap 是否是高德导航
|
||||
|
||||
@@ -61,69 +61,6 @@ public class TaxiModelLoopManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void startNewBookingOrderLoop() {
|
||||
if (mNewBookingOrderDisposable != null && !mNewBookingOrderDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "startNewBookingOrderLoop()");
|
||||
mNewBookingOrderDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
|
||||
TaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> TaxiModel.getInstance().queryNewBookingOrder());
|
||||
}
|
||||
|
||||
public void stopNewBookingOrderLoop() {
|
||||
if (mNewBookingOrderDisposable != null) {
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopNewBookingOrderLoop()");
|
||||
mNewBookingOrderDisposable.dispose();
|
||||
mNewBookingOrderDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startGrabResultLoop() {
|
||||
if (mGrabResultDisposable != null && !mGrabResultDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "startGrabResultLoop()");
|
||||
mGrabResultDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
|
||||
TaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> TaxiModel.getInstance().queryOrderGrabStatus());
|
||||
}
|
||||
|
||||
public void stopGrabResultLoop() {
|
||||
if (mGrabResultDisposable != null) {
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopGrabResultLoop()");
|
||||
mGrabResultDisposable.dispose();
|
||||
mGrabResultDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startHeartbeatLoop() {
|
||||
if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "startHeartbeatLoop()");
|
||||
mHeartbeatDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
|
||||
TaxiConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> TaxiModel.getInstance().runCarHeartbeat());
|
||||
}
|
||||
|
||||
public void stopHeartbeatLoop() {
|
||||
if (mHeartbeatDisposable != null) {
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopHeartbeatLoop()");
|
||||
mHeartbeatDisposable.dispose();
|
||||
mHeartbeatDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startCalculateRouteInfoLoop() {
|
||||
|
||||
CallerLogger.INSTANCE.i(M_TAXI + TAG, "startCalculateRouteInfoLoop()");
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.mogo.och.taxi.model
|
||||
|
||||
import com.mogo.och.taxi.base.BaseViewModel
|
||||
import com.mogo.och.taxi.base.IUiIntent
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean
|
||||
import com.mogo.och.taxi.ui.unmanned.UnmannedIntent
|
||||
import com.mogo.och.taxi.ui.unmanned.UnmannedState
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
object TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
|
||||
|
||||
private var mCurrentOrder:OrderQueryRespBean.Result? = null
|
||||
|
||||
override fun initUiState(): UnmannedState {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun handleIntent(intent: IUiIntent) {
|
||||
when(intent) {
|
||||
UnmannedIntent.GetCurrentTask -> {
|
||||
|
||||
}
|
||||
is UnmannedIntent.GetNextTask -> {
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.GetReceivingOrderState -> {
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.GetVirtualStation -> {
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.GetOrder -> {
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.StartTask -> {
|
||||
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.ArrivedOrderStartStation -> {
|
||||
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.JumpPassengerCheckDone -> {
|
||||
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.ArrivedOrderEndStation -> {
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.JourneyCompleted -> {
|
||||
|
||||
|
||||
}
|
||||
|
||||
is UnmannedIntent.CloseOrderByDriver -> {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getCurrentOCHOrder(): OrderQueryRespBean.Result? {
|
||||
return mCurrentOrder
|
||||
}
|
||||
}
|
||||
@@ -1,308 +0,0 @@
|
||||
package com.mogo.och.taxi.network;
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
import com.mogo.och.taxi.bean.CarHeartbeatReqBean;
|
||||
import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
|
||||
import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean;
|
||||
import com.mogo.och.taxi.bean.OrderCancelReqBean;
|
||||
import com.mogo.och.taxi.bean.OrderGrabReqBean;
|
||||
import com.mogo.och.taxi.bean.OrderGrabRespBean;
|
||||
import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean;
|
||||
import com.mogo.och.taxi.bean.OrderQueryReqBean;
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.bean.OrderQueryRouteInfoReqBean;
|
||||
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean;
|
||||
import com.mogo.och.taxi.bean.OrderStatusUpdateReqBean;
|
||||
import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean;
|
||||
import com.mogo.och.taxi.bean.OrdersListQueryReqBean;
|
||||
import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
|
||||
import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
|
||||
import com.mogo.och.taxi.bean.QueryOrderRouteResp;
|
||||
import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
|
||||
import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
|
||||
import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import retrofit2.http.Body;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Header;
|
||||
import retrofit2.http.Headers;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 网约车-出租车接口定义
|
||||
*/
|
||||
interface TaxiServiceApiNew {
|
||||
|
||||
/**
|
||||
* 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
|
||||
@GET("/autopilot-car-hailing/order/v2/driver/taxi/orderInService/query")
|
||||
Observable<OrdersInServiceQueryRespBean> queryOrdersInAndWaitService(@Header("appId") String appId
|
||||
, @Header("ticket") String ticket, @Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 查询新到的预约单
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
|
||||
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/newBookingOrder/query" )
|
||||
Observable<OrdersNewBookingQueryRespBean> queryNewBookingOrder(@Header ("appId") String appId
|
||||
,@Header("ticket") String ticket,@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* (预约单)执行抢单动作
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
|
||||
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/grabOrder" )
|
||||
Observable<OrderGrabRespBean> grabOrder(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrderGrabReqBean data);
|
||||
|
||||
/**
|
||||
* (预约单)查询抢单结果
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
|
||||
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/grabStatus/query" )
|
||||
Observable<OrderGrabStatusQueryRespBean> queryOrderGrabStatus(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrderGrabReqBean data);
|
||||
|
||||
/**
|
||||
* 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
|
||||
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/routeInfo/query" )
|
||||
Observable<OrderQueryRouteInfoRespBean> queryOrderRouteInfo(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrderQueryRouteInfoReqBean data);
|
||||
|
||||
/**
|
||||
* 通过orderId查询订单信息(用于本地已经有orderId时)
|
||||
* @param data
|
||||
* @return
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
|
||||
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrderById" )
|
||||
Observable<OrderQueryRespBean> queryOrderById(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrderQueryReqBean data);
|
||||
|
||||
/**
|
||||
* 查询服务中订单信息(用于本地无orderId时)
|
||||
* 如果有多条,只会返回时间最近的一条
|
||||
* @param sn
|
||||
* @return
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
|
||||
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrderInService" )
|
||||
Observable<OrderQueryRespBean> queryOrderInService(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 取消订单
|
||||
*/
|
||||
@Headers({"Content-type:application/json;charset=UTF-8"})
|
||||
// @POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
|
||||
@POST("/autopilot-car-hailing/order/v2/driver/taxi/cancelOrder")
|
||||
Observable<BaseData> cancelOrder(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrderCancelReqBean data);
|
||||
|
||||
/**
|
||||
* 订单列表获取
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
|
||||
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrders" )
|
||||
Observable<OrdersListQueryRespBean> queryOrdersList(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrdersListQueryReqBean data);
|
||||
|
||||
/**
|
||||
* 订单状态更新
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
|
||||
// @POST( "/autopilot-car-hailing/order/v2/driver/taxi/order/updateStatus" )
|
||||
@POST( "/autopilot-car-hailing/order/v2/vehicle/taxi/driver/updateStatus" )
|
||||
Observable<BaseData> updateOrderStatus(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body OrderStatusUpdateReqBean data);
|
||||
|
||||
/**
|
||||
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
|
||||
@POST( "/autopilot-car-hailing/location/v2/driver/taxi/heartbeat" )
|
||||
Observable<BaseData> runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body CarHeartbeatReqBean data);
|
||||
|
||||
/**
|
||||
* 查询司机服务数据
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
|
||||
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/serviceData/query" )
|
||||
Observable<DriverServiceDataRespBean> queryServiceData(@Header ("appId") String appId
|
||||
,@Header("ticket") String ticket,@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 上传工控机返回的全路径规划数据
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST("/autopilot-car-hailing/order/v2/driver/taxi/saveOrderRoute")
|
||||
// @POST("/mock/268/autopilot-car-hailing/order/v2/driver/taxi/orderRoute")
|
||||
Observable<BaseData> updateOrderRoute(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket, @Body OrderRouteUpdateReqBean data);
|
||||
|
||||
/**
|
||||
* 上报订单剩余里程和剩余时间
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST("/autopilot-car-hailing/order/v2/driver/taxi/reportOrderRemain")
|
||||
Observable<BaseData> reportOrderRemain(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket, @Body UpdateOrderDisAndTimeReqBean data);
|
||||
|
||||
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
|
||||
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/orderRoute" )
|
||||
Observable<QueryOrderRouteResp> queryOrderRoute(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket, @Query("orderNo") String orderNo);
|
||||
|
||||
/**
|
||||
* 司机端跳过乘客验证,订单状态流转为乘客已上车
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/passenger" )
|
||||
Observable<TaxiDataBaseRespBean> updatePassengerHasBoardedStatus(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket, @Body TaxiOrPassengerReadyReqBean data);
|
||||
|
||||
/**
|
||||
* 司机端确认可开启自动驾驶
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/pilot" )
|
||||
Observable<TaxiDataBaseRespBean> confirmAutopilotConditionByDriver(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
|
||||
|
||||
/**
|
||||
* 查询司机是否已确认可开启自动驾驶
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param orderNo
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" )
|
||||
Observable<TaxiDataBaseRespBean> queryPilotStatus(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket,@Query("orderNo") String orderNo);
|
||||
|
||||
/**
|
||||
* 开启自动驾驶成功
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startServicePilot" )
|
||||
Observable<TaxiDataBaseRespBean> startServicePilotDone(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
|
||||
|
||||
/**
|
||||
* 达到乘客上车点
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/arriveStartPoint" )
|
||||
Observable<TaxiDataBaseRespBean> arrivedStartPoint(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
|
||||
|
||||
/**
|
||||
* 到达乘客目的地
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/arriveTerminal" )
|
||||
Observable<TaxiDataBaseRespBean> arriveTerminal(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
|
||||
|
||||
/**
|
||||
* 订单完成
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/orderCompleted" )
|
||||
Observable<TaxiDataBaseRespBean> orderCompleted(@Header ("appId") String appId
|
||||
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
|
||||
|
||||
/**
|
||||
* 暂停接单
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/stopOrderServing" )
|
||||
Observable<BaseData> stopOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body DriverStatusUpdateReqBean data);
|
||||
/**
|
||||
* 暂停接单
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
|
||||
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" )
|
||||
Observable<BaseData> resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
|
||||
,@Body DriverStatusUpdateReqBean data);
|
||||
}
|
||||
@@ -17,183 +17,11 @@ import io.reactivex.Observable
|
||||
object TaxiServiceManager {
|
||||
|
||||
|
||||
private var mOCHTaxiServiceApi: TaxiServiceApiNew =
|
||||
private var mOCHTaxiServiceApi: TaxiUnmannedServiceApi =
|
||||
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
|
||||
TaxiServiceApiNew::class.java
|
||||
TaxiUnmannedServiceApi::class.java
|
||||
)
|
||||
|
||||
/**
|
||||
* 查询全部服务中/待服务订单列表
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun queryOrdersInAndWaitService(
|
||||
context: Context,
|
||||
callback: OchCommonServiceCallback<OrdersInServiceQueryRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryOrdersInAndWaitService(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
MoGoAiCloudClientConfig.getInstance().sn
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询新到的预约单
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun queryNewBookingOrder(
|
||||
context: Context,
|
||||
callback: OchCommonServiceCallback<OrdersNewBookingQueryRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryNewBookingOrder(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
MoGoAiCloudClientConfig.getInstance().sn
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryNewBookingOrder"))
|
||||
}
|
||||
|
||||
/**
|
||||
* (预约单)执行抢单动作
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun grabOrder(
|
||||
context: Context, orderNo: String?,
|
||||
callback: OchCommonServiceCallback<OrderGrabRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.grabOrder(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderGrabReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "grabOrder"))
|
||||
}
|
||||
|
||||
/**
|
||||
* (预约单)查询抢单结果
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun queryOrderGrabStatus(
|
||||
context: Context, orderNo: String?,
|
||||
callback: OchCommonServiceCallback<OrderGrabStatusQueryRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryOrderGrabStatus(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderGrabReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderGrabStatus"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun queryOrderRouteInfo(
|
||||
context: Context, orderNo: String?,
|
||||
callback: OchCommonServiceCallback<OrderQueryRouteInfoRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryOrderRouteInfo(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderQueryRouteInfoReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRouteInfo"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过orderId查询订单信息(用于本地已经有orderId时)
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
@Deprecated("v2.1_0930需求中暂不再使用此接口")
|
||||
fun queryOrderById(
|
||||
context: Context, orderNo: String?,
|
||||
callback: OchCommonServiceCallback<OrderQueryRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryOrderById(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderQueryReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询未完成态订单信息(用于本地无orderId时)
|
||||
* 如果有多条,只会返回时间最近的一条
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
@Deprecated("v2.1_0930需求中暂不再使用此接口")
|
||||
fun queryOrderInService(
|
||||
context: Context,
|
||||
callback: OchCommonServiceCallback<OrderQueryRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryOrderInService(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
MoGoAiCloudClientConfig.getInstance().sn
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderInService"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 司机取消订单
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param cancelType
|
||||
* @param cancelReason
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun cancelOrder(
|
||||
context: Context, orderNo: String?, cancelType: Int, cancelReason: String?,
|
||||
callback: OchCommonServiceCallback<BaseData>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.cancelOrder(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderCancelReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, cancelType, cancelReason
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "cancelOrder"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单列表获取
|
||||
* @param context
|
||||
@@ -217,29 +45,6 @@ object TaxiServiceManager {
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersList"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单状态更新
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param orderStatus
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun updateOrderStatus(
|
||||
context: Context, orderNo: String?, orderStatus: Int,
|
||||
callback: OchCommonServiceCallback<BaseData>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.updateOrderStatus(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderStatusUpdateReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, orderStatus
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderStatus"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 暂停接单
|
||||
* @param context
|
||||
@@ -271,29 +76,6 @@ object TaxiServiceManager {
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "updateDriverServiceStatus"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
|
||||
* @param context
|
||||
* @param lon
|
||||
* @param lat
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun runCarHeartbeat(
|
||||
context: Context, lon: Double, lat: Double,
|
||||
callback: OchCommonServiceCallback<BaseData>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.runCarHeartbeat(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
CarHeartbeatReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, lon, lat
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询司机服务数据
|
||||
* @param context
|
||||
@@ -313,26 +95,6 @@ object TaxiServiceManager {
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverServiceData"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据订单上传工控机返回的全路径规划数据
|
||||
* @param context
|
||||
* @param orderNo
|
||||
* @param callback
|
||||
*/
|
||||
@JvmStatic
|
||||
fun updateOrderRoute(
|
||||
context: Context, orderNo: String?, points: List<OrderRouteUpdateReqBean.Result?>?,
|
||||
callback: OchCommonServiceCallback<BaseData>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.updateOrderRoute(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
OrderRouteUpdateReqBean(orderNo, points)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderRoute"))
|
||||
}
|
||||
|
||||
/**
|
||||
* 上报剩余里程,时间
|
||||
* @param context
|
||||
@@ -378,120 +140,4 @@ object TaxiServiceManager {
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRoute"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun confirmAutopilotConditionByDriver(
|
||||
context: Context,
|
||||
orderNo: String?,
|
||||
loc: TaxiOrPassengerReadyReqBean.Result?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.confirmAutopilotConditionByDriver(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
TaxiOrPassengerReadyReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "confirmAutopilotConditionByDriver"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun queryAutopilotStatus(
|
||||
context: Context, orderNo: String?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.queryPilotStatus(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
orderNo
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "queryAutopilotStatus"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun updatePassengerHasBoardedStatus(
|
||||
context: Context,
|
||||
orderNo: String?,
|
||||
loc: TaxiOrPassengerReadyReqBean.Result?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.updatePassengerHasBoardedStatus(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
TaxiOrPassengerReadyReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "updatePassengerHasBoardedStatus"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun startServicePilotDone(
|
||||
context: Context,
|
||||
orderNo: String?,
|
||||
loc: TaxiOrPassengerReadyReqBean.Result?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.startServicePilotDone(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
TaxiOrPassengerReadyReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "startServicePilotDone"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun arrivedStartPoint(
|
||||
context: Context,
|
||||
orderNo: String?,
|
||||
loc: TaxiOrPassengerReadyReqBean.Result?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
|
||||
) {
|
||||
mOCHTaxiServiceApi.arrivedStartPoint(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
TaxiOrPassengerReadyReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "arrivedStartPoint"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun arriveTerminal(
|
||||
context: Context,
|
||||
orderNo: String?,
|
||||
loc: TaxiOrPassengerReadyReqBean.Result?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>
|
||||
) {
|
||||
mOCHTaxiServiceApi.arriveTerminal(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
TaxiOrPassengerReadyReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "arriveTerminal"))
|
||||
}
|
||||
@JvmStatic
|
||||
fun orderCompleted(
|
||||
context: Context,
|
||||
orderNo: String?,
|
||||
loc: TaxiOrPassengerReadyReqBean.Result?,
|
||||
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>
|
||||
) {
|
||||
mOCHTaxiServiceApi.orderCompleted(
|
||||
MoGoAiCloudClientConfig.getInstance().serviceAppId,
|
||||
MoGoAiCloudClientConfig.getInstance().token,
|
||||
TaxiOrPassengerReadyReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
|
||||
)
|
||||
)
|
||||
.transformTry()
|
||||
.subscribe(OchCommonSubscribeImpl(context, callback, "orderCompleted"))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package com.mogo.och.taxi.network
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData
|
||||
import com.mogo.och.taxi.bean.DriverServiceDataRespBean
|
||||
import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean
|
||||
import com.mogo.och.taxi.bean.OrdersListQueryReqBean
|
||||
import com.mogo.och.taxi.bean.OrdersListQueryRespBean
|
||||
import com.mogo.och.taxi.bean.QueryOrderRouteResp
|
||||
import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean
|
||||
import io.reactivex.Observable
|
||||
import retrofit2.http.Body
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.Header
|
||||
import retrofit2.http.Headers
|
||||
import retrofit2.http.POST
|
||||
import retrofit2.http.Query
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
interface TaxiUnmannedServiceApi {
|
||||
|
||||
/**
|
||||
* 订单列表获取
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
|
||||
@POST("/autopilot-car-hailing/order/v2/driver/taxi/queryOrders")
|
||||
fun queryOrdersList(
|
||||
@Header("appId") appId: String?,
|
||||
@Header("ticket") ticket: String?,
|
||||
@Body data: OrdersListQueryReqBean?
|
||||
): Observable<OrdersListQueryRespBean?>?
|
||||
|
||||
/**
|
||||
* 查询司机服务数据
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers("Content-type:application/json;charset=UTF-8") // @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
|
||||
@GET("/autopilot-car-hailing/order/v2/driver/taxi/serviceData/query")
|
||||
fun queryServiceData(
|
||||
@Header("appId") appId: String?, @Header("ticket") ticket: String?, @Query("sn") sn: String?
|
||||
): Observable<DriverServiceDataRespBean?>?
|
||||
|
||||
/**
|
||||
* 上报订单剩余里程和剩余时间
|
||||
* @param appId
|
||||
* @param ticket
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers("Content-type:application/json;charset=UTF-8")
|
||||
@POST("/autopilot-car-hailing/order/v2/driver/taxi/reportOrderRemain")
|
||||
fun reportOrderRemain(
|
||||
@Header("appId") appId: String?,
|
||||
@Header("ticket") ticket: String?,
|
||||
@Body data: UpdateOrderDisAndTimeReqBean?
|
||||
): Observable<BaseData?>?
|
||||
|
||||
|
||||
@Headers("Content-type:application/json;charset=UTF-8") // @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
|
||||
@GET("/autopilot-car-hailing/order/v2/driver/taxi/orderRoute")
|
||||
fun queryOrderRoute(
|
||||
@Header("appId") appId: String?,
|
||||
@Header("ticket") ticket: String?,
|
||||
@Query("orderNo") orderNo: String?
|
||||
): Observable<QueryOrderRouteResp?>?
|
||||
|
||||
/**
|
||||
* 开始接单
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
|
||||
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/stopOrderServing")
|
||||
fun stopOrderServing(
|
||||
@Header("appId") appId: String?,
|
||||
@Header("ticket") ticket: String?,
|
||||
@Body data: DriverStatusUpdateReqBean?
|
||||
): Observable<BaseData?>?
|
||||
|
||||
/**
|
||||
* 暂停接单
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
|
||||
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing")
|
||||
fun resetOrderServing(
|
||||
@Header("appId") appId: String?,
|
||||
@Header("ticket") ticket: String?,
|
||||
@Body data: DriverStatusUpdateReqBean?
|
||||
): Observable<BaseData?>?
|
||||
|
||||
|
||||
//登陆成功后查询 开始接单/暂停接单的状态
|
||||
|
||||
//点击开始接单,获取要前往的站点
|
||||
|
||||
//登陆成功后查询当前任务
|
||||
|
||||
//任务到站
|
||||
|
||||
//到达任务站点后查询下一站任务(包含是否有订单和订单状态)
|
||||
|
||||
//轮询订单接口
|
||||
|
||||
//到达乘客上车点
|
||||
|
||||
//开启自驾
|
||||
|
||||
//服务完成
|
||||
}
|
||||
@@ -50,10 +50,6 @@ public class NaviPresenter extends Presenter<TaxiRottingNaviFragment> implements
|
||||
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this);
|
||||
}
|
||||
|
||||
private void releaseListeners() {
|
||||
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
|
||||
}
|
||||
|
||||
private void runOnUIThread( Runnable executor ) {
|
||||
if ( executor == null ) {
|
||||
return;
|
||||
|
||||
@@ -22,11 +22,11 @@ public class TaxiOperationalPresenter extends Presenter<TaxiPersonalDialogFragme
|
||||
}
|
||||
|
||||
private void initListener() {
|
||||
TaxiModel.getInstance().setCarStatusCallback(this);
|
||||
TaxiModel.INSTANCE.setCarStatusCallback(this);
|
||||
}
|
||||
|
||||
private void releaseListener(){
|
||||
TaxiModel.getInstance().setCarStatusCallback(null);
|
||||
TaxiModel.INSTANCE.setCarStatusCallback(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,7 +37,7 @@ public class TaxiOperationalPresenter extends Presenter<TaxiPersonalDialogFragme
|
||||
|
||||
// 获取全部订单列表
|
||||
public void queryOrdersList(int page, int size) {
|
||||
TaxiModel.getInstance().queryOrdersList(page, size);
|
||||
TaxiModel.INSTANCE.queryOrdersList(page, size);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,6 +23,7 @@ import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
|
||||
import com.mogo.och.taxi.callback.ITaxiCarOperationalCallback;
|
||||
import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
|
||||
import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback;
|
||||
import com.mogo.och.taxi.constant.TaxiConst;
|
||||
@@ -36,8 +37,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2021/1/18
|
||||
@@ -45,7 +44,7 @@ import mogo.telematics.pad.MessagePad;
|
||||
* 描述
|
||||
*/
|
||||
public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASStatusCallback,
|
||||
ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback {
|
||||
ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback, ITaxiCarOperationalCallback {
|
||||
|
||||
private static final String TAG = TaxiPresenter.class.getSimpleName();
|
||||
|
||||
@@ -53,7 +52,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
|
||||
|
||||
public TaxiPresenter(TaxiFragment view) {
|
||||
super(view);
|
||||
TaxiModel.getInstance().init(AbsMogoApplication.getApp());
|
||||
TaxiModel.INSTANCE.init(AbsMogoApplication.getApp());
|
||||
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
|
||||
initListeners();
|
||||
}
|
||||
@@ -69,21 +68,22 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
|
||||
super.onDestroy( owner );
|
||||
|
||||
releaseListeners();
|
||||
TaxiModel.getInstance().release();
|
||||
TaxiModel.INSTANCE.release();
|
||||
}
|
||||
|
||||
private void initListeners() {
|
||||
TaxiModel.getInstance().setADASStatusCallback(this);
|
||||
TaxiModel.getInstance().setControllerStatusCallback(this);
|
||||
TaxiModel.getInstance().setOrderStatusCallback(this);
|
||||
TaxiModel.INSTANCE.setADASStatusCallback(this);
|
||||
TaxiModel.INSTANCE.setControllerStatusCallback(this);
|
||||
TaxiModel.INSTANCE.setCarStatusCallback(this);
|
||||
TaxiModel.INSTANCE.setOrderStatusCallback(this);
|
||||
}
|
||||
|
||||
private void releaseListeners() {
|
||||
TaxiModel.getInstance().setADASStatusCallback(null);
|
||||
TaxiModel.getInstance().setControllerStatusCallback(null);
|
||||
TaxiModel.getInstance().setOrderStatusCallback(null);
|
||||
TaxiModel.INSTANCE.setADASStatusCallback(null);
|
||||
TaxiModel.INSTANCE.setControllerStatusCallback(null);
|
||||
TaxiModel.INSTANCE.setOrderStatusCallback(null);
|
||||
OCHAdasAbilityManager.getInstance().release();
|
||||
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
|
||||
TaxiModel.INSTANCE.setMoGoAutopilotPlanningListener(null);
|
||||
}
|
||||
|
||||
private void runOnUIThread( Runnable executor ) {
|
||||
@@ -101,87 +101,32 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
|
||||
* 开启自动驾驶 自驾模式
|
||||
*/
|
||||
public void startAutoPilot() {
|
||||
TaxiModel.getInstance().startAutoPilot();
|
||||
}
|
||||
|
||||
/**
|
||||
* 人工模式
|
||||
*/
|
||||
public void startManualDrive(){
|
||||
TaxiModel.getInstance().startServicePilotDone();
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳过乘客验证环节
|
||||
*/
|
||||
public void jumpPassengerCheckDone(){
|
||||
TaxiModel.getInstance().jumpPassengerCheckDone();
|
||||
}
|
||||
|
||||
/**
|
||||
* 司机确认车辆环境可开启自动驾驶
|
||||
*/
|
||||
public void confirmAutopilotConditionByDriver() {
|
||||
TaxiModel.getInstance().confirmAutopilotConditionByDriver();
|
||||
TaxiModel.INSTANCE.startAutoPilot();
|
||||
}
|
||||
|
||||
// 更新接单状态
|
||||
public void updateCarStatus() {
|
||||
TaxiModel.getInstance().updateCarStatus();
|
||||
TaxiModel.INSTANCE.updateCarStatus();
|
||||
}
|
||||
|
||||
|
||||
// 获取当前订单状态
|
||||
public TaxiOrderStatusEnum getCurOrderStatus() {
|
||||
return TaxiModel.getInstance().getCurOrderStatus();
|
||||
}
|
||||
|
||||
// 取消当前订单
|
||||
public void cancelCurOrder(int reasonType, String reason) {
|
||||
TaxiModel.getInstance().cancelCurrentOrder(reasonType, reason);
|
||||
}
|
||||
|
||||
// 取消待服务中订单
|
||||
public void cancelOrderById(String orderNo, int reasonType, String reason) {
|
||||
TaxiModel.getInstance().cancelOrderById(orderNo, reasonType, reason);
|
||||
}
|
||||
|
||||
// 查询当前订单route信息:预估时间、里程等
|
||||
public void queryCurOrderRouteInfo() {
|
||||
TaxiModel.getInstance().queryCurOrderRouteInfo();
|
||||
}
|
||||
|
||||
// 执行抢单动作
|
||||
public void grabOrder() {
|
||||
TaxiModel.getInstance().grabOrder();
|
||||
}
|
||||
|
||||
// 关闭新到预约单
|
||||
public void cancelNewBookingOrder() {
|
||||
TaxiModel.getInstance().cancelNewBookingOrder();
|
||||
}
|
||||
|
||||
//更新订单已完成状态
|
||||
public void completeOrderService() {
|
||||
TaxiModel.getInstance().orderCompleted();
|
||||
return TaxiModel.INSTANCE.getCurOrderStatus();
|
||||
}
|
||||
|
||||
// 登出
|
||||
public void logout() {
|
||||
TaxiModel.getInstance().logout();
|
||||
TaxiModel.INSTANCE.logout();
|
||||
}
|
||||
|
||||
//导航去订单目的地
|
||||
public void startNaviToEndStation(boolean isShow){
|
||||
TaxiModel.getInstance().startNaviToEndStation(isShow);
|
||||
TaxiModel.INSTANCE.startNaviToEndStation(isShow);
|
||||
}
|
||||
|
||||
public void reportToEndDisAndTime(long lastSumLength, long duration){//米/秒
|
||||
TaxiModel.getInstance().reportOrderRemain(lastSumLength,duration);
|
||||
}
|
||||
|
||||
public void closeOrderByMan(){
|
||||
TaxiModel.getInstance().arriveTerminal();
|
||||
TaxiModel.INSTANCE.reportOrderRemain(lastSumLength,duration);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -224,97 +169,11 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
|
||||
runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrdersInServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> inServiceList) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrdersWaitServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> waitServiceList) {
|
||||
runOnUIThread(() -> mView.onOrdersWaitServiceChanged(waitServiceList));
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
@Override
|
||||
public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
|
||||
CallerLogger.INSTANCE.d(M_TAXI + TAG,"order = "+order.toString());
|
||||
if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus){
|
||||
TaxiModel.getInstance().queryAutopilotStatus(true);
|
||||
TaxiModel.getInstance().setStation();
|
||||
}
|
||||
|
||||
if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
|
||||
TaxiModel.getInstance().startDynamicCalculateRouteInfo();
|
||||
TaxiModel.getInstance().setStation();
|
||||
runOnUIThread(() -> {
|
||||
mView.updateCtvAutopilotStatusTag(true);
|
||||
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(true);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus ||
|
||||
TaxiOrderStatusEnum.Cancel.getCode() == order.orderStatus ||
|
||||
TaxiOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
|
||||
TaxiModel.getInstance().startOrStopCalculateRouteInfo(false);
|
||||
TaxiModel.getInstance().cleanLineMarker();
|
||||
TaxiModel.getInstance().cleanStation();
|
||||
runOnUIThread(() -> {
|
||||
if(TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus){
|
||||
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
runOnUIThread(() -> mView.updateCurrentOrderStatusChanged(order));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderCancelDone() {
|
||||
runOnUIThread(() -> mView.onCurrentOrderCancelDone());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrderCancelDone(String orderNo) {
|
||||
runOnUIThread(() -> mView.onOrderCancelDone(orderNo));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
|
||||
runOnUIThread(() -> mView.onCurrentOrderRouteInfoGot(routeInfo));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
|
||||
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters,timeInSecond));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
|
||||
runOnUIThread(() -> mView.onNewBookingOrderGot(order));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabOrderExecuteDone() {
|
||||
runOnUIThread(() -> mView.onGrabOrderExecuteDone());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
|
||||
runOnUIThread(() -> mView.onGrabOrderSuccess(order));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
|
||||
runOnUIThread(() -> mView.onGrabOrderFailed(order));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDriverHasCheckedPilotCondition(boolean isSafe) {
|
||||
runOnUIThread(() -> mView.onCheckPilotConditionSafe(isSafe));
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters,timeInSecond));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -348,7 +207,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
|
||||
//设置 接单状态
|
||||
TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus);
|
||||
//设置 是否启动订单轮训
|
||||
TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
|
||||
TaxiModel.INSTANCE.startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
|
||||
|
||||
// 设置当前用户角色
|
||||
String role = "";
|
||||
@@ -367,4 +226,14 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
|
||||
public void loginFail(boolean isLogin) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrdersListPageRefresh(List<OrderQueryRespBean.Result> ordersList) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,22 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/interface ITaxiMapDirectionView {
|
||||
*/
|
||||
open interface ITaxiMapDirectionView {
|
||||
/**
|
||||
* 绘制路径线
|
||||
*/
|
||||
fun drawablePolyline()
|
||||
|
||||
/**
|
||||
* 清除路径线
|
||||
*/
|
||||
fun clearPolyline()
|
||||
|
||||
/**
|
||||
* 设置路径中起终点marker
|
||||
*/
|
||||
fun setLineMarker()
|
||||
}
|
||||
@@ -1,7 +1,186 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import com.amap.api.navi.AMapNaviViewListener
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
|
||||
import com.mogo.och.common.module.map.CommonAmapNaviVIew
|
||||
import com.mogo.och.common.module.map.ICommonNaviChangedCallback
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.BaseTaxiUIFragment
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiAmapNaviFragment {
|
||||
}
|
||||
*/
|
||||
class TaxiAmapNaviFragment : BaseTaxiUIFragment(),
|
||||
AMapNaviViewListener {
|
||||
private var mAMapNaviView: CommonAmapNaviVIew? = null
|
||||
private var mNaviToStartInfoCallback: ICommonNaviChangedCallback? = null
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.taxi_amap_navi_view
|
||||
}
|
||||
|
||||
override fun initViews(view: View) {
|
||||
mAMapNaviView = view.findViewById<CommonAmapNaviVIew>(R.id.navi_view)
|
||||
}
|
||||
|
||||
override fun initViews(savedInstanceState: Bundle?) {
|
||||
super.initViews(savedInstanceState)
|
||||
if (mAMapNaviView != null) mAMapNaviView!!.onCreate(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (mAMapNaviView != null) mAMapNaviView!!.onResume()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
if (mAMapNaviView != null) mAMapNaviView!!.onPause()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
AmapNaviToDestinationModel.getInstance(context).setVoiceIsMute(false)
|
||||
if (mAMapNaviView != null) {
|
||||
mAMapNaviView!!.onDestroy()
|
||||
}
|
||||
if (mNaviToStartInfoCallback != null) {
|
||||
mNaviToStartInfoCallback = null
|
||||
}
|
||||
}
|
||||
|
||||
override fun onNaviSetting() {
|
||||
//底部导航设置点击回调
|
||||
}
|
||||
|
||||
override fun onNaviCancel() {}
|
||||
override fun onNaviMapMode(naviMode: Int) {
|
||||
//导航态车头模式,0:车头朝上状态;1:正北朝上模式。
|
||||
}
|
||||
|
||||
override fun onNaviTurnClick() {
|
||||
//转弯view的点击回调
|
||||
}
|
||||
|
||||
override fun onNextRoadClick() {
|
||||
//下一个道路View点击回调
|
||||
}
|
||||
|
||||
override fun onScanViewButtonClick() {
|
||||
//全览按钮点击回调
|
||||
}
|
||||
|
||||
override fun onLockMap(isLock: Boolean) {
|
||||
//锁地图状态发生变化时回调
|
||||
}
|
||||
|
||||
override fun onNaviViewLoaded() {
|
||||
d(SceneConstant.M_TAXI + "wlx", "导航页面加载成功")
|
||||
d(
|
||||
SceneConstant.M_TAXI + "wlx",
|
||||
"请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑"
|
||||
)
|
||||
}
|
||||
|
||||
override fun onMapTypeChanged(i: Int) {}
|
||||
override fun onNaviViewShowMode(i: Int) {}
|
||||
override fun onNaviBackClick(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* 车道信息说明:
|
||||
*
|
||||
*
|
||||
* 0xFF, 无对应车道
|
||||
* 0, 直行
|
||||
* 1, 左转
|
||||
* 2, 直行+左转
|
||||
* 3, 右转
|
||||
* 4, 直行+右转
|
||||
* 5, 左掉头
|
||||
* 6, 左转+右转
|
||||
* 7, 直行+左转+右转
|
||||
* 8, 右掉头
|
||||
* 9, 直行+左掉头
|
||||
* 10, 直行+右掉头
|
||||
* 11, 左转+左掉头
|
||||
* 12, 右转+右掉头
|
||||
* 13, 直行+扩展
|
||||
* 14, 左转+左掉头+扩展
|
||||
* 15, 保留
|
||||
* 16, 直行+左转+左掉头
|
||||
* 17, 右转+左掉头
|
||||
* 18, 左转+右转+左掉头
|
||||
* 19, 直行+右转+左掉头
|
||||
* 20, 左转+右掉头
|
||||
* 21, 公交车道
|
||||
* 22, 空车道
|
||||
* 23 可变车道
|
||||
*/
|
||||
var array = arrayOf(
|
||||
"直行车道",
|
||||
"左转车道",
|
||||
"左转或直行车道",
|
||||
"右转车道",
|
||||
"右转或直行车道",
|
||||
"左掉头车道",
|
||||
"左转或者右转车道",
|
||||
" 左转或右转或直行车道",
|
||||
"右转掉头车道",
|
||||
"直行或左转掉头车道",
|
||||
"直行或右转掉头车道",
|
||||
"左转或左掉头车道",
|
||||
"右转或右掉头车道",
|
||||
"直行并且车道扩展",
|
||||
"左转+左掉头+扩展",
|
||||
"不可以选择该车道",
|
||||
"直行+左转+左掉头车道",
|
||||
"右转+左掉头",
|
||||
"左转+右转+左掉头",
|
||||
"直行+右转+左掉头",
|
||||
"左转+右掉头",
|
||||
"公交车道",
|
||||
"空车道",
|
||||
"可变车道"
|
||||
)
|
||||
var actions = arrayOf(
|
||||
"直行",
|
||||
"左转",
|
||||
"左转或直行",
|
||||
"右转",
|
||||
"右转或这行",
|
||||
"左掉头",
|
||||
"左转或者右转",
|
||||
" 左转或右转或直行",
|
||||
"右转掉头",
|
||||
"直行或左转掉头",
|
||||
"直行或右转掉头",
|
||||
"左转或左掉头",
|
||||
"右转或右掉头",
|
||||
"直行并且车道扩展",
|
||||
"左转+左掉头+扩展",
|
||||
"不可以选择",
|
||||
"直行+左转+左掉头",
|
||||
"右转+左掉头",
|
||||
"左转+右转+左掉头",
|
||||
"直行+右转+左掉头",
|
||||
"左转+右掉头",
|
||||
"公交车道",
|
||||
"空车道",
|
||||
"可变车道"
|
||||
)
|
||||
|
||||
companion object {
|
||||
fun newInstance(): TaxiAmapNaviFragment {
|
||||
val args = Bundle()
|
||||
val fragment = TaxiAmapNaviFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiBeingServedOrdersFragment {
|
||||
}
|
||||
@@ -0,0 +1,855 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.Html
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.amap.api.navi.model.NaviLatLng
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getOverlayManager
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
|
||||
import com.mogo.eagle.core.utilcode.util.ToastUtils
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.mogo.map.overlay.core.Level
|
||||
import com.mogo.map.overlay.point.Point
|
||||
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
|
||||
import com.mogo.och.common.module.map.ICommonNaviChangedCallback
|
||||
import com.mogo.och.common.module.utils.DateTimeUtil
|
||||
import com.mogo.och.common.module.utils.NumberFormatUtil
|
||||
import com.mogo.och.common.module.utils.OCHThreadPoolManager
|
||||
import com.mogo.och.common.module.voice.VoiceNotice.showNotice
|
||||
import com.mogo.och.common.module.wigets.OCHCommitDialog
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.BaseBindingFragment
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean
|
||||
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
|
||||
import com.mogo.och.taxi.constant.TaxiConst
|
||||
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
|
||||
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf
|
||||
import com.mogo.och.taxi.databinding.UnmannedBeingOrderBinding
|
||||
import com.mogo.och.taxi.model.TaxiModel
|
||||
import com.mogo.och.taxi.model.TaxiUnmannedViewModel
|
||||
import com.mogo.och.taxi.ui.unmanned.TaskUiState
|
||||
import com.mogo.och.taxi.ui.unmanned.UnmannedIntent
|
||||
import com.mogo.och.taxi.ui.unmanned.UnmannedState
|
||||
import kotlinx.android.synthetic.main.unmanned_being_order.taskOtherInfo
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.flow.map
|
||||
import java.util.Calendar
|
||||
import kotlin.math.ceil
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/
|
||||
class TaxiBeingTaskFragment : BaseBindingFragment<UnmannedBeingOrderBinding>({
|
||||
UnmannedBeingOrderBinding.inflate(it)
|
||||
}),
|
||||
View.OnClickListener, ICommonNaviChangedCallback {
|
||||
|
||||
private var mOrderNo: String? = null
|
||||
private var mViewModel: TaxiUnmannedViewModel? = null
|
||||
|
||||
@Volatile
|
||||
private var mTtsLessThan200Tip = 0 //离终点200米提示播报
|
||||
private var mCurrentOrder: OrderQueryRespBean.Result? = null
|
||||
private var isFirstStartAutopilotDone = true
|
||||
private var mBeingOrderLayout: ConstraintLayout? = null
|
||||
private var mPassengerInfoLayout: ConstraintLayout? = null
|
||||
private var mNoDatasTv: TextView? = null
|
||||
private var mNoDataView: ConstraintLayout? = null
|
||||
|
||||
@Volatile
|
||||
private var saveOrderState = -1
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.unmanned_being_order
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
return "TaxiBeingTaskFragment"
|
||||
}
|
||||
|
||||
override fun onAttach(context: Context) {
|
||||
super.onAttach(context)
|
||||
mViewModel = ViewModelProvider(this)[TaxiUnmannedViewModel::class.java]
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
initNaviView()
|
||||
isHaveBeingOrder(false)
|
||||
initOnClickListener()
|
||||
//任意模式下调试信息都打开
|
||||
initOrderTestBar()
|
||||
|
||||
initData()
|
||||
}
|
||||
|
||||
private fun initData() {
|
||||
|
||||
lifecycleScope.launchWhenStarted {
|
||||
mViewModel?.let {
|
||||
it.uiIntentFlow.collect { state ->
|
||||
d(TAG,"uiIntentFlow: $state")
|
||||
when(state){
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//监听返回的数据状态
|
||||
lifecycleScope.launchWhenStarted {
|
||||
mViewModel?.let{
|
||||
it.uiStateFlow.map {it.taskUiState}.collect {state ->
|
||||
d(TAG,"uiStateFlow: $state")
|
||||
when(state){
|
||||
is TaskUiState.INIT -> {
|
||||
|
||||
}
|
||||
is TaskUiState.SUCCESS -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun initOnClickListener() {
|
||||
binding.cancelOrder.setOnClickListener(this)
|
||||
binding.taskStatus.setOnClickListener(this)
|
||||
}
|
||||
|
||||
private fun initNaviView() {
|
||||
binding.naviToStart.setOnClickListener(this)
|
||||
binding.naviToEnd.setOnClickListener(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化订单信息
|
||||
*/
|
||||
@SuppressLint("SetTextI18n")
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
fun updateCurrentOrderStatusChanged(order: OrderQueryRespBean.Result?) {
|
||||
try {
|
||||
if (order == null) return
|
||||
if (order.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code) {
|
||||
mCurrentOrder = null
|
||||
isHaveBeingOrder(false)
|
||||
binding.taskOtherInfo.text = "距离 - - 公里,用时 - - 分"
|
||||
return
|
||||
}
|
||||
mOrderNo = order.orderNo
|
||||
onOrderStatusChanged(order)
|
||||
if (TaxiOrderStatusEnum.ArriveAtEnd.code == order.orderStatus) {
|
||||
d(SceneConstant.M_TAXI + TAG, "已经达到终点")
|
||||
binding.taskStatus.setText(R.string.module_och_taxi_arrive_at_end_station2)
|
||||
updateOrderBottomBtn(
|
||||
getString(R.string.module_och_taxi_order_server_end),
|
||||
Color.parseColor("#FFFFFF"),
|
||||
Color.parseColor("#FF1D5EF3"),
|
||||
true
|
||||
)
|
||||
binding.taskStatus.text = "送乘客至"
|
||||
binding.endStationName.text = order.endSiteAddr
|
||||
} else if (TaxiOrderStatusEnum.OnTheWayToEnd.code == order.orderStatus) {
|
||||
d(SceneConstant.M_TAXI + TAG, "已经去往终点")
|
||||
binding.taskStatus.setText(R.string.module_och_taxi_on_the_way_2_end_station)
|
||||
updateOrderBottomBtn(
|
||||
getString(R.string.module_och_taxi_order_close),
|
||||
Color.parseColor("#FFFFFF"),
|
||||
Color.parseColor("#FF1D5EF3"),
|
||||
true
|
||||
)
|
||||
binding.taskStatus.text= "送乘客至"
|
||||
binding.endStationName.text = order.endSiteAddr
|
||||
} else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus
|
||||
|| TaxiOrderStatusEnum.ArriveAtStart.code == order.orderStatus
|
||||
) {
|
||||
val currentCale = DateTimeUtils.getCurrentDateTime()
|
||||
val currentHM = DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.HH_mm)
|
||||
val currentDay =
|
||||
DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd)
|
||||
val strHtml11 = ("<font color=\"#CAD6FF\">已于</font><br>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big><big>" + currentHM + "</big></big></font></b>"
|
||||
+ "<font color=\"#CAD6FF\">" + " " + "到达乘客上车地点</font>")
|
||||
|
||||
binding.taskStatus.text = "送乘客至"
|
||||
binding.endStationName.text = order.endSiteAddr
|
||||
currentCale.add(Calendar.MINUTE, 10)
|
||||
val strHtml13: String = if (currentDay == DateTimeUtil.formatCalendarToString(
|
||||
currentCale,
|
||||
DateTimeUtil.yyyy_MM_dd
|
||||
)
|
||||
) {
|
||||
("<font color=\"#CAD6FF\">免费等待至 </font>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big>" + DateTimeUtil.formatCalendarToString(
|
||||
currentCale,
|
||||
DateTimeUtil.HH_mm
|
||||
) + "</big></b></font>")
|
||||
} else {
|
||||
("<font color=\"#CAD6FF\">免费等待至</font>"
|
||||
+ "<font color=\"#FFFFFF\"><big>" + DateTimeUtil.formatCalendarToString(
|
||||
currentCale,
|
||||
DateTimeUtil.MM_dd_HH_mm
|
||||
) + "</big></font>")
|
||||
}
|
||||
binding.taskOtherInfo.text = Html.fromHtml(strHtml13,Html.FROM_HTML_MODE_LEGACY)
|
||||
if (TaxiOrderStatusEnum.ArriveAtStart.code == order.orderStatus) {
|
||||
d(SceneConstant.M_TAXI + TAG, "车辆已经达到起点")
|
||||
mPassengerInfoLayout!!.visibility = View.VISIBLE
|
||||
binding.orderPhoneAndNum.text = order.passengerPhone + " | "+ order.passengerNum + "人"
|
||||
binding.taskStatus.setText(R.string.module_och_taxi_waiting)
|
||||
updateOrderBottomBtn(
|
||||
getString(R.string.module_och_taxi_order_server_start_wait_check),
|
||||
Color.parseColor("#FFFFFF"),
|
||||
Color.parseColor("#FF1D5EF3"),
|
||||
true
|
||||
)
|
||||
} else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus) {
|
||||
d(SceneConstant.M_TAXI + TAG, "乘客已上车验证成功")
|
||||
mPassengerInfoLayout!!.visibility = View.GONE
|
||||
binding.taskStatus.setText(R.string.module_och_taxi_user_check_success)
|
||||
updateOrderBottomBtn(
|
||||
getString(R.string.module_och_taxi_order_server_start),
|
||||
Color.parseColor("#FFFFFF"),
|
||||
Color.parseColor("#FF1D5EF3"),
|
||||
true
|
||||
)
|
||||
}
|
||||
} else if (TaxiModel.checkCurrentOCHOrder()) {
|
||||
d(SceneConstant.M_TAXI + TAG, "前往乘客上车地点")
|
||||
|
||||
binding.orderPhoneAndNum.text = order.passengerPhone + " | "+ order.passengerNum + "人"
|
||||
|
||||
binding.taskStatus.setText(R.string.module_och_taxi_new_order)
|
||||
updateOrderBottomBtn(
|
||||
getString(R.string.module_och_taxi_order_server_start),
|
||||
Color.parseColor("#4DFFFFFF"),
|
||||
Color.parseColor("#4D1D5EF3"),
|
||||
false
|
||||
)
|
||||
|
||||
val currentCale = DateTimeUtils.getCurrentDateTime()
|
||||
val startCale = DateTimeUtil.formatLongToCalendar(order.bookingTime)
|
||||
val currentDay =
|
||||
DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd)
|
||||
val startDay =
|
||||
DateTimeUtil.formatCalendarToString(startCale, DateTimeUtil.yyyy_MM_dd)
|
||||
val strHtml1: String = if (currentDay == startDay) {
|
||||
("<font color=\"#CAD6FF\">乘客将于</font><br>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big><big>" + DateTimeUtil.formatCalendarToString(
|
||||
startCale,
|
||||
DateTimeUtil.HH_mm
|
||||
) + "</big></big></font></b>"
|
||||
+ "<font color=\"#CAD6FF\"> 用车</font>")
|
||||
} else {
|
||||
("<font color=\"#CAD6FF\">乘客将于</font><br>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big><big>" + DateTimeUtil.formatCalendarToString(
|
||||
startCale,
|
||||
DateTimeUtil.MM_dd_HH_mm
|
||||
) + "</big></big></font></b>"
|
||||
+ "<font color=\"#CAD6FF\"> 用车</font>")
|
||||
}
|
||||
taskOtherInfo.text = Html.fromHtml(strHtml1,Html.FROM_HTML_MODE_LEGACY)
|
||||
}
|
||||
} catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
|
||||
TaxiModel.clearCurrentOCHOrder()
|
||||
}
|
||||
}
|
||||
private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) {
|
||||
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
|
||||
val mCurLatitude = getChassisLocationGCJ02().latitude
|
||||
val mCurLongitude = getChassisLocationGCJ02().longitude
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"currentLatLng=$mCurLatitude $mCurLongitude"
|
||||
)
|
||||
val startNaviLatLng = NaviLatLng(mCurLatitude, mCurLongitude)
|
||||
val endNaviLatLng = NaviLatLng(stationLat, stationLng)
|
||||
AmapNaviToDestinationModel.getInstance(context).initAMapNavi(startNaviLatLng, endNaviLatLng)
|
||||
AmapNaviToDestinationModel.getInstance(context).setVoiceIsMute(isVoicePlay)
|
||||
AmapNaviToDestinationModel.getInstance(context).setOCHTaciNaviChangedCallback(this)
|
||||
}
|
||||
|
||||
private fun showOrHideNavi() {
|
||||
binding.naviToStart.visibility = View.GONE
|
||||
binding.naviToEnd.visibility = View.GONE
|
||||
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
|
||||
mTaxiFragment!!.showAmapNaviToStationFragment(false)
|
||||
mTaxiFragment!!.showRottingToStationFragment(false)
|
||||
}
|
||||
|
||||
/**
|
||||
* 剩余里程和剩余时间
|
||||
* @param meters m
|
||||
* @param timeInSecond 秒
|
||||
*/
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
fun updateDistanceAndTime(meters: Long, timeInSecond: Long) {
|
||||
// CallerLogger.INSTANCE.d(M_TAXI + TAG,"meters = "+meters+"timeInSecond ="+timeInSecond);
|
||||
var dis = "0"
|
||||
var disUnit = "公里"
|
||||
if (meters > 0) {
|
||||
if (meters / 1000 < 1) {
|
||||
disUnit = "米"
|
||||
dis = meters.toFloat().roundToInt().toString()
|
||||
} else {
|
||||
disUnit = "公里"
|
||||
dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
|
||||
}
|
||||
}
|
||||
val min = ceil(timeInSecond.toDouble() / 60f).toInt()
|
||||
val strHtml2 =
|
||||
("<font color=\"#CAD6FF\">里程 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> " + disUnit + "</font>"
|
||||
+ "<font color=\"#CAD6FF\">,剩余 </font>" + "<b><font color=\"#FFFFFF\">" + min + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>")
|
||||
try {
|
||||
if (mCurrentOrder != null && mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code) { //前往上车点
|
||||
binding.taskOtherInfo.text = Html.fromHtml(strHtml2,Html.FROM_HTML_MODE_LEGACY)
|
||||
if (binding.naviToStart.visibility == View.GONE) {
|
||||
binding.naviToStart.visibility = View.VISIBLE
|
||||
}
|
||||
} else if (mCurrentOrder != null && mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code) { //前往终点 时间单位是分钟
|
||||
if (binding.naviToEnd.visibility == View.GONE) {
|
||||
binding.naviToEnd.visibility = View.VISIBLE
|
||||
}
|
||||
if (mTtsLessThan200Tip < 1 && meters <= 250 && meters > 150) {
|
||||
speekVoice200mTipsOnce()
|
||||
}
|
||||
binding.taskOtherInfo.text = Html.fromHtml(strHtml2,Html.FROM_HTML_MODE_LEGACY)
|
||||
if (isFirstStartAutopilotDone) {
|
||||
showNotice(
|
||||
String.format(
|
||||
resources
|
||||
.getString(R.string.module_och_taxi_order_server_start_auto_tip),
|
||||
dis, disUnit, min
|
||||
)
|
||||
)
|
||||
isFirstStartAutopilotDone = false
|
||||
}
|
||||
}
|
||||
} catch (_: NullPointerException) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun speekVoice200mTipsOnce() {
|
||||
mTtsLessThan200Tip = 1
|
||||
showNotice(resources.getString(R.string.module_och_taxi_order_arrive_end_200m_tip))
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
fun onCurrentOrderRouteInfoGot(routeInfo: OrderQueryRouteInfoRespBean.Result?) { // 单位 米, 秒
|
||||
if (routeInfo == null) return
|
||||
d(SceneConstant.M_TAXI + TAG, "durationToEnd = " + routeInfo.durationToEnd)
|
||||
var dis = "0"
|
||||
val distance = routeInfo.distanceToEnd
|
||||
val duration = routeInfo.durationToEnd
|
||||
if (routeInfo.distanceToEnd > 0) {
|
||||
dis = NumberFormatUtil.formatLong(distance.toDouble() / 1000)
|
||||
}
|
||||
val strHtml2 =
|
||||
("<font color=\"#CAD6FF\">全程 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> 公里</font>"
|
||||
+ "<font color=\"#CAD6FF\">,总用时 </font>" + "<b><font color=\"#FFFFFF\">" + ceil(
|
||||
duration.toDouble() / 60
|
||||
).toInt() + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>")
|
||||
|
||||
binding.taskOtherInfo.text = Html.fromHtml(strHtml2,Html.FROM_HTML_MODE_LEGACY)
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
|
||||
}
|
||||
|
||||
private fun startOrEndService() {
|
||||
if (mCurrentOrder == null) return
|
||||
if (TaxiOrderStatusEnum.ArriveAtStart.code == mCurrentOrder!!.orderStatus) { //到达乘客上车点,司机可跳过乘客屏认证
|
||||
mViewModel?.let {
|
||||
it.sendUiIntent(UnmannedIntent.JumpPassengerCheckDone)
|
||||
}
|
||||
} else if (TaxiOrderStatusEnum.ArriveAtEnd.code == mCurrentOrder!!.orderStatus) { //点击了完成服务,结束订单并更新订单信息
|
||||
mViewModel?.let {
|
||||
it.sendUiIntent(UnmannedIntent.JourneyCompleted)
|
||||
}
|
||||
} else if (TaxiOrderStatusEnum.OnTheWayToEnd.code == mCurrentOrder!!.orderStatus) { //前往目的地过程中可提前结束行程
|
||||
//自驾中提示,接管后才能结束
|
||||
if (getState()
|
||||
== IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
|
||||
) {
|
||||
ToastUtils.showLong(R.string.taxi_switch_line_btn_warning1)
|
||||
} else {
|
||||
closeOrderDialog()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun closeOrderDialog() {
|
||||
val builder = OCHCommitDialog.Builder()
|
||||
val closeOrderDialog = builder
|
||||
.title(getString(R.string.dialog_order_close_title))
|
||||
.tips(getString(R.string.dialog_order_close_content))
|
||||
.confirmStr(getString(R.string.dialog_order_close_confirm))
|
||||
.cancelStr(getString(R.string.dialog_order_close_cancel))
|
||||
.build(requireContext())
|
||||
closeOrderDialog!!.setClickListener(object : OCHCommitDialog.ClickListener {
|
||||
override fun confirm() {
|
||||
mViewModel?.let {
|
||||
it.sendUiIntent(UnmannedIntent.CloseOrderByDriver)
|
||||
}
|
||||
}
|
||||
|
||||
override fun cancel() {
|
||||
closeOrderDialog.dismiss()
|
||||
}
|
||||
})
|
||||
closeOrderDialog.show()
|
||||
}
|
||||
|
||||
private fun onOrderStatusChanged(order: OrderQueryRespBean.Result) {
|
||||
val status = order.orderStatus
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"status==$status"
|
||||
)
|
||||
mCurrentOrder = order
|
||||
mActivity!!.runOnUiThread {
|
||||
if (status == TaxiOrderStatusEnum.None.code || status == TaxiOrderStatusEnum.Cancel.code || status == TaxiOrderStatusEnum.JourneyCompleted.code) {
|
||||
isHaveBeingOrder(false)
|
||||
mCurrentOrder = null
|
||||
clearOrderTag()
|
||||
} else {
|
||||
isHaveBeingOrder(true)
|
||||
}
|
||||
if (status != saveOrderState) {
|
||||
val ochStatus =
|
||||
valueOf(status)
|
||||
when (ochStatus) {
|
||||
TaxiOrderStatusEnum.OnTheWayToStart -> {
|
||||
binding.cancelOrder.visibility = View.VISIBLE
|
||||
showNotice(
|
||||
mActivity!!.getString(
|
||||
R.string.module_och_taxi_new_order
|
||||
)
|
||||
)
|
||||
mTtsLessThan200Tip = 0
|
||||
isFirstStartAutopilotDone = true
|
||||
val orderStartStationLat = order.startSiteGcjPoint[1]
|
||||
val orderStartStationLng = order.startSiteGcjPoint[0]
|
||||
startNaviToStation(false, orderStartStationLat, orderStartStationLng)
|
||||
setOrRemoveMapMaker(
|
||||
true,
|
||||
TaxiConst.TAXI_START_MAP_MAKER,
|
||||
order.startSitePoint,
|
||||
R.raw.star_marker
|
||||
)
|
||||
setOrRemoveMapMaker(
|
||||
true,
|
||||
TaxiConst.TAXI_END_MAP_MAKER,
|
||||
order.endSitePoint,
|
||||
R.raw.end_marker
|
||||
)
|
||||
}
|
||||
|
||||
TaxiOrderStatusEnum.Cancel -> {
|
||||
mCurrentOrder = null
|
||||
mTtsLessThan200Tip = 0
|
||||
isFirstStartAutopilotDone = true
|
||||
binding.cancelOrder.visibility = View.VISIBLE
|
||||
//VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel));
|
||||
showOrHideNavi()
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_START_MAP_MAKER,
|
||||
order.startSitePoint,
|
||||
R.raw.star_marker
|
||||
)
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_END_MAP_MAKER,
|
||||
order.endSitePoint,
|
||||
R.raw.end_marker
|
||||
)
|
||||
clearSmallMapRouteLine()
|
||||
}
|
||||
|
||||
TaxiOrderStatusEnum.ArriveAtStart, TaxiOrderStatusEnum.UserArriveAtStart -> {
|
||||
mTtsLessThan200Tip = 0
|
||||
isFirstStartAutopilotDone = true
|
||||
binding.cancelOrder.visibility = View.VISIBLE
|
||||
if (TaxiOrderStatusEnum.UserArriveAtStart.code == ochStatus.code) {
|
||||
showNotice(
|
||||
mActivity!!.getString(
|
||||
R.string.module_och_taxi_order_status_ph_text_check_success
|
||||
)
|
||||
)
|
||||
} else {
|
||||
showNotice(
|
||||
mActivity!!.getString(
|
||||
R.string.module_och_taxi_order_status_ph_text
|
||||
)
|
||||
)
|
||||
}
|
||||
showOrHideNavi()
|
||||
setOrRemoveMapMaker(
|
||||
true,
|
||||
TaxiConst.TAXI_START_MAP_MAKER,
|
||||
order.startSitePoint,
|
||||
R.raw.star_marker
|
||||
)
|
||||
setOrRemoveMapMaker(
|
||||
true,
|
||||
TaxiConst.TAXI_END_MAP_MAKER,
|
||||
order.endSitePoint,
|
||||
R.raw.end_marker
|
||||
)
|
||||
}
|
||||
|
||||
TaxiOrderStatusEnum.OnTheWayToEnd -> {
|
||||
// showNotice("欢迎使用蘑菇智行");
|
||||
binding.cancelOrder.visibility = View.VISIBLE
|
||||
|
||||
if (mTaxiFragment != null) {
|
||||
showNaviToEndStationFragment(false)
|
||||
}
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_START_MAP_MAKER,
|
||||
order.startSitePoint,
|
||||
R.raw.star_marker
|
||||
)
|
||||
setOrRemoveMapMaker(
|
||||
true,
|
||||
TaxiConst.TAXI_END_MAP_MAKER,
|
||||
order.endSitePoint,
|
||||
R.raw.end_marker
|
||||
)
|
||||
}
|
||||
|
||||
TaxiOrderStatusEnum.ArriveAtEnd -> {
|
||||
mTtsLessThan200Tip = 0
|
||||
binding.cancelOrder.visibility = View.GONE
|
||||
showNotice(
|
||||
mActivity!!.getString(
|
||||
R.string.module_och_taxi_order_auto_arrive_end_tip
|
||||
)
|
||||
)
|
||||
showOrHideNavi()
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_START_MAP_MAKER,
|
||||
order.startSitePoint,
|
||||
R.raw.star_marker
|
||||
)
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_END_MAP_MAKER,
|
||||
order.endSitePoint,
|
||||
R.raw.end_marker
|
||||
)
|
||||
clearSmallMapRouteLine()
|
||||
}
|
||||
|
||||
TaxiOrderStatusEnum.JourneyCompleted -> {
|
||||
mCurrentOrder = null
|
||||
mTtsLessThan200Tip = 0
|
||||
isFirstStartAutopilotDone = true
|
||||
binding.cancelOrder.visibility = View.GONE
|
||||
showNotice("感谢您使用蘑菇智行,再见~")
|
||||
showOrHideNavi()
|
||||
}
|
||||
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
saveOrderState = status
|
||||
}
|
||||
}
|
||||
|
||||
private fun clearOrderTag() {
|
||||
saveOrderState = -1
|
||||
binding.taskOtherInfo.text = "距离 - - 公里,用时 - - 分"
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有正在进行的订单,进行UI显示
|
||||
*
|
||||
* @param being
|
||||
*/
|
||||
private fun isHaveBeingOrder(being: Boolean) {
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"isHaveBeingOrder = $being"
|
||||
)
|
||||
try {
|
||||
if (being) {
|
||||
mNoDataView!!.visibility = View.GONE
|
||||
mBeingOrderLayout!!.visibility = View.VISIBLE
|
||||
mTaxiFragment!!.changeOperationViewVisible(View.GONE)
|
||||
clearSmallMapRouteLine()
|
||||
} else {
|
||||
mNoDataView!!.visibility = View.VISIBLE
|
||||
mNoDatasTv!!.text = "暂无进行中订单"
|
||||
mBeingOrderLayout!!.visibility = View.GONE
|
||||
mTaxiFragment!!.changeOperationViewVisible(View.VISIBLE)
|
||||
}
|
||||
} catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
|
||||
TaxiModel.clearCurrentOCHOrder()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onClick(v: View) {
|
||||
if (v.id == binding.taskStatus.id) {
|
||||
d(SceneConstant.M_TAXI + TAG, binding.taskStatus.text.toString())
|
||||
startOrEndService()
|
||||
} else if (v.id == binding.cancelOrder.id) {
|
||||
TaxiOrderCancelDialog(mTaxiFragment, mActivity, mOrderNo, saveOrderState).show()
|
||||
} else if (v.id == binding.naviToStart.id) {
|
||||
if (mTaxiFragment != null) {
|
||||
showNaviToStartStationFragment()
|
||||
}
|
||||
} else if (v.id == binding.naviToEnd.id) {
|
||||
if (mTaxiFragment != null) {
|
||||
showNaviToEndStationFragment(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示/隐藏 前往乘客上车点的导航
|
||||
**/
|
||||
private fun showNaviToStartStationFragment() {
|
||||
if (mCurrentOrder != null &&
|
||||
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
|
||||
) {
|
||||
val orderStartStationLat = mCurrentOrder!!.startSiteGcjPoint[1]
|
||||
val orderStartStationLng = mCurrentOrder!!.startSiteGcjPoint[0]
|
||||
mTaxiFragment!!.showAmapNaviToStationFragment(true)
|
||||
startNaviToStation(true, orderStartStationLat, orderStartStationLng)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示/隐藏 前往乘客目的地的导航
|
||||
*
|
||||
* @param isShow
|
||||
*/
|
||||
private fun showNaviToEndStationFragment(isShow: Boolean) {
|
||||
mTaxiFragment!!.startNaviToEndStation(isShow)
|
||||
}
|
||||
|
||||
fun onCurrentOrderCancelDone() {
|
||||
//去除起终点
|
||||
if (mCurrentOrder != null) {
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_START_MAP_MAKER,
|
||||
mCurrentOrder!!.startSitePoint,
|
||||
R.raw.star_marker
|
||||
)
|
||||
setOrRemoveMapMaker(
|
||||
false,
|
||||
TaxiConst.TAXI_END_MAP_MAKER,
|
||||
mCurrentOrder!!.endSitePoint,
|
||||
R.raw.end_marker
|
||||
)
|
||||
}
|
||||
clearSmallMapRouteLine()
|
||||
//提交取消订单后的回调
|
||||
ToastUtils.showShort("订单取消成功")
|
||||
//更新界面
|
||||
isHaveBeingOrder(false)
|
||||
showOrHideNavi()
|
||||
clearOrderTag()
|
||||
}
|
||||
|
||||
private fun clearSmallMapRouteLine() {
|
||||
// CallerSmpManager.clearPolyline();
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单流转debug START
|
||||
*/
|
||||
private fun initOrderTestBar() {
|
||||
binding.taskStatus.setOnLongClickListener {
|
||||
mTaxiFragment!!.clickTestBar()
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) {
|
||||
updateDistanceAndTime(meters.toLong(), timeInSecond)
|
||||
if (mCurrentOrder != null
|
||||
&& mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
|
||||
) {
|
||||
mTaxiFragment!!.reportToEndDisAndTime(meters, timeInSecond)
|
||||
}
|
||||
}
|
||||
|
||||
override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) {
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"isPlay = $isPlay, isRestart=$isRestart"
|
||||
)
|
||||
if (!isRestart) {
|
||||
mTaxiFragment!!.showAmapNaviToStationFragment(false)
|
||||
return
|
||||
}
|
||||
UiThreadHandler.postDelayed({
|
||||
if (mCurrentOrder != null &&
|
||||
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
|
||||
) {
|
||||
val orderStartStationLat = mCurrentOrder!!.startSiteGcjPoint[1]
|
||||
val orderStartStationLng = mCurrentOrder!!.startSiteGcjPoint[0]
|
||||
startNaviToStation(false, orderStartStationLat, orderStartStationLng)
|
||||
}
|
||||
}, 2000)
|
||||
UiThreadHandler.postDelayed({
|
||||
if (mCurrentOrder != null &&
|
||||
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
|
||||
) {
|
||||
if (binding.naviToStart.visibility == View.GONE) {
|
||||
binding.naviToStart.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
if (mCurrentOrder != null &&
|
||||
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
|
||||
) {
|
||||
if (binding.naviToEnd.visibility == View.GONE) {
|
||||
binding.naviToEnd.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
}, 3000)
|
||||
}
|
||||
|
||||
fun onNaviToEndAmap(isShow: Boolean) {
|
||||
if (mCurrentOrder != null &&
|
||||
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
|
||||
) {
|
||||
val orderEndStationLat = mCurrentOrder!!.endSiteGcjPoint[1]
|
||||
val orderEndStationLng = mCurrentOrder!!.endSiteGcjPoint[0]
|
||||
mTaxiFragment!!.showAmapNaviToStationFragment(isShow)
|
||||
startNaviToStation(isShow, orderEndStationLat, orderEndStationLng)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制地图起点终点
|
||||
* @param isAdd
|
||||
* @param uuid
|
||||
* @param station
|
||||
*/
|
||||
private fun setOrRemoveMapMaker(
|
||||
isAdd: Boolean,
|
||||
uuid: String,
|
||||
station: List<Double>,
|
||||
resourceId: Int
|
||||
) {
|
||||
if (isAdd) {
|
||||
//开启线程执行起终点marker设置
|
||||
val setMapMarkerRunnable = Runnable {
|
||||
d(
|
||||
SceneConstant.M_TAXI + "setMapMaker= " + Thread.currentThread()
|
||||
.name,
|
||||
uuid + "=latitude=" + station[1] + ",longitude=" + station[0]
|
||||
)
|
||||
val builder =
|
||||
Point.Options.Builder(
|
||||
TaxiConst.TYPE_MARKER_TAXI_ORDER,
|
||||
Level.MAP_MARKER
|
||||
)
|
||||
.setId(uuid)
|
||||
.anchor(0.5f, 0.5f)
|
||||
.set3DMode(true)
|
||||
.isUseGps(true)
|
||||
.controlAngle(true)
|
||||
.icon3DRes(resourceId)
|
||||
.latitude(station[1])
|
||||
.longitude(station[0])
|
||||
val mapUIController =
|
||||
getMapUIController()
|
||||
if (mapUIController != null) {
|
||||
val centerLine =
|
||||
mapUIController.getCenterLineInfo(
|
||||
station[0], station[1], -1f
|
||||
)
|
||||
if (null != centerLine) { // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致
|
||||
val angle = centerLine.angle
|
||||
if (angle != null) {
|
||||
builder.rotate(angle.toFloat())
|
||||
}
|
||||
}
|
||||
}
|
||||
val overlayManager =
|
||||
getOverlayManager()
|
||||
overlayManager?.showOrUpdatePoint(builder.build())
|
||||
}
|
||||
OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable)
|
||||
} else {
|
||||
//开启线程移除起终点marker设置
|
||||
val removeMapMarkerRunnable = Runnable {
|
||||
d(
|
||||
SceneConstant.M_TAXI + "RemoveMapMaker=" + Thread.currentThread()
|
||||
.name,
|
||||
uuid + "=latitude=" + station[1] + ",longitude=" + station[0]
|
||||
)
|
||||
// Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerManager(AbsMogoApplication.getApp())).removeMarkers(uuid);
|
||||
val overlayManager =
|
||||
getOverlayManager()
|
||||
overlayManager?.removePoint(uuid)
|
||||
}
|
||||
OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable)
|
||||
}
|
||||
}
|
||||
|
||||
fun updateOrderBottomBtnUI() {
|
||||
mViewModel?.let {
|
||||
it.sendUiIntent(UnmannedIntent.StartTask)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateOrderBottomBtn(txt: String?, txtColorId: Int, bgColorId: Int, isClickable: Boolean) {
|
||||
binding.taskClickBtn.text = txt
|
||||
binding.taskClickBtn.setTextColor(txtColorId)
|
||||
val background =
|
||||
binding.taskClickBtn.background as GradientDrawable //GradientDrawable是Drawable的子类
|
||||
background.setColor(bgColorId)
|
||||
binding.taskClickBtn.isClickable = isClickable
|
||||
}
|
||||
|
||||
/**
|
||||
* END
|
||||
*/
|
||||
companion object {
|
||||
const val TAG = "OCHTaxiBeingServerd"
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var mActivity: Activity? = null
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var mTaxiFragment: TaxiFragment? = null
|
||||
fun newInstance(
|
||||
activity: Activity?,
|
||||
taxiFragment: TaxiFragment?
|
||||
): TaxiBeingTaskFragment {
|
||||
mActivity = activity
|
||||
mTaxiFragment = taxiFragment
|
||||
val args = Bundle()
|
||||
val fragment = TaxiBeingTaskFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,313 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import com.alibaba.android.arouter.launcher.ARouter
|
||||
import com.mogo.commons.module.status.MogoStatusManager
|
||||
import com.mogo.eagle.core.data.temp.EventLogout
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.och.common.module.biz.constant.OchCommonConst
|
||||
import com.mogo.och.common.module.biz.provider.LoginService
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.BaseTaxiTabFragment
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean
|
||||
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
|
||||
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
|
||||
import com.mogo.och.taxi.model.TaxiModel
|
||||
import com.mogo.och.taxi.network.LoginBusImpl
|
||||
import com.mogo.och.taxi.presenter.TaxiPresenter
|
||||
import com.mogo.och.taxi.utils.TPRouteDataTestUtils
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.greenrobot.eventbus.Subscribe
|
||||
import org.greenrobot.eventbus.ThreadMode
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiFragment {
|
||||
*/
|
||||
public class TaxiFragment : BaseTaxiTabFragment<TaxiFragment, TaxiPresenter>(),
|
||||
ITaxiView {
|
||||
private var serverOrdersFragmentWR: WeakReference<TaxiServerOrdersFragment?>? = null
|
||||
private var personalDialogFragment: WeakReference<TaxiPersonalDialogFragment>? = null
|
||||
private var loginService: LoginService? = null
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
super.onActivityCreated(savedInstanceState)
|
||||
loginService =
|
||||
ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService
|
||||
if (loginService != null) {
|
||||
loginService!!.registerFragment(this, getPresenter(), LoginBusImpl())
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
EventBus.getDefault().register(this)
|
||||
return super.onCreateView(inflater, container, savedInstanceState)
|
||||
}
|
||||
|
||||
override fun getStationPanelViewId(): Int {
|
||||
return R.layout.taxi_panel
|
||||
}
|
||||
|
||||
override fun startAutopilot() {
|
||||
// 在自动驾驶中,或者自己确认车辆环境可开启自动驾驶 则可点击
|
||||
if ((mPresenter.curOrderStatus === TaxiOrderStatusEnum.OnTheWayToEnd ||
|
||||
mPresenter.curOrderStatus === TaxiOrderStatusEnum.UserArriveAtStart)
|
||||
&& !isStarting
|
||||
) {
|
||||
d(SceneConstant.M_TAXI + TAG, "startAutopilot")
|
||||
mPresenter.startAutoPilot()
|
||||
}
|
||||
}
|
||||
|
||||
override fun startNaviToEndStation(isShow: Boolean) {
|
||||
mPresenter.startNaviToEndStation(isShow)
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
return "TaxiFragment"
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
super.initViews()
|
||||
initFragment()
|
||||
hidPanel()
|
||||
switchVRFlatMode(MogoStatusManager.getInstance().isVrMode)
|
||||
tvOperationStatus?.visibility = View.VISIBLE
|
||||
initOrderTestBar()
|
||||
}
|
||||
|
||||
private fun initFragment() {
|
||||
serverOrdersFragmentWR = WeakReference(TaxiServerOrdersFragment.newInstance())
|
||||
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
|
||||
//默认显示OCHTaxiServerOrdersFragment
|
||||
transaction.add(R.id.fragment_container, serverOrdersFragmentWR!!.get()!!).show(
|
||||
serverOrdersFragmentWR!!.get()!!
|
||||
)
|
||||
transaction.commitAllowingStateLoss()
|
||||
}
|
||||
|
||||
fun showServerFragmentAndUpdate() {
|
||||
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
|
||||
if (serverOrdersFragmentWR == null || serverOrdersFragmentWR!!.get() == null) {
|
||||
serverOrdersFragmentWR = WeakReference(TaxiServerOrdersFragment.newInstance())
|
||||
transaction.add(R.id.fragment_container, serverOrdersFragmentWR!!.get()!!)
|
||||
.show(serverOrdersFragmentWR!!.get()!!)
|
||||
}
|
||||
}
|
||||
|
||||
override fun createPresenter(): TaxiPresenter {
|
||||
return TaxiPresenter(this)
|
||||
}
|
||||
|
||||
override fun onChangeOperationStatus() {
|
||||
super.onChangeOperationStatus()
|
||||
mPresenter.updateCarStatus()
|
||||
}
|
||||
|
||||
fun switchVRFlatMode(isVRMode: Boolean) {
|
||||
if (mRootView != null) {
|
||||
mRootView.visibility = if (isVRMode) View.VISIBLE else View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
super.onDestroyView()
|
||||
loginService!!.unRegisterFragment()
|
||||
loginService = null
|
||||
EventBus.getDefault().unregister(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* 状态变更
|
||||
* @param inOperation true 可以接单 false 暂停接单
|
||||
* @param role 测试车辆:测试 演示车辆:V 运营车辆: ""空
|
||||
*/
|
||||
fun updateOperationStatus(inOperation: Boolean, role: String?) {
|
||||
e(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"onOperationChanged:$inOperation"
|
||||
)
|
||||
if (inOperation) {
|
||||
if (!TextUtils.isEmpty(role)) {
|
||||
mDriverRole?.visibility = View.VISIBLE
|
||||
mDriverRole?.text = role
|
||||
} else {
|
||||
mDriverRole?.visibility = View.GONE
|
||||
}
|
||||
tvOperationStatus?.text = "暂停接单"
|
||||
tvOperationStatus?.setCompoundDrawablesWithIntrinsicBounds(
|
||||
resources.getDrawable(R.drawable.shape_size_operation_back),
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
showPanel()
|
||||
} else {
|
||||
mDriverRole?.visibility = View.GONE
|
||||
tvOperationStatus?.text = "接单"
|
||||
tvOperationStatus?.setCompoundDrawablesWithIntrinsicBounds(
|
||||
resources.getDrawable(R.drawable.shape_size_operation_out),
|
||||
null,
|
||||
null,
|
||||
null
|
||||
)
|
||||
hidPanel()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onMapLoaded() {}
|
||||
fun updateAutopilotStatus(status: Int) {
|
||||
onAutopilotStatusChanged(status)
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
fun updateCurrentOrderStatusChanged(order: OrderQueryRespBean.Result?) {
|
||||
if (serverOrdersFragmentWR != null && serverOrdersFragmentWR!!.get() != null) {
|
||||
serverOrdersFragmentWR!!.get()!!.updateCurrentOrderStatusChanged(order)
|
||||
}
|
||||
updateTaxiTestBarInfo() //更新调试bar中信息
|
||||
}
|
||||
|
||||
fun onNaviToEnd(isAmap: Boolean, isShow: Boolean) {
|
||||
if (isAmap) {
|
||||
if (null == serverOrdersFragmentWR || serverOrdersFragmentWR!!.get() == null) return
|
||||
serverOrdersFragmentWR!!.get()!!.onNaviToEndAmap(isShow)
|
||||
} else if (isShow) { //使用rotting数据
|
||||
showRottingToStationFragment(true)
|
||||
} else {
|
||||
showAmapNaviToStationFragment(false)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 高德计算出来的到达目的地的剩余里程和时间
|
||||
* @param meters
|
||||
* @param timeInSecond
|
||||
*/
|
||||
fun reportToEndDisAndTime(meters: Int, timeInSecond: Long) { //米/秒
|
||||
mPresenter.reportToEndDisAndTime(meters.toString().toLong(), timeInSecond)
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单流转debug START
|
||||
*/
|
||||
private fun initOrderTestBar() {
|
||||
findViewById<View>(R.id.test_bar_to_start)?.setOnClickListener {
|
||||
TaxiModel.setArriveAtStartStation()
|
||||
}
|
||||
findViewById<View>(R.id.test_bar_to_end)?.setOnClickListener {
|
||||
TaxiModel.setArriveAtEndStation()
|
||||
}
|
||||
|
||||
findViewById<View>(R.id.test_bar_on_the_way_to_end)?.setOnClickListener {
|
||||
if (!isStarting) {
|
||||
mPresenter.startAutoPilot()
|
||||
}
|
||||
TaxiModel.setOnTheWayToEndStation()
|
||||
}
|
||||
findViewById<View>(R.id.test_bar_route)?.setOnClickListener { testRouteInfoUpload() }
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun changeOverview(eventLogout: EventLogout) {
|
||||
if (eventLogout.messgae == EventLogout.LOGOUT_TYPE) {
|
||||
d(SceneConstant.M_TAXI + TAG, "changeOverview Event消息去登出")
|
||||
mPresenter.logout()
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
fun openOperationalInfoView(eventLogout: EventLogout) {
|
||||
if (eventLogout.messgae == EventLogout.PERSONAL_TYPE) {
|
||||
d(SceneConstant.M_TAXI + TAG, "openOperationalInfoView Event个人中心")
|
||||
openOperationalInfoView()
|
||||
}
|
||||
}
|
||||
|
||||
private fun openOperationalInfoView() {
|
||||
personalDialogFragment = WeakReference(TaxiPersonalDialogFragment())
|
||||
activity?.supportFragmentManager?.let {
|
||||
personalDialogFragment!!.get()
|
||||
?.show(it, "service_data")
|
||||
}
|
||||
}
|
||||
|
||||
private fun testRouteInfoUpload() {
|
||||
TPRouteDataTestUtils.converToRouteData()
|
||||
}
|
||||
|
||||
//region Taxi调试信息:订单、线路、轨迹等信息
|
||||
private var testBar: View? = null
|
||||
private var testCurOrderId: TextView? = null
|
||||
private var testCurLineId: TextView? = null
|
||||
private var testCurTrajMd5: TextView? = null
|
||||
private var testCurStopMd5: TextView? = null
|
||||
private var testCurTrajMd5DPQP: TextView? = null
|
||||
private var testCurStopMd5DPQP: TextView? = null
|
||||
@SuppressLint("SetTextI18n")
|
||||
fun clickTestBar() {
|
||||
if (testBar == null) {
|
||||
testBar = findViewById<View>(R.id.module_och_taxi_order_status_change_test_bar)
|
||||
testCurOrderId = findViewById<TextView>(R.id.test_bar_current_order_id)
|
||||
testCurLineId = findViewById<TextView>(R.id.test_bar_current_line_id)
|
||||
testCurTrajMd5 = findViewById<TextView>(R.id.test_bar_current_traj_md5)
|
||||
testCurStopMd5 = findViewById<TextView>(R.id.test_bar_current_stop_md5)
|
||||
testCurTrajMd5DPQP = findViewById<TextView>(R.id.test_bar_current_traj_md5_dpqp)
|
||||
testCurStopMd5DPQP = findViewById<TextView>(R.id.test_bar_current_stop_md5_dpqp)
|
||||
}
|
||||
if (testBar!!.visibility == View.VISIBLE) {
|
||||
testBar!!.visibility = View.GONE
|
||||
} else {
|
||||
val order = TaxiModel.getCurrentOCHOrder()
|
||||
testCurOrderId!!.text = "orderNo:" + (order?.orderNo?.toString() ?: "")
|
||||
testCurLineId!!.text = "lineId:" + (order?.lineId?.toString() ?: "")
|
||||
testCurTrajMd5!!.text = "TMd5:" + if (order == null) "" else order.csvFileMd5
|
||||
testCurStopMd5!!.text = "SMd5:" + if (order == null) "" else order.txtFileMd5
|
||||
testCurTrajMd5DPQP!!.text =
|
||||
"TMd5DPQP:" + if (order == null) "" else order.csvFileMd5DPQP
|
||||
testCurStopMd5DPQP!!.text =
|
||||
"SMd5DPQP:" + if (order == null) "" else order.txtFileMd5DPQP
|
||||
testBar!!.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun updateTaxiTestBarInfo() {
|
||||
if (testBar != null && testBar!!.visibility == View.VISIBLE) {
|
||||
val order = TaxiModel.getCurrentOCHOrder()
|
||||
testCurOrderId!!.text = "orderNo:" + (order?.orderNo?.toString() ?: "")
|
||||
testCurLineId!!.text = "lineId:" + (order?.lineId?.toString() ?: "")
|
||||
testCurTrajMd5!!.text = "TMd5:" + if (order == null) "" else order.csvFileMd5
|
||||
testCurStopMd5!!.text = "SMd5:" + if (order == null) "" else order.txtFileMd5
|
||||
testCurTrajMd5DPQP!!.text =
|
||||
"TMd5DPQP:" + if (order == null) "" else order.csvFileMd5DPQP
|
||||
testCurStopMd5DPQP!!.text =
|
||||
"SMd5DPQP:" + if (order == null) "" else order.txtFileMd5DPQP
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "TaxiFragment"
|
||||
fun newInstance(): TaxiFragment {
|
||||
val args = Bundle()
|
||||
val fragment = TaxiFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -268,12 +268,12 @@ class TaxiMapDirectionView @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
fun setCoordinatesLatLng(
|
||||
routeArrivied: List<LatLng>?,
|
||||
routeArriving: List<LatLng>?,
|
||||
routeArrived: List<LatLng>,
|
||||
routeArriving: List<LatLng>,
|
||||
location: MogoLocation?
|
||||
) {
|
||||
this.routeArrivied.clear()
|
||||
this.routeArrivied.addAll(routeArrivied!!)
|
||||
this.routeArrivied.addAll(routeArrived!!)
|
||||
this.routeArriving.clear()
|
||||
this.routeArriving.addAll(routeArriving!!)
|
||||
this.location = location
|
||||
|
||||
@@ -1,7 +1,138 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.Html
|
||||
import android.text.TextUtils
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.mogo.och.common.module.utils.DateTimeUtil
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.BaseTaxiUIFragment
|
||||
import com.mogo.och.taxi.model.TaxiModel
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiOperationDatasFragment {
|
||||
*/
|
||||
class TaxiOperationDatasFragment : BaseTaxiUIFragment() {
|
||||
private var mRecyclerView: RecyclerView? = null
|
||||
private val mDurationData: MutableList<Long> = ArrayList()
|
||||
private val mOrderNumData: MutableList<Long> = ArrayList()
|
||||
private val mData: MutableList<Long> = ArrayList()
|
||||
private var mAdapter: OperationDataAdapter? = null
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.taxi_operation_data_view
|
||||
}
|
||||
|
||||
override fun initViews(view: View) {
|
||||
mRecyclerView = view.findViewById<RecyclerView>(R.id.operation_data_recycler_view)
|
||||
mRecyclerView!!.layoutManager = LinearLayoutManager(mContext)
|
||||
mContext?.let {
|
||||
mAdapter = OperationDataAdapter(it, mData)
|
||||
mRecyclerView!!.adapter = mAdapter
|
||||
initDatas()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun initDatas() {
|
||||
TaxiModel.queryDriverServiceData()
|
||||
}
|
||||
|
||||
fun setType(type: Int) {
|
||||
mType = type
|
||||
mData.clear()
|
||||
if (mType == 0) {
|
||||
mData.addAll(mDurationData)
|
||||
} else if (mType == 1) {
|
||||
mData.addAll(mOrderNumData)
|
||||
}
|
||||
if (mAdapter != null) mAdapter!!.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
fun updateData(dailyTimeDuration: Long, dailyOrderNum: Long) {
|
||||
mDurationData.clear()
|
||||
mOrderNumData.clear()
|
||||
mData.clear()
|
||||
mDurationData.add(dailyTimeDuration)
|
||||
mOrderNumData.add(dailyOrderNum)
|
||||
mData.addAll(mDurationData)
|
||||
if (mAdapter != null) mAdapter!!.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
internal inner class OperationDataAdapter(
|
||||
private val context: Context,
|
||||
private val datas: List<Long>
|
||||
) :
|
||||
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
override fun onCreateViewHolder(
|
||||
parent: ViewGroup,
|
||||
viewType: Int
|
||||
): RecyclerView.ViewHolder {
|
||||
val view: View = LayoutInflater.from(context)
|
||||
.inflate(R.layout.taxi_operation_data_item_view, parent, false)
|
||||
return OperationDataViewHolder(view)
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||
if (holder is OperationDataViewHolder) {
|
||||
if (0 == mType) {
|
||||
val hourData = if (TextUtils.isEmpty(
|
||||
DateTimeUtil.secondsToHourStr(
|
||||
datas[position]
|
||||
)
|
||||
)
|
||||
) "0" else DateTimeUtil.secondsToHourStr(datas[position])
|
||||
val minuteData = DateTimeUtil.secondsToMinuteStr(datas[position])
|
||||
val data =
|
||||
"<font><b><big><big><big>$hourData</big></big></big></b> 时 </font><font><b><big><big><big>$minuteData</big></big></big></b> 分</font>"
|
||||
holder.operationDataTv.text = Html.fromHtml(data,Html.FROM_HTML_MODE_LEGACY)
|
||||
holder.operationDataTitle.text = "今日在线时长"
|
||||
} else if (1 == mType) {
|
||||
val data =
|
||||
"<font><b><big><big><big>" + datas[position].toString() + "</big></big></big></b>" + " 单" + "</font>"
|
||||
holder.operationDataTv.text = Html.fromHtml(data,Html.FROM_HTML_MODE_LEGACY)
|
||||
holder.operationDataTitle.text = "今日订单完成数"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return datas.size
|
||||
}
|
||||
}
|
||||
|
||||
internal inner class OperationDataViewHolder(itemView: View) :
|
||||
RecyclerView.ViewHolder(itemView) {
|
||||
var operationDataTv: TextView
|
||||
var operationDataTitle: TextView
|
||||
|
||||
init {
|
||||
operationDataTv = itemView.findViewById<TextView>(R.id.operation_data_tv)
|
||||
operationDataTitle = itemView.findViewById<TextView>(R.id.operation_data_title_tv)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var mContext: Context? = null
|
||||
private var mType = 0 //0: 运营时长 1:运营单数
|
||||
fun newInstance(context: Context?, type: Int): TaxiOperationDatasFragment {
|
||||
mContext = context
|
||||
mType = type
|
||||
val args = Bundle()
|
||||
val fragment = TaxiOperationDatasFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,512 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.Point
|
||||
import android.graphics.Typeface
|
||||
import android.os.Bundle
|
||||
import android.util.TypedValue
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import android.widget.Button
|
||||
import android.widget.ImageView
|
||||
import android.widget.RelativeLayout
|
||||
import android.widget.TextView
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentPagerAdapter
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.mogo.commons.mvp.MvpDialogFragment
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.och.common.module.utils.DateTimeUtil
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.AvoidLeakDialog
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean
|
||||
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.*
|
||||
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf
|
||||
import com.mogo.och.taxi.constant.TaxiOrderTypeEnum
|
||||
import com.mogo.och.taxi.presenter.TaxiOperationalPresenter
|
||||
import me.jessyan.autosize.utils.AutoSizeUtils
|
||||
import java.util.Calendar
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiPersonalDialogFragment {
|
||||
*/
|
||||
class TaxiPersonalDialogFragment :
|
||||
MvpDialogFragment<TaxiPersonalDialogFragment?, TaxiOperationalPresenter?>(),
|
||||
View.OnClickListener {
|
||||
private var mOperationDataRl: RelativeLayout? = null
|
||||
private var mCloseIv: ImageView? = null
|
||||
private var mOrdersRv: RecyclerView? = null
|
||||
private var mShowOrdersBt: Button? = null
|
||||
private var mOperationTab: TabLayout? = null
|
||||
private var mOperationViewPager: ViewPager? = null
|
||||
private var mAdapter: OrderAdapter? = null
|
||||
private var mNoDatas: ConstraintLayout? = null
|
||||
private val orders: MutableList<OrderQueryRespBean.Result> = ArrayList()
|
||||
private val mTabTitles = arrayOf("在线时长", "订单完成数")
|
||||
private val fragments: MutableList<TaxiOperationDatasFragment> = ArrayList()
|
||||
private var mNextPage = 1 //订单列表分页从1开始
|
||||
private val mPerPageSize = 10
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val dialog = AvoidLeakDialog(
|
||||
requireContext()
|
||||
)
|
||||
dialog.setHostFragmentReference(this)
|
||||
return dialog
|
||||
}
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.taxi_orders_list_view
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
initView()
|
||||
}
|
||||
|
||||
override fun createPresenter(): TaxiOperationalPresenter {
|
||||
return TaxiOperationalPresenter(this)
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
return TAG
|
||||
}
|
||||
|
||||
override fun dismissAllowingStateLoss() {
|
||||
super.dismissAllowingStateLoss()
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
isCancelable = false
|
||||
dialog!!.setCanceledOnTouchOutside(true)
|
||||
val window = dialog!!.window
|
||||
//dialog padding 去掉
|
||||
window!!.decorView.setPadding(0, 0, 0, 0)
|
||||
window.setDimAmount(0f)
|
||||
val params = window.attributes
|
||||
params.x = 0
|
||||
params.y = 0
|
||||
val windowManager = requireContext().getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
||||
val point = Point()
|
||||
windowManager.defaultDisplay.getSize(point)
|
||||
params.width = (point.x * 0.375).toInt()
|
||||
params.height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||
d(SceneConstant.M_TAXI + TAG, "width= " + params.width + "height= " + params.height)
|
||||
window.attributes = params
|
||||
window.decorView.setBackgroundColor(Color.parseColor("#00FFFFFF")) //设置背景, 不然显示不全
|
||||
window.setGravity(Gravity.LEFT or Gravity.BOTTOM)
|
||||
}
|
||||
|
||||
private fun initView() {
|
||||
initOperationTabDatas()
|
||||
mCloseIv = findViewById<ImageView>(R.id.module_och_taxi_order_list_close_iv)
|
||||
mOperationDataRl = findViewById<RelativeLayout>(R.id.module_och_taxi_operation_data_rl)
|
||||
mShowOrdersBt = findViewById<Button>(R.id.module_och_taxi_order_list_show_bt)
|
||||
mOrdersRv = findViewById<RecyclerView>(R.id.module_och_taxi_order_list)
|
||||
mNoDatas = findViewById<ConstraintLayout>(R.id.no_order_data_view)
|
||||
val imageView = findViewById<ImageView>(R.id.no_order_data_iv)
|
||||
imageView!!.setImageResource(R.drawable.no_order_data)
|
||||
val params = imageView.layoutParams as ConstraintLayout.LayoutParams
|
||||
params.width = 480
|
||||
params.height = 480
|
||||
imageView.layoutParams = params
|
||||
mOrdersRv!!.visibility = View.GONE
|
||||
mNoDatas!!.visibility = View.GONE
|
||||
mShowOrdersBt!!.setOnClickListener(this)
|
||||
mCloseIv!!.setOnClickListener(this)
|
||||
}
|
||||
|
||||
private fun initOperationTabDatas() {
|
||||
mOperationTab = findViewById<TabLayout>(R.id.operation_data_tablayout)
|
||||
mOperationViewPager = findViewById<ViewPager>(R.id.operation_data_viewpager)
|
||||
for (i in mTabTitles.indices) {
|
||||
val tab = mOperationTab!!.newTab()
|
||||
tab.view.setBackgroundColor(Color.parseColor("#00000000"))
|
||||
val tabView = View.inflate(context, R.layout.taxi_operation_tab_item_custom, null)
|
||||
val tv = tabView.findViewById<TextView>(R.id.operation_tab_title)
|
||||
tv.text = mTabTitles[i]
|
||||
tab.customView = tabView
|
||||
if (0 == i) {
|
||||
mOperationTab!!.addTab(tab, true)
|
||||
changeOperationTabLayoutTabUI(tab, true)
|
||||
fragments.add(TaxiOperationDatasFragment.newInstance(activity, 0))
|
||||
} else if (1 == i) {
|
||||
mOperationTab!!.addTab(tab)
|
||||
changeOperationTabLayoutTabUI(tab, false)
|
||||
fragments.add(TaxiOperationDatasFragment.newInstance(activity, 1))
|
||||
}
|
||||
}
|
||||
mOperationTab!!.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
|
||||
override fun onTabSelected(tab: TabLayout.Tab) {
|
||||
mOperationViewPager!!.currentItem = tab.position
|
||||
changeOperationTabLayoutTabUI(tab, true)
|
||||
fragments[tab.position].setType(tab.position)
|
||||
}
|
||||
|
||||
override fun onTabUnselected(tab: TabLayout.Tab) {
|
||||
changeOperationTabLayoutTabUI(tab, false)
|
||||
}
|
||||
|
||||
override fun onTabReselected(tab: TabLayout.Tab) {}
|
||||
})
|
||||
mOperationViewPager!!.addOnPageChangeListener(object : OnPageChangeListener {
|
||||
override fun onPageScrolled(
|
||||
position: Int,
|
||||
positionOffset: Float,
|
||||
positionOffsetPixels: Int
|
||||
) {
|
||||
}
|
||||
|
||||
override fun onPageSelected(position: Int) {
|
||||
mOperationTab!!.getTabAt(position)!!.select()
|
||||
}
|
||||
|
||||
override fun onPageScrollStateChanged(state: Int) {}
|
||||
})
|
||||
mOperationViewPager!!.adapter = OrdersOperationFragmentAdapter(
|
||||
childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
|
||||
)
|
||||
fragments[0].setType(0)
|
||||
}
|
||||
|
||||
fun onServiceDataUpdate(dailyTimeDuration: Long, dailyOrderNum: Long) {
|
||||
for (i in fragments.indices) {
|
||||
fragments[i].updateData(dailyTimeDuration, dailyOrderNum)
|
||||
}
|
||||
}
|
||||
|
||||
private fun changeOperationTabLayoutTabUI(tab: TabLayout.Tab, isSelected: Boolean) {
|
||||
val textView = tab.customView!!.findViewById<View>(R.id.operation_tab_title) as TextView
|
||||
val imageView = tab.customView!!.findViewById<View>(R.id.operation_tab_line_iv) as ImageView
|
||||
if (isSelected) {
|
||||
textView.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
AutoSizeUtils.dp2px(context, 46f).toFloat()
|
||||
)
|
||||
d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text)
|
||||
textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))
|
||||
textView.setTextColor(Color.parseColor("#FFFFFF"))
|
||||
imageView.setImageDrawable(resources.getDrawable(R.drawable.taxi_driver_operation_tab_line))
|
||||
} else {
|
||||
textView.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
AutoSizeUtils.dp2px(context, 40f).toFloat()
|
||||
)
|
||||
d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text)
|
||||
textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL))
|
||||
textView.setTextColor(Color.parseColor("#A7B6F0"))
|
||||
imageView.setImageDrawable(null)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onClick(v: View) {
|
||||
if (v.id == R.id.module_och_taxi_order_list_close_iv) {
|
||||
dismiss()
|
||||
} else {
|
||||
mOrdersRv!!.visibility = View.VISIBLE
|
||||
mOperationDataRl!!.visibility = View.GONE
|
||||
mNoDatas!!.visibility = View.GONE
|
||||
initOrdersView()
|
||||
mPresenter!!.queryOrdersList(mNextPage, mPerPageSize)
|
||||
}
|
||||
}
|
||||
|
||||
private fun initOrdersView() {
|
||||
context?.let {
|
||||
mAdapter = OrderAdapter(it, orders)
|
||||
val manager = LinearLayoutManager(
|
||||
context
|
||||
)
|
||||
mOrdersRv!!.layoutManager = manager
|
||||
mOrdersRv!!.addOnScrollListener(object : OnTaxiOrderRvOnScrollListener() {
|
||||
override fun onLoadMore() {
|
||||
if (!serverHadNoData) {
|
||||
mPresenter!!.queryOrdersList(mNextPage, mPerPageSize)
|
||||
}
|
||||
}
|
||||
})
|
||||
mOrdersRv!!.adapter = mAdapter
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
fun onOrdersListPageRefresh(ordersList: List<OrderQueryRespBean.Result>) {
|
||||
try {
|
||||
if (mNextPage == 0 || ordersList.isEmpty()) { //无数据
|
||||
mOrdersRv!!.visibility = View.GONE
|
||||
mNoDatas!!.visibility = View.VISIBLE
|
||||
return
|
||||
}
|
||||
mOrdersRv!!.visibility = View.VISIBLE
|
||||
mNoDatas!!.visibility = View.GONE
|
||||
if ((ordersList.size < mPerPageSize) && mNextPage > 0) { //已经没有更多数据,提示无数据
|
||||
//已经没有更多数据
|
||||
serverHadNoData = true
|
||||
orders.addAll(ordersList!!)
|
||||
mAdapter!!.notifyDataSetChanged()
|
||||
mNextPage += 1
|
||||
return
|
||||
}
|
||||
serverHadNoData = false
|
||||
orders.addAll(ordersList)
|
||||
if (mAdapter != null) {
|
||||
mAdapter!!.notifyDataSetChanged()
|
||||
}
|
||||
mNextPage += 1
|
||||
} catch (e: Exception) {
|
||||
e.fillInStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
internal inner class OrderAdapter(
|
||||
private val context: Context,
|
||||
private var orders: List<OrderQueryRespBean.Result>
|
||||
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||
if (viewType == ORDER_DETAIL_ITEM) {
|
||||
val view: View = LayoutInflater.from(context)
|
||||
.inflate(R.layout.taxi_orders_list_item, parent, false)
|
||||
return OrderDetailViewHolder(view)
|
||||
} else { //viewType == DAY_GROUP_ITEM
|
||||
val view: View = LayoutInflater.from(context)
|
||||
.inflate(R.layout.taxi_orders_list_day_item, parent, false)
|
||||
return DayGroupViewHolder(view)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||
val queryRespBean = orders[position]
|
||||
?: return
|
||||
if (holder is DayGroupViewHolder) {
|
||||
holder.dayGroupTv.text = DateTimeUtil.getYMDTime(queryRespBean.createTime)
|
||||
bindOrderDetailData(
|
||||
queryRespBean,
|
||||
holder.orderTimeTv,
|
||||
holder.startStationTv,
|
||||
holder.endStationTv,
|
||||
holder.orderStatusBt,
|
||||
holder.orderTypeBt,
|
||||
holder.orderNumTv
|
||||
)
|
||||
if (isNoLineItem(position)) {
|
||||
holder.dividerLine.visibility = View.VISIBLE
|
||||
} else {
|
||||
holder.dividerLine.visibility = View.GONE
|
||||
}
|
||||
if (position == orders.size - 1 && serverHadNoData) {
|
||||
holder.mBootNoDataView.visibility = View.VISIBLE
|
||||
} else {
|
||||
holder.mBootNoDataView.visibility = View.GONE
|
||||
}
|
||||
} else if (holder is OrderDetailViewHolder) {
|
||||
bindOrderDetailData(
|
||||
queryRespBean,
|
||||
holder.orderTimeTv,
|
||||
holder.startStationTv,
|
||||
holder.endStationTv,
|
||||
holder.orderStatusBt,
|
||||
holder.orderTypeBt,
|
||||
holder.orderNumTv
|
||||
)
|
||||
if (isNoLineItem(position)) {
|
||||
holder.dividerLine.visibility = View.VISIBLE
|
||||
} else {
|
||||
holder.dividerLine.visibility = View.GONE
|
||||
}
|
||||
if (position == orders.size - 1 && serverHadNoData) {
|
||||
holder.mBootNoDataView.visibility = View.VISIBLE
|
||||
} else {
|
||||
holder.mBootNoDataView.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemId(position: Int): Long {
|
||||
return position.toLong()
|
||||
}
|
||||
|
||||
override fun getItemViewType(position: Int): Int {
|
||||
//第一个要显示时间
|
||||
if (position == 0) {
|
||||
return Companion.DAY_GROUP_ITEM
|
||||
}
|
||||
val currentDate = DateTimeUtil.getYMDTime(orders[position].createTime) //获取当前订单时间
|
||||
val prevIndex = position - 1
|
||||
val preDate = DateTimeUtil.getYMDTime(orders[prevIndex].createTime)
|
||||
val isDifferent = preDate != currentDate //前一个订单的日期跟第二个订单的日期是否一致
|
||||
return if (isDifferent) DAY_GROUP_ITEM else ORDER_DETAIL_ITEM //一样订单详情, 不一样新添加分组
|
||||
}
|
||||
|
||||
private fun isNoLineItem(position: Int): Boolean {
|
||||
return if (position == orders.size - 1) {
|
||||
false
|
||||
} else {
|
||||
val currentDate =
|
||||
DateTimeUtil.getYMDTime(orders[position].createTime) //获取当前订单时间
|
||||
val nextIndex = position + 1
|
||||
val preDate =
|
||||
DateTimeUtil.getYMDTime(orders[nextIndex].createTime)
|
||||
preDate == currentDate //一样有划分线, 不一样没有划分线
|
||||
}
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return orders.size
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun bindOrderDetailData(
|
||||
queryRespBean: OrderQueryRespBean.Result,
|
||||
orderTimeTv: TextView,
|
||||
startStationTv: TextView,
|
||||
endStationTv: TextView,
|
||||
orderStatusBt: Button,
|
||||
orderTypeBt: Button,
|
||||
orderNumTv: TextView
|
||||
) {
|
||||
val calendar = Calendar.getInstance()
|
||||
calendar.timeInMillis = queryRespBean.createTime
|
||||
orderTimeTv.text = DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm)
|
||||
startStationTv.text = queryRespBean.startSiteAddr
|
||||
endStationTv.text = queryRespBean.endSiteAddr
|
||||
orderStatusBt.text = getOrderStatus(queryRespBean.orderStatus, orderStatusBt)
|
||||
orderTypeBt.text = getOrderType(queryRespBean.orderType, orderTypeBt)
|
||||
orderNumTv.text = "订单编号:" + queryRespBean.orderNo.toString()
|
||||
}
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
private fun getOrderStatus(status: Int, button: Button): String {
|
||||
return when (valueOf(status)) {
|
||||
JourneyCompleted -> {
|
||||
button.background =
|
||||
context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg)
|
||||
"已完成"
|
||||
}
|
||||
|
||||
Cancel -> {
|
||||
button.background =
|
||||
context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg)
|
||||
"已取消"
|
||||
}
|
||||
|
||||
else -> {
|
||||
button.background = context.getDrawable(R.drawable.taxi_order_button_status_bg)
|
||||
"服务中"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
private fun getOrderType(type: Int, button: Button): String {
|
||||
return if (type == TaxiOrderTypeEnum.Reserved.type) {
|
||||
button.background =
|
||||
context.getDrawable(R.drawable.taxi_order_button_type_reserver_bg)
|
||||
"预约单"
|
||||
} else {
|
||||
button.background = context.getDrawable(R.drawable.taxi_order_button_type_bg)
|
||||
"即时单"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal open inner class OrderDetailViewHolder(itemView: View) :
|
||||
RecyclerView.ViewHolder(itemView) {
|
||||
var orderTimeTv: TextView
|
||||
var orderStatusBt: Button
|
||||
var startStationTv: TextView
|
||||
var endStationTv: TextView
|
||||
var orderNumTv: TextView
|
||||
var orderTypeBt: Button
|
||||
var dividerLine: View
|
||||
var mBootNoDataView: View
|
||||
|
||||
init {
|
||||
orderTimeTv = itemView.findViewById<TextView>(R.id.order_time_hm_tv)
|
||||
orderStatusBt = itemView.findViewById<Button>(R.id.order_status_bt)
|
||||
startStationTv = itemView.findViewById<TextView>(R.id.grab_order_start_station)
|
||||
endStationTv = itemView.findViewById<TextView>(R.id.grab_order_end_station)
|
||||
orderNumTv = itemView.findViewById<TextView>(R.id.order_num)
|
||||
orderTypeBt = itemView.findViewById<Button>(R.id.order_type_bt)
|
||||
dividerLine = itemView.findViewById<View>(R.id.module_och_taxi_order_divider)
|
||||
mBootNoDataView = itemView.findViewById<View>(R.id.boot_refresh_no_data_view)
|
||||
}
|
||||
}
|
||||
|
||||
internal inner class DayGroupViewHolder(itemView: View) :
|
||||
OrderDetailViewHolder(itemView) {
|
||||
val dayGroupTv: TextView
|
||||
|
||||
init {
|
||||
dayGroupTv = itemView.findViewById<TextView>(R.id.order_day_tv)
|
||||
}
|
||||
}
|
||||
|
||||
internal abstract inner class OnTaxiOrderRvOnScrollListener : RecyclerView.OnScrollListener() {
|
||||
private var isUpwardSliding = false
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
||||
val manager = recyclerView.layoutManager
|
||||
//不滑动
|
||||
if (manager is LinearLayoutManager && newState == RecyclerView.SCROLL_STATE_IDLE) {
|
||||
val lastItemPosition = manager.findLastCompletelyVisibleItemPosition()
|
||||
val itemCount = manager.itemCount
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"lastItemPosition==$lastItemPosition,itemCount==$itemCount"
|
||||
)
|
||||
//向上滑动到最后一个
|
||||
if (lastItemPosition == itemCount - 1 && isUpwardSliding) {
|
||||
onLoadMore()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||
super.onScrolled(recyclerView, dx, dy)
|
||||
isUpwardSliding = dy > 0
|
||||
}
|
||||
|
||||
abstract fun onLoadMore()
|
||||
}
|
||||
|
||||
override fun dismiss() {
|
||||
super.dismiss()
|
||||
mNextPage = 0
|
||||
orders.clear()
|
||||
}
|
||||
|
||||
private inner class OrdersOperationFragmentAdapter(fm: FragmentManager, behavior: Int) :
|
||||
FragmentPagerAdapter(fm, behavior) {
|
||||
override fun getItem(position: Int): Fragment {
|
||||
return fragments[position]
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return fragments.size
|
||||
}
|
||||
|
||||
override fun getPageTitle(position: Int): CharSequence {
|
||||
return mTabTitles[position]
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val TAG = "OCHTaxiOrdersDialog"
|
||||
private var serverHadNoData = false
|
||||
private const val ORDER_DETAIL_ITEM = 0
|
||||
private const val DAY_GROUP_ITEM = 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.os.Bundle
|
||||
import com.mogo.eagle.core.utilcode.util.ToastUtils
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.BaseBindingFragment
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean
|
||||
import com.mogo.och.taxi.databinding.UnmannedBeingOrderBinding
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/
|
||||
class TaxiReserveOrderFragment : BaseBindingFragment<UnmannedBeingOrderBinding>({
|
||||
UnmannedBeingOrderBinding.inflate(it)
|
||||
}) {
|
||||
private val mDatas: MutableList<OrderQueryRespBean.Result> = ArrayList()
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.unmanned_being_order
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
return "TaxiReserveOrdersFragment"
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
|
||||
}
|
||||
|
||||
fun onOrderCancelDone(orderNo: String) {
|
||||
ToastUtils.showShort("订单取消成功")
|
||||
|
||||
}
|
||||
|
||||
companion object {
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var mTaxiFragment: TaxiFragment? = null
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var mActivity: Activity? = null
|
||||
fun newInstance(
|
||||
activity: Activity?,
|
||||
taxiFragment: TaxiFragment?
|
||||
): TaxiReserveOrderFragment {
|
||||
mActivity = activity
|
||||
mTaxiFragment = taxiFragment
|
||||
val args = Bundle()
|
||||
val fragment = TaxiReserveOrderFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiReserveOrdersFragment {
|
||||
}
|
||||
@@ -1,7 +1,102 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.os.Bundle
|
||||
import com.amap.api.maps.model.LatLng
|
||||
import com.mogo.commons.mvp.MvpFragment
|
||||
import com.mogo.eagle.core.data.map.MogoLocation
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.presenter.NaviPresenter
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/24
|
||||
*/class TaxiRottingNaviFragment {
|
||||
*/
|
||||
class TaxiRottingNaviFragment : MvpFragment<TaxiRottingNaviFragment?, NaviPresenter?>() {
|
||||
private val TAG = TaxiRottingNaviFragment::class.java.simpleName
|
||||
private var mMapDirectionView: TaxiMapDirectionView? = null
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.taxi_rotting_navi_view
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
return TAG
|
||||
}
|
||||
|
||||
override fun initViews() {}
|
||||
override fun initViews(savedInstanceState: Bundle?) {
|
||||
super.initViews(savedInstanceState)
|
||||
mMapDirectionView = mRootView.findViewById<TaxiMapDirectionView>(R.id.rotting_navi_view)
|
||||
mMapDirectionView!!.onCreateView(savedInstanceState)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
mMapDirectionView!!.onResume()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
mMapDirectionView!!.onPause()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
if (mMapDirectionView != null) {
|
||||
mMapDirectionView!!.onDestroy()
|
||||
}
|
||||
}
|
||||
|
||||
override fun createPresenter(): NaviPresenter {
|
||||
return NaviPresenter(this)
|
||||
}
|
||||
|
||||
fun routeResult(
|
||||
routeArrived: List<LatLng>,
|
||||
routeArriving: List<LatLng>,
|
||||
location: MogoLocation?
|
||||
) {
|
||||
if (routeArrived.size + routeArriving.size > 0) {
|
||||
drawablePolylineByRoute(routeArrived, routeArriving, location)
|
||||
} else {
|
||||
clearPolyline()
|
||||
}
|
||||
}
|
||||
|
||||
fun setLineMarker(startStation: LatLng?, endStation: LatLng?) {
|
||||
if (startStation != null && endStation != null) {
|
||||
if (mMapDirectionView != null) {
|
||||
mMapDirectionView!!.setStartMarkAndEndMark(startStation, endStation)
|
||||
UiThreadHandler.post { mMapDirectionView!!.setLineMarker() }
|
||||
}
|
||||
} else {
|
||||
clearPolyline()
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawablePolylineByRoute(
|
||||
routeArrived: List<LatLng>,
|
||||
routeArriving: List<LatLng>,
|
||||
location: MogoLocation?
|
||||
) {
|
||||
if (mMapDirectionView != null) {
|
||||
mMapDirectionView!!.setCoordinatesLatLng(routeArrived, routeArriving, location)
|
||||
UiThreadHandler.post { mMapDirectionView!!.drawablePolyline() }
|
||||
}
|
||||
}
|
||||
|
||||
private fun clearPolyline() {
|
||||
if (mMapDirectionView != null) {
|
||||
UiThreadHandler.post { mMapDirectionView!!.clearPolyline() }
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance(): TaxiRottingNaviFragment {
|
||||
val args = Bundle()
|
||||
val fragment = TaxiRottingNaviFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,221 @@
|
||||
package com.mogo.och.taxi.ui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.graphics.Color
|
||||
import android.graphics.Typeface
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.TypedValue
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentPagerAdapter
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.och.taxi.R
|
||||
import com.mogo.och.taxi.base.BaseTaxiUIFragment
|
||||
import com.mogo.och.taxi.bean.OrderQueryRespBean
|
||||
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
|
||||
import me.jessyan.autosize.utils.AutoSizeUtils
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/25
|
||||
*/class TaxiServerOrdersFragment {
|
||||
}
|
||||
*/
|
||||
class TaxiServerOrdersFragment : BaseTaxiUIFragment() {
|
||||
private val mFragmentTransaction: FragmentTransaction? = null
|
||||
private var mTaxiOrderTab: TabLayout? = null
|
||||
private var mWaitOrderSum: TextView? = null
|
||||
private var mTaxiOrderPager: ViewPager? = null
|
||||
private val mTabTitles = arrayOf("进行中", "待服务")
|
||||
private val fragments: MutableList<Fragment> = ArrayList()
|
||||
private var beingServerdOrdersFragment: TaxiBeingTaskFragment? = null
|
||||
private var reserveOrdersFragment: TaxiReserveOrderFragment? = null
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.taxi_server_orders_panel
|
||||
}
|
||||
|
||||
override fun initViews(view: View) {
|
||||
initOrderTab(view)
|
||||
}
|
||||
|
||||
private fun initOrderTab(view: View) {
|
||||
mWaitOrderSum = view.findViewById<TextView>(R.id.wait_order_num)
|
||||
mTaxiOrderTab = view.findViewById<TabLayout>(R.id.module_och_taxi_tab)
|
||||
mTaxiOrderPager = view.findViewById<ViewPager>(R.id.module_och_taxi_view_pager)
|
||||
for (i in mTabTitles.indices) {
|
||||
val tab = mTaxiOrderTab?.newTab()
|
||||
tab?.view?.setBackgroundColor(Color.parseColor("#00000000"))
|
||||
val tabView =
|
||||
View.inflate(activity, R.layout.taxi_tab_item_custom, null) as TextView
|
||||
tabView.text = mTabTitles[i]
|
||||
tabView.height = AutoSizeUtils.dp2px(getContext(), 120f)
|
||||
tab?.customView = tabView
|
||||
if (0 == i) {
|
||||
mTaxiOrderTab?.addTab(tab!!, true)
|
||||
changeTabLayoutTabUI(tab!!, true)
|
||||
beingServerdOrdersFragment = TaxiBeingTaskFragment.newInstance(
|
||||
activity,
|
||||
parentFragment as TaxiFragment?
|
||||
)
|
||||
fragments.add(beingServerdOrdersFragment!!)
|
||||
} else if (1 == i) {
|
||||
mTaxiOrderTab?.addTab(tab!!)
|
||||
changeTabLayoutTabUI(tab!!, false)
|
||||
reserveOrdersFragment = TaxiReserveOrderFragment.newInstance(
|
||||
activity,
|
||||
parentFragment as TaxiFragment?
|
||||
)
|
||||
fragments.add(reserveOrdersFragment!!)
|
||||
}
|
||||
}
|
||||
d(SceneConstant.M_TAXI + TAG, "activity=" + getActivity())
|
||||
mTaxiOrderTab?.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
|
||||
override fun onTabSelected(tab: TabLayout.Tab) {
|
||||
mTaxiOrderPager?.currentItem = tab.position
|
||||
changeTabLayoutTabUI(tab, true)
|
||||
}
|
||||
|
||||
override fun onTabUnselected(tab: TabLayout.Tab) {
|
||||
changeTabLayoutTabUI(tab, false)
|
||||
}
|
||||
|
||||
override fun onTabReselected(tab: TabLayout.Tab) {}
|
||||
})
|
||||
mTaxiOrderPager?.addOnPageChangeListener(object : OnPageChangeListener {
|
||||
override fun onPageScrolled(
|
||||
position: Int,
|
||||
positionOffset: Float,
|
||||
positionOffsetPixels: Int
|
||||
) {
|
||||
}
|
||||
|
||||
override fun onPageSelected(position: Int) {
|
||||
mTaxiOrderTab?.getTabAt(position)!!.select()
|
||||
}
|
||||
|
||||
override fun onPageScrollStateChanged(state: Int) {}
|
||||
})
|
||||
mTaxiOrderPager?.adapter = OrdersFragmentAdapter(
|
||||
childFragmentManager,
|
||||
FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
|
||||
)
|
||||
}
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
private fun changeTabLayoutTabUI(tab: TabLayout.Tab, isSelected: Boolean) {
|
||||
val textView = tab.customView!!.findViewById<View>(R.id.tab_title) as TextView
|
||||
if (isSelected) {
|
||||
textView.background = activity?.getDrawable(R.drawable.taxi_driver_tab_item_bg)
|
||||
textView.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
AutoSizeUtils.dp2px(context, 40f).toFloat()
|
||||
)
|
||||
d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text)
|
||||
textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
|
||||
textView.setTextColor(Color.parseColor("#FFFFFF"))
|
||||
} else {
|
||||
textView.background = null
|
||||
textView.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
AutoSizeUtils.dp2px(getContext(), 36f).toFloat()
|
||||
)
|
||||
d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text)
|
||||
textView.typeface = Typeface.defaultFromStyle(Typeface.NORMAL)
|
||||
textView.setTextColor(Color.parseColor("#CCD4F5"))
|
||||
}
|
||||
}
|
||||
|
||||
internal inner class OrdersFragmentAdapter(
|
||||
fragmentManager: FragmentManager,
|
||||
behavior: Int
|
||||
) :
|
||||
FragmentPagerAdapter(fragmentManager, behavior) {
|
||||
override fun getItem(position: Int): Fragment {
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"getItem=$position"
|
||||
)
|
||||
return fragments[position]
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return fragments.size
|
||||
}
|
||||
|
||||
override fun getPageTitle(position: Int): CharSequence {
|
||||
d(
|
||||
SceneConstant.M_TAXI + TAG,
|
||||
"getPageTitle=$position"
|
||||
)
|
||||
return mTabTitles[position]
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
fun updateCurrentOrderStatusChanged(order: OrderQueryRespBean.Result?) {
|
||||
if (beingServerdOrdersFragment != null) {
|
||||
mTaxiOrderTab!!.getTabAt(0)!!.select()
|
||||
beingServerdOrdersFragment!!.updateCurrentOrderStatusChanged(order)
|
||||
}
|
||||
}
|
||||
|
||||
fun onOrdersWaitServiceChanged(waitServiceList: List<OrderQueryRespBean.Result>) {
|
||||
// if (waitServiceList.isEmpty()) {
|
||||
// mWaitOrderSum!!.visibility = View.GONE
|
||||
// } else {
|
||||
// mWaitOrderSum!!.text = waitServiceList.size.toString()
|
||||
// mWaitOrderSum!!.visibility = View.VISIBLE
|
||||
// }
|
||||
// if (null == reserveOrdersFragment) return
|
||||
// reserveOrdersFragment!!.onOrdersWaitServiceChanged(waitServiceList)
|
||||
}
|
||||
|
||||
fun onOrderCancelDone(orderNo: String?) {
|
||||
if (null == reserveOrdersFragment) return
|
||||
reserveOrdersFragment!!.onOrderCancelDone(orderNo!!)
|
||||
}
|
||||
|
||||
fun onCurrentOrderCancelDone() {
|
||||
if (null == beingServerdOrdersFragment) return
|
||||
beingServerdOrdersFragment!!.onCurrentOrderCancelDone()
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long) {
|
||||
if (null == beingServerdOrdersFragment) return
|
||||
beingServerdOrdersFragment!!.updateDistanceAndTime(meters, timeInSecond)
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
fun onCurrentOrderRouteInfoGot(routeInfo: OrderQueryRouteInfoRespBean.Result?) {
|
||||
if (null == beingServerdOrdersFragment) return
|
||||
beingServerdOrdersFragment!!.onCurrentOrderRouteInfoGot(routeInfo)
|
||||
}
|
||||
|
||||
fun updateOrderBottomBtnUI() {
|
||||
if (null == beingServerdOrdersFragment) return
|
||||
beingServerdOrdersFragment!!.updateOrderBottomBtnUI()
|
||||
}
|
||||
|
||||
fun onNaviToEndAmap(isShow: Boolean) {
|
||||
if (null == beingServerdOrdersFragment) return
|
||||
beingServerdOrdersFragment!!.onNaviToEndAmap(isShow)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "TaxiFragment"
|
||||
fun newInstance(): TaxiServerOrdersFragment {
|
||||
val args = Bundle()
|
||||
val fragment = TaxiServerOrdersFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.mogo.och.taxi.ui.unmanned
|
||||
|
||||
import com.mogo.och.taxi.base.IUiIntent
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
sealed class UnmannedIntent: IUiIntent{
|
||||
|
||||
//获取接单/暂停接单状态
|
||||
object GetReceivingOrderState : UnmannedIntent()
|
||||
|
||||
//开始接单
|
||||
object StartReceivingOrder : UnmannedIntent()
|
||||
|
||||
//暂停接单
|
||||
object PauseReceivingOrder : UnmannedIntent()
|
||||
|
||||
//获取当前任务信息
|
||||
object GetCurrentTask : UnmannedIntent()
|
||||
|
||||
//到站获取下一个执行的任务信息
|
||||
object GetNextTask: UnmannedIntent()
|
||||
|
||||
//轮询订单
|
||||
object GetOrder: UnmannedIntent()
|
||||
|
||||
//开始接单后获取要前往的虚拟站点
|
||||
object GetVirtualStation: UnmannedIntent()
|
||||
|
||||
//开始执行任务
|
||||
object StartTask: UnmannedIntent()
|
||||
|
||||
//到达乘客上车点
|
||||
object ArrivedOrderStartStation: UnmannedIntent()
|
||||
|
||||
//到达乘客下车点
|
||||
object ArrivedOrderEndStation: UnmannedIntent()
|
||||
|
||||
//订单服务完成
|
||||
object JourneyCompleted: UnmannedIntent()
|
||||
|
||||
//跳过乘客验证
|
||||
object JumpPassengerCheckDone : UnmannedIntent()
|
||||
|
||||
//司机端手动结束订单
|
||||
object CloseOrderByDriver : UnmannedIntent()
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.mogo.och.taxi.ui.unmanned
|
||||
|
||||
import com.mogo.och.taxi.base.IUiState
|
||||
import com.mogo.och.taxi.bean.OrderDetail
|
||||
import com.mogo.och.taxi.bean.TaskDetail
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2023/7/26
|
||||
*/
|
||||
data class UnmannedState(val taskUiState: TaskUiState,val orderUiState: OrderUiState): IUiState
|
||||
|
||||
sealed class TaskUiState{
|
||||
object INIT : TaskUiState()
|
||||
data class SUCCESS(val models: List<TaskDetail>) : TaskUiState()
|
||||
}
|
||||
|
||||
sealed class OrderUiState{
|
||||
object INIT : OrderUiState()
|
||||
data class SUCCESS(val models: List<OrderDetail>) : OrderUiState()
|
||||
}
|
||||
|
||||
sealed class OperationBtnUiState{
|
||||
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import com.mogo.och.taxi.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.constant.TaxiConst;
|
||||
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
|
||||
import com.mogo.och.taxi.model.TaxiModel;
|
||||
import com.mogo.och.taxi.model.TaxiUnmannedViewModel;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -50,7 +51,7 @@ public class TaxiTrajectoryManager {
|
||||
* 同步订单信息
|
||||
*/
|
||||
public void syncTrajectoryInfo() {
|
||||
OrderQueryRespBean.Result orderInfo = TaxiModel.getInstance().getCurrentOCHOrder();
|
||||
OrderQueryRespBean.Result orderInfo = TaxiModel.INSTANCE.getCurrentOCHOrder();
|
||||
if (orderInfo == null || orderInfo.orderStatus >= TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) {
|
||||
CallerLogger.INSTANCE.d(M_TAXI + TAG, "syncTrajectoryInfo() stop.");
|
||||
stopTrajReqLoop();
|
||||
@@ -99,7 +100,7 @@ public class TaxiTrajectoryManager {
|
||||
}
|
||||
|
||||
private void setupAutoPilotLine() {
|
||||
OrderQueryRespBean.Result order = TaxiModel.getInstance().getCurrentOCHOrder();
|
||||
OrderQueryRespBean.Result order = TaxiModel.INSTANCE.getCurrentOCHOrder();
|
||||
if (order == null) {
|
||||
CallerLogger.INSTANCE.e(M_TAXI + TAG,
|
||||
"setupAutoPilotLine(): orderInfo is null.");
|
||||
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 53 KiB |