[6.0.0] taxi司机端重构初始化

This commit is contained in:
wangmingjun
2023-07-31 18:14:41 +08:00
parent 2e3ab4a5e0
commit 489e2ef869
566 changed files with 4828 additions and 13411 deletions

View File

@@ -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")

View File

@@ -1,7 +1,31 @@
package com.mogo.och.taxi.base
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.content.DialogInterface.OnShowListener
import androidx.fragment.app.DialogFragment
import java.lang.ref.WeakReference
/**
* @author: wangmingjun
* @author: wang ming jun
* @date: 2023/7/24
*/class AvoidLeakDialog {
}
*/
open class AvoidLeakDialog : Dialog {
private var hostFragmentReference: WeakReference<DialogFragment?>? = null
fun setHostFragmentReference(hostFragment: DialogFragment?) {
hostFragmentReference = WeakReference(hostFragment)
}
constructor(context: Context) : super(context) {}
override fun setOnCancelListener(listener: DialogInterface.OnCancelListener?) {}
override fun setOnDismissListener(listener: DialogInterface.OnDismissListener?) {}
override fun setOnShowListener(listener: OnShowListener?) {}
override fun dismiss() {
super.dismiss()
if (null != hostFragmentReference && null != hostFragmentReference!!.get()) {
hostFragmentReference!!.get()!!.dismissAllowingStateLoss()
}
}
}

View File

@@ -0,0 +1,28 @@
package com.mogo.och.taxi.base
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.viewbinding.ViewBinding
import com.mogo.commons.mvp.BaseFragment
abstract class BaseBindingFragment<VB : ViewBinding>(
val block: (LayoutInflater) -> VB
) : BaseFragment() {
private var _binding: VB? = null
protected val binding: VB
get() = requireNotNull(_binding) { "The property of binding has been destroyed." }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
_binding = block(layoutInflater)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}

View File

@@ -1,7 +1,612 @@
package com.mogo.och.taxi.base
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.SystemClock
import android.view.LayoutInflater
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.constraintlayout.widget.Group
import androidx.fragment.app.FragmentTransaction
import com.mogo.commons.mvp.IView
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.mvp.Presenter
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.initBadCase
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showToolsView
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView
import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView
import com.mogo.eagle.core.function.smp.view.SmallMapView
import com.mogo.eagle.core.function.view.MapBizView
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.listener.IMogoMapListener
import com.mogo.map.uicontroller.VisualAngleMode
import com.mogo.och.common.module.utils.AnimatorDrawableUtil
import com.mogo.och.taxi.R
import com.mogo.och.taxi.constant.TaxiConst
import com.mogo.och.taxi.ui.TaxiAmapNaviFragment
import com.mogo.och.taxi.ui.TaxiRottingNaviFragment
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/24
*/class BaseTaxiTabFragment {
*/
abstract class BaseTaxiTabFragment<V: IView, P: Presenter<V>> : MvpFragment<V, P>(),
IMogoMapListener,IMoGoAutopilotRecordListener {
private val TAG = "BaseOchFragment"
private var ctvAutopilotStatusRL: RelativeLayout? = null
private var mAnimFlowIv: ImageView? = null
protected var tvOperationStatus: TextView? = null
protected var mDriverRole: TextView? = null
private var flStationPanelContainer: FrameLayout? = null
private var flNaviPanelContainer: FrameLayout? = null
private var mapBizView: MapBizView? = null
private var groupTestPanel: Group? = null
private var mSpeedView: TextView? = null
private var mAutopilotImage: ImageView? = null
private var mAutopilotTv: TextView? = null
private var mMapswitchBtn: LinearLayout? = null
private var mSwitchBtnIcon: ImageView? = null
private var mCloseNaviIcon: ImageView? = null
private var mSettingBtn: RelativeLayout? = null
private var mBadcaseBtn: LinearLayout? = null
//消息盒子
private var driverMsgBoxButtonView: DriverMsgBoxButtonView? = null
protected var viewDriverMsgBoxList: DriverMsgBoxListView? = null
protected var viewDriverMsgBoxBubble: DriverMsgBoxBubbleView? = null
private var ochAmapNaviFragment: TaxiAmapNaviFragment? = null
private var taxiRottingNaviFragment: TaxiRottingNaviFragment? = null
// protected TaxiTrafficLightView mTrafficLightView;
// protected TaxiTrafficLightView mTrafficLightView;
private var smallMapView: SmallMapView? = null
private val mHandler = Handler(Looper.getMainLooper())
private val startAutopilotDrawableIds = arrayOf(
R.drawable.anim_flow_00000, R.drawable.anim_flow_00001, R.drawable.anim_flow_00002,
R.drawable.anim_flow_00003, R.drawable.anim_flow_00004, R.drawable.anim_flow_00005,
R.drawable.anim_flow_00006, R.drawable.anim_flow_00007, R.drawable.anim_flow_00008,
R.drawable.anim_flow_00009, R.drawable.anim_flow_00010, R.drawable.anim_flow_00011,
R.drawable.anim_flow_00012, R.drawable.anim_flow_00013, R.drawable.anim_flow_00014,
R.drawable.anim_flow_00015, R.drawable.anim_flow_00016, R.drawable.anim_flow_00017,
R.drawable.anim_flow_00018, R.drawable.anim_flow_00019, R.drawable.anim_flow_00020,
R.drawable.anim_flow_00021, R.drawable.anim_flow_00022, R.drawable.anim_flow_00023,
R.drawable.anim_flow_00024, R.drawable.anim_flow_00025, R.drawable.anim_flow_00026,
R.drawable.anim_flow_00027, R.drawable.anim_flow_00028, R.drawable.anim_flow_00029,
R.drawable.anim_flow_00030, R.drawable.anim_flow_00031, R.drawable.anim_flow_00032,
R.drawable.anim_flow_00033, R.drawable.anim_flow_00034, R.drawable.anim_flow_00035,
R.drawable.anim_flow_00036, R.drawable.anim_flow_00037, R.drawable.anim_flow_00038,
R.drawable.anim_flow_00039, R.drawable.anim_flow_00040, R.drawable.anim_flow_00041,
R.drawable.anim_flow_00042, R.drawable.anim_flow_00043, R.drawable.anim_flow_00044,
R.drawable.anim_flow_00045, R.drawable.anim_flow_00046, R.drawable.anim_flow_00047,
R.drawable.anim_flow_00048, R.drawable.anim_flow_00049, R.drawable.anim_flow_00050,
R.drawable.anim_flow_00051, R.drawable.anim_flow_00052, R.drawable.anim_flow_00053,
R.drawable.anim_flow_00054, R.drawable.anim_flow_00055, R.drawable.anim_flow_00056,
R.drawable.anim_flow_00057, R.drawable.anim_flow_00058, R.drawable.anim_flow_00059
)
private val startManCODrawableIds = arrayOf(
R.drawable.anim_flow_man_co_00000, R.drawable.anim_flow_man_co_00001,
R.drawable.anim_flow_man_co_00002, R.drawable.anim_flow_man_co_00003,
R.drawable.anim_flow_man_co_00004, R.drawable.anim_flow_man_co_00005,
R.drawable.anim_flow_man_co_00006, R.drawable.anim_flow_man_co_00007,
R.drawable.anim_flow_man_co_00008, R.drawable.anim_flow_man_co_00009,
R.drawable.anim_flow_man_co_00010, R.drawable.anim_flow_man_co_00011,
R.drawable.anim_flow_man_co_00012, R.drawable.anim_flow_man_co_00013,
R.drawable.anim_flow_man_co_00014, R.drawable.anim_flow_man_co_00015,
R.drawable.anim_flow_man_co_00016, R.drawable.anim_flow_man_co_00017,
R.drawable.anim_flow_man_co_00018, R.drawable.anim_flow_man_co_00019,
R.drawable.anim_flow_man_co_00020, R.drawable.anim_flow_man_co_00021,
R.drawable.anim_flow_man_co_00022, R.drawable.anim_flow_man_co_00023,
R.drawable.anim_flow_man_co_00024, R.drawable.anim_flow_man_co_00025,
R.drawable.anim_flow_man_co_00026, R.drawable.anim_flow_man_co_00027,
R.drawable.anim_flow_man_co_00028, R.drawable.anim_flow_man_co_00029,
R.drawable.anim_flow_man_co_00030, R.drawable.anim_flow_man_co_00031,
R.drawable.anim_flow_man_co_00032, R.drawable.anim_flow_man_co_00033,
R.drawable.anim_flow_man_co_00034, R.drawable.anim_flow_man_co_00035,
R.drawable.anim_flow_man_co_00036, R.drawable.anim_flow_man_co_00037,
R.drawable.anim_flow_man_co_00038, R.drawable.anim_flow_man_co_00039,
R.drawable.anim_flow_man_co_00040, R.drawable.anim_flow_man_co_00041,
R.drawable.anim_flow_man_co_00042, R.drawable.anim_flow_man_co_00043,
R.drawable.anim_flow_man_co_00044, R.drawable.anim_flow_man_co_00045,
R.drawable.anim_flow_man_co_00046, R.drawable.anim_flow_man_co_00047,
R.drawable.anim_flow_man_co_00048, R.drawable.anim_flow_man_co_00049,
R.drawable.anim_flow_man_co_00050, R.drawable.anim_flow_man_co_00051,
R.drawable.anim_flow_man_co_00052, R.drawable.anim_flow_man_co_00053,
R.drawable.anim_flow_man_co_00054, R.drawable.anim_flow_man_co_00055,
R.drawable.anim_flow_man_co_00056, R.drawable.anim_flow_man_co_00057,
R.drawable.anim_flow_man_co_00058, R.drawable.anim_flow_man_co_00059
)
override fun getLayoutId(): Int {
return R.layout.taxi_base_fragment
}
private var panelView: View? = null
@SuppressLint("UseCompatLoadingForDrawables")
override fun initViews() {
mapBizView = findViewById(R.id.mapBizView)
groupTestPanel = findViewById(R.id.groupTestPanel)
ctvAutopilotStatusRL = findViewById(R.id.module_mogo_och_autopilot_status)
ctvAutopilotStatusRL!!.background =
resources.getDrawable(R.drawable.taxi_autopilot_bg_selector,null)
updateCtvAutopilotStatusTag(false)
mAutopilotImage = findViewById(R.id.module_och_autopilot_iv)
mAnimFlowIv = findViewById(R.id.anim_flow_iv)
mAutopilotTv = findViewById(R.id.module_och_autopilot_tv)
flStationPanelContainer =
findViewById(R.id.module_mogo_och_station_panel_container)
driverMsgBoxButtonView = findViewById(R.id.viewDriverMsgBoxButton)
viewDriverMsgBoxList = findViewById(R.id.viewDriverMsgBoxList)
viewDriverMsgBoxBubble = findViewById(R.id.viewDriverMsgBoxBubble)
mSpeedView = findViewById(R.id.module_mogo_och_speed_tv)
mCloseNaviIcon = findViewById(R.id.taxi_close_navi_icon)
flNaviPanelContainer = findViewById(R.id.module_mogo_och_navi_panel_container)
mSpeedView!!.isLongClickable = true //调试按钮任意模式下都开
tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status)
mDriverRole = findViewById(R.id.taxi_driver_role_tv)
mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_layout)
mSwitchBtnIcon = findViewById(R.id.taxi_switch_icon)
updateSwitchMapIcon()
mMapswitchBtn!!.setOnClickListener {
//视角切换
val start = SystemClock.elapsedRealtime()
try {
val controller = getMapUIController()
if (controller != null) {
//切换地图的远近视图
if (controller.currentMapVisualAngle.isLongSight) {
getMapUIController()?.setLockMode(true)
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null)
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
} else if (controller.currentMapVisualAngle.isMediumSight) {
getMapUIController()?.setLockMode(false)
controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null)
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_long)
} else {
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
}
}
} finally {
d(
SceneConstant.M_TAXI + TAG,
"cost:" + (SystemClock.elapsedRealtime() - start)
)
}
}
mSettingBtn = findViewById(R.id.module_och_taxi_setting_layout)
mSettingBtn!!.setOnClickListener {
showToolsView()
}
// mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
mBadcaseBtn = findViewById(R.id.module_och_taxi_badcase_ll)
if (mBadcaseBtn != null) {
initBadCase(mBadcaseBtn!!)
CallerAutopilotRecordListenerManager.addListener(TAG, this)
}
panelView = LayoutInflater.from(context)
.inflate(getStationPanelViewId(), flStationPanelContainer)
ctvAutopilotStatusRL!!.setOnClickListener(object : OnPreventFastClickListener() {
override fun onClickImpl(v: View) {
// 如果能自动驾驶,就自动驾驶,不能就提示
if (getState() ==
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
) {
return //远程代驾状态下不可开启自动驾驶,只能等远程代驾主动退出
} else if (!(ctvAutopilotStatusRL!!.tag as Boolean)) {
ToastUtils.showShort(resources.getString(R.string.module_och_taxi_auto_disable_tip1))
} else {
startAutopilot()
}
}
})
// debug下调用测试面板 长按速度值 任意模式下调试都打开
// if (DebugConfig.isDebug()) {
mSpeedView!!.setOnLongClickListener {
if (groupTestPanel!!.visibility == View.VISIBLE) {
groupTestPanel!!.visibility = View.GONE
} else {
groupTestPanel!!.visibility = View.VISIBLE
}
false
}
// }
onAutopilotStatusChanged(getState())
// 模拟 不可自动驾驶目前场景是刚开机adas还未和工控机连接
findViewById<View>(R.id.btnAutopilotDisable)?.setOnClickListener {
onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
)
}
// 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
findViewById<View>(R.id.btnAutopilotEnable)?.setOnClickListener {
onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE
)
}
// 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
findViewById<View>(R.id.btnAutopilotRunning)?.setOnClickListener {
onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
)
}
findViewById<View>(R.id.btnAutopilotmanco)?.setOnClickListener {
onAutopilotStatusChanged(
IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
)
}
tvOperationStatus!!.setOnClickListener { onChangeOperationStatus() }
mCloseNaviIcon!!.setOnClickListener {
showAmapNaviToStationFragment(false)
showRottingToStationFragment(false)
}
driverMsgBoxButtonView!!.setClickListener(object : DriverMsgBoxButtonView.ClickListener {
override fun showMsgBoxList(show: Boolean) {
if (show) {
viewDriverMsgBoxList!!.visibility = View.VISIBLE
viewDriverMsgBoxList!!.notifyData()
viewDriverMsgBoxBubble!!.visibility = View.GONE
viewDriverMsgBoxBubble!!.isShowData(false)
} else {
viewDriverMsgBoxList!!.visibility = View.GONE
viewDriverMsgBoxBubble!!.visibility = View.VISIBLE
viewDriverMsgBoxBubble!!.isShowData(true)
}
}
})
smallMapView = findViewById(R.id.smallMapView)
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
mapBizView!!.onCreate(savedInstanceState)
smallMapView!!.onCreateView(savedInstanceState)
}
override fun onResume() {
super.onResume()
mapBizView!!.onResume()
smallMapView!!.onResume()
}
override fun onPause() {
super.onPause()
mapBizView!!.onPause()
smallMapView!!.onPause()
}
protected open fun onChangeOperationStatus() {}
private fun updateSwitchMapIcon() {
val controller = getMapUIController()
if (controller != null) {
if (controller.currentMapVisualAngle.isLongSight) {
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_long)
} else if (controller.currentMapVisualAngle.isMediumSight) {
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
} else {
mSwitchBtnIcon!!.setImageResource(R.drawable.taxi_switch_map_medium)
}
}
}
override fun onLowMemory() {
super.onLowMemory()
mapBizView!!.onLowMemory()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapBizView!!.onSaveInstanceState(outState)
}
override fun onDestroyView() {
mapBizView!!.onDestroy()
super.onDestroyView()
CallerAutopilotRecordListenerManager.removeListener(TAG)
}
override fun onDestroy() {
super.onDestroy()
smallMapView!!.onDestroy()
}
private var mPrevAPStatus = -1
/**
* 改变自动驾驶状态
*
* @param status 2 - running 1 - enable 2 - disable
*/
fun onAutopilotStatusChanged(status: Int) {
activity?.runOnUiThread(Runnable runOnUiThread@{
if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) {
// 1. 主动开启自动驾驶中不为2为0、1则继续loading
return@runOnUiThread
}
if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status && mPrevAPStatus != status
) {
// 2. 主动开启自动驾驶中为2则停止loading并isStarting = false
startAutopilotDone(true)
return@runOnUiThread
}
// 3. 其他过程直接更新
startOrStopLoadingAnim(false)
autopilotStatusAnimchanged(status)
mPrevAPStatus = status
})
}
fun stopAnimAndUpdateBtnStatus() {
startOrStopLoadingAnim(false)
startAutopilotDone(false)
}
fun onManMachineCoDriving(manMachineCoDriving: Int) {
if (mPrevAPStatus != manMachineCoDriving) {
autopilotStatusAnimchanged(manMachineCoDriving)
}
mPrevAPStatus = manMachineCoDriving
}
fun updateCtvAutopilotStatusTag(tag: Boolean) {
ctvAutopilotStatusRL!!.tag = tag
}
private var animatorDrawableUtil: AnimatorDrawableUtil? = null
private fun autopilotStatusAnimchanged(status: Int) {
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
mAutopilotTv!!.text = "自动驾驶"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot)
if (animatorDrawableUtil == null) {
animatorDrawableUtil = AnimatorDrawableUtil()
}
animatorDrawableUtil!!.setAnimation(
mAnimFlowIv,
listOf(*startAutopilotDrawableIds)
)
animatorDrawableUtil!!.start(true, 100, null)
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
mAutopilotTv!!.text = "自动驾驶"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot)
if (animatorDrawableUtil != null) {
animatorDrawableUtil!!.stop()
mAnimFlowIv!!.setImageResource(0)
}
animatorDrawableUtil = null
} else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == status) {
mAutopilotTv!!.text = "远程代驾"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot)
if (animatorDrawableUtil == null) {
animatorDrawableUtil = AnimatorDrawableUtil()
}
animatorDrawableUtil!!.setAnimation(mAnimFlowIv, listOf(*startManCODrawableIds))
animatorDrawableUtil!!.start(true, 100, null)
} else {
mAutopilotTv!!.text = "自动驾驶"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_disable,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_disable)
if (animatorDrawableUtil != null) {
animatorDrawableUtil!!.stop()
mAnimFlowIv!!.setImageResource(0)
}
animatorDrawableUtil = null
}
}
private fun startAutopilotDone(success: Boolean) {
if (autopilotLoadingAnimator != null) {
autopilotLoadingAnimator!!.end()
mAutopilotImage!!.clearAnimation()
autopilotLoadingAnimator = null
}
if (success) {
mAutopilotTv!!.text = "成功"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_success)
} else {
mAutopilotTv!!.text = "失败"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_failed)
}
mHandler.postDelayed({
startOrStopLoadingAnim(false)
onAutopilotStatusChanged(getState())
}, 1000L)
}
var isStarting = false
private var autopilotLoadingAnimator: ObjectAnimator? = null
@SuppressLint("ObjectAnimatorBinding")
fun startOrStopLoadingAnim(start: Boolean) {
if (start) {
isStarting = true
mAutopilotTv!!.text = "启动中"
mAutopilotTv!!.setTextColor(resources.getColor(R.color.taxi_autopilot_text_color_normal,null))
mAutopilotImage!!.setImageResource(R.drawable.taxi_ic_autopilot_loading)
if (autopilotLoadingAnimator == null) {
autopilotLoadingAnimator = ObjectAnimator.ofFloat(
mAutopilotImage,
"rotation", 0f, 360f
)
}
autopilotLoadingAnimator!!.interpolator = LinearInterpolator()
autopilotLoadingAnimator!!.repeatCount = -1 //无限循环
autopilotLoadingAnimator!!.startDelay = 100
autopilotLoadingAnimator!!.duration = 1000 //设置持续时间
autopilotLoadingAnimator!!.start() //动画开始
startingAutoApilotCountDown()
} else {
isStarting = false
if (autopilotLoadingAnimator != null) {
autopilotLoadingAnimator!!.end()
mAutopilotImage!!.clearAnimation()
autopilotLoadingAnimator = null
}
}
}
private fun startingAutoApilotCountDown() {
UiThreadHandler.postDelayed({
//未启动成功10s后做处理
if (isStarting) { //判断动画是否在进行
//并且根据状态来设置自动驾驶启动成功还是失败
if (getState()
== IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
) {
startAutopilotDone(true)
} else {
startAutopilotDone(false)
}
}
}, TaxiConst.TIMER_START_AUTOPILOT_INTERVAL)
}
fun hidPanel() {
activity?.runOnUiThread { flStationPanelContainer!!.visibility = View.GONE }
}
fun showPanel() {
activity?.runOnUiThread {
flStationPanelContainer!!.visibility = View.VISIBLE
}
}
fun getPanelView(): View? {
return panelView
}
/**
* 获取站点面板view在[.initViews]时候添加到container中
*
* @return 站点面板view
*/
abstract fun getStationPanelViewId(): Int
/**
* 重新开启自动驾驶
*/
abstract fun startAutopilot()
fun changeOperationViewVisible(visible: Int) {
activity?.runOnUiThread(Runnable runOnUiThread@{
if (tvOperationStatus == null) {
return@runOnUiThread
}
tvOperationStatus!!.visibility = visible
})
}
fun updateSpeedView(newSpeed: Float) {
val speed = (Math.abs(newSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值
mSpeedView!!.text = speed.toString()
}
override fun onMapVisualAngleChanged(visualAngleMode: VisualAngleMode?) {
//todo ui 切换
}
fun showAmapNaviToStationFragment(isShow: Boolean) {
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
closeAmapViewIFHadeAdd()
if (isShow) {
closeRouteViewIFHadeAdd()
// if (ochNaviFragment == null){
ochAmapNaviFragment = TaxiAmapNaviFragment.newInstance()
// }
if (ochAmapNaviFragment!!.isAdded) {
return
}
transaction.add(R.id.module_mogo_och_navi_panel_container, ochAmapNaviFragment!!)
.show(ochAmapNaviFragment!!)
transaction.commitAllowingStateLoss()
mCloseNaviIcon!!.visibility = View.VISIBLE
flNaviPanelContainer!!.visibility = View.VISIBLE
smallMapView!!.visibility = View.GONE
} else {
mCloseNaviIcon!!.visibility = View.GONE
flNaviPanelContainer!!.visibility = View.GONE
smallMapView!!.visibility = View.VISIBLE
}
}
private fun closeAmapViewIFHadeAdd() {
if (ochAmapNaviFragment != null) {
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
ochAmapNaviFragment!!.onDestroy()
transaction.remove(ochAmapNaviFragment!!)
transaction.commitAllowingStateLoss()
ochAmapNaviFragment = null
}
}
private fun closeRouteViewIFHadeAdd() {
if (taxiRottingNaviFragment != null) {
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
taxiRottingNaviFragment!!.onDestroy()
transaction.remove(taxiRottingNaviFragment!!)
transaction.commitAllowingStateLoss()
taxiRottingNaviFragment = null
}
}
fun showRottingToStationFragment(isShow: Boolean) {
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
if (isShow) {
closeAmapViewIFHadeAdd()
// if (ochNaviFragment == null){
taxiRottingNaviFragment = TaxiRottingNaviFragment.newInstance()
// }
if (taxiRottingNaviFragment!!.isAdded) {
return
}
transaction.add(R.id.module_mogo_och_navi_panel_container, taxiRottingNaviFragment!!)
.show(taxiRottingNaviFragment!!)
transaction.commitAllowingStateLoss()
mCloseNaviIcon!!.visibility = View.VISIBLE
flNaviPanelContainer!!.visibility = View.VISIBLE
smallMapView!!.visibility = View.GONE
} else {
closeRouteViewIFHadeAdd()
mCloseNaviIcon!!.visibility = View.GONE
flNaviPanelContainer!!.visibility = View.GONE
smallMapView!!.visibility = View.VISIBLE
}
}
abstract fun startNaviToEndStation(isShow: Boolean)
}

View File

@@ -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
}
}

