diff --git a/OCH/mogo-och-taxi-unmanned/build.gradle b/OCH/mogo-och-taxi-unmanned/build.gradle index 3d5e7a6590..fd5445fd05 100644 --- a/OCH/mogo-och-taxi-unmanned/build.gradle +++ b/OCH/mogo-och-taxi-unmanned/build.gradle @@ -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") diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/AvoidLeakDialog.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/AvoidLeakDialog.kt index 4b86ae39a4..d16598fb72 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/AvoidLeakDialog.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/AvoidLeakDialog.kt @@ -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 { -} \ No newline at end of file + */ +open class AvoidLeakDialog : Dialog { + private var hostFragmentReference: WeakReference? = 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() + } + } +} diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseBindingFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseBindingFragment.kt new file mode 100644 index 0000000000..9d13a74b2e --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseBindingFragment.kt @@ -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( + 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 + } +} diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt index deafbfb0ca..fa547d492e 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiTabFragment.kt @@ -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> : MvpFragment(), + 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(R.id.btnAutopilotDisable)?.setOnClickListener { + onAutopilotStatusChanged( + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE + ) + } + + // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态 + findViewById(R.id.btnAutopilotEnable)?.setOnClickListener { + onAutopilotStatusChanged( + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE + ) + } + + // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人 + findViewById(R.id.btnAutopilotRunning)?.setOnClickListener { + onAutopilotStatusChanged( + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING + ) + } + findViewById(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) } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiUIFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiUIFragment.kt index f869dba43b..8bec467c4a 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiUIFragment.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseTaxiUIFragment.kt @@ -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 + } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseUiFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseUiFragment.kt new file mode 100644 index 0000000000..2e21b7ca97 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseUiFragment.kt @@ -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?) + +} diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt new file mode 100644 index 0000000000..db4c7dc6f8 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/BaseViewModel.kt @@ -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 : ViewModel() { + + private val _uiStateFlow = MutableStateFlow(initUiState()) + val uiStateFlow: StateFlow = _uiStateFlow + + protected abstract fun initUiState(): UiState + + protected fun sendUiState(copy: UiState.() -> UiState){ + _uiStateFlow.update { copy(_uiStateFlow.value) } + } + + private val _uiIntentFlow: Channel = Channel() + val uiIntentFlow: Flow = _uiIntentFlow.receiveAsFlow() + + fun sendUiIntent(uiIntent: UiIntent){ + viewModelScope.launch { + _uiIntentFlow.send(uiIntent) + } + } + + init { + viewModelScope.launch { + uiIntentFlow.collect { + handleIntent(it) + } + } + } + + protected abstract fun handleIntent(intent: IUiIntent) +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/MviInterface.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/MviInterface.kt new file mode 100644 index 0000000000..0ef921eb03 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/base/MviInterface.kt @@ -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 \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderDetail.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderDetail.kt new file mode 100644 index 0000000000..1337096ae6 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderDetail.kt @@ -0,0 +1,7 @@ +package com.mogo.och.taxi.bean + +/** + * @author: wangmingjun + * @date: 2023/7/26 + */ +data class OrderDetail(var orderId: Long) diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaskDetail.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaskDetail.kt new file mode 100644 index 0000000000..c654c63689 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaskDetail.kt @@ -0,0 +1,7 @@ +package com.mogo.och.taxi.bean + +/** + * @author: wangmingjun + * @date: 2023/7/26 + */ +data class TaskDetail(var taskId: Int) diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java index 7ffc67eb0f..2b6edf2761 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java @@ -13,39 +13,10 @@ import java.util.List; * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等) */ public interface ITaxiOrderStatusCallback { - // 进行中单变更:暂未用到 - void onOrdersInServiceChanged(@NonNull List inServiceList); - // 待服务单变更 - void onOrdersWaitServiceChanged(@NonNull List 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 是否是高德导航 diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt index e97319fef0..661cb2eff6 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.kt @@ -1,7 +1,1142 @@ package com.mogo.och.taxi.model +import android.annotation.SuppressLint +import android.content.Context +import android.net.ConnectivityManager +import android.text.TextUtils +import com.alibaba.android.arouter.launcher.ARouter +import com.amap.api.maps.model.LatLng +import com.elegant.network.utils.GsonUtil +import com.mogo.aicloud.services.socket.IMogoOnMessageListener +import com.mogo.commons.module.intent.IMogoIntentListener +import com.mogo.commons.module.intent.IntentManager +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.cancelAutoPilot +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setIPCDemoMode +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setIgnoreConditionDraw +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.addListener +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +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.CallerLogger.i +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.pushAppOperationalMsgBox +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.registerSocketMessageListener +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.releaseSocketMessageListener +import com.mogo.och.common.module.biz.common.socketmessage.data.OCHOperationalMessage +import com.mogo.och.common.module.biz.constant.LoginStatusManager.isLogin +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.provider.LoginService +import com.mogo.och.common.module.callback.OchAdasStartFailureCallback +import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.startLoopAbnormalFactors +import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.stopLoopAbnormalFactors +import com.mogo.och.common.module.manager.OCHAdasAbilityManager +import com.mogo.och.common.module.manager.distancemamager.IDistanceListener +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addDistanceListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addTrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint +import com.mogo.och.common.module.map.AmapNaviToDestinationModel +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.calculateRouteSumLength +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterLatlngToLocation +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations +import com.mogo.och.common.module.utils.PinYinUtil +import com.mogo.och.common.module.utils.ToastUtilsOch +import com.mogo.och.taxi.R +import com.mogo.och.taxi.bean.DriverServiceDataRespBean +import com.mogo.och.taxi.bean.OrderQueryRespBean +import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean +import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean +import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean +import com.mogo.och.taxi.bean.OrdersListQueryRespBean +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.callback.IOCHTaxiAutopilotPlanningCallback +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 +import com.mogo.och.taxi.constant.TaxiOrderStatusEnum +import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf +import com.mogo.och.taxi.constant.TaxtServingStatusManager.isOpeningOrderStatus +import com.mogo.och.taxi.network.TaxiServiceManager.changeOrderServing +import com.mogo.och.taxi.network.TaxiServiceManager.queryDriverServiceData +import com.mogo.och.taxi.network.TaxiServiceManager.queryOrderRoute +import com.mogo.och.taxi.network.TaxiServiceManager.queryOrdersList +import com.mogo.och.taxi.network.TaxiServiceManager.reportOrderRemain +import com.mogo.och.taxi.utils.OrderUtil +import com.mogo.och.taxi.utils.TaxiAnalyticsManager +import com.mogo.och.taxi.utils.TaxiTrajectoryManager +import com.zhjt.service.chain.ChainLog +import io.reactivex.exceptions.UndeliverableException +import io.reactivex.functions.Consumer +import io.reactivex.plugins.RxJavaPlugins +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.ArrivalNotification +import mogo.telematics.pad.MessagePad.GlobalPathResp +import mogo_msg.MogoReportMsg.MogoReportMessage +import system_master.SystemStatusInfo +import java.io.IOException + /** - * @author: wangmingjun + * @author: wangmingjun * @date: 2023/7/25 - */class TaxiModel { + */ +@SuppressLint("StaticFieldLeak") +object TaxiModel { + + private val TAG = TaxiModel::class.java.simpleName + + private var mContext: Context? = null + + @Volatile + private var mCurrentOCHOrder //当前订单 + : OrderQueryRespBean.Result? = null + + @Volatile + private var mInServiceList = mutableListOf() //进行中订单 + + @Volatile + private var mWaitServiceList = mutableListOf() //待服务订单 + + + private var mADASStatusCallback //Model->Presenter:自动驾驶状态相关 + : ITaxiADASStatusCallback? = null + private var mCarOperationalCallback //Model->Presenter:登录状态和司机今日接单状态 + : ITaxiCarOperationalCallback? = null + private var mControllerStatusCallback //Model->Presenter:VR mode等 + : ITaxiControllerStatusCallback? = null + private var mOrderStatusCallback //Model->Presenter:订单变更 + : ITaxiOrderStatusCallback? = null + private var mAutopilotPlanningCallback: IOCHTaxiAutopilotPlanningCallback? = null + + @Volatile + private var isRestartAutopilot = false + + private val mRoutePoints: MutableList? = ArrayList() + private val mPreRouteIndex = 0 + + private var mLongitude = 0.0 + private var mLatitude = 0.0 + private var mLocation: MogoLocation? = null + + private var loginService: LoginService? = null + + fun setMoGoAutopilotPlanningListener(moGoAutopilotPlanningCallback: IOCHTaxiAutopilotPlanningCallback?) { + mAutopilotPlanningCallback = moGoAutopilotPlanningCallback + } + + fun setADASStatusCallback(callback: ITaxiADASStatusCallback?) { + mADASStatusCallback = callback + } + + fun setCarStatusCallback(callback: ITaxiCarOperationalCallback?) { + mCarOperationalCallback = callback + } + + fun setControllerStatusCallback(callback: ITaxiControllerStatusCallback?) { + mControllerStatusCallback = callback + } + + fun setOrderStatusCallback(callback: ITaxiOrderStatusCallback?) { + mOrderStatusCallback = callback + } + + fun init(context: Context) { + mContext = context.applicationContext + initListeners() + loginService = + ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService + + // TODO: 2021/8/27 因需要通过此回调的location进行坐标上传,暂改为全程监听,退出后再反注册, + // 待后续整体调整location获取来源 +// if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { +// apis.getLocationInfoApi().start(); +// } + + //2022.1.28 + // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 + // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with + RxJavaPlugins.setErrorHandler(Consumer { e -> + var e = e + if (e is UndeliverableException) { + e = (e.cause)!! + d(SceneConstant.M_TAXI + TAG, "UndeliverableException") + } + if ((e is IOException)) { // + // fine, irrelevant network problem or API that throws on cancellation + d(SceneConstant.M_TAXI + TAG, "IOException") + return@Consumer + } + if (e is InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + d(SceneConstant.M_TAXI + TAG, "InterruptedException") + return@Consumer + } + if ((e is NullPointerException) || (e is IllegalArgumentException)) { + // that's likely a bug in the application + d(SceneConstant.M_TAXI + TAG, "NullPointerException or IllegalArgumentException") + Thread.currentThread().uncaughtExceptionHandler?.uncaughtException( + Thread.currentThread(), + e + ) + return@Consumer + } + if (e is IllegalStateException) { + // that's a bug in RxJava or in a custom operator + d(SceneConstant.M_TAXI + TAG, "IllegalStateException") + Thread.currentThread().uncaughtExceptionHandler?.uncaughtException( + Thread.currentThread(), + e + ) + return@Consumer + } + d(SceneConstant.M_TAXI + TAG, "Undeliverable exception") + }) + } + + fun release() { + startOrStopOrderLoop(false) + startOrStopCalculateRouteInfo(false) + releaseListeners() + loginService = null + } + + private fun initListeners() { + // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 + CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) + IntentManager.getInstance() + .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) + MogoStatusManager.getInstance().registerStatusChangedListener( + TAG, + StatusDescriptor.VR_MODE, + mMogoStatusChangedListener + ) + + //定位监听, 传false是高德坐标系 + addListener(TAG, 10, mMapLocationListener) + + //2021.11.1 自动驾驶路线规划接口 + CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) + + //开启自驾后 异常信息返回 + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener) + registerSocketMessageListener( + OCHSocketMessageManager.msgMonitorType, + mMogoOnMessageListener + ) + startLoopAbnormalFactors(mContext!!) + addDistanceListener(TAG, distanceListener) + addTrajectoryListener(TAG, trajectoryListener) + } + + private val mMogoOnMessageListener = + object : IMogoOnMessageListener { + override fun target(): Class { + return OCHOperationalMessage::class.java + } + + override fun onMsgReceived(obj: OCHOperationalMessage) { + if (obj == null) { + d(SceneConstant.M_TAXI + TAG, "onMsgReceived = null") + return + } + d(SceneConstant.M_TAXI + TAG, "onMsgReceived = " + obj.message) + pushAppOperationalMsgBox( + obj.pushTimeStamp, + obj.message, OCHSocketMessageManager.OPERATION_SYSTEM + ) + } + } + + private fun releaseListeners() { + MogoStatusManager.getInstance().unregisterStatusChangedListener( + TAG, + StatusDescriptor.VR_MODE, + mMogoStatusChangedListener + ) + + // 注销地图监听 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + releaseSocketMessageListener(OCHSocketMessageManager.msgMonitorType) + CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener) + CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener) + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null) + stopLoopAbnormalFactors() + } + + fun startOrStopOrderLoop(start: Boolean) { + d(SceneConstant.M_TAXI + TAG, "startOrStopOrderLoop() $start") + if (start) { + TaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop() + } else { + TaxiModelLoopManager.getInstance().stopInAndWaitOrdersLoop() + } + } + + //更新接单状态 + fun updateCarStatus() { + if (!isLogin()) { + loginService!!.queryLoginStatusByNet() + return + } + changeOrderServing( + mContext!!, isOpeningOrderStatus(), + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData) { + if (null != data && 0 == data.code) { + loginService!!.queryLoginStatusByNet() + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext!!.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(mContext!!.getString(R.string.request_error_tip)) + } + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + + // 获取全部订单列表 + fun queryOrdersList(page: Int, size: Int) { + queryOrdersList( + mContext!!, page, size, + object : OchCommonServiceCallback { + override fun onSuccess(data: OrdersListQueryRespBean) { + if (null != data && 0 == data.code) { + if (mCarOperationalCallback != null) { + mCarOperationalCallback!!.onOrdersListPageRefresh(data.data.orders) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext!!.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(mContext!!.getString(R.string.request_error_tip)) + } + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + + // 查询司机服务数据 + fun queryDriverServiceData() { + queryDriverServiceData( + mContext!!, + object : OchCommonServiceCallback { + override fun onSuccess(data: DriverServiceDataRespBean) { + if (data != null && data.code == 0 && data.data != null) { + if (mCarOperationalCallback != null) { + mCarOperationalCallback!!.onServiceDataUpdate( + data.data.timeDuration, data.data.orderNum + ) + } + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext!!.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(mContext!!.getString(R.string.request_error_tip)) + } + } + + override fun onFail(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + }) + } + + // 获取当前订单 + fun getCurrentOCHOrder(): OrderQueryRespBean.Result? { + return TaxiUnmannedViewModel.getCurrentOCHOrder() + } + + // 获取当前订单状态 + fun getCurOrderStatus(): TaxiOrderStatusEnum? { + val order: OrderQueryRespBean.Result = + getCurrentOCHOrder() + ?: return TaxiOrderStatusEnum.None + return valueOf(order.orderStatus) + } + + //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据 + private fun updateNativeCurrentOrder(data: OrderQueryRespBean.Result?) { + if (data == null) { + return + } + mCurrentOCHOrder = data + TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() + SharedPrefsMgr.getInstance(mContext!!).putString( + TaxiConst.SP_KEY_OCH_TAXI_ORDER, + GsonUtil.jsonFromObject(data) + ) + if (mCurrentOCHOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code) { + if (FunctionBuildConfig.isDemoMode) { + // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true + setIgnoreConditionDraw(true) + setIPCDemoMode(true) + d(SceneConstant.M_TAXI + TAG, "美化模式-ignore:置为true(更新本地order信息)") + } + updateAutopilotControlParameters() + } + if (mCurrentOCHOrder!!.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) { + if (FunctionBuildConfig.isDemoMode) { + d(SceneConstant.M_TAXI + TAG, "setIPCDemoMode:false") + setIPCDemoMode(false) + } + clearAutopilotControlParameters() + } + } + + /** + * 将业务订单信息保存,鹰眼可取用 + */ + private fun updateAutopilotControlParameters() { + val parameters = initAutopilotControlParameters() + if (null == parameters) { + e(SceneConstant.M_TAXI + TAG, "AutopilotControlParameters is empty.") + return + } + d(SceneConstant.M_TAXI + TAG, "AutopilotControlParameters is update.") + updateAutopilotControlParameters(parameters) + } + + private fun clearAutopilotControlParameters() { + d(SceneConstant.M_TAXI + TAG, "AutopilotControlParameters is clear.") + updateAutopilotControlParameters(null) + } + + //清除订单信息 + fun clearCurrentOCHOrder() { + startOrStopCalculateRouteInfo(false) + mCurrentOCHOrder = null + clearAutopilotControlParameters() + TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() + SharedPrefsMgr.getInstance(mContext!!).remove(TaxiConst.SP_KEY_OCH_TAXI_ORDER) + isRestartAutopilot = false + if (FunctionBuildConfig.isDemoMode) { + // 当美化模式(演示模式)开启时: 取消或订单已完成时,置false + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false + setIgnoreConditionDraw(false) + setIPCDemoMode(false) + d(SceneConstant.M_TAXI + TAG, "美化模式-ignore:置为false(已完成or清除当前订单)") + } + } + + //检测当前订单 + fun checkCurrentOCHOrder(): Boolean { + return (mCurrentOCHOrder != null + ) && (mCurrentOCHOrder!!.startSiteGcjPoint != null + ) && (mCurrentOCHOrder!!.endSiteGcjPoint != null) + } + + /** + * 以当前订单为基础,开启自动驾驶 + */ + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_OCH_TAXI_START_AUTOPILOT, + paramIndexes = [-1] + ) + fun startAutoPilot() { + if (!checkCurrentOCHOrder()) { + e(SceneConstant.M_TAXI + TAG, "no order or order is empty.") + ToastUtils.showShort("当前订单不存在或异常!") + return + } + + //根据开关和后台是否发布轨迹启动自驾 + if (FunctionBuildConfig.isPassStartAutopilotCommand && TextUtils.isEmpty( + mCurrentOCHOrder!!.csvFileUrl + ) + && TextUtils.isEmpty(mCurrentOCHOrder!!.csvFileUrlDPQP) + ) { + ToastUtils.showLong("无发布轨迹, 请发布后重试") + e( + SceneConstant.M_TAXI + TAG, "isPassStartAutopilotCommand = " + + FunctionBuildConfig.isPassStartAutopilotCommand + + "busRoutesResult.csvFileUrl = " + mCurrentOCHOrder!!.csvFileUrl + + "busRoutesResult.csvFileUrlDPQP = " + mCurrentOCHOrder!!.csvFileUrlDPQP + ) + return + } + e( + SceneConstant.M_TAXI + TAG, "isPassStartAutopilotCommand = " + + FunctionBuildConfig.isPassStartAutopilotCommand + ) + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { + ToastUtils.showLong( + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + + ", 请稍候重试" + ) + TaxiAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( + mCurrentOCHOrder!!.startSiteAddr, + mCurrentOCHOrder!!.endSiteAddr, + mCurrentOCHOrder!!.orderNo, + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + ) + return + } + + //点击开始自动驾驶按钮订单状态去流转, 不再与自动驾驶是否启动成功挂钩 + isRestartAutopilot = mCurrentOCHOrder!!.orderStatus != TaxiOrderStatusEnum.UserArriveAtStart.code + + val parameters = initAutopilotControlParameters() + if (null == parameters) { + e(SceneConstant.M_TAXI + TAG, "AutopilotControlParameters is empty.") + return + } + startAutoPilot(parameters) + d( + SceneConstant.M_TAXI + TAG, "start autopilot with parameter: %s", + GsonUtil.jsonFromObject(parameters) + + " ,startSiteName=" + mCurrentOCHOrder!!.startSiteAddr + + " ,endSiteName=" + mCurrentOCHOrder!!.endSiteAddr + + "isRestartAutopilot = " + isRestartAutopilot + ) + TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent( + isRestartAutopilot, + false, + mCurrentOCHOrder!!.startSiteAddr, + mCurrentOCHOrder!!.endSiteAddr, + mCurrentOCHOrder!!.lineId, + mCurrentOCHOrder!!.orderNo + ) + if (mControllerStatusCallback != null) { + mControllerStatusCallback!!.startOpenAutopilot() + } + + // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除 +// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" ); + } + + private fun initAutopilotControlParameters(): AutopilotControlParameters? { + if (!checkCurrentOCHOrder()) { + e(SceneConstant.M_TAXI + TAG, "no order or order is empty.") + return null + } + val parameters = AutopilotControlParameters() + val startWgsLon = mCurrentOCHOrder!!.startSitePoint[0] + val startWgsLat = mCurrentOCHOrder!!.startSitePoint[1] + val endWgsLon = mCurrentOCHOrder!!.endSitePoint[0] + val endWgsLat = mCurrentOCHOrder!!.endSitePoint[1] + parameters.vehicleType = mCurrentOCHOrder!!.businessType + parameters.startName = + PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder!!.startSiteAddr) // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) + parameters.endName = + PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder!!.endSiteAddr) // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) + parameters.startLatLon = AutoPilotLonLat(startWgsLat, startWgsLon) + parameters.endLatLon = AutoPilotLonLat(endWgsLat, endWgsLon) + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = AutoPilotLine( + mCurrentOCHOrder!!.lineId, + mCurrentOCHOrder!!.csvFileUrl, mCurrentOCHOrder!!.csvFileMd5, + mCurrentOCHOrder!!.txtFileUrl, mCurrentOCHOrder!!.txtFileMd5, + mCurrentOCHOrder!!.contrailSaveTime, mCurrentOCHOrder!!.carModel, + mCurrentOCHOrder!!.csvFileUrlDPQP, mCurrentOCHOrder!!.csvFileMd5DPQP, + mCurrentOCHOrder!!.txtFileUrlDPQP, mCurrentOCHOrder!!.txtFileMd5DPQP, + mCurrentOCHOrder!!.contrailSaveTimeDPQP + ) + } + return parameters + } + + //结束自动驾驶 + fun cancelAutopilot() { + try { + cancelAutoPilot() + d(SceneConstant.M_TAXI + TAG, "结束自动驾驶") + } catch (e: Exception) { + e.printStackTrace() + } + } + + //根据围栏判断,是否到达起点 + private fun judgeStartStation(location: MogoLocation) { + if ((mCurrentOCHOrder == null) || (mCurrentOCHOrder!!.startSiteGcjPoint == null + ) || (mCurrentOCHOrder!!.startSiteGcjPoint.size < 2) + ) { + return + } + val startLon = mCurrentOCHOrder!!.startSiteGcjPoint[0] + val startLat = mCurrentOCHOrder!!.startSiteGcjPoint[1] + val distance = CoordinateUtils.calculateLineDistance( + startLon, startLat, + location.longitude, location.latitude + ).toDouble() + i(SceneConstant.M_TAXI + TAG, "judgeStartStation() distance = $distance") + if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { + // TODO: 调用到达上车点 arrivedStartPoint() + } + } + + //监听网络变化,避免启动机器时无网导致无法更新订单信息 + private val mNetWorkIntentListener: IMogoIntentListener = + IMogoIntentListener { intentStr, _ -> + d(SceneConstant.M_TAXI + TAG, "onIntentReceived = %s", intentStr) + if ((ConnectivityManager.CONNECTIVITY_ACTION == intentStr)) { + if (NetworkUtils.isConnected(mContext)) { + startOrStopOrderLoop(isLogin() && isOpeningOrderStatus()) + loginService!!.queryLoginStatusByNet() + } + } + } + + private val mAdasStartFailureListener: OchAdasStartFailureCallback = + object : OchAdasStartFailureCallback { + override fun onStartAutopilotFailure( + startFailedCode: String, + startFailedMessage: String + ) { + TaxiAnalyticsManager.getInstance() + .triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage) + if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode) { + e( + SceneConstant.M_TAXI + TAG, + "mAdasStartFailureListener = $startFailedMessage" + ) + mADASStatusCallback!!.onStartAdasFailure() + } + } + } + + private val mMogoStatusChangedListener: IMogoStatusChangedListener = + IMogoStatusChangedListener { descriptor, isTrue -> + + // VR mode变更回调 + if (StatusDescriptor.VR_MODE == descriptor) { + if (mControllerStatusCallback != null) { + mControllerStatusCallback!!.onVRModeChanged(isTrue) + } + } + } + + // 自车定位 + private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = + object : IMoGoChassisLocationGCJ02Listener { + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + //位置变化时,通过围栏判断是否到达x点 + if (null == mogoLocation) return + if (checkCurrentOCHOrder()) { + if (getCurOrderStatus() === TaxiOrderStatusEnum.OnTheWayToStart) { + judgeStartStation(mogoLocation) + } + if (getCurOrderStatus() === TaxiOrderStatusEnum.OnTheWayToEnd && + getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING + ) { + judgeEndStation(mogoLocation) + } + } + mLongitude = mogoLocation.longitude + mLatitude = mogoLocation.latitude + mLocation = mogoLocation + if (mControllerStatusCallback != null) { + mControllerStatusCallback!!.onCarLocationChanged(mogoLocation) + } + } + } + + private fun judgeEndStation(currentLocation: MogoLocation) { + if ((mCurrentOCHOrder == null) || (mCurrentOCHOrder!!.endSiteGcjPoint == null + ) || (mCurrentOCHOrder!!.endSiteGcjPoint.size < 2) + ) { + return + } + val endLon = mCurrentOCHOrder!!.endSiteGcjPoint[0] + val endLat = mCurrentOCHOrder!!.endSiteGcjPoint[1] + val distance = CoordinateUtils.calculateLineDistance( + endLon, endLat, + currentLocation.longitude, currentLocation.latitude + ).toDouble() + i(SceneConstant.M_TAXI + TAG, "judgeEndStation() distance = $distance") + if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { //1、当前位置和站点围栏15m内 + if ((!checkCurrentOCHOrder() + || (getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd)) + ) { + i(SceneConstant.M_TAXI + TAG, "order exception or order ArriveAtEnd") + return + } + + //2、开始计算当前位置和站点的向量角度 < 90度 未经过 >90度 经过 + val stationAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( + currentLocation.longitude, + currentLocation.latitude, + endLon, + endLat, currentLocation.heading.toInt() + ).toDouble() + i( + SceneConstant.M_TAXI + TAG, + "judgeEndStation() stationAngle = $stationAngle" + ) + + //3、刚过站且过站距离在15m内, 提交到站 + if (stationAngle > 90 && distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { + if ((!checkCurrentOCHOrder() + || (getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd)) + ) { + i(SceneConstant.M_TAXI + TAG, "order exception or order ArriveAtEnd") + return + } + i(SceneConstant.M_TAXI + TAG, "judgeEndStation() = 刚过站且在15m内") + // TODO: 调用到达目的地 arriveTerminal() + } + } + } + + /** + * 订单流转debug START + */ + fun setArriveAtStartStation() { + if ((mCurrentOCHOrder == null + || mCurrentOCHOrder!!.orderStatus != TaxiOrderStatusEnum.OnTheWayToStart.code) + ) { + ToastUtils.showShort("订单状态不匹配该操作!") + return + } + // TODO: 调用到达起点 arrivedStartPoint() + } + + fun setArriveAtEndStation() { + if ((mCurrentOCHOrder == null + || mCurrentOCHOrder!!.orderStatus != TaxiOrderStatusEnum.OnTheWayToEnd.code) + ) { + ToastUtils.showShort("订单状态不匹配该操作!") + return + } + // TODO: 调用到达目的地 arriveTerminal() + } + + /** + * 测试开启自动驾驶 + */ + fun setOnTheWayToEndStation() { + if ((mCurrentOCHOrder == null + || mCurrentOCHOrder!!.orderStatus != TaxiOrderStatusEnum.UserArriveAtStart.code) + ) { + ToastUtils.showShort("订单状态不匹配该操作!") + } + // TODO: 调用开始任务 startServicePilotDone() + } + + private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener = + object : IMoGoAutopilotStatusListener { + override fun onAutopilotDockerInfo(dockerVersion: String) {} + override fun onAutopilotRouteLineId(lineId: Long) {} + override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) {} + override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { + TaxiTrajectoryManager.getInstance().onAutopilotGuardian(guardianInfo) + } + + override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {} + override fun onAutopilotStatusResponse(state: Int) { + if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + if (mADASStatusCallback != null) { + mADASStatusCallback!!.onAutopilotRunning() + } + if ((mCurrentOCHOrder != null + && TaxiOrderStatusEnum.OnTheWayToEnd.code == mCurrentOCHOrder!!.orderStatus) + ) { + TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent( + isRestartAutopilot, + true, + mCurrentOCHOrder!!.startSiteAddr, + mCurrentOCHOrder!!.endSiteAddr, + mCurrentOCHOrder!!.lineId, + mCurrentOCHOrder!!.orderNo + ) + if (FunctionBuildConfig.isDemoMode) { + // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true + setIgnoreConditionDraw(true) + setIPCDemoMode(true) + d( + SceneConstant.M_TAXI + TAG, + "美化模式-ignore:置为true(到达出发点且已开启自动驾驶)" + ) + } + } + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + if ((FunctionBuildConfig.isDemoMode + && checkCurrentOCHOrder() + && ((getCurOrderStatus() === TaxiOrderStatusEnum.OnTheWayToEnd + || getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd))) + ) { + // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 + return + } + if (mADASStatusCallback != null) { + mADASStatusCallback!!.onAutopilotEnable() + } + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + if ((FunctionBuildConfig.isDemoMode + && checkCurrentOCHOrder() + && ((getCurOrderStatus() === TaxiOrderStatusEnum.OnTheWayToEnd + || getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd))) + ) { + // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 + return + } + if (mADASStatusCallback != null) { + mADASStatusCallback!!.onAutopilotDisable() + } + } else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) { + if (FunctionBuildConfig.isDemoMode) { + if ((checkCurrentOCHOrder() + && (getCurOrderStatus() === TaxiOrderStatusEnum.OnTheWayToEnd + || getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd)) + ) { //订单中 + // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 + } else { //美化模式下没订单,显示人工驾驶 + if (mADASStatusCallback != null) { + mADASStatusCallback!!.onAutopilotDisable() + } + } + return + } + if (mADASStatusCallback != null) { + mADASStatusCallback!!.onManMachineCoDriving() + } + } + } + + override fun onAutopilotSNRequest() {} + override fun onAutopilotArriveAtStation(arrivalNotification: ArrivalNotification?) { + i(SceneConstant.M_TAXI + TAG, "onAutopilotArriveAtStation = " + arrivalNotification.toString()) + if (((arrivalNotification == null) || !checkCurrentOCHOrder() + || (getCurOrderStatus() === TaxiOrderStatusEnum.ArriveAtEnd)) + ) { + return + } + // TODO: 到站调用 arriveTerminal() + if (FunctionBuildConfig.isDemoMode) { + // 当美化模式(演示模式)开启时: 到达目的地,置false + // 2022.10.08 到达目的地时候取消自动起自驾, 服务完成取消引导线和自动驾驶按钮状态 +// FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; +// CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false); + setIPCDemoMode(false) + d(SceneConstant.M_TAXI + TAG, "美化模式-ignore:置为false(到达目的地)") + } + } + + override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {} + } + + private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = + object : IMoGoPlanningRottingListener { + override fun onAutopilotRotting(globalPathResp: GlobalPathResp?) { + if (null != globalPathResp && globalPathResp.wayPointsList != null) { + d( + SceneConstant.M_TAXI + TAG, ("getWayPointsList = " + + globalPathResp.wayPointsList.size) + ) + } + if (null != globalPathResp && globalPathResp.wayPointsList.size > 0) { + updateOrderRouteInfo(globalPathResp.wayPointsList) + } + } + } + + /** + * 设置路径规划起终点 + * + */ + fun setRouteLineMarker() { + val currentOCHOrder = getCurrentOCHOrder() + if (currentOCHOrder != null) { + if ((currentOCHOrder.startSiteGcjPoint == null) || currentOCHOrder.startSiteGcjPoint.isEmpty() || (currentOCHOrder.startSiteGcjPoint.size < 2) || ( + currentOCHOrder.endSiteGcjPoint == null) || currentOCHOrder.endSiteGcjPoint.isEmpty() || (currentOCHOrder.endSiteGcjPoint.size < 2) + ) { + cleanLineMarker() + return + } + val startStation = LatLng( + currentOCHOrder.startSiteGcjPoint[1], + currentOCHOrder.startSiteGcjPoint[0] + ) + val endStation = LatLng( + currentOCHOrder.endSiteGcjPoint[1], + currentOCHOrder.endSiteGcjPoint[0] + ) + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback!!.setLineMarker(startStation, endStation) + } + } + } + + fun cleanLineMarker() { + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback!!.setLineMarker(null, null) + } + } + + private fun coordinateConverterWgsToGcjList( + mContext: Context?, + mogoLatLngList: List + ): List { + val points: MutableList = ArrayList() + for (m: MessagePad.Location? in mogoLatLngList) { + val mogoLatLng = coordinateConverterWgsToGcj( + mContext, + (m)!! + ) + val result = OrderRouteUpdateReqBean.Result() + result.latitude = mogoLatLng.latitude + result.longitude = mogoLatLng.longitude + points.add(result) + } + return points + } + + /** + * 计算全路径长度,以及实时更新剩余距离,剩余时间,预计时间 + * + * @param models + */ + fun updateOrderRouteInfo(models: List) { + if (models.isEmpty()) return + if (mCurrentOCHOrder == null) return + d(SceneConstant.M_TAXI + TAG, "--------计算出sumLength开始---------- ") + + //转换成高德坐标系 + if (mRoutePoints!!.size > 0) { + mRoutePoints.clear() + } + mRoutePoints.addAll(coordinateConverterWgsToGcjLocations(mContext, models)) + startDynamicCalculateRouteInfo() + } + + fun startDynamicCalculateRouteInfo() { + d( + SceneConstant.M_TAXI + TAG, + "--------mCurrentOCHOrder---------- $mCurrentOCHOrder" + ) + if (mCurrentOCHOrder != null && mRoutePoints!!.size == 0) { //根据orderNo去查询 + queryOrderRouteList(mCurrentOCHOrder!!.orderNo) + } + d(SceneConstant.M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints!!.size) + if (mRoutePoints.size > 0) { + reportTotalDisAndTime() + } + //开启实时计算剩余距离,剩余时间,预计时间 + startOrStopCalculateRouteInfo(true) + AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi() + if (mOrderStatusCallback != null) { + mOrderStatusCallback!!.onNaviToEnd(false, false) + } + } + + private fun reportTotalDisAndTime() { + val lastSumLength = calculateRouteSumLength(mRoutePoints) + val lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6 //秒 + reportOrderRemain(lastSumLength.toLong(), lastTime.toLong()) + } + + private fun updateDistance(lastSumLength: Float) { + val lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6 //秒 + d( + SceneConstant.M_TAXI + "dynamicCalculateRouteInfo", + ("---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime + + " thread = " + Thread.currentThread().name) + ) + if (mCurrentOCHOrder != null) { + mCurrentOCHOrder!!.decreaseTravelDistance(lastSumLength.toDouble()) + } + if (mOrderStatusCallback != null) { + mOrderStatusCallback!!.onCurrentOrderDistToEndChanged( + lastSumLength.toLong(), + lastTime.toLong() + ) + } + reportOrderRemain(lastSumLength.toLong(), lastTime.toLong()) + } + + private val distanceListener: IDistanceListener = object : IDistanceListener { + override fun distanceCallback(distance: Float) { + updateDistance( + distance + ) + } + } + + private val trajectoryListener: ITrajectoryListener = + object : ITrajectoryListener { + override fun trajectoryCallback( + routeArrivied: MutableList, + routeArriving: MutableList, + location: MogoLocation + ) { + if (mAutopilotPlanningCallback != null) { + val routeArriviedTemp: MutableList = + ArrayList() + val routeArrivingTemp: MutableList = + ArrayList() + var temp: LatLng? + for (mogoLocation: MogoLocation in routeArrivied) { + temp = LatLng( + mogoLocation.getLatitude(), + mogoLocation.getLongitude() + ) + routeArriviedTemp.add(temp) + } + for (mogoLocation: MogoLocation in routeArriving) { + temp = LatLng( + mogoLocation.getLatitude(), + mogoLocation.getLongitude() + ) + routeArrivingTemp.add(temp) + } + mAutopilotPlanningCallback!!.routeResult( + routeArriviedTemp, + routeArrivingTemp, + location + ) + setRouteLineMarker() + } + } + } + + + /** + * 查询当前订单的全局路径 (当自动驾驶开启后,订单前往乘客上车点,杀掉应用再次进来时候) + */ + private fun queryOrderRouteList(orderNo: String) { + if (mCurrentOCHOrder != null) { + queryOrderRoute( + (mContext)!!, orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: QueryOrderRouteResp) { + if ((data != null) && (data.data != null) && (mRoutePoints!!.size == 0)) { + mRoutePoints.clear() + val routePoints = coordinateConverterLatlngToLocation(data.data) + mRoutePoints.addAll(routePoints) + } + } + + override fun onError() { + // TODO: 2022/5/18 是否在请求异常的时候提示 + } + + override fun onFail(code: Int, msg: String) {} + }) + } + } + + /** + * 开始轮询计算剩余里程和时间 + * + * @param isStart + */ + fun startOrStopCalculateRouteInfo(isStart: Boolean) { + d(SceneConstant.M_TAXI + TAG, "startOrStopOrderLoop() $isStart") + if (isStart) { + TaxiModelLoopManager.getInstance().startCalculateRouteInfoLoop() + } else { + mRoutePoints!!.clear() + TaxiModelLoopManager.getInstance().stopCalculateRouteInfoLoop() + } + } + + /** + * 上报订单剩余里程和时间 单位:KM, M, 单位:秒 + * + * @param lastSumLength + * @param duration + */ + fun reportOrderRemain(lastSumLength: Long, duration: Long) { // 米/秒 + if (mCurrentOCHOrder == null) return + reportOrderRemain( + (mContext)!!, + mCurrentOCHOrder!!.orderNo, + lastSumLength, + duration, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData) {} + override fun onFail(code: Int, msg: String) {} + }) + } + + // 登出 + fun logout() { + loginService!!.loginOut(mLatitude, mLongitude) + } + + //导航去订单终点目的地 + fun startNaviToEndStation(isShow: Boolean) { + if (mRoutePoints!!.size > 0) { //使用自驾轨迹 + if (mOrderStatusCallback != null) { + mOrderStatusCallback!!.onNaviToEnd(false, isShow) + } + } else { //若直接要显示导航地图则直接导航, 若不是则2s后若无轨迹数据使用高德导航 + if (isShow && mRoutePoints.size == 0 && mOrderStatusCallback != null) { + mOrderStatusCallback!!.onNaviToEnd(true, true) + } else { + UiThreadHandler.postDelayed({ + if (mRoutePoints.size == 0 && mOrderStatusCallback != null) { + mOrderStatusCallback!!.onNaviToEnd(true, false) + } + }, 2000L) + } + } + } + + fun setStation() { + val currentOCHOrder = getCurrentOCHOrder() + if (currentOCHOrder != null) { + val startStation = MogoLocation() + startStation.longitude = currentOCHOrder.startSiteGcjPoint[0] + startStation.latitude = currentOCHOrder.startSiteGcjPoint[1] + val endStation = MogoLocation() + endStation.longitude = currentOCHOrder.endSiteGcjPoint[0] + endStation.latitude = currentOCHOrder.endSiteGcjPoint[1] + setStationPoint(startStation, endStation, currentOCHOrder.lineId) + } + } + + fun cleanStation() { + setStationPoint(null, null, -1L) + } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java index 6574a6ca89..1430748ea9 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java @@ -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()"); diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt new file mode 100644 index 0000000000..393b52e617 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiUnmannedViewModel.kt @@ -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(){ + + 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 + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java deleted file mode 100644 index cbb3885cf6..0000000000 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ /dev/null @@ -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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket - ,@Body DriverStatusUpdateReqBean data); -} diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt index 63b5cfa751..7ab023d182 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt @@ -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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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?, - callback: OchCommonServiceCallback? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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? - ) { - 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 - ) { - 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 - ) { - mOCHTaxiServiceApi.orderCompleted( - MoGoAiCloudClientConfig.getInstance().serviceAppId, - MoGoAiCloudClientConfig.getInstance().token, - TaxiOrPassengerReadyReqBean( - MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc - ) - ) - .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "orderCompleted")) - } - } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiUnmannedServiceApi.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiUnmannedServiceApi.kt new file mode 100644 index 0000000000..9c4eae0bba --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiUnmannedServiceApi.kt @@ -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? + + /** + * 查询司机服务数据 + * @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? + + /** + * 上报订单剩余里程和剩余时间 + * @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? + + + @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? + + /** + * 开始接单 + * @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? + + /** + * 暂停接单 + * @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? + + + //登陆成功后查询 开始接单/暂停接单的状态 + + //点击开始接单,获取要前往的站点 + + //登陆成功后查询当前任务 + + //任务到站 + + //到达任务站点后查询下一站任务(包含是否有订单和订单状态) + + //轮询订单接口 + + //到达乘客上车点 + + //开启自驾 + + //服务完成 +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java index 112ed99f50..dbb2618746 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java @@ -50,10 +50,6 @@ public class NaviPresenter extends Presenter implements TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this); } - private void releaseListeners() { - TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null); - } - private void runOnUIThread( Runnable executor ) { if ( executor == null ) { return; diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java index f97b97d72a..234d47e255 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java @@ -22,11 +22,11 @@ public class TaxiOperationalPresenter extends Presenter 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 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 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 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 implements ITaxiADASS runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus()); } - @Override - public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) { - - } - - @Override - public void onOrdersWaitServiceChanged(@NonNull @NotNull List 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 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 implements ITaxiADASS public void loginFail(boolean isLogin) { } + + @Override + public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) { + + } + + @Override + public void onOrdersListPageRefresh(List ordersList) { + + } } diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.kt index 3775e2c0d2..bdbbb8fcef 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.kt @@ -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() } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.kt index 4650acd3aa..2a3b5c8eb0 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.kt @@ -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 { -} \ No newline at end of file + */ +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(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 + } + } +} diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingServedOrdersFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingServedOrdersFragment.kt deleted file mode 100644 index a38848aa90..0000000000 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingServedOrdersFragment.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mogo.och.taxi.ui - -/** - * @author: wangmingjun - * @date: 2023/7/24 - */class TaxiBeingServedOrdersFragment { -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt new file mode 100644 index 0000000000..6035bb4766 --- /dev/null +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingTaskFragment.kt @@ -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.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 = ("已于
" + + "" + currentHM + "" + + "" + " " + "到达乘客上车地点") + + 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 + ) + ) { + ("免费等待至 " + + "" + DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.HH_mm + ) + "") + } else { + ("免费等待至" + + "" + DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.MM_dd_HH_mm + ) + "") + } + 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) { + ("乘客将于
" + + "" + DateTimeUtil.formatCalendarToString( + startCale, + DateTimeUtil.HH_mm + ) + "" + + " 用车") + } else { + ("乘客将于
" + + "" + DateTimeUtil.formatCalendarToString( + startCale, + DateTimeUtil.MM_dd_HH_mm + ) + "" + + " 用车") + } + 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 = + ("里程 " + "" + dis + "" + " " + disUnit + "" + + ",剩余 " + "" + min + "" + " 分钟") + 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 = + ("全程 " + "" + dis + "" + " 公里" + + ",总用时 " + "" + ceil( + duration.toDouble() / 60 + ).toInt() + "" + " 分钟") + + 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, + 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 + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt index c23930a179..29487ae357 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.kt @@ -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(), + ITaxiView { + private var serverOrdersFragmentWR: WeakReference? = null + private var personalDialogFragment: WeakReference? = 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(R.id.test_bar_to_start)?.setOnClickListener { + TaxiModel.setArriveAtStartStation() + } + findViewById(R.id.test_bar_to_end)?.setOnClickListener { + TaxiModel.setArriveAtEndStation() + } + + findViewById(R.id.test_bar_on_the_way_to_end)?.setOnClickListener { + if (!isStarting) { + mPresenter.startAutoPilot() + } + TaxiModel.setOnTheWayToEndStation() + } + findViewById(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(R.id.module_och_taxi_order_status_change_test_bar) + testCurOrderId = findViewById(R.id.test_bar_current_order_id) + testCurLineId = findViewById(R.id.test_bar_current_line_id) + testCurTrajMd5 = findViewById(R.id.test_bar_current_traj_md5) + testCurStopMd5 = findViewById(R.id.test_bar_current_stop_md5) + testCurTrajMd5DPQP = findViewById(R.id.test_bar_current_traj_md5_dpqp) + testCurStopMd5DPQP = findViewById(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 + } + } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt index 5718ed6a16..11f873cf18 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt @@ -268,12 +268,12 @@ class TaxiMapDirectionView @JvmOverloads constructor( } fun setCoordinatesLatLng( - routeArrivied: List?, - routeArriving: List?, + routeArrived: List, + routeArriving: List, location: MogoLocation? ) { this.routeArrivied.clear() - this.routeArrivied.addAll(routeArrivied!!) + this.routeArrivied.addAll(routeArrived!!) this.routeArriving.clear() this.routeArriving.addAll(routeArriving!!) this.location = location diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.kt index 0807ae742a..bf2d09f9f8 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.kt @@ -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 = ArrayList() + private val mOrderNumData: MutableList = ArrayList() + private val mData: MutableList = 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(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 + ) : + RecyclerView.Adapter() { + 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 = + "$hourData$minuteData" + holder.operationDataTv.text = Html.fromHtml(data,Html.FROM_HTML_MODE_LEGACY) + holder.operationDataTitle.text = "今日在线时长" + } else if (1 == mType) { + val data = + "" + datas[position].toString() + "" + " 单" + "" + 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(R.id.operation_data_tv) + operationDataTitle = itemView.findViewById(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 + } + } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.kt index 4325c35048..6156470130 100644 --- a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.kt +++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.kt @@ -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(), + 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 = ArrayList() + private val mTabTitles = arrayOf("在线时长", "订单完成数") + private val fragments: MutableList = 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(R.id.module_och_taxi_order_list_close_iv) + mOperationDataRl = findViewById(R.id.module_och_taxi_operation_data_rl) + mShowOrdersBt = findViewById