View File

@@ -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?)
}

View File

@@ -0,0 +1,47 @@
package com.mogo.och.taxi.base
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
/**
* @author: wangmingjun
* @date: 2023/7/21
*/
abstract class BaseViewModel<UiState : IUiState, UiIntent : IUiIntent> : ViewModel() {
private val _uiStateFlow = MutableStateFlow(initUiState())
val uiStateFlow: StateFlow<UiState> = _uiStateFlow
protected abstract fun initUiState(): UiState
protected fun sendUiState(copy: UiState.() -> UiState){
_uiStateFlow.update { copy(_uiStateFlow.value) }
}
private val _uiIntentFlow: Channel<UiIntent> = Channel()
val uiIntentFlow: Flow<UiIntent> = _uiIntentFlow.receiveAsFlow()
fun sendUiIntent(uiIntent: UiIntent){
viewModelScope.launch {
_uiIntentFlow.send(uiIntent)
}
}
init {
viewModelScope.launch {
uiIntentFlow.collect {
handleIntent(it)
}
}
}
protected abstract fun handleIntent(intent: IUiIntent)
}

View File

@@ -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

View File

@@ -0,0 +1,7 @@
package com.mogo.och.taxi.bean
/**
* @author: wangmingjun
* @date: 2023/7/26
*/
data class OrderDetail(var orderId: Long)

View File

@@ -0,0 +1,7 @@
package com.mogo.och.taxi.bean
/**
* @author: wangmingjun
* @date: 2023/7/26
*/
data class TaskDetail(var taskId: Int)

View File

@@ -13,39 +13,10 @@ import java.util.List;
* Model->Presenter回调订单相关进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
*/
public interface ITaxiOrderStatusCallback {
// 进行中单变更:暂未用到
void onOrdersInServiceChanged(@NonNull List<OrderQueryRespBean.Result> inServiceList);
// 待服务单变更
void onOrdersWaitServiceChanged(@NonNull List<OrderQueryRespBean.Result> waitServiceList);
// 当前进行单状态变更:新到进行中订单、进行中单状态变更
void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
// 当前订单取消完成:用于司机主动取消订单的结果反馈
void onCurrentOrderCancelDone();
// 待服务单被取消
void onOrderCancelDone(String orderNo);
// 当前订单route信息查询反馈
void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
// 当前位置距离上车点的距离(米)、预估时间(秒)
void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
// 当前位置距离上车点的距离(米)、预估时间(秒)
void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
// 新到预约单
void onNewBookingOrderGot(OrderQueryRespBean.Result order);
// 执行抢单动作完成:可进入抢单中状态
void onGrabOrderExecuteDone();
// 抢到预约单
void onGrabOrderSuccess(OrderQueryRespBean.Result order);
// 未抢到预约单
void onGrabOrderFailed(OrderQueryRespBean.Result order);
// 司机已确认开启自动驾驶环境
void onDriverHasCheckedPilotCondition(boolean isSafe);
/**
* 导航到目的地
* @param isAmap 是否是高德导航

View File

@@ -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()");

View File

@@ -0,0 +1,75 @@
package com.mogo.och.taxi.model
import com.mogo.och.taxi.base.BaseViewModel
import com.mogo.och.taxi.base.IUiIntent
import com.mogo.och.taxi.bean.OrderQueryRespBean
import com.mogo.och.taxi.ui.unmanned.UnmannedIntent
import com.mogo.och.taxi.ui.unmanned.UnmannedState
/**
* @author: wangmingjun
* @date: 2023/7/26
*/
object TaxiUnmannedViewModel : BaseViewModel<UnmannedState, UnmannedIntent>(){
private var mCurrentOrder:OrderQueryRespBean.Result? = null
override fun initUiState(): UnmannedState {
TODO("Not yet implemented")
}
override fun handleIntent(intent: IUiIntent) {
when(intent) {
UnmannedIntent.GetCurrentTask -> {
}
is UnmannedIntent.GetNextTask -> {
}
is UnmannedIntent.GetReceivingOrderState -> {
}
is UnmannedIntent.GetVirtualStation -> {
}
is UnmannedIntent.GetOrder -> {
}
is UnmannedIntent.StartTask -> {
}
is UnmannedIntent.ArrivedOrderStartStation -> {
}
is UnmannedIntent.JumpPassengerCheckDone -> {
}
is UnmannedIntent.ArrivedOrderEndStation -> {
}
is UnmannedIntent.JourneyCompleted -> {
}
is UnmannedIntent.CloseOrderByDriver -> {
}
}
}
fun getCurrentOCHOrder(): OrderQueryRespBean.Result? {
return mCurrentOrder
}
}

View File

@@ -1,308 +0,0 @@
package com.mogo.och.taxi.network;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.och.taxi.bean.CarHeartbeatReqBean;
import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean;
import com.mogo.och.taxi.bean.OrderCancelReqBean;
import com.mogo.och.taxi.bean.OrderGrabReqBean;
import com.mogo.och.taxi.bean.OrderGrabRespBean;
import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean;
import com.mogo.och.taxi.bean.OrderQueryReqBean;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
import com.mogo.och.taxi.bean.OrderQueryRouteInfoReqBean;
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean;
import com.mogo.och.taxi.bean.OrderStatusUpdateReqBean;
import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean;
import com.mogo.och.taxi.bean.OrdersListQueryReqBean;
import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
import com.mogo.och.taxi.bean.QueryOrderRouteResp;
import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean;
import io.reactivex.Observable;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by pangfan on 2021/8/19
*
* 网约车-出租车接口定义
*/
interface TaxiServiceApiNew {
/**
* 查询全部服务中/待服务订单没有的时候返回code 0空列表
* @param sn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
@GET("/autopilot-car-hailing/order/v2/driver/taxi/orderInService/query")
Observable<OrdersInServiceQueryRespBean> queryOrdersInAndWaitService(@Header("appId") String appId
, @Header("ticket") String ticket, @Query("sn") String sn);
/**
* 查询新到的预约单
* @param sn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/newBookingOrder/query" )
Observable<OrdersNewBookingQueryRespBean> queryNewBookingOrder(@Header ("appId") String appId
,@Header("ticket") String ticket,@Query("sn") String sn);
/**
* (预约单)执行抢单动作
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/grabOrder" )
Observable<OrderGrabRespBean> grabOrder(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrderGrabReqBean data);
/**
* (预约单)查询抢单结果
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/grabStatus/query" )
Observable<OrderGrabStatusQueryRespBean> queryOrderGrabStatus(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrderGrabReqBean data);
/**
* 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/routeInfo/query" )
Observable<OrderQueryRouteInfoRespBean> queryOrderRouteInfo(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrderQueryRouteInfoReqBean data);
/**
* 通过orderId查询订单信息用于本地已经有orderId时
* @param data
* @return
* @deprecated v2.1_0930需求中暂不再使用此接口
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrderById" )
Observable<OrderQueryRespBean> queryOrderById(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrderQueryReqBean data);
/**
* 查询服务中订单信息用于本地无orderId时
* 如果有多条,只会返回时间最近的一条
* @param sn
* @return
* @deprecated v2.1_0930需求中暂不再使用此接口
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrderInService" )
Observable<OrderQueryRespBean> queryOrderInService(@Header ("appId") String appId,@Header("ticket") String ticket
,@Query("sn") String sn);
/**
* 取消订单
*/
@Headers({"Content-type:application/json;charset=UTF-8"})
// @POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
@POST("/autopilot-car-hailing/order/v2/driver/taxi/cancelOrder")
Observable<BaseData> cancelOrder(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrderCancelReqBean data);
/**
* 订单列表获取
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
@POST( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrders" )
Observable<OrdersListQueryRespBean> queryOrdersList(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrdersListQueryReqBean data);
/**
* 订单状态更新
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
// @POST( "/autopilot-car-hailing/order/v2/driver/taxi/order/updateStatus" )
@POST( "/autopilot-car-hailing/order/v2/vehicle/taxi/driver/updateStatus" )
Observable<BaseData> updateOrderStatus(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body OrderStatusUpdateReqBean data);
/**
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
@POST( "/autopilot-car-hailing/location/v2/driver/taxi/heartbeat" )
Observable<BaseData> runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body CarHeartbeatReqBean data);
/**
* 查询司机服务数据
* @param sn
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/serviceData/query" )
Observable<DriverServiceDataRespBean> queryServiceData(@Header ("appId") String appId
,@Header("ticket") String ticket,@Query("sn") String sn);
/**
* 上传工控机返回的全路径规划数据
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST("/autopilot-car-hailing/order/v2/driver/taxi/saveOrderRoute")
// @POST("/mock/268/autopilot-car-hailing/order/v2/driver/taxi/orderRoute")
Observable<BaseData> updateOrderRoute(@Header ("appId") String appId
, @Header("ticket") String ticket, @Body OrderRouteUpdateReqBean data);
/**
* 上报订单剩余里程和剩余时间
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST("/autopilot-car-hailing/order/v2/driver/taxi/reportOrderRemain")
Observable<BaseData> reportOrderRemain(@Header ("appId") String appId
, @Header("ticket") String ticket, @Body UpdateOrderDisAndTimeReqBean data);
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
@GET( "/autopilot-car-hailing/order/v2/driver/taxi/orderRoute" )
Observable<QueryOrderRouteResp> queryOrderRoute(@Header ("appId") String appId
, @Header("ticket") String ticket, @Query("orderNo") String orderNo);
/**
* 司机端跳过乘客验证,订单状态流转为乘客已上车
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/passenger" )
Observable<TaxiDataBaseRespBean> updatePassengerHasBoardedStatus(@Header ("appId") String appId
, @Header("ticket") String ticket, @Body TaxiOrPassengerReadyReqBean data);
/**
* 司机端确认可开启自动驾驶
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/pilot" )
Observable<TaxiDataBaseRespBean> confirmAutopilotConditionByDriver(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
/**
* 查询司机是否已确认可开启自动驾驶
* @param appId
* @param ticket
* @param orderNo
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" )
Observable<TaxiDataBaseRespBean> queryPilotStatus(@Header ("appId") String appId
, @Header("ticket") String ticket,@Query("orderNo") String orderNo);
/**
* 开启自动驾驶成功
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startServicePilot" )
Observable<TaxiDataBaseRespBean> startServicePilotDone(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
/**
* 达到乘客上车点
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/arriveStartPoint" )
Observable<TaxiDataBaseRespBean> arrivedStartPoint(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
/**
* 到达乘客目的地
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/arriveTerminal" )
Observable<TaxiDataBaseRespBean> arriveTerminal(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
/**
* 订单完成
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/orderCompleted" )
Observable<TaxiDataBaseRespBean> orderCompleted(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
/**
* 暂停接单
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/stopOrderServing" )
Observable<BaseData> stopOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body DriverStatusUpdateReqBean data);
/**
* 暂停接单
* @param data
* @return
*/
@Headers( {"Content-type:application/json;charset=UTF-8"} )
// @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" )
Observable<BaseData> resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
,@Body DriverStatusUpdateReqBean data);
}

View File

@@ -17,183 +17,11 @@ import io.reactivex.Observable
object TaxiServiceManager {
private var mOCHTaxiServiceApi: TaxiServiceApiNew =
private var mOCHTaxiServiceApi: TaxiUnmannedServiceApi =
MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
TaxiServiceApiNew::class.java
TaxiUnmannedServiceApi::class.java
)
/**
* 查询全部服务中/待服务订单列表
* @param context
* @param callback
*/
@JvmStatic
fun queryOrdersInAndWaitService(
context: Context,
callback: OchCommonServiceCallback<OrdersInServiceQueryRespBean>?
) {
mOCHTaxiServiceApi.queryOrdersInAndWaitService(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
MoGoAiCloudClientConfig.getInstance().sn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService"))
}
/**
* 查询新到的预约单
* @param context
* @param callback
*/
@JvmStatic
fun queryNewBookingOrder(
context: Context,
callback: OchCommonServiceCallback<OrdersNewBookingQueryRespBean>?
) {
mOCHTaxiServiceApi.queryNewBookingOrder(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
MoGoAiCloudClientConfig.getInstance().sn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryNewBookingOrder"))
}
/**
* (预约单)执行抢单动作
* @param context
* @param orderNo
* @param callback
*/
@JvmStatic
fun grabOrder(
context: Context, orderNo: String?,
callback: OchCommonServiceCallback<OrderGrabRespBean>?
) {
mOCHTaxiServiceApi.grabOrder(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderGrabReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "grabOrder"))
}
/**
* (预约单)查询抢单结果
* @param context
* @param orderNo
* @param callback
*/
@JvmStatic
fun queryOrderGrabStatus(
context: Context, orderNo: String?,
callback: OchCommonServiceCallback<OrderGrabStatusQueryRespBean>?
) {
mOCHTaxiServiceApi.queryOrderGrabStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderGrabReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderGrabStatus"))
}
/**
* 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
* @param context
* @param orderNo
* @param callback
*/
@JvmStatic
fun queryOrderRouteInfo(
context: Context, orderNo: String?,
callback: OchCommonServiceCallback<OrderQueryRouteInfoRespBean>?
) {
mOCHTaxiServiceApi.queryOrderRouteInfo(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderQueryRouteInfoReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRouteInfo"))
}
/**
* 通过orderId查询订单信息用于本地已经有orderId时
* @param context
* @param orderNo
* @param callback
*/
@JvmStatic
@Deprecated("v2.1_0930需求中暂不再使用此接口")
fun queryOrderById(
context: Context, orderNo: String?,
callback: OchCommonServiceCallback<OrderQueryRespBean>?
) {
mOCHTaxiServiceApi.queryOrderById(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderQueryReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById"))
}
/**
* 查询未完成态订单信息用于本地无orderId时
* 如果有多条,只会返回时间最近的一条
* @param context
* @param callback
*/
@JvmStatic
@Deprecated("v2.1_0930需求中暂不再使用此接口")
fun queryOrderInService(
context: Context,
callback: OchCommonServiceCallback<OrderQueryRespBean>?
) {
mOCHTaxiServiceApi.queryOrderInService(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
MoGoAiCloudClientConfig.getInstance().sn
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderInService"))
}
/**
* 司机取消订单
* @param context
* @param orderNo
* @param cancelType
* @param cancelReason
* @param callback
*/
@JvmStatic
fun cancelOrder(
context: Context, orderNo: String?, cancelType: Int, cancelReason: String?,
callback: OchCommonServiceCallback<BaseData>?
) {
mOCHTaxiServiceApi.cancelOrder(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderCancelReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, cancelType, cancelReason
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "cancelOrder"))
}
/**
* 订单列表获取
* @param context
@@ -217,29 +45,6 @@ object TaxiServiceManager {
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersList"))
}
/**
* 订单状态更新
* @param context
* @param orderNo
* @param orderStatus
* @param callback
*/
@JvmStatic
fun updateOrderStatus(
context: Context, orderNo: String?, orderStatus: Int,
callback: OchCommonServiceCallback<BaseData>?
) {
mOCHTaxiServiceApi.updateOrderStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderStatusUpdateReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, orderStatus
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderStatus"))
}
/**
* 暂停接单
* @param context
@@ -271,29 +76,6 @@ object TaxiServiceManager {
.subscribe(OchCommonSubscribeImpl(context, callback, "updateDriverServiceStatus"))
}
/**
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
* @param context
* @param lon
* @param lat
* @param callback
*/
@JvmStatic
fun runCarHeartbeat(
context: Context, lon: Double, lat: Double,
callback: OchCommonServiceCallback<BaseData>?
) {
mOCHTaxiServiceApi.runCarHeartbeat(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
CarHeartbeatReqBean(
MoGoAiCloudClientConfig.getInstance().sn, lon, lat
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat"))
}
/**
* 查询司机服务数据
* @param context
@@ -313,26 +95,6 @@ object TaxiServiceManager {
.subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverServiceData"))
}
/**
* 根据订单上传工控机返回的全路径规划数据
* @param context
* @param orderNo
* @param callback
*/
@JvmStatic
fun updateOrderRoute(
context: Context, orderNo: String?, points: List<OrderRouteUpdateReqBean.Result?>?,
callback: OchCommonServiceCallback<BaseData>?
) {
mOCHTaxiServiceApi.updateOrderRoute(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
OrderRouteUpdateReqBean(orderNo, points)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderRoute"))
}
/**
* 上报剩余里程,时间
* @param context
@@ -378,120 +140,4 @@ object TaxiServiceManager {
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRoute"))
}
@JvmStatic
fun confirmAutopilotConditionByDriver(
context: Context,
orderNo: String?,
loc: TaxiOrPassengerReadyReqBean.Result?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
) {
mOCHTaxiServiceApi.confirmAutopilotConditionByDriver(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiOrPassengerReadyReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "confirmAutopilotConditionByDriver"))
}
@JvmStatic
fun queryAutopilotStatus(
context: Context, orderNo: String?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
) {
mOCHTaxiServiceApi.queryPilotStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
orderNo
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "queryAutopilotStatus"))
}
@JvmStatic
fun updatePassengerHasBoardedStatus(
context: Context,
orderNo: String?,
loc: TaxiOrPassengerReadyReqBean.Result?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
) {
mOCHTaxiServiceApi.updatePassengerHasBoardedStatus(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiOrPassengerReadyReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "updatePassengerHasBoardedStatus"))
}
@JvmStatic
fun startServicePilotDone(
context: Context,
orderNo: String?,
loc: TaxiOrPassengerReadyReqBean.Result?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
) {
mOCHTaxiServiceApi.startServicePilotDone(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiOrPassengerReadyReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "startServicePilotDone"))
}
@JvmStatic
fun arrivedStartPoint(
context: Context,
orderNo: String?,
loc: TaxiOrPassengerReadyReqBean.Result?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>?
) {
mOCHTaxiServiceApi.arrivedStartPoint(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiOrPassengerReadyReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "arrivedStartPoint"))
}
@JvmStatic
fun arriveTerminal(
context: Context,
orderNo: String?,
loc: TaxiOrPassengerReadyReqBean.Result?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>
) {
mOCHTaxiServiceApi.arriveTerminal(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiOrPassengerReadyReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "arriveTerminal"))
}
@JvmStatic
fun orderCompleted(
context: Context,
orderNo: String?,
loc: TaxiOrPassengerReadyReqBean.Result?,
callback: OchCommonServiceCallback<TaxiDataBaseRespBean>
) {
mOCHTaxiServiceApi.orderCompleted(
MoGoAiCloudClientConfig.getInstance().serviceAppId,
MoGoAiCloudClientConfig.getInstance().token,
TaxiOrPassengerReadyReqBean(
MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
)
)
.transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "orderCompleted"))
}
}

View File

@@ -0,0 +1,116 @@
package com.mogo.och.taxi.network
import com.mogo.eagle.core.data.BaseData
import com.mogo.och.taxi.bean.DriverServiceDataRespBean
import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean
import com.mogo.och.taxi.bean.OrdersListQueryReqBean
import com.mogo.och.taxi.bean.OrdersListQueryRespBean
import com.mogo.och.taxi.bean.QueryOrderRouteResp
import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean
import io.reactivex.Observable
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Headers
import retrofit2.http.POST
import retrofit2.http.Query
/**
* @author: wangmingjun
* @date: 2023/7/26
*/
interface TaxiUnmannedServiceApi {
/**
* 订单列表获取
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
@POST("/autopilot-car-hailing/order/v2/driver/taxi/queryOrders")
fun queryOrdersList(
@Header("appId") appId: String?,
@Header("ticket") ticket: String?,
@Body data: OrdersListQueryReqBean?
): Observable<OrdersListQueryRespBean?>?
/**
* 查询司机服务数据
* @param sn
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8") // @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
@GET("/autopilot-car-hailing/order/v2/driver/taxi/serviceData/query")
fun queryServiceData(
@Header("appId") appId: String?, @Header("ticket") ticket: String?, @Query("sn") sn: String?
): Observable<DriverServiceDataRespBean?>?
/**
* 上报订单剩余里程和剩余时间
* @param appId
* @param ticket
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8")
@POST("/autopilot-car-hailing/order/v2/driver/taxi/reportOrderRemain")
fun reportOrderRemain(
@Header("appId") appId: String?,
@Header("ticket") ticket: String?,
@Body data: UpdateOrderDisAndTimeReqBean?
): Observable<BaseData?>?
@Headers("Content-type:application/json;charset=UTF-8") // @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
@GET("/autopilot-car-hailing/order/v2/driver/taxi/orderRoute")
fun queryOrderRoute(
@Header("appId") appId: String?,
@Header("ticket") ticket: String?,
@Query("orderNo") orderNo: String?
): Observable<QueryOrderRouteResp?>?
/**
* 开始接单
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/stopOrderServing")
fun stopOrderServing(
@Header("appId") appId: String?,
@Header("ticket") ticket: String?,
@Body data: DriverStatusUpdateReqBean?
): Observable<BaseData?>?
/**
* 暂停接单
* @param data
* @return
*/
@Headers("Content-type:application/json;charset=UTF-8") // @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
@POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing")
fun resetOrderServing(
@Header("appId") appId: String?,
@Header("ticket") ticket: String?,
@Body data: DriverStatusUpdateReqBean?
): Observable<BaseData?>?
//登陆成功后查询 开始接单/暂停接单的状态
//点击开始接单,获取要前往的站点
//登陆成功后查询当前任务
//任务到站
//到达任务站点后查询下一站任务(包含是否有订单和订单状态)
//轮询订单接口
//到达乘客上车点
//开启自驾
//服务完成
}

View File

@@ -50,10 +50,6 @@ public class NaviPresenter extends Presenter<TaxiRottingNaviFragment> implements
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this);
}
private void releaseListeners() {
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
}
private void runOnUIThread( Runnable executor ) {
if ( executor == null ) {
return;

View File

@@ -22,11 +22,11 @@ public class TaxiOperationalPresenter extends Presenter<TaxiPersonalDialogFragme
}
private void initListener() {
TaxiModel.getInstance().setCarStatusCallback(this);
TaxiModel.INSTANCE.setCarStatusCallback(this);
}
private void releaseListener(){
TaxiModel.getInstance().setCarStatusCallback(null);
TaxiModel.INSTANCE.setCarStatusCallback(null);
}
@Override
@@ -37,7 +37,7 @@ public class TaxiOperationalPresenter extends Presenter<TaxiPersonalDialogFragme
// 获取全部订单列表
public void queryOrdersList(int page, int size) {
TaxiModel.getInstance().queryOrdersList(page, size);
TaxiModel.INSTANCE.queryOrdersList(page, size);
}
@Override

View File

@@ -23,6 +23,7 @@ import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
import com.mogo.och.taxi.bean.OrderQueryRespBean;
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
import com.mogo.och.taxi.callback.ITaxiCarOperationalCallback;
import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback;
import com.mogo.och.taxi.constant.TaxiConst;
@@ -36,8 +37,6 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import mogo.telematics.pad.MessagePad;
/**
* @author congtaowang
* @since 2021/1/18
@@ -45,7 +44,7 @@ import mogo.telematics.pad.MessagePad;
* 描述
*/
public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASStatusCallback,
ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback {
ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback, ITaxiCarOperationalCallback {
private static final String TAG = TaxiPresenter.class.getSimpleName();
@@ -53,7 +52,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
public TaxiPresenter(TaxiFragment view) {
super(view);
TaxiModel.getInstance().init(AbsMogoApplication.getApp());
TaxiModel.INSTANCE.init(AbsMogoApplication.getApp());
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
initListeners();
}
@@ -69,21 +68,22 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
super.onDestroy( owner );
releaseListeners();
TaxiModel.getInstance().release();
TaxiModel.INSTANCE.release();
}
private void initListeners() {
TaxiModel.getInstance().setADASStatusCallback(this);
TaxiModel.getInstance().setControllerStatusCallback(this);
TaxiModel.getInstance().setOrderStatusCallback(this);
TaxiModel.INSTANCE.setADASStatusCallback(this);
TaxiModel.INSTANCE.setControllerStatusCallback(this);
TaxiModel.INSTANCE.setCarStatusCallback(this);
TaxiModel.INSTANCE.setOrderStatusCallback(this);
}
private void releaseListeners() {
TaxiModel.getInstance().setADASStatusCallback(null);
TaxiModel.getInstance().setControllerStatusCallback(null);
TaxiModel.getInstance().setOrderStatusCallback(null);
TaxiModel.INSTANCE.setADASStatusCallback(null);
TaxiModel.INSTANCE.setControllerStatusCallback(null);
TaxiModel.INSTANCE.setOrderStatusCallback(null);
OCHAdasAbilityManager.getInstance().release();
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
TaxiModel.INSTANCE.setMoGoAutopilotPlanningListener(null);
}
private void runOnUIThread( Runnable executor ) {
@@ -101,87 +101,32 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
* 开启自动驾驶 自驾模式
*/
public void startAutoPilot() {
TaxiModel.getInstance().startAutoPilot();
}
/**
* 人工模式
*/
public void startManualDrive(){
TaxiModel.getInstance().startServicePilotDone();
}
/**
* 跳过乘客验证环节
*/
public void jumpPassengerCheckDone(){
TaxiModel.getInstance().jumpPassengerCheckDone();
}
/**
* 司机确认车辆环境可开启自动驾驶
*/
public void confirmAutopilotConditionByDriver() {
TaxiModel.getInstance().confirmAutopilotConditionByDriver();
TaxiModel.INSTANCE.startAutoPilot();
}
// 更新接单状态
public void updateCarStatus() {
TaxiModel.getInstance().updateCarStatus();
TaxiModel.INSTANCE.updateCarStatus();
}
// 获取当前订单状态
public TaxiOrderStatusEnum getCurOrderStatus() {
return TaxiModel.getInstance().getCurOrderStatus();
}
// 取消当前订单
public void cancelCurOrder(int reasonType, String reason) {
TaxiModel.getInstance().cancelCurrentOrder(reasonType, reason);
}
// 取消待服务中订单
public void cancelOrderById(String orderNo, int reasonType, String reason) {
TaxiModel.getInstance().cancelOrderById(orderNo, reasonType, reason);
}
// 查询当前订单route信息预估时间、里程等
public void queryCurOrderRouteInfo() {
TaxiModel.getInstance().queryCurOrderRouteInfo();
}
// 执行抢单动作
public void grabOrder() {
TaxiModel.getInstance().grabOrder();
}
// 关闭新到预约单
public void cancelNewBookingOrder() {
TaxiModel.getInstance().cancelNewBookingOrder();
}
//更新订单已完成状态
public void completeOrderService() {
TaxiModel.getInstance().orderCompleted();
return TaxiModel.INSTANCE.getCurOrderStatus();
}
// 登出
public void logout() {
TaxiModel.getInstance().logout();
TaxiModel.INSTANCE.logout();
}
//导航去订单目的地
public void startNaviToEndStation(boolean isShow){
TaxiModel.getInstance().startNaviToEndStation(isShow);
TaxiModel.INSTANCE.startNaviToEndStation(isShow);
}
public void reportToEndDisAndTime(long lastSumLength, long duration){//米/秒
TaxiModel.getInstance().reportOrderRemain(lastSumLength,duration);
}
public void closeOrderByMan(){
TaxiModel.getInstance().arriveTerminal();
TaxiModel.INSTANCE.reportOrderRemain(lastSumLength,duration);
}
@Override
@@ -224,97 +169,11 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus());
}
@Override
public void onOrdersInServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> inServiceList) {
}
@Override
public void onOrdersWaitServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> waitServiceList) {
runOnUIThread(() -> mView.onOrdersWaitServiceChanged(waitServiceList));
}
@RequiresApi(api = Build.VERSION_CODES.P)
@Override
public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
CallerLogger.INSTANCE.d(M_TAXI + TAG,"order = "+order.toString());
if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus){
TaxiModel.getInstance().queryAutopilotStatus(true);
TaxiModel.getInstance().setStation();
}
if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
TaxiModel.getInstance().startDynamicCalculateRouteInfo();
TaxiModel.getInstance().setStation();
runOnUIThread(() -> {
mView.updateCtvAutopilotStatusTag(true);
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(true);
});
}
if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus ||
TaxiOrderStatusEnum.Cancel.getCode() == order.orderStatus ||
TaxiOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
TaxiModel.getInstance().startOrStopCalculateRouteInfo(false);
TaxiModel.getInstance().cleanLineMarker();
TaxiModel.getInstance().cleanStation();
runOnUIThread(() -> {
if(TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus){
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(false);
}
});
}
runOnUIThread(() -> mView.updateCurrentOrderStatusChanged(order));
}
@Override
public void onCurrentOrderCancelDone() {
runOnUIThread(() -> mView.onCurrentOrderCancelDone());
}
@Override
public void onOrderCancelDone(String orderNo) {
runOnUIThread(() -> mView.onOrderCancelDone(orderNo));
}
@Override
public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
runOnUIThread(() -> mView.onCurrentOrderRouteInfoGot(routeInfo));
}
@Override
public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond) {
}
@Override
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters,timeInSecond));
}
@Override
public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
runOnUIThread(() -> mView.onNewBookingOrderGot(order));
}
@Override
public void onGrabOrderExecuteDone() {
runOnUIThread(() -> mView.onGrabOrderExecuteDone());
}
@Override
public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
runOnUIThread(() -> mView.onGrabOrderSuccess(order));
}
@Override
public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
runOnUIThread(() -> mView.onGrabOrderFailed(order));
}
@Override
public void onDriverHasCheckedPilotCondition(boolean isSafe) {
runOnUIThread(() -> mView.onCheckPilotConditionSafe(isSafe));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters,timeInSecond));
}
}
@Override
@@ -348,7 +207,7 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
//设置 接单状态
TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus);
//设置 是否启动订单轮训
TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
TaxiModel.INSTANCE.startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
// 设置当前用户角色
String role = "";
@@ -367,4 +226,14 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
public void loginFail(boolean isLogin) {
}
@Override
public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
}
@Override
public void onOrdersListPageRefresh(List<OrderQueryRespBean.Result> ordersList) {
}
}

View File

@@ -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()
}

View File

@@ -1,7 +1,186 @@
package com.mogo.och.taxi.ui
import android.os.Bundle
import android.view.View
import com.amap.api.navi.AMapNaviViewListener
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
import com.mogo.och.common.module.map.CommonAmapNaviVIew
import com.mogo.och.common.module.map.ICommonNaviChangedCallback
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseTaxiUIFragment
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiAmapNaviFragment {
}
*/
class TaxiAmapNaviFragment : BaseTaxiUIFragment(),
AMapNaviViewListener {
private var mAMapNaviView: CommonAmapNaviVIew? = null
private var mNaviToStartInfoCallback: ICommonNaviChangedCallback? = null
override fun getLayoutId(): Int {
return R.layout.taxi_amap_navi_view
}
override fun initViews(view: View) {
mAMapNaviView = view.findViewById<CommonAmapNaviVIew>(R.id.navi_view)
}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
if (mAMapNaviView != null) mAMapNaviView!!.onCreate(savedInstanceState)
}
override fun onResume() {
super.onResume()
if (mAMapNaviView != null) mAMapNaviView!!.onResume()
}
override fun onPause() {
super.onPause()
if (mAMapNaviView != null) mAMapNaviView!!.onPause()
}
override fun onDestroy() {
super.onDestroy()
AmapNaviToDestinationModel.getInstance(context).setVoiceIsMute(false)
if (mAMapNaviView != null) {
mAMapNaviView!!.onDestroy()
}
if (mNaviToStartInfoCallback != null) {
mNaviToStartInfoCallback = null
}
}
override fun onNaviSetting() {
//底部导航设置点击回调
}
override fun onNaviCancel() {}
override fun onNaviMapMode(naviMode: Int) {
//导航态车头模式0:车头朝上状态1:正北朝上模式。
}
override fun onNaviTurnClick() {
//转弯view的点击回调
}
override fun onNextRoadClick() {
//下一个道路View点击回调
}
override fun onScanViewButtonClick() {
//全览按钮点击回调
}
override fun onLockMap(isLock: Boolean) {
//锁地图状态发生变化时回调
}
override fun onNaviViewLoaded() {
d(SceneConstant.M_TAXI + "wlx", "导航页面加载成功")
d(
SceneConstant.M_TAXI + "wlx",
"请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑"
)
}
override fun onMapTypeChanged(i: Int) {}
override fun onNaviViewShowMode(i: Int) {}
override fun onNaviBackClick(): Boolean {
return false
}
/**
* 车道信息说明:
*
*
* 0xFF, 无对应车道
* 0, 直行
* 1, 左转
* 2, 直行+左转
* 3, 右转
* 4, 直行+右转
* 5, 左掉头
* 6, 左转+右转
* 7, 直行+左转+右转
* 8, 右掉头
* 9, 直行+左掉头
* 10, 直行+右掉头
* 11, 左转+左掉头
* 12, 右转+右掉头
* 13, 直行+扩展
* 14, 左转+左掉头+扩展
* 15, 保留
* 16, 直行+左转+左掉头
* 17, 右转+左掉头
* 18, 左转+右转+左掉头
* 19, 直行+右转+左掉头
* 20, 左转+右掉头
* 21, 公交车道
* 22, 空车道
* 23 可变车道
*/
var array = arrayOf(
"直行车道",
"左转车道",
"左转或直行车道",
"右转车道",
"右转或直行车道",
"左掉头车道",
"左转或者右转车道",
" 左转或右转或直行车道",
"右转掉头车道",
"直行或左转掉头车道",
"直行或右转掉头车道",
"左转或左掉头车道",
"右转或右掉头车道",
"直行并且车道扩展",
"左转+左掉头+扩展",
"不可以选择该车道",
"直行+左转+左掉头车道",
"右转+左掉头",
"左转+右转+左掉头",
"直行+右转+左掉头",
"左转+右掉头",
"公交车道",
"空车道",
"可变车道"
)
var actions = arrayOf(
"直行",
"左转",
"左转或直行",
"右转",
"右转或这行",
"左掉头",
"左转或者右转",
" 左转或右转或直行",
"右转掉头",
"直行或左转掉头",
"直行或右转掉头",
"左转或左掉头",
"右转或右掉头",
"直行并且车道扩展",
"左转+左掉头+扩展",
"不可以选择",
"直行+左转+左掉头",
"右转+左掉头",
"左转+右转+左掉头",
"直行+右转+左掉头",
"左转+右掉头",
"公交车道",
"空车道",
"可变车道"
)
companion object {
fun newInstance(): TaxiAmapNaviFragment {
val args = Bundle()
val fragment = TaxiAmapNaviFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,7 +0,0 @@
package com.mogo.och.taxi.ui
/**
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiBeingServedOrdersFragment {
}

View File

@@ -0,0 +1,855 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.os.Bundle
import android.text.Html
import android.view.View
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.amap.api.navi.model.NaviLatLng
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getOverlayManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.overlay.core.Level
import com.mogo.map.overlay.point.Point
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
import com.mogo.och.common.module.map.ICommonNaviChangedCallback
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.NumberFormatUtil
import com.mogo.och.common.module.utils.OCHThreadPoolManager
import com.mogo.och.common.module.voice.VoiceNotice.showNotice
import com.mogo.och.common.module.wigets.OCHCommitDialog
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseBindingFragment
import com.mogo.och.taxi.bean.OrderQueryRespBean
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
import com.mogo.och.taxi.constant.TaxiConst
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf
import com.mogo.och.taxi.databinding.UnmannedBeingOrderBinding
import com.mogo.och.taxi.model.TaxiModel
import com.mogo.och.taxi.model.TaxiUnmannedViewModel
import com.mogo.och.taxi.ui.unmanned.TaskUiState
import com.mogo.och.taxi.ui.unmanned.UnmannedIntent
import com.mogo.och.taxi.ui.unmanned.UnmannedState
import kotlinx.android.synthetic.main.unmanned_being_order.taskOtherInfo
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.map
import java.util.Calendar
import kotlin.math.ceil
import kotlin.math.roundToInt
/**
* @author: wangmingjun
* @date: 2023/7/24
*/
class TaxiBeingTaskFragment : BaseBindingFragment<UnmannedBeingOrderBinding>({
UnmannedBeingOrderBinding.inflate(it)
}),
View.OnClickListener, ICommonNaviChangedCallback {
private var mOrderNo: String? = null
private var mViewModel: TaxiUnmannedViewModel? = null
@Volatile
private var mTtsLessThan200Tip = 0 //离终点200米提示播报
private var mCurrentOrder: OrderQueryRespBean.Result? = null
private var isFirstStartAutopilotDone = true
private var mBeingOrderLayout: ConstraintLayout? = null
private var mPassengerInfoLayout: ConstraintLayout? = null
private var mNoDatasTv: TextView? = null
private var mNoDataView: ConstraintLayout? = null
@Volatile
private var saveOrderState = -1
override fun getLayoutId(): Int {
return R.layout.unmanned_being_order
}
override fun getTagName(): String {
return "TaxiBeingTaskFragment"
}
override fun onAttach(context: Context) {
super.onAttach(context)
mViewModel = ViewModelProvider(this)[TaxiUnmannedViewModel::class.java]
}
override fun initViews() {
initNaviView()
isHaveBeingOrder(false)
initOnClickListener()
//任意模式下调试信息都打开
initOrderTestBar()
initData()
}
private fun initData() {
lifecycleScope.launchWhenStarted {
mViewModel?.let {
it.uiIntentFlow.collect { state ->
d(TAG,"uiIntentFlow: $state")
when(state){
}
}
}
}
//监听返回的数据状态
lifecycleScope.launchWhenStarted {
mViewModel?.let{
it.uiStateFlow.map {it.taskUiState}.collect {state ->
d(TAG,"uiStateFlow: $state")
when(state){
is TaskUiState.INIT -> {
}
is TaskUiState.SUCCESS -> {
}
}
}
}
}
}
private fun initOnClickListener() {
binding.cancelOrder.setOnClickListener(this)
binding.taskStatus.setOnClickListener(this)
}
private fun initNaviView() {
binding.naviToStart.setOnClickListener(this)
binding.naviToEnd.setOnClickListener(this)
}
/**
* 初始化订单信息
*/
@SuppressLint("SetTextI18n")
@RequiresApi(api = Build.VERSION_CODES.P)
fun updateCurrentOrderStatusChanged(order: OrderQueryRespBean.Result?) {
try {
if (order == null) return
if (order.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.code) {
mCurrentOrder = null
isHaveBeingOrder(false)
binding.taskOtherInfo.text = "距离 - - 公里,用时 - - 分"
return
}
mOrderNo = order.orderNo
onOrderStatusChanged(order)
if (TaxiOrderStatusEnum.ArriveAtEnd.code == order.orderStatus) {
d(SceneConstant.M_TAXI + TAG, "已经达到终点")
binding.taskStatus.setText(R.string.module_och_taxi_arrive_at_end_station2)
updateOrderBottomBtn(
getString(R.string.module_och_taxi_order_server_end),
Color.parseColor("#FFFFFF"),
Color.parseColor("#FF1D5EF3"),
true
)
binding.taskStatus.text = "送乘客至"
binding.endStationName.text = order.endSiteAddr
} else if (TaxiOrderStatusEnum.OnTheWayToEnd.code == order.orderStatus) {
d(SceneConstant.M_TAXI + TAG, "已经去往终点")
binding.taskStatus.setText(R.string.module_och_taxi_on_the_way_2_end_station)
updateOrderBottomBtn(
getString(R.string.module_och_taxi_order_close),
Color.parseColor("#FFFFFF"),
Color.parseColor("#FF1D5EF3"),
true
)
binding.taskStatus.text= "送乘客至"
binding.endStationName.text = order.endSiteAddr
} else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus
|| TaxiOrderStatusEnum.ArriveAtStart.code == order.orderStatus
) {
val currentCale = DateTimeUtils.getCurrentDateTime()
val currentHM = DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.HH_mm)
val currentDay =
DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd)
val strHtml11 = ("<font color=\"#CAD6FF\">已于</font><br>"
+ "<b><font color=\"#FFFFFF\"><big><big>" + currentHM + "</big></big></font></b>"
+ "<font color=\"#CAD6FF\">" + " " + "到达乘客上车地点</font>")
binding.taskStatus.text = "送乘客至"
binding.endStationName.text = order.endSiteAddr
currentCale.add(Calendar.MINUTE, 10)
val strHtml13: String = if (currentDay == DateTimeUtil.formatCalendarToString(
currentCale,
DateTimeUtil.yyyy_MM_dd
)
) {
("<font color=\"#CAD6FF\">免费等待至 </font>"
+ "<b><font color=\"#FFFFFF\"><big>" + DateTimeUtil.formatCalendarToString(
currentCale,
DateTimeUtil.HH_mm
) + "</big></b></font>")
} else {
("<font color=\"#CAD6FF\">免费等待至</font>"
+ "<font color=\"#FFFFFF\"><big>" + DateTimeUtil.formatCalendarToString(
currentCale,
DateTimeUtil.MM_dd_HH_mm
) + "</big></font>")
}
binding.taskOtherInfo.text = Html.fromHtml(strHtml13,Html.FROM_HTML_MODE_LEGACY)
if (TaxiOrderStatusEnum.ArriveAtStart.code == order.orderStatus) {
d(SceneConstant.M_TAXI + TAG, "车辆已经达到起点")
mPassengerInfoLayout!!.visibility = View.VISIBLE
binding.orderPhoneAndNum.text = order.passengerPhone + " | "+ order.passengerNum + ""
binding.taskStatus.setText(R.string.module_och_taxi_waiting)
updateOrderBottomBtn(
getString(R.string.module_och_taxi_order_server_start_wait_check),
Color.parseColor("#FFFFFF"),
Color.parseColor("#FF1D5EF3"),
true
)
} else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus) {
d(SceneConstant.M_TAXI + TAG, "乘客已上车验证成功")
mPassengerInfoLayout!!.visibility = View.GONE
binding.taskStatus.setText(R.string.module_och_taxi_user_check_success)
updateOrderBottomBtn(
getString(R.string.module_och_taxi_order_server_start),
Color.parseColor("#FFFFFF"),
Color.parseColor("#FF1D5EF3"),
true
)
}
} else if (TaxiModel.checkCurrentOCHOrder()) {
d(SceneConstant.M_TAXI + TAG, "前往乘客上车地点")
binding.orderPhoneAndNum.text = order.passengerPhone + " | "+ order.passengerNum + ""
binding.taskStatus.setText(R.string.module_och_taxi_new_order)
updateOrderBottomBtn(
getString(R.string.module_och_taxi_order_server_start),
Color.parseColor("#4DFFFFFF"),
Color.parseColor("#4D1D5EF3"),
false
)
val currentCale = DateTimeUtils.getCurrentDateTime()
val startCale = DateTimeUtil.formatLongToCalendar(order.bookingTime)
val currentDay =
DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd)
val startDay =
DateTimeUtil.formatCalendarToString(startCale, DateTimeUtil.yyyy_MM_dd)
val strHtml1: String = if (currentDay == startDay) {
("<font color=\"#CAD6FF\">乘客将于</font><br>"
+ "<b><font color=\"#FFFFFF\"><big><big>" + DateTimeUtil.formatCalendarToString(
startCale,
DateTimeUtil.HH_mm
) + "</big></big></font></b>"
+ "<font color=\"#CAD6FF\"> 用车</font>")
} else {
("<font color=\"#CAD6FF\">乘客将于</font><br>"
+ "<b><font color=\"#FFFFFF\"><big><big>" + DateTimeUtil.formatCalendarToString(
startCale,
DateTimeUtil.MM_dd_HH_mm
) + "</big></big></font></b>"
+ "<font color=\"#CAD6FF\"> 用车</font>")
}
taskOtherInfo.text = Html.fromHtml(strHtml1,Html.FROM_HTML_MODE_LEGACY)
}
} catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
TaxiModel.clearCurrentOCHOrder()
}
}
private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) {
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
val mCurLatitude = getChassisLocationGCJ02().latitude
val mCurLongitude = getChassisLocationGCJ02().longitude
d(
SceneConstant.M_TAXI + TAG,
"currentLatLng=$mCurLatitude $mCurLongitude"
)
val startNaviLatLng = NaviLatLng(mCurLatitude, mCurLongitude)
val endNaviLatLng = NaviLatLng(stationLat, stationLng)
AmapNaviToDestinationModel.getInstance(context).initAMapNavi(startNaviLatLng, endNaviLatLng)
AmapNaviToDestinationModel.getInstance(context).setVoiceIsMute(isVoicePlay)
AmapNaviToDestinationModel.getInstance(context).setOCHTaciNaviChangedCallback(this)
}
private fun showOrHideNavi() {
binding.naviToStart.visibility = View.GONE
binding.naviToEnd.visibility = View.GONE
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
mTaxiFragment!!.showAmapNaviToStationFragment(false)
mTaxiFragment!!.showRottingToStationFragment(false)
}
/**
* 剩余里程和剩余时间
* @param meters m
* @param timeInSecond 秒
*/
@RequiresApi(Build.VERSION_CODES.N)
fun updateDistanceAndTime(meters: Long, timeInSecond: Long) {
// CallerLogger.INSTANCE.d(M_TAXI + TAG,"meters = "+meters+"timeInSecond ="+timeInSecond);
var dis = "0"
var disUnit = "公里"
if (meters > 0) {
if (meters / 1000 < 1) {
disUnit = ""
dis = meters.toFloat().roundToInt().toString()
} else {
disUnit = "公里"
dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000)
}
}
val min = ceil(timeInSecond.toDouble() / 60f).toInt()
val strHtml2 =
("<font color=\"#CAD6FF\">里程 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> " + disUnit + "</font>"
+ "<font color=\"#CAD6FF\">,剩余 </font>" + "<b><font color=\"#FFFFFF\">" + min + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>")
try {
if (mCurrentOrder != null && mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code) { //前往上车点
binding.taskOtherInfo.text = Html.fromHtml(strHtml2,Html.FROM_HTML_MODE_LEGACY)
if (binding.naviToStart.visibility == View.GONE) {
binding.naviToStart.visibility = View.VISIBLE
}
} else if (mCurrentOrder != null && mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code) { //前往终点 时间单位是分钟
if (binding.naviToEnd.visibility == View.GONE) {
binding.naviToEnd.visibility = View.VISIBLE
}
if (mTtsLessThan200Tip < 1 && meters <= 250 && meters > 150) {
speekVoice200mTipsOnce()
}
binding.taskOtherInfo.text = Html.fromHtml(strHtml2,Html.FROM_HTML_MODE_LEGACY)
if (isFirstStartAutopilotDone) {
showNotice(
String.format(
resources
.getString(R.string.module_och_taxi_order_server_start_auto_tip),
dis, disUnit, min
)
)
isFirstStartAutopilotDone = false
}
}
} catch (_: NullPointerException) {
}
}
private fun speekVoice200mTipsOnce() {
mTtsLessThan200Tip = 1
showNotice(resources.getString(R.string.module_och_taxi_order_arrive_end_200m_tip))
}
@RequiresApi(Build.VERSION_CODES.N)
fun onCurrentOrderRouteInfoGot(routeInfo: OrderQueryRouteInfoRespBean.Result?) { // 单位 米, 秒
if (routeInfo == null) return
d(SceneConstant.M_TAXI + TAG, "durationToEnd = " + routeInfo.durationToEnd)
var dis = "0"
val distance = routeInfo.distanceToEnd
val duration = routeInfo.durationToEnd
if (routeInfo.distanceToEnd > 0) {
dis = NumberFormatUtil.formatLong(distance.toDouble() / 1000)
}
val strHtml2 =
("<font color=\"#CAD6FF\">全程 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> 公里</font>"
+ "<font color=\"#CAD6FF\">,总用时 </font>" + "<b><font color=\"#FFFFFF\">" + ceil(
duration.toDouble() / 60
).toInt() + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>")
binding.taskOtherInfo.text = Html.fromHtml(strHtml2,Html.FROM_HTML_MODE_LEGACY)
}
override fun onDestroyView() {
super.onDestroyView()
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
}
private fun startOrEndService() {
if (mCurrentOrder == null) return
if (TaxiOrderStatusEnum.ArriveAtStart.code == mCurrentOrder!!.orderStatus) { //到达乘客上车点,司机可跳过乘客屏认证
mViewModel?.let {
it.sendUiIntent(UnmannedIntent.JumpPassengerCheckDone)
}
} else if (TaxiOrderStatusEnum.ArriveAtEnd.code == mCurrentOrder!!.orderStatus) { //点击了完成服务,结束订单并更新订单信息
mViewModel?.let {
it.sendUiIntent(UnmannedIntent.JourneyCompleted)
}
} else if (TaxiOrderStatusEnum.OnTheWayToEnd.code == mCurrentOrder!!.orderStatus) { //前往目的地过程中可提前结束行程
//自驾中提示,接管后才能结束
if (getState()
== IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
) {
ToastUtils.showLong(R.string.taxi_switch_line_btn_warning1)
} else {
closeOrderDialog()
}
}
}
private fun closeOrderDialog() {
val builder = OCHCommitDialog.Builder()
val closeOrderDialog = builder
.title(getString(R.string.dialog_order_close_title))
.tips(getString(R.string.dialog_order_close_content))
.confirmStr(getString(R.string.dialog_order_close_confirm))
.cancelStr(getString(R.string.dialog_order_close_cancel))
.build(requireContext())
closeOrderDialog!!.setClickListener(object : OCHCommitDialog.ClickListener {
override fun confirm() {
mViewModel?.let {
it.sendUiIntent(UnmannedIntent.CloseOrderByDriver)
}
}
override fun cancel() {
closeOrderDialog.dismiss()
}
})
closeOrderDialog.show()
}
private fun onOrderStatusChanged(order: OrderQueryRespBean.Result) {
val status = order.orderStatus
d(
SceneConstant.M_TAXI + TAG,
"status==$status"
)
mCurrentOrder = order
mActivity!!.runOnUiThread {
if (status == TaxiOrderStatusEnum.None.code || status == TaxiOrderStatusEnum.Cancel.code || status == TaxiOrderStatusEnum.JourneyCompleted.code) {
isHaveBeingOrder(false)
mCurrentOrder = null
clearOrderTag()
} else {
isHaveBeingOrder(true)
}
if (status != saveOrderState) {
val ochStatus =
valueOf(status)
when (ochStatus) {
TaxiOrderStatusEnum.OnTheWayToStart -> {
binding.cancelOrder.visibility = View.VISIBLE
showNotice(
mActivity!!.getString(
R.string.module_och_taxi_new_order
)
)
mTtsLessThan200Tip = 0
isFirstStartAutopilotDone = true
val orderStartStationLat = order.startSiteGcjPoint[1]
val orderStartStationLng = order.startSiteGcjPoint[0]
startNaviToStation(false, orderStartStationLat, orderStartStationLng)
setOrRemoveMapMaker(
true,
TaxiConst.TAXI_START_MAP_MAKER,
order.startSitePoint,
R.raw.star_marker
)
setOrRemoveMapMaker(
true,
TaxiConst.TAXI_END_MAP_MAKER,
order.endSitePoint,
R.raw.end_marker
)
}
TaxiOrderStatusEnum.Cancel -> {
mCurrentOrder = null
mTtsLessThan200Tip = 0
isFirstStartAutopilotDone = true
binding.cancelOrder.visibility = View.VISIBLE
//VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel));
showOrHideNavi()
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_START_MAP_MAKER,
order.startSitePoint,
R.raw.star_marker
)
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_END_MAP_MAKER,
order.endSitePoint,
R.raw.end_marker
)
clearSmallMapRouteLine()
}
TaxiOrderStatusEnum.ArriveAtStart, TaxiOrderStatusEnum.UserArriveAtStart -> {
mTtsLessThan200Tip = 0
isFirstStartAutopilotDone = true
binding.cancelOrder.visibility = View.VISIBLE
if (TaxiOrderStatusEnum.UserArriveAtStart.code == ochStatus.code) {
showNotice(
mActivity!!.getString(
R.string.module_och_taxi_order_status_ph_text_check_success
)
)
} else {
showNotice(
mActivity!!.getString(
R.string.module_och_taxi_order_status_ph_text
)
)
}
showOrHideNavi()
setOrRemoveMapMaker(
true,
TaxiConst.TAXI_START_MAP_MAKER,
order.startSitePoint,
R.raw.star_marker
)
setOrRemoveMapMaker(
true,
TaxiConst.TAXI_END_MAP_MAKER,
order.endSitePoint,
R.raw.end_marker
)
}
TaxiOrderStatusEnum.OnTheWayToEnd -> {
// showNotice("欢迎使用蘑菇智行");
binding.cancelOrder.visibility = View.VISIBLE
if (mTaxiFragment != null) {
showNaviToEndStationFragment(false)
}
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_START_MAP_MAKER,
order.startSitePoint,
R.raw.star_marker
)
setOrRemoveMapMaker(
true,
TaxiConst.TAXI_END_MAP_MAKER,
order.endSitePoint,
R.raw.end_marker
)
}
TaxiOrderStatusEnum.ArriveAtEnd -> {
mTtsLessThan200Tip = 0
binding.cancelOrder.visibility = View.GONE
showNotice(
mActivity!!.getString(
R.string.module_och_taxi_order_auto_arrive_end_tip
)
)
showOrHideNavi()
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_START_MAP_MAKER,
order.startSitePoint,
R.raw.star_marker
)
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_END_MAP_MAKER,
order.endSitePoint,
R.raw.end_marker
)
clearSmallMapRouteLine()
}
TaxiOrderStatusEnum.JourneyCompleted -> {
mCurrentOrder = null
mTtsLessThan200Tip = 0
isFirstStartAutopilotDone = true
binding.cancelOrder.visibility = View.GONE
showNotice("感谢您使用蘑菇智行,再见~")
showOrHideNavi()
}
else -> {}
}
}
saveOrderState = status
}
}
private fun clearOrderTag() {
saveOrderState = -1
binding.taskOtherInfo.text = "距离 - - 公里,用时 - - 分"
}
/**
* 是否有正在进行的订单进行UI显示
*
* @param being
*/
private fun isHaveBeingOrder(being: Boolean) {
d(
SceneConstant.M_TAXI + TAG,
"isHaveBeingOrder = $being"
)
try {
if (being) {
mNoDataView!!.visibility = View.GONE
mBeingOrderLayout!!.visibility = View.VISIBLE
mTaxiFragment!!.changeOperationViewVisible(View.GONE)
clearSmallMapRouteLine()
} else {
mNoDataView!!.visibility = View.VISIBLE
mNoDatasTv!!.text = "暂无进行中订单"
mBeingOrderLayout!!.visibility = View.GONE
mTaxiFragment!!.changeOperationViewVisible(View.VISIBLE)
}
} catch (e: NullPointerException) { //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
TaxiModel.clearCurrentOCHOrder()
}
}
override fun onClick(v: View) {
if (v.id == binding.taskStatus.id) {
d(SceneConstant.M_TAXI + TAG, binding.taskStatus.text.toString())
startOrEndService()
} else if (v.id == binding.cancelOrder.id) {
TaxiOrderCancelDialog(mTaxiFragment, mActivity, mOrderNo, saveOrderState).show()
} else if (v.id == binding.naviToStart.id) {
if (mTaxiFragment != null) {
showNaviToStartStationFragment()
}
} else if (v.id == binding.naviToEnd.id) {
if (mTaxiFragment != null) {
showNaviToEndStationFragment(true)
}
}
}
/**
* 显示/隐藏 前往乘客上车点的导航
**/
private fun showNaviToStartStationFragment() {
if (mCurrentOrder != null &&
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
) {
val orderStartStationLat = mCurrentOrder!!.startSiteGcjPoint[1]
val orderStartStationLng = mCurrentOrder!!.startSiteGcjPoint[0]
mTaxiFragment!!.showAmapNaviToStationFragment(true)
startNaviToStation(true, orderStartStationLat, orderStartStationLng)
}
}
/**
* 显示/隐藏 前往乘客目的地的导航
*
* @param isShow
*/
private fun showNaviToEndStationFragment(isShow: Boolean) {
mTaxiFragment!!.startNaviToEndStation(isShow)
}
fun onCurrentOrderCancelDone() {
//去除起终点
if (mCurrentOrder != null) {
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_START_MAP_MAKER,
mCurrentOrder!!.startSitePoint,
R.raw.star_marker
)
setOrRemoveMapMaker(
false,
TaxiConst.TAXI_END_MAP_MAKER,
mCurrentOrder!!.endSitePoint,
R.raw.end_marker
)
}
clearSmallMapRouteLine()
//提交取消订单后的回调
ToastUtils.showShort("订单取消成功")
//更新界面
isHaveBeingOrder(false)
showOrHideNavi()
clearOrderTag()
}
private fun clearSmallMapRouteLine() {
// CallerSmpManager.clearPolyline();
}
/**
* 订单流转debug START
*/
private fun initOrderTestBar() {
binding.taskStatus.setOnLongClickListener {
mTaxiFragment!!.clickTestBar()
false
}
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) {
updateDistanceAndTime(meters.toLong(), timeInSecond)
if (mCurrentOrder != null
&& mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
) {
mTaxiFragment!!.reportToEndDisAndTime(meters, timeInSecond)
}
}
override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) {
d(
SceneConstant.M_TAXI + TAG,
"isPlay = $isPlay, isRestart=$isRestart"
)
if (!isRestart) {
mTaxiFragment!!.showAmapNaviToStationFragment(false)
return
}
UiThreadHandler.postDelayed({
if (mCurrentOrder != null &&
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
) {
val orderStartStationLat = mCurrentOrder!!.startSiteGcjPoint[1]
val orderStartStationLng = mCurrentOrder!!.startSiteGcjPoint[0]
startNaviToStation(false, orderStartStationLat, orderStartStationLng)
}
}, 2000)
UiThreadHandler.postDelayed({
if (mCurrentOrder != null &&
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.code
) {
if (binding.naviToStart.visibility == View.GONE) {
binding.naviToStart.visibility = View.VISIBLE
}
}
if (mCurrentOrder != null &&
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
) {
if (binding.naviToEnd.visibility == View.GONE) {
binding.naviToEnd.visibility = View.VISIBLE
}
}
}, 3000)
}
fun onNaviToEndAmap(isShow: Boolean) {
if (mCurrentOrder != null &&
mCurrentOrder!!.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code
) {
val orderEndStationLat = mCurrentOrder!!.endSiteGcjPoint[1]
val orderEndStationLng = mCurrentOrder!!.endSiteGcjPoint[0]
mTaxiFragment!!.showAmapNaviToStationFragment(isShow)
startNaviToStation(isShow, orderEndStationLat, orderEndStationLng)
}
}
/**
* 绘制地图起点终点
* @param isAdd
* @param uuid
* @param station
*/
private fun setOrRemoveMapMaker(
isAdd: Boolean,
uuid: String,
station: List<Double>,
resourceId: Int
) {
if (isAdd) {
//开启线程执行起终点marker设置
val setMapMarkerRunnable = Runnable {
d(
SceneConstant.M_TAXI + "setMapMaker= " + Thread.currentThread()
.name,
uuid + "=latitude=" + station[1] + ",longitude=" + station[0]
)
val builder =
Point.Options.Builder(
TaxiConst.TYPE_MARKER_TAXI_ORDER,
Level.MAP_MARKER
)
.setId(uuid)
.anchor(0.5f, 0.5f)
.set3DMode(true)
.isUseGps(true)
.controlAngle(true)
.icon3DRes(resourceId)
.latitude(station[1])
.longitude(station[0])
val mapUIController =
getMapUIController()
if (mapUIController != null) {
val centerLine =
mapUIController.getCenterLineInfo(
station[0], station[1], -1f
)
if (null != centerLine) { // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致
val angle = centerLine.angle
if (angle != null) {
builder.rotate(angle.toFloat())
}
}
}
val overlayManager =
getOverlayManager()
overlayManager?.showOrUpdatePoint(builder.build())
}
OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable)
} else {
//开启线程移除起终点marker设置
val removeMapMarkerRunnable = Runnable {
d(
SceneConstant.M_TAXI + "RemoveMapMaker=" + Thread.currentThread()
.name,
uuid + "=latitude=" + station[1] + ",longitude=" + station[0]
)
// Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerManager(AbsMogoApplication.getApp())).removeMarkers(uuid);
val overlayManager =
getOverlayManager()
overlayManager?.removePoint(uuid)
}
OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable)
}
}
fun updateOrderBottomBtnUI() {
mViewModel?.let {
it.sendUiIntent(UnmannedIntent.StartTask)
}
}
private fun updateOrderBottomBtn(txt: String?, txtColorId: Int, bgColorId: Int, isClickable: Boolean) {
binding.taskClickBtn.text = txt
binding.taskClickBtn.setTextColor(txtColorId)
val background =
binding.taskClickBtn.background as GradientDrawable //GradientDrawable是Drawable的子类
background.setColor(bgColorId)
binding.taskClickBtn.isClickable = isClickable
}
/**
* END
*/
companion object {
const val TAG = "OCHTaxiBeingServerd"
@SuppressLint("StaticFieldLeak")
private var mActivity: Activity? = null
@SuppressLint("StaticFieldLeak")
private var mTaxiFragment: TaxiFragment? = null
fun newInstance(
activity: Activity?,
taxiFragment: TaxiFragment?
): TaxiBeingTaskFragment {
mActivity = activity
mTaxiFragment = taxiFragment
val args = Bundle()
val fragment = TaxiBeingTaskFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,7 +1,313 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.fragment.app.FragmentTransaction
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.common.module.biz.constant.OchCommonConst
import com.mogo.och.common.module.biz.provider.LoginService
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseTaxiTabFragment
import com.mogo.och.taxi.bean.OrderQueryRespBean
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum
import com.mogo.och.taxi.model.TaxiModel
import com.mogo.och.taxi.network.LoginBusImpl
import com.mogo.och.taxi.presenter.TaxiPresenter
import com.mogo.och.taxi.utils.TPRouteDataTestUtils
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import java.lang.ref.WeakReference
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiFragment {
*/
public class TaxiFragment : BaseTaxiTabFragment<TaxiFragment, TaxiPresenter>(),
ITaxiView {
private var serverOrdersFragmentWR: WeakReference<TaxiServerOrdersFragment?>? = null
private var personalDialogFragment: WeakReference<TaxiPersonalDialogFragment>? = null
private var loginService: LoginService? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
loginService =
ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation() as LoginService
if (loginService != null) {
loginService!!.registerFragment(this, getPresenter(), LoginBusImpl())
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
EventBus.getDefault().register(this)
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun getStationPanelViewId(): Int {
return R.layout.taxi_panel
}
override fun startAutopilot() {
// 在自动驾驶中,或者自己确认车辆环境可开启自动驾驶 则可点击
if ((mPresenter.curOrderStatus === TaxiOrderStatusEnum.OnTheWayToEnd ||
mPresenter.curOrderStatus === TaxiOrderStatusEnum.UserArriveAtStart)
&& !isStarting
) {
d(SceneConstant.M_TAXI + TAG, "startAutopilot")
mPresenter.startAutoPilot()
}
}
override fun startNaviToEndStation(isShow: Boolean) {
mPresenter.startNaviToEndStation(isShow)
}
override fun getTagName(): String {
return "TaxiFragment"
}
override fun initViews() {
super.initViews()
initFragment()
hidPanel()
switchVRFlatMode(MogoStatusManager.getInstance().isVrMode)
tvOperationStatus?.visibility = View.VISIBLE
initOrderTestBar()
}
private fun initFragment() {
serverOrdersFragmentWR = WeakReference(TaxiServerOrdersFragment.newInstance())
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
//默认显示OCHTaxiServerOrdersFragment
transaction.add(R.id.fragment_container, serverOrdersFragmentWR!!.get()!!).show(
serverOrdersFragmentWR!!.get()!!
)
transaction.commitAllowingStateLoss()
}
fun showServerFragmentAndUpdate() {
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
if (serverOrdersFragmentWR == null || serverOrdersFragmentWR!!.get() == null) {
serverOrdersFragmentWR = WeakReference(TaxiServerOrdersFragment.newInstance())
transaction.add(R.id.fragment_container, serverOrdersFragmentWR!!.get()!!)
.show(serverOrdersFragmentWR!!.get()!!)
}
}
override fun createPresenter(): TaxiPresenter {
return TaxiPresenter(this)
}
override fun onChangeOperationStatus() {
super.onChangeOperationStatus()
mPresenter.updateCarStatus()
}
fun switchVRFlatMode(isVRMode: Boolean) {
if (mRootView != null) {
mRootView.visibility = if (isVRMode) View.VISIBLE else View.GONE
}
}
override fun onDestroyView() {
super.onDestroyView()
loginService!!.unRegisterFragment()
loginService = null
EventBus.getDefault().unregister(this)
}
/**
* 状态变更
* @param inOperation true 可以接单 false 暂停接单
* @param role 测试车辆:测试 演示车辆V 运营车辆: ""空
*/
fun updateOperationStatus(inOperation: Boolean, role: String?) {
e(
SceneConstant.M_TAXI + TAG,
"onOperationChanged:$inOperation"
)
if (inOperation) {
if (!TextUtils.isEmpty(role)) {
mDriverRole?.visibility = View.VISIBLE
mDriverRole?.text = role
} else {
mDriverRole?.visibility = View.GONE
}
tvOperationStatus?.text = "暂停接单"
tvOperationStatus?.setCompoundDrawablesWithIntrinsicBounds(
resources.getDrawable(R.drawable.shape_size_operation_back),
null,
null,
null
)
showPanel()
} else {
mDriverRole?.visibility = View.GONE
tvOperationStatus?.text = "接单"
tvOperationStatus?.setCompoundDrawablesWithIntrinsicBounds(
resources.getDrawable(R.drawable.shape_size_operation_out),
null,
null,
null
)
hidPanel()
}
}
override fun onMapLoaded() {}
fun updateAutopilotStatus(status: Int) {
onAutopilotStatusChanged(status)
}
@RequiresApi(api = Build.VERSION_CODES.P)
fun updateCurrentOrderStatusChanged(order: OrderQueryRespBean.Result?) {
if (serverOrdersFragmentWR != null && serverOrdersFragmentWR!!.get() != null) {
serverOrdersFragmentWR!!.get()!!.updateCurrentOrderStatusChanged(order)
}
updateTaxiTestBarInfo() //更新调试bar中信息
}
fun onNaviToEnd(isAmap: Boolean, isShow: Boolean) {
if (isAmap) {
if (null == serverOrdersFragmentWR || serverOrdersFragmentWR!!.get() == null) return
serverOrdersFragmentWR!!.get()!!.onNaviToEndAmap(isShow)
} else if (isShow) { //使用rotting数据
showRottingToStationFragment(true)
} else {
showAmapNaviToStationFragment(false)
}
}
/**
* 高德计算出来的到达目的地的剩余里程和时间
* @param meters
* @param timeInSecond
*/
fun reportToEndDisAndTime(meters: Int, timeInSecond: Long) { //米/秒
mPresenter.reportToEndDisAndTime(meters.toString().toLong(), timeInSecond)
}
/**
* 订单流转debug START
*/
private fun initOrderTestBar() {
findViewById<View>(R.id.test_bar_to_start)?.setOnClickListener {
TaxiModel.setArriveAtStartStation()
}
findViewById<View>(R.id.test_bar_to_end)?.setOnClickListener {
TaxiModel.setArriveAtEndStation()
}
findViewById<View>(R.id.test_bar_on_the_way_to_end)?.setOnClickListener {
if (!isStarting) {
mPresenter.startAutoPilot()
}
TaxiModel.setOnTheWayToEndStation()
}
findViewById<View>(R.id.test_bar_route)?.setOnClickListener { testRouteInfoUpload() }
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun changeOverview(eventLogout: EventLogout) {
if (eventLogout.messgae == EventLogout.LOGOUT_TYPE) {
d(SceneConstant.M_TAXI + TAG, "changeOverview Event消息去登出")
mPresenter.logout()
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun openOperationalInfoView(eventLogout: EventLogout) {
if (eventLogout.messgae == EventLogout.PERSONAL_TYPE) {
d(SceneConstant.M_TAXI + TAG, "openOperationalInfoView Event个人中心")
openOperationalInfoView()
}
}
private fun openOperationalInfoView() {
personalDialogFragment = WeakReference(TaxiPersonalDialogFragment())
activity?.supportFragmentManager?.let {
personalDialogFragment!!.get()
?.show(it, "service_data")
}
}
private fun testRouteInfoUpload() {
TPRouteDataTestUtils.converToRouteData()
}
//region Taxi调试信息订单、线路、轨迹等信息
private var testBar: View? = null
private var testCurOrderId: TextView? = null
private var testCurLineId: TextView? = null
private var testCurTrajMd5: TextView? = null
private var testCurStopMd5: TextView? = null
private var testCurTrajMd5DPQP: TextView? = null
private var testCurStopMd5DPQP: TextView? = null
@SuppressLint("SetTextI18n")
fun clickTestBar() {
if (testBar == null) {
testBar = findViewById<View>(R.id.module_och_taxi_order_status_change_test_bar)
testCurOrderId = findViewById<TextView>(R.id.test_bar_current_order_id)
testCurLineId = findViewById<TextView>(R.id.test_bar_current_line_id)
testCurTrajMd5 = findViewById<TextView>(R.id.test_bar_current_traj_md5)
testCurStopMd5 = findViewById<TextView>(R.id.test_bar_current_stop_md5)
testCurTrajMd5DPQP = findViewById<TextView>(R.id.test_bar_current_traj_md5_dpqp)
testCurStopMd5DPQP = findViewById<TextView>(R.id.test_bar_current_stop_md5_dpqp)
}
if (testBar!!.visibility == View.VISIBLE) {
testBar!!.visibility = View.GONE
} else {
val order = TaxiModel.getCurrentOCHOrder()
testCurOrderId!!.text = "orderNo:" + (order?.orderNo?.toString() ?: "")
testCurLineId!!.text = "lineId:" + (order?.lineId?.toString() ?: "")
testCurTrajMd5!!.text = "TMd5:" + if (order == null) "" else order.csvFileMd5
testCurStopMd5!!.text = "SMd5:" + if (order == null) "" else order.txtFileMd5
testCurTrajMd5DPQP!!.text =
"TMd5DPQP:" + if (order == null) "" else order.csvFileMd5DPQP
testCurStopMd5DPQP!!.text =
"SMd5DPQP:" + if (order == null) "" else order.txtFileMd5DPQP
testBar!!.visibility = View.VISIBLE
}
}
@SuppressLint("SetTextI18n")
private fun updateTaxiTestBarInfo() {
if (testBar != null && testBar!!.visibility == View.VISIBLE) {
val order = TaxiModel.getCurrentOCHOrder()
testCurOrderId!!.text = "orderNo:" + (order?.orderNo?.toString() ?: "")
testCurLineId!!.text = "lineId:" + (order?.lineId?.toString() ?: "")
testCurTrajMd5!!.text = "TMd5:" + if (order == null) "" else order.csvFileMd5
testCurStopMd5!!.text = "SMd5:" + if (order == null) "" else order.txtFileMd5
testCurTrajMd5DPQP!!.text =
"TMd5DPQP:" + if (order == null) "" else order.csvFileMd5DPQP
testCurStopMd5DPQP!!.text =
"SMd5DPQP:" + if (order == null) "" else order.txtFileMd5DPQP
}
}
companion object {
const val TAG = "TaxiFragment"
fun newInstance(): TaxiFragment {
val args = Bundle()
val fragment = TaxiFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -268,12 +268,12 @@ class TaxiMapDirectionView @JvmOverloads constructor(
}
fun setCoordinatesLatLng(
routeArrivied: List<LatLng>?,
routeArriving: List<LatLng>?,
routeArrived: List<LatLng>,
routeArriving: List<LatLng>,
location: MogoLocation?
) {
this.routeArrivied.clear()
this.routeArrivied.addAll(routeArrivied!!)
this.routeArrivied.addAll(routeArrived!!)
this.routeArriving.clear()
this.routeArriving.addAll(routeArriving!!)
this.location = location

View File

@@ -1,7 +1,138 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.content.Context
import android.os.Build
import android.os.Bundle
import android.text.Html
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseTaxiUIFragment
import com.mogo.och.taxi.model.TaxiModel
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiOperationDatasFragment {
*/
class TaxiOperationDatasFragment : BaseTaxiUIFragment() {
private var mRecyclerView: RecyclerView? = null
private val mDurationData: MutableList<Long> = ArrayList()
private val mOrderNumData: MutableList<Long> = ArrayList()
private val mData: MutableList<Long> = ArrayList()
private var mAdapter: OperationDataAdapter? = null
override fun getLayoutId(): Int {
return R.layout.taxi_operation_data_view
}
override fun initViews(view: View) {
mRecyclerView = view.findViewById<RecyclerView>(R.id.operation_data_recycler_view)
mRecyclerView!!.layoutManager = LinearLayoutManager(mContext)
mContext?.let {
mAdapter = OperationDataAdapter(it, mData)
mRecyclerView!!.adapter = mAdapter
initDatas()
}
}
private fun initDatas() {
TaxiModel.queryDriverServiceData()
}
fun setType(type: Int) {
mType = type
mData.clear()
if (mType == 0) {
mData.addAll(mDurationData)
} else if (mType == 1) {
mData.addAll(mOrderNumData)
}
if (mAdapter != null) mAdapter!!.notifyDataSetChanged()
}
fun updateData(dailyTimeDuration: Long, dailyOrderNum: Long) {
mDurationData.clear()
mOrderNumData.clear()
mData.clear()
mDurationData.add(dailyTimeDuration)
mOrderNumData.add(dailyOrderNum)
mData.addAll(mDurationData)
if (mAdapter != null) mAdapter!!.notifyDataSetChanged()
}
internal inner class OperationDataAdapter(
private val context: Context,
private val datas: List<Long>
) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): RecyclerView.ViewHolder {
val view: View = LayoutInflater.from(context)
.inflate(R.layout.taxi_operation_data_item_view, parent, false)
return OperationDataViewHolder(view)
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is OperationDataViewHolder) {
if (0 == mType) {
val hourData = if (TextUtils.isEmpty(
DateTimeUtil.secondsToHourStr(
datas[position]
)
)
) "0" else DateTimeUtil.secondsToHourStr(datas[position])
val minuteData = DateTimeUtil.secondsToMinuteStr(datas[position])
val data =
"<font><b><big><big><big>$hourData</big></big></big></b> 时 </font><font><b><big><big><big>$minuteData</big></big></big></b> 分</font>"
holder.operationDataTv.text = Html.fromHtml(data,Html.FROM_HTML_MODE_LEGACY)
holder.operationDataTitle.text = "今日在线时长"
} else if (1 == mType) {
val data =
"<font><b><big><big><big>" + datas[position].toString() + "</big></big></big></b>" + "" + "</font>"
holder.operationDataTv.text = Html.fromHtml(data,Html.FROM_HTML_MODE_LEGACY)
holder.operationDataTitle.text = "今日订单完成数"
}
}
}
override fun getItemCount(): Int {
return datas.size
}
}
internal inner class OperationDataViewHolder(itemView: View) :
RecyclerView.ViewHolder(itemView) {
var operationDataTv: TextView
var operationDataTitle: TextView
init {
operationDataTv = itemView.findViewById<TextView>(R.id.operation_data_tv)
operationDataTitle = itemView.findViewById<TextView>(R.id.operation_data_title_tv)
}
}
companion object {
@SuppressLint("StaticFieldLeak")
private var mContext: Context? = null
private var mType = 0 //0: 运营时长 1运营单数
fun newInstance(context: Context?, type: Int): TaxiOperationDatasFragment {
mContext = context
mType = type
val args = Bundle()
val fragment = TaxiOperationDatasFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,7 +1,512 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.app.Dialog
import android.content.Context
import android.graphics.Color
import android.graphics.Point
import android.graphics.Typeface
import android.os.Bundle
import android.util.TypedValue
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.Button
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import com.google.android.material.tabs.TabLayout
import com.mogo.commons.mvp.MvpDialogFragment
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.AvoidLeakDialog
import com.mogo.och.taxi.bean.OrderQueryRespBean
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.*
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum.Companion.valueOf
import com.mogo.och.taxi.constant.TaxiOrderTypeEnum
import com.mogo.och.taxi.presenter.TaxiOperationalPresenter
import me.jessyan.autosize.utils.AutoSizeUtils
import java.util.Calendar
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiPersonalDialogFragment {
*/
class TaxiPersonalDialogFragment :
MvpDialogFragment<TaxiPersonalDialogFragment?, TaxiOperationalPresenter?>(),
View.OnClickListener {
private var mOperationDataRl: RelativeLayout? = null
private var mCloseIv: ImageView? = null
private var mOrdersRv: RecyclerView? = null
private var mShowOrdersBt: Button? = null
private var mOperationTab: TabLayout? = null
private var mOperationViewPager: ViewPager? = null
private var mAdapter: OrderAdapter? = null
private var mNoDatas: ConstraintLayout? = null
private val orders: MutableList<OrderQueryRespBean.Result> = ArrayList()
private val mTabTitles = arrayOf("在线时长", "订单完成数")
private val fragments: MutableList<TaxiOperationDatasFragment> = ArrayList()
private var mNextPage = 1 //订单列表分页从1开始
private val mPerPageSize = 10
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = AvoidLeakDialog(
requireContext()
)
dialog.setHostFragmentReference(this)
return dialog
}
override fun getLayoutId(): Int {
return R.layout.taxi_orders_list_view
}
override fun initViews() {
initView()
}
override fun createPresenter(): TaxiOperationalPresenter {
return TaxiOperationalPresenter(this)
}
override fun getTagName(): String {
return TAG
}
override fun dismissAllowingStateLoss() {
super.dismissAllowingStateLoss()
}
override fun onStart() {
super.onStart()
isCancelable = false
dialog!!.setCanceledOnTouchOutside(true)
val window = dialog!!.window
//dialog padding 去掉
window!!.decorView.setPadding(0, 0, 0, 0)
window.setDimAmount(0f)
val params = window.attributes
params.x = 0
params.y = 0
val windowManager = requireContext().getSystemService(Context.WINDOW_SERVICE) as WindowManager
val point = Point()
windowManager.defaultDisplay.getSize(point)
params.width = (point.x * 0.375).toInt()
params.height = ViewGroup.LayoutParams.MATCH_PARENT
d(SceneConstant.M_TAXI + TAG, "width= " + params.width + "height= " + params.height)
window.attributes = params
window.decorView.setBackgroundColor(Color.parseColor("#00FFFFFF")) //设置背景, 不然显示不全
window.setGravity(Gravity.LEFT or Gravity.BOTTOM)
}
private fun initView() {
initOperationTabDatas()
mCloseIv = findViewById<ImageView>(R.id.module_och_taxi_order_list_close_iv)
mOperationDataRl = findViewById<RelativeLayout>(R.id.module_och_taxi_operation_data_rl)
mShowOrdersBt = findViewById<Button>(R.id.module_och_taxi_order_list_show_bt)
mOrdersRv = findViewById<RecyclerView>(R.id.module_och_taxi_order_list)
mNoDatas = findViewById<ConstraintLayout>(R.id.no_order_data_view)
val imageView = findViewById<ImageView>(R.id.no_order_data_iv)
imageView!!.setImageResource(R.drawable.no_order_data)
val params = imageView.layoutParams as ConstraintLayout.LayoutParams
params.width = 480
params.height = 480
imageView.layoutParams = params
mOrdersRv!!.visibility = View.GONE
mNoDatas!!.visibility = View.GONE
mShowOrdersBt!!.setOnClickListener(this)
mCloseIv!!.setOnClickListener(this)
}
private fun initOperationTabDatas() {
mOperationTab = findViewById<TabLayout>(R.id.operation_data_tablayout)
mOperationViewPager = findViewById<ViewPager>(R.id.operation_data_viewpager)
for (i in mTabTitles.indices) {
val tab = mOperationTab!!.newTab()
tab.view.setBackgroundColor(Color.parseColor("#00000000"))
val tabView = View.inflate(context, R.layout.taxi_operation_tab_item_custom, null)
val tv = tabView.findViewById<TextView>(R.id.operation_tab_title)
tv.text = mTabTitles[i]
tab.customView = tabView
if (0 == i) {
mOperationTab!!.addTab(tab, true)
changeOperationTabLayoutTabUI(tab, true)
fragments.add(TaxiOperationDatasFragment.newInstance(activity, 0))
} else if (1 == i) {
mOperationTab!!.addTab(tab)
changeOperationTabLayoutTabUI(tab, false)
fragments.add(TaxiOperationDatasFragment.newInstance(activity, 1))
}
}
mOperationTab!!.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
mOperationViewPager!!.currentItem = tab.position
changeOperationTabLayoutTabUI(tab, true)
fragments[tab.position].setType(tab.position)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
changeOperationTabLayoutTabUI(tab, false)
}
override fun onTabReselected(tab: TabLayout.Tab) {}
})
mOperationViewPager!!.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
mOperationTab!!.getTabAt(position)!!.select()
}
override fun onPageScrollStateChanged(state: Int) {}
})
mOperationViewPager!!.adapter = OrdersOperationFragmentAdapter(
childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
)
fragments[0].setType(0)
}
fun onServiceDataUpdate(dailyTimeDuration: Long, dailyOrderNum: Long) {
for (i in fragments.indices) {
fragments[i].updateData(dailyTimeDuration, dailyOrderNum)
}
}
private fun changeOperationTabLayoutTabUI(tab: TabLayout.Tab, isSelected: Boolean) {
val textView = tab.customView!!.findViewById<View>(R.id.operation_tab_title) as TextView
val imageView = tab.customView!!.findViewById<View>(R.id.operation_tab_line_iv) as ImageView
if (isSelected) {
textView.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
AutoSizeUtils.dp2px(context, 46f).toFloat()
)
d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text)
textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD))
textView.setTextColor(Color.parseColor("#FFFFFF"))
imageView.setImageDrawable(resources.getDrawable(R.drawable.taxi_driver_operation_tab_line))
} else {
textView.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
AutoSizeUtils.dp2px(context, 40f).toFloat()
)
d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text)
textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL))
textView.setTextColor(Color.parseColor("#A7B6F0"))
imageView.setImageDrawable(null)
}
}
override fun onClick(v: View) {
if (v.id == R.id.module_och_taxi_order_list_close_iv) {
dismiss()
} else {
mOrdersRv!!.visibility = View.VISIBLE
mOperationDataRl!!.visibility = View.GONE
mNoDatas!!.visibility = View.GONE
initOrdersView()
mPresenter!!.queryOrdersList(mNextPage, mPerPageSize)
}
}
private fun initOrdersView() {
context?.let {
mAdapter = OrderAdapter(it, orders)
val manager = LinearLayoutManager(
context
)
mOrdersRv!!.layoutManager = manager
mOrdersRv!!.addOnScrollListener(object : OnTaxiOrderRvOnScrollListener() {
override fun onLoadMore() {
if (!serverHadNoData) {
mPresenter!!.queryOrdersList(mNextPage, mPerPageSize)
}
}
})
mOrdersRv!!.adapter = mAdapter
}
}
@SuppressLint("NotifyDataSetChanged")
fun onOrdersListPageRefresh(ordersList: List<OrderQueryRespBean.Result>) {
try {
if (mNextPage == 0 || ordersList.isEmpty()) { //无数据
mOrdersRv!!.visibility = View.GONE
mNoDatas!!.visibility = View.VISIBLE
return
}
mOrdersRv!!.visibility = View.VISIBLE
mNoDatas!!.visibility = View.GONE
if ((ordersList.size < mPerPageSize) && mNextPage > 0) { //已经没有更多数据,提示无数据
//已经没有更多数据
serverHadNoData = true
orders.addAll(ordersList!!)
mAdapter!!.notifyDataSetChanged()
mNextPage += 1
return
}
serverHadNoData = false
orders.addAll(ordersList)
if (mAdapter != null) {
mAdapter!!.notifyDataSetChanged()
}
mNextPage += 1
} catch (e: Exception) {
e.fillInStackTrace()
}
}
internal inner class OrderAdapter(
private val context: Context,
private var orders: List<OrderQueryRespBean.Result>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if (viewType == ORDER_DETAIL_ITEM) {
val view: View = LayoutInflater.from(context)
.inflate(R.layout.taxi_orders_list_item, parent, false)
return OrderDetailViewHolder(view)
} else { //viewType == DAY_GROUP_ITEM
val view: View = LayoutInflater.from(context)
.inflate(R.layout.taxi_orders_list_day_item, parent, false)
return DayGroupViewHolder(view)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val queryRespBean = orders[position]
?: return
if (holder is DayGroupViewHolder) {
holder.dayGroupTv.text = DateTimeUtil.getYMDTime(queryRespBean.createTime)
bindOrderDetailData(
queryRespBean,
holder.orderTimeTv,
holder.startStationTv,
holder.endStationTv,
holder.orderStatusBt,
holder.orderTypeBt,
holder.orderNumTv
)
if (isNoLineItem(position)) {
holder.dividerLine.visibility = View.VISIBLE
} else {
holder.dividerLine.visibility = View.GONE
}
if (position == orders.size - 1 && serverHadNoData) {
holder.mBootNoDataView.visibility = View.VISIBLE
} else {
holder.mBootNoDataView.visibility = View.GONE
}
} else if (holder is OrderDetailViewHolder) {
bindOrderDetailData(
queryRespBean,
holder.orderTimeTv,
holder.startStationTv,
holder.endStationTv,
holder.orderStatusBt,
holder.orderTypeBt,
holder.orderNumTv
)
if (isNoLineItem(position)) {
holder.dividerLine.visibility = View.VISIBLE
} else {
holder.dividerLine.visibility = View.GONE
}
if (position == orders.size - 1 && serverHadNoData) {
holder.mBootNoDataView.visibility = View.VISIBLE
} else {
holder.mBootNoDataView.visibility = View.GONE
}
}
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
//第一个要显示时间
if (position == 0) {
return Companion.DAY_GROUP_ITEM
}
val currentDate = DateTimeUtil.getYMDTime(orders[position].createTime) //获取当前订单时间
val prevIndex = position - 1
val preDate = DateTimeUtil.getYMDTime(orders[prevIndex].createTime)
val isDifferent = preDate != currentDate //前一个订单的日期跟第二个订单的日期是否一致
return if (isDifferent) DAY_GROUP_ITEM else ORDER_DETAIL_ITEM //一样订单详情, 不一样新添加分组
}
private fun isNoLineItem(position: Int): Boolean {
return if (position == orders.size - 1) {
false
} else {
val currentDate =
DateTimeUtil.getYMDTime(orders[position].createTime) //获取当前订单时间
val nextIndex = position + 1
val preDate =
DateTimeUtil.getYMDTime(orders[nextIndex].createTime)
preDate == currentDate //一样有划分线, 不一样没有划分线
}
}
override fun getItemCount(): Int {
return orders.size
}
@SuppressLint("SetTextI18n")
private fun bindOrderDetailData(
queryRespBean: OrderQueryRespBean.Result,
orderTimeTv: TextView,
startStationTv: TextView,
endStationTv: TextView,
orderStatusBt: Button,
orderTypeBt: Button,
orderNumTv: TextView
) {
val calendar = Calendar.getInstance()
calendar.timeInMillis = queryRespBean.createTime
orderTimeTv.text = DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm)
startStationTv.text = queryRespBean.startSiteAddr
endStationTv.text = queryRespBean.endSiteAddr
orderStatusBt.text = getOrderStatus(queryRespBean.orderStatus, orderStatusBt)
orderTypeBt.text = getOrderType(queryRespBean.orderType, orderTypeBt)
orderNumTv.text = "订单编号:" + queryRespBean.orderNo.toString()
}
@SuppressLint("UseCompatLoadingForDrawables")
private fun getOrderStatus(status: Int, button: Button): String {
return when (valueOf(status)) {
JourneyCompleted -> {
button.background =
context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg)
"已完成"
}
Cancel -> {
button.background =
context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg)
"已取消"
}
else -> {
button.background = context.getDrawable(R.drawable.taxi_order_button_status_bg)
"服务中"
}
}
}
@SuppressLint("UseCompatLoadingForDrawables")
private fun getOrderType(type: Int, button: Button): String {
return if (type == TaxiOrderTypeEnum.Reserved.type) {
button.background =
context.getDrawable(R.drawable.taxi_order_button_type_reserver_bg)
"预约单"
} else {
button.background = context.getDrawable(R.drawable.taxi_order_button_type_bg)
"即时单"
}
}
}
internal open inner class OrderDetailViewHolder(itemView: View) :
RecyclerView.ViewHolder(itemView) {
var orderTimeTv: TextView
var orderStatusBt: Button
var startStationTv: TextView
var endStationTv: TextView
var orderNumTv: TextView
var orderTypeBt: Button
var dividerLine: View
var mBootNoDataView: View
init {
orderTimeTv = itemView.findViewById<TextView>(R.id.order_time_hm_tv)
orderStatusBt = itemView.findViewById<Button>(R.id.order_status_bt)
startStationTv = itemView.findViewById<TextView>(R.id.grab_order_start_station)
endStationTv = itemView.findViewById<TextView>(R.id.grab_order_end_station)
orderNumTv = itemView.findViewById<TextView>(R.id.order_num)
orderTypeBt = itemView.findViewById<Button>(R.id.order_type_bt)
dividerLine = itemView.findViewById<View>(R.id.module_och_taxi_order_divider)
mBootNoDataView = itemView.findViewById<View>(R.id.boot_refresh_no_data_view)
}
}
internal inner class DayGroupViewHolder(itemView: View) :
OrderDetailViewHolder(itemView) {
val dayGroupTv: TextView
init {
dayGroupTv = itemView.findViewById<TextView>(R.id.order_day_tv)
}
}
internal abstract inner class OnTaxiOrderRvOnScrollListener : RecyclerView.OnScrollListener() {
private var isUpwardSliding = false
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
val manager = recyclerView.layoutManager
//不滑动
if (manager is LinearLayoutManager && newState == RecyclerView.SCROLL_STATE_IDLE) {
val lastItemPosition = manager.findLastCompletelyVisibleItemPosition()
val itemCount = manager.itemCount
d(
SceneConstant.M_TAXI + TAG,
"lastItemPosition==$lastItemPosition,itemCount==$itemCount"
)
//向上滑动到最后一个
if (lastItemPosition == itemCount - 1 && isUpwardSliding) {
onLoadMore()
}
}
}
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
isUpwardSliding = dy > 0
}
abstract fun onLoadMore()
}
override fun dismiss() {
super.dismiss()
mNextPage = 0
orders.clear()
}
private inner class OrdersOperationFragmentAdapter(fm: FragmentManager, behavior: Int) :
FragmentPagerAdapter(fm, behavior) {
override fun getItem(position: Int): Fragment {
return fragments[position]
}
override fun getCount(): Int {
return fragments.size
}
override fun getPageTitle(position: Int): CharSequence {
return mTabTitles[position]
}
}
companion object {
private const val TAG = "OCHTaxiOrdersDialog"
private var serverHadNoData = false
private const val ORDER_DETAIL_ITEM = 0
private const val DAY_GROUP_ITEM = 1
}
}

View File

@@ -0,0 +1,54 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.app.Activity
import android.os.Bundle
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseBindingFragment
import com.mogo.och.taxi.bean.OrderQueryRespBean
import com.mogo.och.taxi.databinding.UnmannedBeingOrderBinding
/**
* @author: wangmingjun
* @date: 2023/7/24
*/
class TaxiReserveOrderFragment : BaseBindingFragment<UnmannedBeingOrderBinding>({
UnmannedBeingOrderBinding.inflate(it)
}) {
private val mDatas: MutableList<OrderQueryRespBean.Result> = ArrayList()
override fun getLayoutId(): Int {
return R.layout.unmanned_being_order
}
override fun getTagName(): String {
return "TaxiReserveOrdersFragment"
}
override fun initViews() {
}
fun onOrderCancelDone(orderNo: String) {
ToastUtils.showShort("订单取消成功")
}
companion object {
@SuppressLint("StaticFieldLeak")
private var mTaxiFragment: TaxiFragment? = null
@SuppressLint("StaticFieldLeak")
private var mActivity: Activity? = null
fun newInstance(
activity: Activity?,
taxiFragment: TaxiFragment?
): TaxiReserveOrderFragment {
mActivity = activity
mTaxiFragment = taxiFragment
val args = Bundle()
val fragment = TaxiReserveOrderFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,7 +0,0 @@
package com.mogo.och.taxi.ui
/**
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiReserveOrdersFragment {
}

View File

@@ -1,7 +1,102 @@
package com.mogo.och.taxi.ui
import android.os.Bundle
import com.amap.api.maps.model.LatLng
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.taxi.R
import com.mogo.och.taxi.presenter.NaviPresenter
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/24
*/class TaxiRottingNaviFragment {
*/
class TaxiRottingNaviFragment : MvpFragment<TaxiRottingNaviFragment?, NaviPresenter?>() {
private val TAG = TaxiRottingNaviFragment::class.java.simpleName
private var mMapDirectionView: TaxiMapDirectionView? = null
override fun getLayoutId(): Int {
return R.layout.taxi_rotting_navi_view
}
override fun getTagName(): String {
return TAG
}
override fun initViews() {}
override fun initViews(savedInstanceState: Bundle?) {
super.initViews(savedInstanceState)
mMapDirectionView = mRootView.findViewById<TaxiMapDirectionView>(R.id.rotting_navi_view)
mMapDirectionView!!.onCreateView(savedInstanceState)
}
override fun onResume() {
super.onResume()
mMapDirectionView!!.onResume()
}
override fun onPause() {
super.onPause()
mMapDirectionView!!.onPause()
}
override fun onDestroy() {
super.onDestroy()
if (mMapDirectionView != null) {
mMapDirectionView!!.onDestroy()
}
}
override fun createPresenter(): NaviPresenter {
return NaviPresenter(this)
}
fun routeResult(
routeArrived: List<LatLng>,
routeArriving: List<LatLng>,
location: MogoLocation?
) {
if (routeArrived.size + routeArriving.size > 0) {
drawablePolylineByRoute(routeArrived, routeArriving, location)
} else {
clearPolyline()
}
}
fun setLineMarker(startStation: LatLng?, endStation: LatLng?) {
if (startStation != null && endStation != null) {
if (mMapDirectionView != null) {
mMapDirectionView!!.setStartMarkAndEndMark(startStation, endStation)
UiThreadHandler.post { mMapDirectionView!!.setLineMarker() }
}
} else {
clearPolyline()
}
}
private fun drawablePolylineByRoute(
routeArrived: List<LatLng>,
routeArriving: List<LatLng>,
location: MogoLocation?
) {
if (mMapDirectionView != null) {
mMapDirectionView!!.setCoordinatesLatLng(routeArrived, routeArriving, location)
UiThreadHandler.post { mMapDirectionView!!.drawablePolyline() }
}
}
private fun clearPolyline() {
if (mMapDirectionView != null) {
UiThreadHandler.post { mMapDirectionView!!.clearPolyline() }
}
}
companion object {
fun newInstance(): TaxiRottingNaviFragment {
val args = Bundle()
val fragment = TaxiRottingNaviFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -1,7 +1,221 @@
package com.mogo.och.taxi.ui
import android.annotation.SuppressLint
import android.graphics.Color
import android.graphics.Typeface
import android.os.Build
import android.os.Bundle
import android.util.TypedValue
import android.view.View
import android.widget.TextView
import androidx.annotation.RequiresApi
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import androidx.fragment.app.FragmentTransaction
import androidx.viewpager.widget.ViewPager
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import com.google.android.material.tabs.TabLayout
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.taxi.R
import com.mogo.och.taxi.base.BaseTaxiUIFragment
import com.mogo.och.taxi.bean.OrderQueryRespBean
import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean
import me.jessyan.autosize.utils.AutoSizeUtils
/**
* @author: wangmingjun
* @author: wangmingjun
* @date: 2023/7/25
*/class TaxiServerOrdersFragment {
}
*/
class TaxiServerOrdersFragment : BaseTaxiUIFragment() {
private val mFragmentTransaction: FragmentTransaction? = null
private var mTaxiOrderTab: TabLayout? = null
private var mWaitOrderSum: TextView? = null
private var mTaxiOrderPager: ViewPager? = null
private val mTabTitles = arrayOf("进行中", "待服务")
private val fragments: MutableList<Fragment> = ArrayList()
private var beingServerdOrdersFragment: TaxiBeingTaskFragment? = null
private var reserveOrdersFragment: TaxiReserveOrderFragment? = null
override fun getLayoutId(): Int {
return R.layout.taxi_server_orders_panel
}
override fun initViews(view: View) {
initOrderTab(view)
}
private fun initOrderTab(view: View) {
mWaitOrderSum = view.findViewById<TextView>(R.id.wait_order_num)
mTaxiOrderTab = view.findViewById<TabLayout>(R.id.module_och_taxi_tab)
mTaxiOrderPager = view.findViewById<ViewPager>(R.id.module_och_taxi_view_pager)
for (i in mTabTitles.indices) {
val tab = mTaxiOrderTab?.newTab()
tab?.view?.setBackgroundColor(Color.parseColor("#00000000"))
val tabView =
View.inflate(activity, R.layout.taxi_tab_item_custom, null) as TextView
tabView.text = mTabTitles[i]
tabView.height = AutoSizeUtils.dp2px(getContext(), 120f)
tab?.customView = tabView
if (0 == i) {
mTaxiOrderTab?.addTab(tab!!, true)
changeTabLayoutTabUI(tab!!, true)
beingServerdOrdersFragment = TaxiBeingTaskFragment.newInstance(
activity,
parentFragment as TaxiFragment?
)
fragments.add(beingServerdOrdersFragment!!)
} else if (1 == i) {
mTaxiOrderTab?.addTab(tab!!)
changeTabLayoutTabUI(tab!!, false)
reserveOrdersFragment = TaxiReserveOrderFragment.newInstance(
activity,
parentFragment as TaxiFragment?
)
fragments.add(reserveOrdersFragment!!)
}
}
d(SceneConstant.M_TAXI + TAG, "activity=" + getActivity())
mTaxiOrderTab?.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
mTaxiOrderPager?.currentItem = tab.position
changeTabLayoutTabUI(tab, true)
}
override fun onTabUnselected(tab: TabLayout.Tab) {
changeTabLayoutTabUI(tab, false)
}
override fun onTabReselected(tab: TabLayout.Tab) {}
})
mTaxiOrderPager?.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
mTaxiOrderTab?.getTabAt(position)!!.select()
}
override fun onPageScrollStateChanged(state: Int) {}
})
mTaxiOrderPager?.adapter = OrdersFragmentAdapter(
childFragmentManager,
FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
)
}
@SuppressLint("UseCompatLoadingForDrawables")
private fun changeTabLayoutTabUI(tab: TabLayout.Tab, isSelected: Boolean) {
val textView = tab.customView!!.findViewById<View>(R.id.tab_title) as TextView
if (isSelected) {
textView.background = activity?.getDrawable(R.drawable.taxi_driver_tab_item_bg)
textView.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
AutoSizeUtils.dp2px(context, 40f).toFloat()
)
d(SceneConstant.M_TAXI + TAG, "SelectTv = " + textView.text)
textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD)
textView.setTextColor(Color.parseColor("#FFFFFF"))
} else {
textView.background = null
textView.setTextSize(
TypedValue.COMPLEX_UNIT_PX,
AutoSizeUtils.dp2px(getContext(), 36f).toFloat()
)
d(SceneConstant.M_TAXI + TAG, "unSelectTv = " + textView.text)
textView.typeface = Typeface.defaultFromStyle(Typeface.NORMAL)
textView.setTextColor(Color.parseColor("#CCD4F5"))
}
}
internal inner class OrdersFragmentAdapter(
fragmentManager: FragmentManager,
behavior: Int
) :
FragmentPagerAdapter(fragmentManager, behavior) {
override fun getItem(position: Int): Fragment {
d(
SceneConstant.M_TAXI + TAG,
"getItem=$position"
)
return fragments[position]
}
override fun getCount(): Int {
return fragments.size
}
override fun getPageTitle(position: Int): CharSequence {
d(
SceneConstant.M_TAXI + TAG,
"getPageTitle=$position"
)
return mTabTitles[position]
}
}
@RequiresApi(api = Build.VERSION_CODES.P)
fun updateCurrentOrderStatusChanged(order: OrderQueryRespBean.Result?) {
if (beingServerdOrdersFragment != null) {
mTaxiOrderTab!!.getTabAt(0)!!.select()
beingServerdOrdersFragment!!.updateCurrentOrderStatusChanged(order)
}
}
fun onOrdersWaitServiceChanged(waitServiceList: List<OrderQueryRespBean.Result>) {
// if (waitServiceList.isEmpty()) {
// mWaitOrderSum!!.visibility = View.GONE
// } else {
// mWaitOrderSum!!.text = waitServiceList.size.toString()
// mWaitOrderSum!!.visibility = View.VISIBLE
// }
// if (null == reserveOrdersFragment) return
// reserveOrdersFragment!!.onOrdersWaitServiceChanged(waitServiceList)
}
fun onOrderCancelDone(orderNo: String?) {
if (null == reserveOrdersFragment) return
reserveOrdersFragment!!.onOrderCancelDone(orderNo!!)
}
fun onCurrentOrderCancelDone() {
if (null == beingServerdOrdersFragment) return
beingServerdOrdersFragment!!.onCurrentOrderCancelDone()
}
@RequiresApi(Build.VERSION_CODES.N)
fun onCurrentOrderDistToEndChanged(meters: Long, timeInSecond: Long) {
if (null == beingServerdOrdersFragment) return
beingServerdOrdersFragment!!.updateDistanceAndTime(meters, timeInSecond)
}
@RequiresApi(Build.VERSION_CODES.N)
fun onCurrentOrderRouteInfoGot(routeInfo: OrderQueryRouteInfoRespBean.Result?) {
if (null == beingServerdOrdersFragment) return
beingServerdOrdersFragment!!.onCurrentOrderRouteInfoGot(routeInfo)
}
fun updateOrderBottomBtnUI() {
if (null == beingServerdOrdersFragment) return
beingServerdOrdersFragment!!.updateOrderBottomBtnUI()
}
fun onNaviToEndAmap(isShow: Boolean) {
if (null == beingServerdOrdersFragment) return
beingServerdOrdersFragment!!.onNaviToEndAmap(isShow)
}
companion object {
const val TAG = "TaxiFragment"
fun newInstance(): TaxiServerOrdersFragment {
val args = Bundle()
val fragment = TaxiServerOrdersFragment()
fragment.arguments = args
return fragment
}
}
}

View File

@@ -0,0 +1,50 @@
package com.mogo.och.taxi.ui.unmanned
import com.mogo.och.taxi.base.IUiIntent
/**
* @author: wangmingjun
* @date: 2023/7/26
*/
sealed class UnmannedIntent: IUiIntent{
//获取接单/暂停接单状态
object GetReceivingOrderState : UnmannedIntent()
//开始接单
object StartReceivingOrder : UnmannedIntent()
//暂停接单
object PauseReceivingOrder : UnmannedIntent()
//获取当前任务信息
object GetCurrentTask : UnmannedIntent()
//到站获取下一个执行的任务信息
object GetNextTask: UnmannedIntent()
//轮询订单
object GetOrder: UnmannedIntent()
//开始接单后获取要前往的虚拟站点
object GetVirtualStation: UnmannedIntent()
//开始执行任务
object StartTask: UnmannedIntent()
//到达乘客上车点
object ArrivedOrderStartStation: UnmannedIntent()
//到达乘客下车点
object ArrivedOrderEndStation: UnmannedIntent()
//订单服务完成
object JourneyCompleted: UnmannedIntent()
//跳过乘客验证
object JumpPassengerCheckDone : UnmannedIntent()
//司机端手动结束订单
object CloseOrderByDriver : UnmannedIntent()
}

View File

@@ -0,0 +1,25 @@
package com.mogo.och.taxi.ui.unmanned
import com.mogo.och.taxi.base.IUiState
import com.mogo.och.taxi.bean.OrderDetail
import com.mogo.och.taxi.bean.TaskDetail
/**
* @author: wangmingjun
* @date: 2023/7/26
*/
data class UnmannedState(val taskUiState: TaskUiState,val orderUiState: OrderUiState): IUiState
sealed class TaskUiState{
object INIT : TaskUiState()
data class SUCCESS(val models: List<TaskDetail>) : TaskUiState()
}
sealed class OrderUiState{
object INIT : OrderUiState()
data class SUCCESS(val models: List<OrderDetail>) : OrderUiState()
}
sealed class OperationBtnUiState{
}

View File

@@ -10,6 +10,7 @@ import com.mogo.och.taxi.bean.OrderQueryRespBean;
import com.mogo.och.taxi.constant.TaxiConst;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
import com.mogo.och.taxi.model.TaxiModel;
import com.mogo.och.taxi.model.TaxiUnmannedViewModel;
import java.util.concurrent.TimeUnit;
@@ -50,7 +51,7 @@ public class TaxiTrajectoryManager {
* 同步订单信息
*/
public void syncTrajectoryInfo() {
OrderQueryRespBean.Result orderInfo = TaxiModel.getInstance().getCurrentOCHOrder();
OrderQueryRespBean.Result orderInfo = TaxiModel.INSTANCE.getCurrentOCHOrder();
if (orderInfo == null || orderInfo.orderStatus >= TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "syncTrajectoryInfo() stop.");
stopTrajReqLoop();
@@ -99,7 +100,7 @@ public class TaxiTrajectoryManager {
}
private void setupAutoPilotLine() {
OrderQueryRespBean.Result order = TaxiModel.getInstance().getCurrentOCHOrder();
OrderQueryRespBean.Result order = TaxiModel.INSTANCE.getCurrentOCHOrder();
if (order == null) {
CallerLogger.INSTANCE.e(M_TAXI + TAG,
"setupAutoPilotLine(): orderInfo is null.");

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Some files were not shown because too many files have changed in this diff Show More