From ecb9925c69e27bea24f0c4ceec46a43821bfc03e Mon Sep 17 00:00:00 2001 From: aibingbing Date: Sat, 12 Oct 2024 15:11:46 +0800 Subject: [PATCH 01/13] =?UTF-8?q?[6.7.0][=E5=B7=A5=E5=85=B7=E7=AE=B1]=20fi?= =?UTF-8?q?x:=20=E6=BC=AB=E6=B8=B8=20=E7=82=B9=E5=87=BB=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/hmi/bone/toolkit/custom/ToolDriverRomaView.kt | 3 ++- .../src/main/res/layout/view_tool_driver_roma.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolDriverRomaView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolDriverRomaView.kt index 8f69e31e74..fece3e38b4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolDriverRomaView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/toolkit/custom/ToolDriverRomaView.kt @@ -15,6 +15,7 @@ import com.mogo.eagle.core.utilcode.util.ClickUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import kotlinx.android.synthetic.main.view_tool_driver_roma.view.ivRomaView +import kotlinx.android.synthetic.main.view_tool_driver_roma.view.toolDriverRomaContainer class ToolDriverRomaView @JvmOverloads constructor( context: Context, @@ -41,7 +42,7 @@ class ToolDriverRomaView @JvmOverloads constructor( 0 ) - setOnClickListener { + toolDriverRomaContainer.setOnClickListener { if (ClickUtils.isClickTooFrequent(this, 2500)) { ToastUtils.showShort("不要频繁点击哦~") return@setOnClickListener diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_driver_roma.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_driver_roma.xml index 24338356e1..75ce81ba4b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_driver_roma.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_tool_driver_roma.xml @@ -1,7 +1,7 @@ From 05b86f677d5406e4a688c2ca50cdf4de731636ef Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 15:34:38 +0800 Subject: [PATCH 02/13] =?UTF-8?q?[6.7.0]=20[fix]=20[=E5=88=B0=E7=AB=99?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/weaknet/repository/impl/ShuttleSaasRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/ShuttleSaasRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/ShuttleSaasRepository.kt index b4e1c233ef..cc61dfaf56 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/ShuttleSaasRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/impl/ShuttleSaasRepository.kt @@ -219,8 +219,8 @@ class ShuttleSaasRepository : IRepository { EventDb.saveEventTaskArriveSite( task.taskId!!, task.lineId!!, - start.siteId.toLong(), - start.seq, + end.siteId.toLong(), + end.seq, task.taskStartTime, lineInfo.lineName ) From 3b9061a2165205dc26dd5d0eb0ec2a1c9473101f Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 16:18:44 +0800 Subject: [PATCH 03/13] =?UTF-8?q?[6.7.0]=20[fea]=20[=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=9B=B8=E4=B9=98=20=E8=99=9A=E6=8B=9F=E5=8D=95=E5=B1=95?= =?UTF-8?q?=E7=A4=BA]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/module/wigets/CommonSlideView.kt | 2 +- .../module/wigets/autopilot/AutopilotState.kt | 10 +- .../wigets/autopilot/AutopilotStateModel.kt | 6 +- .../module/wigets/commonview/EmptyView.kt | 55 ++ .../wigets/map/orderstatus/OrderStatusView.kt | 22 +- .../map/orderstatus/OrderStatusViewModel.kt | 2 + .../common/src/main/res/values/attrs.xml | 4 + .../och/unmanned/taxi/ui/base/TaxiFragment.kt | 23 +- .../och/unmanned/taxi/ui/debug/DebugView.kt | 6 +- .../TaxiOperationalDialogFragment.kt | 3 +- .../unmanned/taxi/ui/task/TaxiTaskModel.kt | 16 +- .../itinerarycurrent/ItineraryCurrentModel.kt | 486 ++++++++++- .../itinerarycurrent/ItineraryCurrentView.kt | 767 +++++++++++++++++- .../taxi/wigets/TaxiSelectViewGroup.kt | 2 +- .../res/layout/unmanned_itinerary_current.xml | 203 ++++- .../res/layout/unmanned_switch_itinerary.xml | 6 +- .../layout/unmanned_taxi_base_fragment.xml | 9 + .../main/res/layout/unmanned_taxi_panel.xml | 7 - .../src/main/res/values/colors.xml | 1 + 19 files changed, 1550 insertions(+), 80 deletions(-) create mode 100644 OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/commonview/EmptyView.kt diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/CommonSlideView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/CommonSlideView.kt index 69e257067f..1b4ea64f73 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/CommonSlideView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/CommonSlideView.kt @@ -130,7 +130,7 @@ class CommonSlideView @JvmOverloads constructor( if(isVisible){ lottie_bg.setAnimation("slide.json") lottie_bg.playAnimation() - draggableButton.setTextColor(ResourcesUtils.getColor(R.color.white)) + draggableButton.setTextColor(context.getColor(R.color.white)) ObjectAnimator.ofFloat( draggableButton, "translationX", draggableButton.translationX, 0f diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotState.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotState.kt index 762db267ba..1ae3d57c97 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotState.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotState.kt @@ -50,11 +50,11 @@ class AutopilotState @JvmOverloads constructor( autopilotLoadingAnimator = ObjectAnimator.ofFloat(aciv_autopilot_state, "rotation", 0f, 360f); autopilotLoadingAnimator.interpolator = LinearInterpolator() autopilotLoadingAnimator.repeatCount = -1 //无限循环 - autopilotLoadingAnimator.duration = 1000 //无限循环 + autopilotLoadingAnimator.duration = 2000 //无限循环 autopilotChangeStateAnimator = ObjectAnimator.ofFloat(aciv_autopilot_state, "alpha", 1f, 0f,1f); autopilotChangeStateAnimator.interpolator = LinearInterpolator() - autopilotChangeStateAnimator.duration = 200 + autopilotChangeStateAnimator.duration = 300 onClick { startAutopilot() } @@ -127,7 +127,7 @@ class AutopilotState @JvmOverloads constructor( override fun inAutopilot() { CallerLogger.d(TAG,"展示自驾中UI") - updateImageInAnimator(R.drawable.common_autopilot_starting_new) + updateImageInAnimator(R.drawable.common_autopilot_running) actv_pxjs_state.visibility = GONE actv_autopilot_head.visibility = VISIBLE @@ -225,7 +225,7 @@ class AutopilotState @JvmOverloads constructor( actv_pxjs_state.setTextColor(ResourcesUtils.getColor(R.color.common_19FFCB)) AutopilotState@this.isEnabled = false - aciv_autopilot_running_ani.visibility = VISIBLE + aciv_autopilot_running_ani.visibility = GONE autopilotStateAnimator?.stop() autopilotLoadingAnimator.cancel() autopilotChangeStateAnimator.start() @@ -234,7 +234,7 @@ class AutopilotState @JvmOverloads constructor( private fun updateImageInAnimator(@DrawableRes resource:Int){ UiThreadHandler.postDelayed({ aciv_autopilot_state.setImageResource(resource) - },100,UiThreadHandler.MODE.QUEUE) + },150,UiThreadHandler.MODE.QUEUE) } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotStateModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotStateModel.kt index 79b15bf807..f23f021a51 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotStateModel.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/autopilot/AutopilotStateModel.kt @@ -12,6 +12,7 @@ import com.mogo.och.common.module.manager.autopilot.line.ILineCallback import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.utils.RxUtils import java.util.concurrent.atomic.AtomicBoolean /** @@ -126,6 +127,9 @@ class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCall OchChainLogManager.writeChainLog("自驾信息","启动自驾") if(AutopilotStateDebug.debugStatus){ startAutopilotSuccess() + RxUtils.createSubscribe(5_000) { + startAutopilotFail() + } }else { LineManager.startAutopilot() } @@ -159,7 +163,7 @@ class AutopilotStateModel : ViewModel(), IOchAutopilotStatusListener, ILineCall this.isPalyStartAni.set(false) UiThreadHandler.postDelayed({ autopilotStateChange() - },1000,UiThreadHandler.MODE.QUEUE) + },3000,UiThreadHandler.MODE.QUEUE) } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/commonview/EmptyView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/commonview/EmptyView.kt new file mode 100644 index 0000000000..66252b9b03 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/commonview/EmptyView.kt @@ -0,0 +1,55 @@ +package com.mogo.och.common.module.wigets.commonview + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.map.listener.IMogoMapListener +import com.mogo.och.common.module.R +import com.mogo.och.common.module.utils.ResourcesUtils +import kotlinx.android.synthetic.main.common_empty_view.view.no_order_data_tv + +class EmptyView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr),IMogoMapListener { + companion object { + const val TAG = "LoadingMapStatusView" + } + + private var emptyTitle:String = "" + + + init { + LayoutInflater.from(context).inflate(R.layout.common_empty_view, this, true) + try { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.EmptyView) + emptyTitle = typedArray.getString(R.styleable.EmptyView_empty_title)?:ResourcesUtils.getString(R.string.common_empty_data) + typedArray.recycle() + } catch (e: Exception) { + e.printStackTrace() + } + no_order_data_tv.text = emptyTitle + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerLogger.d(TAG,"onAttachedToWindow") + + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerLogger.d(TAG,"onDetachedFromWindow") + } + + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt index a7e1eb3083..9b2258896e 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusView.kt @@ -54,16 +54,18 @@ class OrderStatusView : RelativeLayout, OrderStatusViewModel.IVisualCallback { override fun setImageViewResource(name: Int,ordering:Boolean) { iv_order_status.setImageResource(name) - if (iv_order_status.layoutParams is RelativeLayout.LayoutParams) { - val temp = iv_order_status.layoutParams as RelativeLayout.LayoutParams - temp.removeRule(RelativeLayout.ALIGN_PARENT_START) - temp.addRule(ALIGN_PARENT_END) - iv_order_status.layoutParams = temp - }else{ - val temp = iv_order_status.layoutParams as RelativeLayout.LayoutParams - temp.removeRule(RelativeLayout.ALIGN_PARENT_END) - temp.addRule(ALIGN_PARENT_START) - iv_order_status.layoutParams = temp + if (iv_order_status.layoutParams is LayoutParams) { + if(ordering){ + val temp = iv_order_status.layoutParams as LayoutParams + temp.removeRule(ALIGN_PARENT_START) + temp.addRule(ALIGN_PARENT_END) + iv_order_status.layoutParams = temp + }else{ + val temp = iv_order_status.layoutParams as LayoutParams + temp.removeRule(ALIGN_PARENT_END) + temp.addRule(ALIGN_PARENT_START) + iv_order_status.layoutParams = temp + } } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt index 82f4b26dfe..ae2f82b5fd 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/orderstatus/OrderStatusViewModel.kt @@ -2,6 +2,7 @@ package com.mogo.och.common.module.wigets.map.orderstatus import androidx.annotation.DrawableRes import androidx.lifecycle.ViewModel +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.R import com.mogo.och.common.module.biz.login.ILoginCallback @@ -30,6 +31,7 @@ class OrderStatusViewModel : ViewModel(), ILoginCallback { } override fun onOpenOrderStatusEnumChange(businessEnum: OpenOrderStatusEnum?) { + CallerLogger.d(TAG,"新的接单状态${businessEnum}") UiThreadHandler.post({ if (LoginStatusManager.isOpenOrderType()) { this.viewCallback?.setImageViewResource(R.drawable.common_order_status,true) diff --git a/OCH/common/common/src/main/res/values/attrs.xml b/OCH/common/common/src/main/res/values/attrs.xml index 31323f4270..ab122895b6 100644 --- a/OCH/common/common/src/main/res/values/attrs.xml +++ b/OCH/common/common/src/main/res/values/attrs.xml @@ -14,6 +14,10 @@ + + + + diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt index 980ff8fb45..dbca0cc86f 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt @@ -40,8 +40,8 @@ import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskTabFragment import com.mogo.och.unmanned.taxi.utils.TPRouteDataTestUtils import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.unmannedMapCL import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.module_mogo_och_navi_panel_container +import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.orderDebugView import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.taxi_close_navi_icon -import kotlinx.android.synthetic.main.unmanned_taxi_panel.orderDebugView import java.lang.ref.WeakReference /** @@ -64,8 +64,6 @@ class TaxiFragment :MvpFragment(), private val lineView = "LINEVIEW" private var personalDialogFragment: WeakReference? = null - private var taskTabFragment: WeakReference? = null - private fun updateOperationBtnStatusOnModeChange(isRoutingVerifyMode: Boolean) { if (MogoStatusManager.getInstance().isTaxiUnmanedDriverTakingOrders) { @@ -175,11 +173,6 @@ class TaxiFragment :MvpFragment(), unmannedMapCL.onPause() } - fun onChangeOperationStatus() { - if (null == taskTabFragment || taskTabFragment!!.get() == null) return - taskTabFragment!!.get()!!.onCarTakeOrderStatusChanged() - } - override fun onLowMemory() { super.onLowMemory() unmannedMapCL.onLowMemory() @@ -273,15 +266,6 @@ class TaxiFragment :MvpFragment(), } - /** - * 获取站点面板view,在[.initViews]时候添加到container中 - * - * @return 站点面板view - */ - fun getStationPanelViewId(): Int { - return R.layout.unmanned_taxi_panel - } - /** * 重新开启自动驾驶 */ @@ -419,8 +403,9 @@ class TaxiFragment :MvpFragment(), if (MogoStatusManager.getInstance().isTaxiUnmanedDriverLineRoutingVerifyMode) { showAmapNaviToStationFragment(isShow) } else { - if (null == taskTabFragment || taskTabFragment!!.get() == null) return - taskTabFragment!!.get()!!.onNaviToEndStationByAMap(isShow) + // TODO: 需要复原 +// if (null == taskTabFragment || taskTabFragment!!.get() == null) return +// taskTabFragment!!.get()!!.onNaviToEndStationByAMap(isShow) } } else if (isShow) { //使用routing数据 showRoutingToStationFragment(true) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt index 6cd50de673..66579ebe65 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/debug/DebugView.kt @@ -22,6 +22,7 @@ import com.mogo.commons.module.status.StatusDescriptor import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.function.main.MainMoGoApplication import com.mogo.eagle.core.network.utils.GsonUtil +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -74,16 +75,19 @@ public class DebugView @JvmOverloads constructor( private var logHistoryTextView: TextView? = null fun printInfoMsg(msg: String) { + CallerLogger.i(TAG,msg) printMsg("Info $msg", MainMoGoApplication.getApp().getColor(R.color.background_info)) trackEvent("Info", msg) } fun printWarnMsg(msg: String) { + CallerLogger.w(TAG,msg) printMsg("Warn $msg", MainMoGoApplication.getApp().getColor(R.color.background_debug)) trackEvent("Warn", msg) } fun printErrorMsg(msg: String) { + CallerLogger.e(TAG,msg) printMsg("Error $msg", MainMoGoApplication.getApp().getColor(R.color.background_error)) trackEvent("Error", msg) } @@ -155,7 +159,7 @@ public class DebugView @JvmOverloads constructor( initBroadcastReceiver() LayoutInflater.from(context).inflate(R.layout.unmanned_taxi_debug_order, this, true) debugLogHistoryTextView.movementMethod = ScrollingMovementMethod.getInstance() - visibility = GONE + visibility = VISIBLE logHistoryTextView = debugLogHistoryTextView initView() diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaxiOperationalDialogFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaxiOperationalDialogFragment.kt index f7b40c9862..092926449b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaxiOperationalDialogFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/operational/TaxiOperationalDialogFragment.kt @@ -26,7 +26,6 @@ import com.mogo.och.unmanned.taxi.bean.QueryServingDurationRespBean import com.mogo.och.unmanned.taxi.bean.QueryTaskRespBean import com.mogo.och.unmanned.taxi.constant.StationTypeEnum import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum -import com.mogo.och.unmanned.taxi.ui.task.TaxiCurrentTaskFragment import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.dayCompletedOrdersView import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.dayTotalOrdersView import kotlinx.android.synthetic.main.unmanned_taxi_operational_data_view.itemDayTv @@ -115,7 +114,7 @@ class TaxiOperationalDialogFragment : DialogFragment(), lifecycleScope.launchWhenStarted { mViewModel.uiStateFlow.map { it.operationalDataUIState }.collect { operationalDataUIState -> - d(TaxiCurrentTaskFragment.TAG, "uiStateFlow-initViewModelObserver: $operationalDataUIState") + d(TAG, "uiStateFlow-initViewModelObserver: $operationalDataUIState") when (operationalDataUIState) { is OperationalDataStateUIState.Init -> { } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt index 45372c123c..83f27f04c6 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt @@ -276,14 +276,14 @@ object TaxiTaskModel { private val mMogoAutopilotStatusListener: IOchAutopilotStatusListener = object : IOchAutopilotStatusListener { override fun onAutopilotIpcConnectStatusChanged(status: AdasConstants.IpcConnectionStatus, reason: String?) { - DebugView.printInfoMsg( - "[域控连接状态变化] status=$status, reason=${ - if (TextUtils.isEmpty( - reason - ) - ) "" else reason - }" - ) +// DebugView.printInfoMsg( +// "[域控连接状态变化] status=$status, reason=${ +// if (TextUtils.isEmpty( +// reason +// ) +// ) "" else reason +// }" +// ) } override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?, lineId: Long) { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt index c79a16007a..b843c773be 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt @@ -1,27 +1,505 @@ package com.mogo.och.unmanned.taxi.ui.itinerarycurrent import androidx.lifecycle.ViewModel +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager +import com.mogo.eagle.core.network.utils.GsonUtil +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.common.module.manager.autopilot.line.LineManager +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager +import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.utils.ToastUtilsOch +import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.unmanned.taxi.R +import com.mogo.och.unmanned.taxi.base.BaseViewModel +import com.mogo.och.unmanned.taxi.base.IUiIntent +import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean +import com.mogo.och.unmanned.taxi.bean.TrajectoryListRespBean +import com.mogo.och.unmanned.taxi.callback.ITaxiCarServiceCallback +import com.mogo.och.unmanned.taxi.callback.ITaxiTaskWithOrderCallback +import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum +import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum +import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst +import com.mogo.och.unmanned.taxi.network.TaxiTaskWithOrderServiceManager +import com.mogo.och.unmanned.taxi.ui.debug.DebugView +import com.mogo.och.unmanned.taxi.ui.task.TaskUiIntent +import com.mogo.och.unmanned.taxi.ui.task.TaskWithOrderUIState +import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel +import com.mogo.och.unmanned.taxi.ui.task.UnmannedState +import com.mogo.och.unmanned.taxi.utils.TaxiTrajectoryManager /** * @author XuXinChao * @description BadCase录包管理页面 * @since: 2022/12/15 */ -class ItineraryCurrentModel : ViewModel() { +class ItineraryCurrentModel : BaseViewModel(), + ITaxiTaskWithOrderCallback, ITaxiCarServiceCallback { private val TAG = ItineraryCurrentModel::class.java.simpleName + init { + TaxiTaskModel.addTaskWithOrderListener(TAG, this) + TaxiTaskModel.setCarServiceCallback(this) + } + private var viewCallback: SwtichLineViewCallback? = null + fun setDistanceCallback(viewCallback: SwtichLineViewCallback) { + this.viewCallback = viewCallback + } + + override fun onCleared() { - + TaxiTaskModel.removeTaskWithOrderListener(TAG) + TaxiTaskModel.removeCarServiceCallback() + super.onCleared() } - fun setDistanceCallback(viewCallback: SwtichLineViewCallback) { - this.viewCallback = viewCallback + override fun initUiState(): UnmannedState { + return UnmannedState(TaskWithOrderUIState.Init) + } + + override fun handleIntent(intent: IUiIntent) { + when (intent) { + is TaskUiIntent.StartTaskWithOrderLooper -> { //开始轮询 + startOrStopCurrentTaskWithOrderLoop(true) + } + + is TaskUiIntent.StartOrEndTakeOrder -> {//开始、暂停接单 + TaxiTaskModel.updateCarServingStatus() + } + + is TaskUiIntent.JumpPassengerCheck -> { //手动点击跳过乘客验证 + jumpPassengerCheck() + } + + is TaskUiIntent.JourneyCompleted -> { //点击服务完成 + journeyCompleted() + } + + is TaskUiIntent.CloseOrderByDriver -> { + closeOrderByDriver() + } + + is TaskUiIntent.CancelOrder -> {// 取消订单, 暂未加取消类型和原因 + cancelOrder(intent.type) + } + + is TaskUiIntent.StartTask -> { + startTask() + } + } + } + + fun startOrStopCurrentTaskWithOrderLoop(start: Boolean) { + d(TAG, "startOrStopCurrentTaskWithOrderLoop(): isStart=$start") + if (start) { + DebugView.printInfoMsg("[查询TaskWithOrder信息] start loop") + TaxiTaskModel.startQueryCurrentTaskWithOrderLoop() + } else { + DebugView.printInfoMsg("[查询TaskWithOrder信息] stop loop") + TaxiTaskModel.stopQueryCurrentTaskWithOrderLoop() + } + } + + private fun cancelOrder(cancelType: Int) { + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + currentTaskWithOrder?.order?.also { + TaxiTaskModel.cancelOrder(it.orderNo, cancelType) + } + } + + private fun jumpPassengerCheck() { + DebugView.printInfoMsg("[跳过乘客验证] 准备发送请求") + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + currentTaskWithOrder?.order?.also { + TaxiTaskWithOrderServiceManager.jumpPassengerCheck( + AbsMogoApplication.getApp().applicationContext, + it.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + DebugView.printInfoMsg("[跳过乘客验证] 请求success") + d(TAG, "jumpPassengerCheck onSuccess:") + } + + override fun onFail(code: Int, msg: String?) { + DebugView.printInfoMsg("[跳过乘客验证] 请求fail, code=$code, msg=$msg") + d(TAG, "jumpPassengerCheck onFail: code=$code, msg=$msg") + } + }) + } + } + + private fun journeyCompleted() { + DebugView.printInfoMsg("[服务完成] 准备发送请求") + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + currentTaskWithOrder?.order?.also { + TaxiTaskWithOrderServiceManager.orderCompleted( + AbsMogoApplication.getApp().applicationContext, + it.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + DebugView.printInfoMsg("[服务完成] 请求success") + d(TAG, "journeyCompleted onSuccess") + } + + override fun onFail(code: Int, msg: String?) { + DebugView.printInfoMsg("[服务完成] 请求fail, code=$code, msg=$msg") + d(TAG, "journeyCompleted onFail: code=$code, msg=$msg") + } + }) + } + } + + private fun closeOrderByDriver() { + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + currentTaskWithOrder?.order?.orderEndSite?.also { + TaxiTaskModel.submitArriveSite(it.siteId, true) + } + } + + private fun startTask(isStartAutopilot: Boolean = true) { + if (!TaxiTaskModel.checkCurrentTaskCondition()) { + ToastUtils.showShort("无任务!") + return + } + + TaxiTaskModel.getCurrentTaskWithOrder()?.let { + TaxiTaskModel.startTask( + if (it.order != null && it.order!!.orderStatus >= TaxiOrderStatusEnum.ArriveAtStart.code) + it.order!!.orderLine //当前若是启动的送驾任务 , 则使用订单信息的lineId + else + it.lineId + ,isStartAutopilot) + } + } + + private fun updateTaskAndOrderUi(currentTaskWithOrder: QueryCurrentTaskRespBean.Result?) { + d( + TAG, "updateTaskAndOrderUi: currentTaskWithOrder=${ + GsonUtil.getGson().toJson(currentTaskWithOrder) + }" + ) + sendUiState { + copy( + taskWithOrderUIState = TaskWithOrderUIState.TaskWithOrder( + currentTaskWithOrder + ) + ) + } + } + + private fun updatePrepareTaskDelayUI(delayTime: Long, isStart: Boolean) { + d(TAG, "UpdatePrepareTaskDelay120SUI = $isStart") + sendUiState { + copy( + taskWithOrderUIState = TaskWithOrderUIState.UpdatePrepareTaskDelay(delayTime, + isStart + ) + ) + } + } + + private fun updateDriveToNearestStationTaskUI(driveToNearestStationTask: StartServiceRespBean.Result?) { + d(TAG, "updateDriveToNearestStationTaskUI = ${driveToNearestStationTask?.toString()}") + sendUiState { + copy( + taskWithOrderUIState = TaskWithOrderUIState.TaskDriveToNearestStationTask( + driveToNearestStationTask + ) + ) + } + } + + private fun updateOrderTripInfoUI(mileage: Float, duration: Int) { + d(TAG, "updateOrderTripInfoUI") + OchChainLogManager.writeChainLog("到达目的地计算距离和时间", "距离:${mileage} 时间:${duration}") + sendUiState { + copy( + taskWithOrderUIState = TaskWithOrderUIState.UpdateOrderTripInfo( + mileage, duration + ) + ) + } + } + + private fun updateTaskTripInfoLocalCalculateUI(meters: Long, timeInSecond: Long) { + d(TAG, "UpdateTaskTripInfoLocalCalculateUI") + sendUiState { + copy( + taskWithOrderUIState = TaskWithOrderUIState.UpdateTaskTripLocalCalculateInfo( + meters, timeInSecond + ) + ) + } + } + + override fun onTaskWithOrderQuerySuccess(timeMillis: Long) { + } + + override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) { + d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result)) + DebugView.printInfoMsg("[查询TaskWithOrder信息] 更新数据, 刷新UI") + updateTaskAndOrderUi(result) + // 设置task执行相关状态,切换模式时判断使用 + if (result == null || result.taskType == TaskTypeEnum.None.code) { + MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) + LineManager.setLineInfo(null); + } else { + MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, true) + } + } + + override fun onTaskStarted(result: QueryCurrentTaskRespBean.Result?) { + updateLocalCalculateStation(result) + if (result?.endSite != null){ + TaxiTaskModel.setBeautificationMode(true) + updateAutopilotControlParameters() + }else{ + clearDemoModeAndACParameters() + } + } + + private fun updateLocalCalculateStation(result: QueryCurrentTaskRespBean.Result?) { + if (result?.startSite != null && result.endSite != null + ) { + d(TAG, "updateLocalCalculateStation start") + val curTaskAndOrder = TaxiTaskModel.getCurrentTaskWithOrder() ?: return + if (curTaskAndOrder.startSite != null && curTaskAndOrder.endSite != null) { + val startStation = MogoLocation() + startStation.longitude = curTaskAndOrder.startSite!!.gcjLon + startStation.latitude = curTaskAndOrder.startSite!!.gcjLat + val endStation = MogoLocation() + endStation.longitude = curTaskAndOrder.endSite!!.gcjLon + endStation.latitude = curTaskAndOrder.endSite!!.gcjLat + TrajectoryAndDistanceManager.setStationPoint( + startStation, + endStation, + curTaskAndOrder.lineId + ) + } + } else { + TaxiTaskModel.clearLocalCalculateStation() + } + } + + /** + * 开始倒计时120s或者10s拉取任务 + * 演练任务120s拉取 + * 接驾任务10s拉取 + */ + override fun onTaskCompleted(result: QueryCurrentTaskRespBean.Result?) { + d(TAG, "onTaskCompleted: ${result?.currentStatus}, siteId=${result?.endSite?.siteId}") + + if (result?.order != null && result.servingStatus == 1){ + if (result.taskType <= TaskTypeEnum.VirtualTask.code + && result.order!!.orderStatus < TaxiOrderStatusEnum.ArriveAtStart.code) { + VoiceNotice.showNotice("已为您接到订单") + } + if (result.order!!.orderStatus == TaxiOrderStatusEnum.ArriveAtStart.code){ + VoiceNotice.showNotice("已到达上车地点,等待乘客上车") + } + } + + /** + * 1、有订单下(表示当前有订单或者未来有要执行的订单): + * 接驾任务需要立即拉取, 拉取时机在车辆前往上车点状态 + * 送驾任务需要立即拉取, 拉取时机在乘客已上车状态 + * 2、在没有订单情况下 + * 若当前到站的是前往标定站点, 则45s去拉取任务 + * 若当前是演练任务到站, 45s去拉取任务 + * 若当前是接驾任务到站, 此情况肯定是有订单的, 则走1 + * 若当前到站的是送驾任务, 不去拉取, 需等待司机点击服务完成按钮后拉取 + */ + + if (result?.order != null){ //接到订单情况下 + if (QueryCurrentTaskRespBean.isOrderOnTheWayToStart(result)){ //接驾任务拉取 + TaxiTaskModel.startPrepareTaskDelay( + TaxiUnmannedConst.START_PREPARE_TO_START_TASK_INTERVAL, + result?.endSite!!.siteId) + }else if (QueryCurrentTaskRespBean.isOrderUserArriveAtStart(result)) { //送驾任务拉取 + TaxiTaskModel.startPrepareTaskDelay(0, result?.endSite!!.siteId) + }else{ // 在已经接到订单的其他情况下, 取消倒计时任务拉取 + TaxiTaskModel.removePrepareTaskDelay() + } + }else{ //演练任务拉取 6.2.0使用配置的时间拉取, 默认45s + TaxiTaskModel.startPrepareTaskDelay( + CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() * 1000L, result?.endSite!!.siteId) + } + + clearDemoModeAndACParameters() + } + + override fun onTaskTrajectoryDataChanged(data: TrajectoryListRespBean?) { + TaxiTrajectoryManager.getInstance().syncTrajectoryInfo() //同步轨迹信息 + } + + override fun onOrderCancel() { + VoiceNotice.showNotice("已取消行程") + //取消自驾,D档位会溜车 map3.6.0 修改 + TaxiTaskModel.cancelAutopilot() + // 设置task执行相关状态,切换模式时判断使用 + MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) + LineManager.setLineInfo(null); + } + + override fun onOrderArriveAtEnd(orderNo: String) { + TaxiTaskModel.queryOrderByOrderNo(orderNo) + } + + /** + * 更新总全程信息(公里和分钟), 后端返回的数据 + */ + override fun onOrderTripInfoChanged(mileage: Float, duration: Int) { + updateOrderTripInfoUI(mileage, duration) + } + + override fun onOrderJourneyCompleted() { + updateTaskAndOrderUi(null) + //获取新的任务 + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + currentTaskWithOrder?.endSite?.also {//使用配置的时间拉取, 默认是45s + TaxiTaskModel.startPrepareTaskDelay( + CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() * 1000L, + it.siteId) + } + // 设置task执行相关状态,切换模式时判断使用 + MogoStatusManager.getInstance().setTaxiUnmanedDriverPerformTask(TAG, false) + LineManager.setLineInfo(null); + } + + override fun onStartAutopilot(postDelayTime: Long) { + UiThreadHandler.postDelayed(startTaskRunnable, postDelayTime) // 5s后或者倒计时结束开启自驾, 状态流转 + } + + private val startTaskRunnable: Runnable = Runnable { + startTask() //状态流转 + VoiceNotice.showNotice("车辆正在自动开启自动驾驶") + } + + /** + * 主动请求平行驾驶, 停止启动自驾命令, 任务状态需向下流转 + */ + override fun onStopAutopilot() { + UiThreadHandler.removeCallbacks(startTaskRunnable) + if (!TaxiTaskModel.checkCurrentTaskCondition()) { + d(TAG, "onStopAutopilot: 无任务无需流转状态") + return + } + startTask(false) + } + + override fun onPauseStartAutopilot() { + UiThreadHandler.removeCallbacks(startTaskRunnable) + } + + /** + * 开始倒计时120s或者10s拉取任务 + * 演练任务120s拉取 + * 接驾任务10s拉取 + */ + override fun onStartPrepareTaskUI(delayTime: Long, isStart: Boolean) { + updatePrepareTaskDelayUI(delayTime, isStart) + } + + /** + * 更新本次任务行程信息, 本地计算的数据 + */ + override fun onTaskTripInfoLocalCalculateChanged(meters: Long, timeInSecond: Long) { + updateTaskTripInfoLocalCalculateUI(meters, timeInSecond) + } + + override fun onCarEndServiceSuccess( + driveToNearestStationTask: StartServiceRespBean.Result?, + currentTaskWithOrder: QueryCurrentTaskRespBean.Result? + ) { + if (currentTaskWithOrder == null) return + if (currentTaskWithOrder.currentStatus < TaskStatusEnum.CompleteTask.code //任务未完成 + && currentTaskWithOrder.currentStatus > TaskStatusEnum.None.code // 暂停接单后查询到任务状态是0, 代表没任务 + || currentTaskWithOrder.order != null) {// 有订单未完成 + VoiceNotice.showNotice("暂停接单啦!要完成当前订单哦") + } else { + VoiceNotice.showNotice("暂停接单啦") + updateDriveToNearestStationTaskUI(driveToNearestStationTask) + } + } + + override fun onCarEndServiceFailed(code: Int, msg: String) { + ToastUtilsOch.showWithCodeMessage(code, msg) + } + + override fun onCarEndServiceError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + + override fun onCarStartServiceSuccess( + driveToNearestStationTask: StartServiceRespBean.Result?, + currentTaskWithOrder: QueryCurrentTaskRespBean.Result? + ) { + VoiceNotice.showNotice("开始接单啦") + updateDriveToNearestStationTaskUI(driveToNearestStationTask) + } + + override fun onCarStartServiceFailed(code: Int, msg: String) { + val gcJ02Location = OchLocationManager.getGCJ02Location() + ToastUtilsOch.showWithCodeMessage( + code, + "$msg curLatitude = ${gcJ02Location.latitude}" + " curLongitude = ${gcJ02Location.longitude}" + ) + } + + override fun onCarStartServiceError() { + val context = AbsMogoApplication.getApp().applicationContext + if (!NetworkUtils.isConnected(context)) { + ToastUtils.showShort(context.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(context.getString(R.string.request_error_tip)) + } + } + + private fun clearDemoModeAndACParameters(){ + if (FunctionBuildConfig.isDemoMode) { + d(TAG, "setIPCDemoMode:false") + CallerAutoPilotControlManager.setIPCDemoMode(false) + } + TaxiTaskModel.clearAutopilotControlParameters() + } + + /** + * 将业务订单信息保存,鹰眼可取用 + */ + private fun updateAutopilotControlParameters() { + val parameters = TaxiTaskModel.initAutopilotControlParameters() + if (null == parameters) { + CallerLogger.e(TAG, "AutopilotControlParameters is empty.") + return + } + d(TAG, "AutopilotControlParameters is update.") + DebugView.printInfoMsg("[启自驾] updateAutopilotControlParameters调用成功") + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt index c43a3f0d3d..c0e72f1d27 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt @@ -1,17 +1,84 @@ package com.mogo.och.unmanned.taxi.ui.task.itinerarycurrent import android.content.Context +import android.graphics.Color +import android.os.CountDownTimer +import android.text.TextUtils import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner +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.hmi.ui.widget.ItinerarySummaryDialog +import com.mogo.eagle.core.function.main.MainMoGoApplication +import com.mogo.eagle.core.network.utils.GsonUtil +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i +import com.mogo.eagle.core.utilcode.util.ClickUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum +import com.mogo.och.common.module.manager.autopilot.location.OchLocationManager +import com.mogo.och.common.module.map.AmapNaviToDestinationModel +import com.mogo.och.common.module.map.ICommonNaviChangedCallback +import com.mogo.och.common.module.map.MapMakerManager +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.FlowBus +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.wigets.CommonSlideView +import com.mogo.och.common.module.wigets.OCHCommitDialog import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.TaxiUnmannedDriverProvider +import com.mogo.och.unmanned.taxi.bean.OrderDetail +import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean +import com.mogo.och.unmanned.taxi.bean.StartServiceRespBean +import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum +import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum +import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst +import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_END_MAP_MAKER +import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TAXI_START_MAP_MAKER +import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.TYPE_MARKER_TAXI_ORDER +import com.mogo.och.unmanned.taxi.ui.debug.DebugView import com.mogo.och.unmanned.taxi.ui.itinerarycurrent.ItineraryCurrentModel +import com.mogo.och.unmanned.taxi.ui.task.TaskUiIntent +import com.mogo.och.unmanned.taxi.ui.task.TaskWithOrderUIState +import com.mogo.och.unmanned.taxi.ui.task.TaxiOrderCancelDialog +import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel +import com.mogo.och.unmanned.taxi.utils.TaskUtils +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.aciv_task_type_exercise +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.aciv_task_type_order +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_distance_end +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_end_order +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_submit_task +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.cancelOrder +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.commonSlideViewStartServer +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.gourp_order +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.group_itinerary_info +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.include_empty +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.naviToEnd +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.naviToStart +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.prepareTaskCountdownTv +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.taskStatus +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.actv_time_end +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.endStationName +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.startStationName +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.orderPhoneAndNum +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.pathwayPoint +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.trajectoryType +import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.v_bg_route_point_station_name +import kotlinx.coroutines.flow.map -class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineViewCallback { +class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineViewCallback, + View.OnClickListener, ICommonNaviChangedCallback { constructor(context: Context) : super(context) @@ -27,6 +94,10 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi const val TAG = "SwitchBizView" } + private var mPrepareTasCountDownTimer: CountDownTimer? = null + + private var dialog: ItinerarySummaryDialog? = null + private var viewModel: ItineraryCurrentModel?=null private var fragment: LifecycleOwner?=null @@ -41,6 +112,272 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi fragment = TaxiUnmannedDriverProvider.getFragmentInfo() } + private fun initViewModelObserver() { + viewModel?.sendUiIntent(TaskUiIntent.StartTaskWithOrderLooper) + + //监听返回的数据状态 + fragment?.lifecycleScope?.launchWhenStarted { + viewModel?.uiStateFlow?.map { it.taskWithOrderUIState }?.collect { taskAndOrderUiState -> + d(TAG, "uiStateFlow-initViewModelObserver: $taskAndOrderUiState") + when (taskAndOrderUiState) { + is TaskWithOrderUIState.Init -> { + } + + // 开始接单后 需要将车开到最近的一个站点就位,然后才能开启 无人化 流程 + is TaskWithOrderUIState.TaskDriveToNearestStationTask -> { + if (taskAndOrderUiState.driveToNearestStationTask != null) { + updateViewByDriveToNearestStationTask(taskAndOrderUiState.driveToNearestStationTask) + } else { + updatePrepareTaskDelayUI(0, false) + initContainerView(false) + removeAllMapMarker() + } + } + + is TaskWithOrderUIState.TaskWithOrder -> { + val currentTaskWithOrder = taskAndOrderUiState.taskWithOrder + if (currentTaskWithOrder == null) { + initContainerView(false) + removeAllMapMarker() + } else { + updateViewByCurrentTaskWithOrder(currentTaskWithOrder) + } + updateNextTaskFragment(currentTaskWithOrder) + } + + is TaskWithOrderUIState.UpdateOrderTripInfo -> { + dialog?.setOrderMileage(taskAndOrderUiState.mileage*1000) + actv_distance_end.text = TaskUtils.getCurrentTaskDistance(taskAndOrderUiState.mileage.toLong()) + actv_time_end.text = TaskUtils.getCurrentTaskTime(taskAndOrderUiState.duration.toLong()) + } + + is TaskWithOrderUIState.UpdateTaskTripLocalCalculateInfo -> { + actv_distance_end.text = TaskUtils.getCurrentTaskDistance(taskAndOrderUiState.meters.toLong()) + actv_time_end.text = TaskUtils.getCurrentTaskTime(taskAndOrderUiState.timeInSecond.toLong()) + } + + is TaskWithOrderUIState.UpdatePrepareTaskDelay -> { + updatePrepareTaskDelayUI( + taskAndOrderUiState.delayTime, + taskAndOrderUiState.isStart + ) + } + } + } + } + } + + /** + * 更新拉取任务倒计时 + */ + private fun updatePrepareTaskDelayUI(millisInFuture: Long, isStart: Boolean) { + DebugView.printInfoMsg("距离任务获取还有 ${DateTimeUtil.second2MMSS(millisInFuture / 1000)}") + if (!isStart) { + prepareTaskCountdownTv.visibility = View.GONE + mPrepareTasCountDownTimer?.cancel() + mPrepareTasCountDownTimer = null + return + } + + if (mPrepareTasCountDownTimer != null) { + mPrepareTasCountDownTimer?.cancel() + mPrepareTasCountDownTimer = null + } + + mPrepareTasCountDownTimer = object : CountDownTimer(millisInFuture, 1000L) {// 倒计时后开启自驾 + + override fun onTick(millisUntilFinished: Long) { + DebugView.printInfoMsg("距离任务获取还有 ${DateTimeUtil.second2MMSS(millisUntilFinished / 1000)}") + // 倒计时 + UiThreadHandler.post { + prepareTaskCountdownTv.visibility = View.VISIBLE + prepareTaskCountdownTv.text = + "距离任务获取还有 ${DateTimeUtil.second2MMSS(millisUntilFinished / 1000)}" + } + } + + override fun onFinish() { + //倒计时结束了... + UiThreadHandler.post { + prepareTaskCountdownTv.visibility = View.INVISIBLE + } + mPrepareTasCountDownTimer?.cancel() + } + } + + mPrepareTasCountDownTimer?.start() + } + + /** + * 更新当前任务和订单信息 + */ + private fun updateViewByCurrentTaskWithOrder(taskAndOrder: QueryCurrentTaskRespBean.Result?) { + if (taskAndOrder == null) return + /** + * 根据任务类型判断任务显示, + * 虚拟单, 显示在进行中 前往上车点 + * 演练任务,显示演练任务, 同时有订单显示在待服务中 + * 当前任务是接驾任务,显示订单状态+运营单 订单显示在进行中, 任务不再显示 + */ + val taskType = taskAndOrder.taskType // 任务类型 + val order = taskAndOrder.order // 订单信息 + val endSite = taskAndOrder.endSite // 终点 + val currentStatus = taskAndOrder.currentStatus // 任务的状态 0:空闲 1:获取任务 2:开始任务 3:到达目的地 + + if ((endSite == null || currentStatus == TaskStatusEnum.CompleteTask.code) // 无任务或者任务已经完成的时候且无订单的时候 + && taskAndOrder.order == null + ) { + initContainerView(false) + removeAllMapMarker() + return + } + + initContainerView(true) + + when (taskType) { + TaskTypeEnum.None.code -> { + if (order != null && (currentStatus == TaskStatusEnum.CompleteTask.code + || currentStatus == TaskStatusEnum.None.code) + ) { //暂停接单会清空前往上车点任务 + updateOrderUI(order) + } + } + + TaskTypeEnum.VirtualTask.code -> { //演练任务 + + if (order != null && currentStatus == TaskStatusEnum.CompleteTask.code) { + updateOrderUI(order) + } else { + updateVirtualTaskUI(taskAndOrder) + } + } + + TaskTypeEnum.ToOrderEndTask.code, TaskTypeEnum.ToOrderStartTask.code -> {// 接驾任务 或 送驾任务 + order?.also { + updatePathwayPoint(taskType, endSite?.siteName) + updateOrderUI(it) + } + } + } + + updateMapMarkers(taskAndOrder) + updateRemainDistanceAndTime(false) + } + + // 第一个特殊任务 也是虚拟任务 + private fun updateViewByDriveToNearestStationTask(driveToNearestStationTask: StartServiceRespBean.Result?) { + if (driveToNearestStationTask == null) return + initContainerView(true) + // DriverToNearestStationTask 任务更新 + gourp_order.visibility = GONE + group_itinerary_info.visibility = VISIBLE + aciv_task_type_exercise.visibility = VISIBLE + // 更新任务状态,起点,终点 + taskStatus.text = resources.getString(R.string.task_start_to_virtual_site) + startStationName.text = resources.getString(R.string.task_current_loc) + endStationName.text = driveToNearestStationTask.siteName + + setOrRemoveMapMaker( + true, + TAXI_END_MAP_MAKER, + driveToNearestStationTask.wgs84Lat, + driveToNearestStationTask.wgs84Lon, + R.raw.end_marker + ) + + // 使用高德获取导航数据 + startNaviToStation( + false, + driveToNearestStationTask.gcjLat, + driveToNearestStationTask.gcjLon + ) + } + + private fun showEmptyView() { + gourp_order.visibility = GONE + aciv_task_type_exercise.visibility = GONE + group_itinerary_info.visibility = GONE + include_empty.visibility = VISIBLE + prepareTaskCountdownTv.visibility = GONE + } + + private fun initOnClickListener() { + naviToStart.setOnClickListener(this) + naviToEnd.setOnClickListener(this) + + cancelOrder.setOnClickListener(this) + taskStatus.setOnClickListener(this) + commonSlideViewStartServer.setSlideListener(object :CommonSlideView.SlideListener{ + override fun slideEnd() { + d(TAG, taskStatus.text.toString()) + startOrEndService() + } + }) + actv_submit_task.onClick { + startOrEndService() + } + actv_end_order.onClick { + startOrEndService() + } + } + + private fun initTaskDebugViewListener() { + fragment?.let { fr-> + aciv_task_type_exercise.setOnLongClickListener { + FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_DEBUG_VIEW) + .post(fr.lifecycleScope, true) + false + } + aciv_task_type_order.setOnLongClickListener { + FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_DEBUG_VIEW) + .post(fr.lifecycleScope, true) + false + } + } + } + + private fun startOrEndService() { + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + if (currentTaskWithOrder?.order == null) return + val order = currentTaskWithOrder.order + if (TaxiOrderStatusEnum.ArriveAtStart.code == order!!.orderStatus) { //到达乘客上车点,司机可跳过乘客屏认证 + viewModel?.sendUiIntent(TaskUiIntent.JumpPassengerCheck) + } else if (TaxiOrderStatusEnum.UserArriveAtStart.code == order.orderStatus) { + viewModel?.sendUiIntent(TaskUiIntent.StartTask) + } else if (TaxiOrderStatusEnum.ArriveAtEnd.code == order.orderStatus) { //点击了完成服务,结束订单并更新订单信息 + viewModel?.sendUiIntent(TaskUiIntent.JourneyCompleted) + } else if (TaxiOrderStatusEnum.OnTheWayToEnd.code == order.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(ResourcesUtils.getString(R.string.dialog_order_close_title)) + .tips(ResourcesUtils.getString(R.string.dialog_order_close_content)) + .confirmStr(ResourcesUtils.getString(R.string.dialog_order_close_confirm)) + .cancelStr(ResourcesUtils.getString(R.string.dialog_order_close_cancel)) + .build(context) + closeOrderDialog!!.setClickListener(object : OCHCommitDialog.ClickListener { + override fun confirm() { + viewModel?.sendUiIntent(TaskUiIntent.CloseOrderByDriver) + } + + override fun cancel() { + closeOrderDialog.dismiss() + } + }) + closeOrderDialog.show() + } + override fun onAttachedToWindow() { super.onAttachedToWindow() @@ -48,6 +385,434 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi ViewModelProvider(it).get(ItineraryCurrentModel::class.java) } viewModel?.setDistanceCallback(this) + initOnClickListener() + showEmptyView() + initTaskDebugViewListener() + initViewModelObserver() + } + + override fun onClick(v: View?) { + if (!ClickUtils.isFastClick()) { + i(TAG, "view点击过快") + return + } + when (v?.id) { + + cancelOrder.id -> { + val currentWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + if (currentWithOrder?.order != null) { + val order = currentWithOrder.order + TaxiOrderCancelDialog(context, order!!.orderStatus) { type -> + viewModel?.sendUiIntent(TaskUiIntent.CancelOrder(type)) + }.show() + } + } + + naviToStart.id, + naviToEnd.id -> { + showNaviToEndStationFragment(true) + } + } + } + + /** + * 显示/隐藏 前往任务目的地的导航 + * + * @param isShow + */ + private fun showNaviToEndStationFragment(isShow: Boolean) { + fragment?.let { + FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_START_NAVI_TO_END_STATION) + .post(it.lifecycleScope, isShow) + } + } + + /** + * 是否有正在进行的订单,进行UI显示 + * + * @param hasCurrentTask + */ + private fun initContainerView(hasCurrentTask: Boolean) { + d( + TAG, + "hasCurrentTask = $hasCurrentTask" + ) + if (hasCurrentTask) { + include_empty.visibility = View.GONE + prepareTaskCountdownTv.visibility = View.GONE + } else { + // 空页面 + include_empty.visibility = View.VISIBLE + // 倒计时 + prepareTaskCountdownTv.visibility = View.GONE + // 行程信息 + group_itinerary_info.visibility = View.GONE + // 订单信息 + gourp_order.visibility = View.GONE + // 途经点信息 + pathwayPoint.visibility = View.GONE + // 演练单标识 + aciv_task_type_exercise.visibility = View.GONE + // 轨迹标识 + trajectoryType.visibility = View.GONE + } + } + + private fun removeAllMapMarker() { + MapMakerManager.removeAllMapMarkerByOwner(TYPE_MARKER_TAXI_ORDER) + } + + private fun updateNextTaskFragment(result: QueryCurrentTaskRespBean.Result?) { + fragment?.let { + FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_TASK_WITH_ORDER_CHANGED) + .post(it.lifecycleScope, result) + + if (result != null + && result.taskType == TaskTypeEnum.VirtualTask.code + && result.order != null + && result.currentStatus != TaskStatusEnum.CompleteTask.code + ) { + VoiceNotice.showNotice("已为您提前接到下一订单,待完成当前任务后服务") + FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_SHOW_RED_POINT) + .post(it.lifecycleScope, true) + } else { + FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_SHOW_RED_POINT) + .post(it.lifecycleScope, false) + } + } + + } + + private fun updateOrderUI(order: OrderDetail) { + cancelOrder.visibility = if (order.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code + ) View.GONE else View.VISIBLE + gourp_order.visibility = View.VISIBLE + group_itinerary_info.visibility = View.VISIBLE + aciv_task_type_exercise.visibility = View.GONE +// orderStatus: 0 订单创建(为派单), 10 已派上司机(司机去往上车点), 20 司机到达上车点, +// 30 乘客到达上车点, 40 服务中(去往目的地), 50 到达目的地, 60 已完成, 70 已取消 + naviToStart.visibility = if (order.orderStatus + == TaxiOrderStatusEnum.OnTheWayToStart.code + ) View.VISIBLE else View.GONE + + naviToEnd.visibility = if (order.orderStatus + == TaxiOrderStatusEnum.OnTheWayToEnd.code + ) View.VISIBLE else View.GONE + + updatePrepareTaskDelayUI(0, false) + + orderPhoneAndNum.text = TaskUtils.getCurrentTaskPhoneNumAndPassengerCountHtml( + order.bookingUserPhone, + order.passengerSize + ) + startStationName.text = order.orderStartSite?.siteName + endStationName.text = order.orderEndSite?.siteName + TaxiTaskModel.getCurrentOrderTrajectoryList().also { + val orderTrajectory = it.firstOrNull {order.orderLine == it.lineId} + trajectoryType.visibility = if (orderTrajectory?.source == 2) + View.VISIBLE else View.GONE + } + + when (order.orderStatus) { + TaxiOrderStatusEnum.None.code -> { //无 + dismissDialog() + initContainerView(false) + removeAllMapMarker() + } + + TaxiOrderStatusEnum.ArriveAtEnd.code -> { //到达目的地 + taskStatus.text = resources.getString(R.string.task_start_end_site) + + actv_end_order.visibility = VISIBLE + actv_end_order.text = ResourcesUtils.getString(R.string.module_och_taxi_order_server_end) + commonSlideViewStartServer.visibility = GONE + actv_submit_task.visibility = GONE + + showDialog() + hideNaviBtns() + } + + TaxiOrderStatusEnum.OnTheWayToEnd.code -> { //送驾中 + dismissDialog() + taskStatus.text = resources.getString(R.string.task_start_end_site) + + actv_end_order.visibility = VISIBLE + actv_end_order.text = ResourcesUtils.getString(R.string.module_och_taxi_order_close) + commonSlideViewStartServer.visibility = GONE + actv_submit_task.visibility = GONE + + } + + TaxiOrderStatusEnum.UserArriveAtStart.code, TaxiOrderStatusEnum.ArriveAtStart.code -> { + //乘客到达上车点, 验证成功 ; 到达乘客上车点 + dismissDialog() + taskStatus.text = resources.getString(R.string.arrived_start_site) + + actv_end_order.visibility = GONE + commonSlideViewStartServer.visibility = GONE + actv_submit_task.visibility = VISIBLE + if (order.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.code) { + actv_submit_task.text = + ResourcesUtils.getString(R.string.module_och_taxi_order_server_start) + } + else { + actv_submit_task.text = + ResourcesUtils.getString(R.string.module_och_taxi_order_server_start_wait_check) + } + hideNaviBtns() + actv_time_end.text = TaskUtils.getCurrentTaskWaitTimeHtml() + } + + TaxiOrderStatusEnum.OnTheWayToStart.code -> { //前往上车地点 + dismissDialog() + taskStatus.text = resources.getString(R.string.task_start_start_site) + actv_end_order.visibility = GONE + commonSlideViewStartServer.visibility = VISIBLE + actv_submit_task.visibility = GONE + } + } + } + + //展示虚拟订单 + private fun updateVirtualTaskUI(taskAndOrder: QueryCurrentTaskRespBean.Result?) { + + if (taskAndOrder == null) return + + val startSite = taskAndOrder.startSite // 起点 + val endSite = taskAndOrder.endSite // 终点 + val currentStatus = taskAndOrder.currentStatus // 任务的状态 0:空闲 1:获取任务 2:开始任务 3:到达目的地 + + + + // 空页面 + include_empty.visibility = View.GONE + // 倒计时 + prepareTaskCountdownTv.visibility = View.GONE + // 行程信息 + group_itinerary_info.visibility = View.VISIBLE + // 订单信息 + gourp_order.visibility = View.GONE + // 途经点信息 + pathwayPoint.visibility = View.GONE + // 演练单标识 + aciv_task_type_exercise.visibility = View.VISIBLE + + naviToStart.visibility = View.GONE + naviToEnd.visibility = if (currentStatus >= TaskStatusEnum.StartTask.code) View.VISIBLE else View.GONE + + if (startSite == null || endSite == null) return + + taskStatus.text = resources.getString(R.string.task_start_end_site) + + + startStationName.text = startSite.siteName + endStationName.text = endSite.siteName + TaxiTaskModel.getCurrentOrderTrajectoryList().also { + val taskTrajectory = it.firstOrNull {taskAndOrder.lineId == it.lineId} + trajectoryType.visibility = if (taskTrajectory?.source == 2) + View.VISIBLE else View.GONE + } + updatePrepareTaskDelayUI(0, false) + } + + private fun updatePathwayPoint(taskType: Int, endSiteName: String?) { + if (TextUtils.isEmpty(endSiteName)) return + pathwayPoint.visibility = if (taskType == TaskTypeEnum.ToOrderStartTask.code) + View.VISIBLE else View.GONE + v_bg_route_point_station_name.text = "途径: $endSiteName" + } + + private fun updateMapMarkers(taskAndOrder: QueryCurrentTaskRespBean.Result?) { + if (taskAndOrder?.startSite != null + && taskAndOrder.endSite != null + ) { + when (taskAndOrder.currentStatus) { + TaskStatusEnum.GetTask.code -> { + setOrRemoveMapMaker( + true, + TAXI_START_MAP_MAKER, + taskAndOrder.startSite!!.wgs84Lat, + taskAndOrder.startSite!!.wgs84Lon, + R.raw.star_marker + ) + setOrRemoveMapMaker( + true, + TAXI_END_MAP_MAKER, + taskAndOrder.endSite!!.wgs84Lat, + taskAndOrder.endSite!!.wgs84Lon, + R.raw.end_marker + ) + } + + TaskStatusEnum.StartTask.code -> { + setOrRemoveMapMaker( + false, + TAXI_START_MAP_MAKER, + taskAndOrder.startSite!!.wgs84Lat, + taskAndOrder.startSite!!.wgs84Lon, + R.raw.star_marker + ) + setOrRemoveMapMaker( + true, + TAXI_END_MAP_MAKER, + taskAndOrder.endSite!!.wgs84Lat, + taskAndOrder.endSite!!.wgs84Lon, + R.raw.end_marker + ) + } + + TaskStatusEnum.CompleteTask.code -> { + setOrRemoveMapMaker( + false, + TAXI_START_MAP_MAKER, + taskAndOrder.startSite!!.wgs84Lat, + taskAndOrder.startSite!!.wgs84Lon, + R.raw.star_marker + ) + setOrRemoveMapMaker( + false, + TAXI_END_MAP_MAKER, + taskAndOrder.endSite!!.wgs84Lat, + taskAndOrder.endSite!!.wgs84Lon, + R.raw.end_marker + ) + } + } + } else { + d( + TAG, + "CurrentTaskWithOrder == " + GsonUtil.jsonFromObject(taskAndOrder) + ) + } + } + + /** + * 绘制地图起点终点 + * @param isAdd + * @param uuid + */ + private fun setOrRemoveMapMaker( + isAdd: Boolean, uuid: String, + lat: Double, lon: Double, resourceId: Int + ) { + if (isAdd) { + MapMakerManager.addMapMaker(TYPE_MARKER_TAXI_ORDER, uuid, lat, lon, resourceId) + } else { + MapMakerManager.removeMapMaker(uuid, lat, lon) + } + } + + /** + * 根据任务状态计算剩余历程和时间 + */ + private fun updateRemainDistanceAndTime(isVoicePlay: Boolean) { + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() ?: return + d(TAG, "updateRemainDistanceAndTime ${currentTaskWithOrder.currentStatus}") + if (currentTaskWithOrder.currentStatus == TaskStatusEnum.StartTask.code) { + if (currentTaskWithOrder.endSite != null) { + startNaviToStation( + isVoicePlay, currentTaskWithOrder.endSite!!.gcjLat, + currentTaskWithOrder.endSite!!.gcjLon + ) + } + + } else if (currentTaskWithOrder.currentStatus == TaskStatusEnum.CompleteTask.code && + currentTaskWithOrder.taskType <= TaskTypeEnum.ToOrderStartTask.code + ) { + actv_distance_end.text = "已到达 ${currentTaskWithOrder.endSite?.siteName}" + } else { + actv_distance_end.text = "距离 -- 公里, 用时 -- 分钟" + } + } + + private fun startNaviToStation(isVoicePlay: Boolean, stationLat: Double, stationLng: Double) { + AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() + val gcJ02Location = OchLocationManager.getGCJ02Location() + val mCurLatitude = gcJ02Location.latitude + val mCurLongitude = gcJ02Location.longitude + d(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).setTaxiNaviChangedCallback(this) + } + + private fun showDialog(){ + if(dialog==null&&context!=null){ + + } + context?.let { + if(dialog==null) { + dialog = ItinerarySummaryDialog(it, true, R.style.summary_dialog) + } + dialog?.let { dialogInner -> + if(!dialogInner.isShowing){ + dialogInner.show() + } + } + } + + } + + private fun dismissDialog(){ + dialog?.let { + if(it.isShowing){ + it.dismiss() + } + } + dialog = null + } + + private fun hideNaviBtns() { + naviToStart.visibility = View.GONE + naviToEnd.visibility = View.GONE + AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() + fragment?.let { + FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_AMAP_NAVI_TO_STATION_FRAGMENT) + .post(it.lifecycleScope, false) + FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_ROUTING_TO_STATION_FRAGMENT) + .post(it.lifecycleScope, false) + } + + } + + override fun onCurrentNaviDistAndTimeChanged(meters: Int, timeInSecond: Long) { + actv_distance_end.text = TaskUtils.getCurrentTaskDistance(meters.toLong()) + actv_time_end.text = TaskUtils.getCurrentTaskTime(timeInSecond) + } + + override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) { + d(TAG, "isPlay = $isPlay, isRestart=$isRestart") + if (!isRestart) { + fragment?.let { + FlowBus.with(TaxiDriverEventConst.TaxiFragmentEvent.EVENT_TYPE_SHOW_AMAP_NAVI_TO_STATION_FRAGMENT) + .post(it.lifecycleScope, false) + } + return + } + val currentTaskWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + + UiThreadHandler.postDelayed({ + updateRemainDistanceAndTime(false) + }, 2000) + + UiThreadHandler.postDelayed({ + if (currentTaskWithOrder?.currentStatus == TaskStatusEnum.GetTask.code + ) { + if (naviToStart.visibility == View.GONE) { + naviToStart.visibility = View.VISIBLE + } + } + if ((currentTaskWithOrder?.currentStatus == TaskStatusEnum.StartTask.code + && currentTaskWithOrder.order == null) + || (currentTaskWithOrder?.order?.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.code) + ) { + if (naviToEnd.visibility == View.GONE) { + naviToEnd.visibility = View.VISIBLE + } + } + }, 3000) } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/wigets/TaxiSelectViewGroup.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/wigets/TaxiSelectViewGroup.kt index 9c04f15962..6e73abf9f6 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/wigets/TaxiSelectViewGroup.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/wigets/TaxiSelectViewGroup.kt @@ -61,7 +61,7 @@ class TaxiSelectViewGroup @JvmOverloads constructor( override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) if(isVisible){ - + textCurrentItinerary.setCheck(true) }else{ } diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml index fd6679d196..c473742cc3 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_current.xml @@ -8,7 +8,7 @@ xmlns:tools="http://schemas.android.com/tools"> - + + + @@ -144,14 +158,14 @@ android:textSize="@dimen/dp_32" android:textColor="@color/taxi_color_CCCCCC" app:layout_constraintTop_toBottomOf="@+id/actv_distance_end" - app:layout_constraintStart_toStartOf="@+id/actv_current_itinerary_start_name" - app:layout_constraintBottom_toTopOf="@+id/actv_current_itinerary_end_name" + app:layout_constraintStart_toStartOf="@+id/startStationName" + app:layout_constraintBottom_toTopOf="@+id/endStationName" android:layout_width="wrap_content" android:layout_height="wrap_content"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_itinerary.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_itinerary.xml index 2c807a6f4e..d2790945a0 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_itinerary.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_itinerary.xml @@ -28,19 +28,21 @@ app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="@dimen/dp_28" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" android:visibility="gone" app:layout_constraintTop_toBottomOf="@+id/taxiServerSelector" android:layout_width="match_parent" - android:layout_height="wrap_content"/> + android:layout_height="0dp"/> + android:layout_height="0dp"/> \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml index d1f28311ba..daf8149f23 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml @@ -75,4 +75,13 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_panel.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_panel.xml index 277e864b33..84ba5addce 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_panel.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_panel.xml @@ -9,11 +9,4 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml b/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml index cd63f6153e..510aaafcfb 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/values/colors.xml @@ -43,4 +43,5 @@ #80000000 #2EACFF #FF4E41 + #91A1EA \ No newline at end of file From 6223e3bb591c615a7ad20a585e210c045d4e8245 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 16:43:23 +0800 Subject: [PATCH 04/13] =?UTF-8?q?[6.7.0]=20[fea]=20[=E5=BE=85=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E9=A1=B5=E9=9D=A2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/itinerarynext/ItineraryNextView.kt | 92 ++++++++++++++++++- .../itinerayswitch/ItinerarySwitchView.kt | 4 - .../res/layout/unmanned_itinerary_next.xml | 33 ++++--- 3 files changed, 113 insertions(+), 16 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarynext/ItineraryNextView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarynext/ItineraryNextView.kt index 964d18fa25..84faaa5f93 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarynext/ItineraryNextView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarynext/ItineraryNextView.kt @@ -3,14 +3,30 @@ package com.mogo.och.unmanned.taxi.ui.task.itinerarynext import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner -import com.mogo.och.common.module.wigets.WindowRelativeLayout +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.och.common.module.utils.FlowBus import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.TaxiUnmannedDriverProvider +import com.mogo.och.unmanned.taxi.bean.OrderDetail +import com.mogo.och.unmanned.taxi.bean.QueryCurrentTaskRespBean +import com.mogo.och.unmanned.taxi.constant.TaskStatusEnum +import com.mogo.och.unmanned.taxi.constant.TaskTypeEnum +import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst import com.mogo.och.unmanned.taxi.ui.itinerarynext.ItineraryNextModel +import com.mogo.och.unmanned.taxi.ui.task.TaxiOrderCancelDialog +import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.aciv_order_close +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.actv_end_station_name +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.actv_order_count +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.actv_order_phone +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.actv_start_station_name +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.group_order_next +import kotlinx.android.synthetic.main.unmanned_itinerary_next.view.include_empty class ItineraryNextView: ConstraintLayout, ItineraryNextModel.SwtichLineViewCallback { @@ -40,6 +56,17 @@ class ItineraryNextView: ConstraintLayout, ItineraryNextModel.SwtichLineViewCall private fun initView() { fragment = TaxiUnmannedDriverProvider.getFragmentInfo() + + aciv_order_close.onClick { //取消待服务订单 + val currentWithOrder = TaxiTaskModel.getCurrentTaskWithOrder() + if (currentWithOrder?.order != null) { + val order = currentWithOrder.order + TaxiOrderCancelDialog(context, order!!.orderStatus) { type -> + TaxiTaskModel.cancelOrder(order.orderNo,type) + }.show() + } + } + showNoNextTaskView() } @@ -49,6 +76,69 @@ class ItineraryNextView: ConstraintLayout, ItineraryNextModel.SwtichLineViewCall ViewModelProvider(it)[ItineraryNextModel::class.java] } viewModel?.setDistanceCallback(this) + initTaskDebugViewListener() + } + + fun onTaskDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?) { + if (taskWithOrder?.order == null) { + showNoNextTaskView() + return + } + + if (taskWithOrder.taskType == TaskTypeEnum.VirtualTask.code && + taskWithOrder.currentStatus != TaskStatusEnum.CompleteTask.code + ) { + val order = taskWithOrder.order + updateTaskUI(order!!) + } else { + showNoNextTaskView() + } + } + + private fun showNoNextTaskView() { + include_empty.visibility = View.VISIBLE + group_order_next.visibility = View.GONE + } + + private fun showNextTaskView() { + include_empty.visibility = View.GONE + group_order_next.visibility = View.VISIBLE + } + + private fun updateTaskUI(order: OrderDetail) { + showNextTaskView() + + var tempPhone = order.bookingUserPhone + + tempPhone.let { + if (it.length > 8) { + //截取电话号码前三位 + val phoneNumPre = it.substring(0, 3) + //截取电话号码后四位 + val phoneNumFix = it.substring(7) + tempPhone = "$phoneNumPre****$phoneNumFix" + } + } + actv_order_phone.text = tempPhone + + order.passengerSize + actv_order_count.text = "${order.passengerSize}人" + + order.orderStartSite?.let { + actv_start_station_name.text = it.siteName + } + order.orderEndSite?.let { + actv_end_station_name.text = it.siteName + } + } + + private fun initTaskDebugViewListener() { + fragment?.let { fr-> + FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_TASK_WITH_ORDER_CHANGED) + .register(fr) { taskWithOrder -> + onTaskDataChanged(taskWithOrder) + } + } } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerayswitch/ItinerarySwitchView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerayswitch/ItinerarySwitchView.kt index bc24b02e20..5a4ed664ae 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerayswitch/ItinerarySwitchView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerayswitch/ItinerarySwitchView.kt @@ -84,10 +84,6 @@ class ItinerarySwitchView: ConstraintLayout, ItinerarySwitchModel.SwtichLineView .register(it) { show -> taxiServerSelector.setNextItineraryRedBagVisable( if (show) View.VISIBLE else View.GONE) } -// FlowBus.with(TaxiDriverEventConst.TabFragmentEvent.EVENT_TYPE_TASK_WITH_ORDER_CHANGED) -// .register(it) { taskWithOrder -> -// nextTaskFragment?.onTaskDataChanged(taskWithOrder) -// } } } diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_next.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_next.xml index 52d197d77d..154b09b2c4 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_next.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_itinerary_next.xml @@ -72,17 +72,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"/> - - - + + + + \ No newline at end of file From 59cb483509f37e4b46456070a7f740f90aa33ccf Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Sat, 12 Oct 2024 16:43:40 +0800 Subject: [PATCH 05/13] =?UTF-8?q?[6.7.0]=E6=9B=BF=E6=8D=A2=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=9B=92=E5=AD=90=E4=B8=8A=E6=8A=A5ICON=E8=B5=84?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/drawable-xhdpi/icon_report_error.png | Bin 15683 -> 16207 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_error.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_error.png index 54f4c05d775c3a3e406e915dcf5a4599cd8ff61b..766d4332f7fbf589bf9619f999c673466ed2062c 100644 GIT binary patch literal 16207 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 b-Fjx1>a}tRukb?s4`!E_R*|ZbFb(-%as4vh literal 15683 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 From 9b6c93841ec437d1e2957a3b963c8c503a7667c3 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Sat, 12 Oct 2024 17:31:10 +0800 Subject: [PATCH 06/13] =?UTF-8?q?[6.7.0][FSM]=20refactor:=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=8D=E7=9F=A5=E9=81=93=E6=A1=A3=E4=BD=8D=E6=97=B6?= =?UTF-8?q?=20=E7=94=B1=E7=A9=BA=E4=BF=AE=E6=94=B9=E4=B8=BA=20=E2=80=9C-?= =?UTF-8?q?=E2=80=9D=20=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/hmi/bone/status/StartAutoPilotStatusView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt index 74b7dd1f4d..b70126a41a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt @@ -182,7 +182,7 @@ class StartAutoPilotStatusView @JvmOverloads constructor( Chassis.GearPosition.GEAR_NONE -> { tv_gear?.isEnabled = false - tv_gear?.text = "" + tv_gear?.text = "-" } else -> {} From 606f63c3e98a3549abbe40d538cbd9e0b70a95db Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Sat, 12 Oct 2024 18:17:13 +0800 Subject: [PATCH 07/13] =?UTF-8?q?[6.7.0]=E6=95=B0=E6=8D=AE=E4=B8=8A?= =?UTF-8?q?=E8=BD=A6=E5=88=B0BUS-=E7=BA=A2=E7=BB=BF=E7=81=AF=E4=B9=98?= =?UTF-8?q?=E5=AE=A2=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/m2/layout/shuttle_p_m2_fragment.xml | 21 ++++++ .../notice/traffic/TrafficLightPromptView.kt | 6 +- .../hmi/ui/widget/FusionTrafficLightView.kt | 61 +++++++++++---- .../bg_fusion_traffic_light_p_bus.png | Bin 0 -> 7756 bytes .../drawable-xhdpi/icon_light_green_p_bus.png | Bin 0 -> 18464 bytes .../icon_light_green_pointer_p_bus.png | Bin 0 -> 501 bytes .../icon_light_green_scale_p_bus.png | Bin 0 -> 2232 bytes .../drawable-xhdpi/icon_light_red_p_bus.png | Bin 0 -> 20104 bytes .../icon_light_red_pointer_p_bus.png | Bin 0 -> 502 bytes .../icon_light_red_scale_p_bus.png | Bin 0 -> 2287 bytes .../icon_light_yellow_p_bus.png | Bin 0 -> 18977 bytes .../icon_light_yellow_pointer_p_bus.png | Bin 0 -> 510 bytes .../icon_light_yellow_scale_p_bus.png | Bin 0 -> 2132 bytes .../hmi_view_fusion_traffic_light_p_bus.xml | 70 ++++++++++++++++++ .../view_traffic_light_prompt_p_bus.xml | 10 ++- .../src/main/res/values/attr.xml | 1 + .../src/main/res/values/dimens.xml | 1 + 17 files changed, 147 insertions(+), 23 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_pointer_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_green_scale_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_pointer_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_scale_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_pointer_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_yellow_scale_p_bus.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_fusion_traffic_light_p_bus.xml diff --git a/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_fragment.xml b/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_fragment.xml index 1b9201eab7..013ff4c731 100644 --- a/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_fragment.xml +++ b/OCH/shuttle/passenger/src/main/res/m2/layout/shuttle_p_m2_fragment.xml @@ -157,6 +157,27 @@ app:layout_constraintRight_toRightOf="parent" android:visibility="gone"/> + + + + + + { //BUS乘客端提示 - tvPromptTitle?.text = "即将绿灯" + tvPromptTitle?.text = "即将绿灯," tvPromptContent?.text = "请准备出发" } } @@ -287,7 +287,7 @@ class TrafficLightPromptView @JvmOverloads constructor( } else -> { //BUS乘客端提示 - tvPromptTitle?.text = "即将红灯" + tvPromptTitle?.text = "即将红灯," tvPromptContent?.text = "请减速慢行" } } @@ -305,7 +305,7 @@ class TrafficLightPromptView @JvmOverloads constructor( } else -> { //BUS乘客端提示 - tvPromptTitle?.text = "即将黄灯" + tvPromptTitle?.text = "即将黄灯," tvPromptContent?.text = "请减速慢行" } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt index dfb443576e..e323c30796 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/FusionTrafficLightView.kt @@ -31,8 +31,7 @@ class FusionTrafficLightView @JvmOverloads constructor( private const val TAG = "FusionTrafficLightView" } - private var user = 0 //使用方,driver:0 passenger:1 - private var mCurrentLightId = TrafficLightEnum.BLACK + private var user = 0 //使用方,driver:0 passenger taxi:1 passenger bus:2 private var totalDuration = 0 //一轮灯态的总时长 private var currentAngle = 0f //指针指向角度 @@ -59,10 +58,19 @@ class FusionTrafficLightView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - if(user == 0){ - LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light, this, true) - }else{ - LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light_p, this, true) + when (user) { + 0 -> { + //司机端 + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light, this, true) + } + 1 -> { + //Taxi乘客端 + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light_p, this, true) + } + else -> { + //Bus乘客端 + LayoutInflater.from(context).inflate(R.layout.hmi_view_fusion_traffic_light_p_bus, this, true) + } } CallerTrafficLightListenerManager.addListener(TAG, this) fusionTrafficLightNum = findViewById(R.id.fusionTrafficLightNum) @@ -229,19 +237,40 @@ class FusionTrafficLightView @JvmOverloads constructor( //根据当前灯态设置转盘、刻度、指针背景 when(currentState){ TrafficLightEnum.GREEN -> { - fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) - fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) - fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) + if(user == 2){ + //BUS乘客端 + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_p_bus)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale_p_bus)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer_p_bus)) + }else{ + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer)) + } } TrafficLightEnum.YELLOW -> { - fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) - fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) - fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) + if(user == 2){ + //BUS乘客端 + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_p_bus)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale_p_bus)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer_p_bus)) + }else{ + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer)) + } } else -> { - fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) - fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) - fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) + if(user == 2){ + //BUS乘客端 + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_p_bus)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale_p_bus)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer_p_bus)) + }else{ + fusionTrafficLightState?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red)) + fusionTrafficLightScale?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale)) + fusionTrafficLightPointer?.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer)) + } } } //更新当前灯态倒计时时间 @@ -250,7 +279,7 @@ class FusionTrafficLightView @JvmOverloads constructor( }else{ fusionTrafficLightNum?.text = "0" } - //当时间为1开头时时间视觉上看不是左右居中对齐,需要做便宜操作 + //当时间为1开头时时间视觉上看不是左右居中对齐,需要做偏移操作 if(currentDuration.toString().startsWith("1")){ val numLayoutParams = fusionTrafficLightNum?.layoutParams as LayoutParams numLayoutParams.rightMargin = 6 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light_p_bus.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_fusion_traffic_light_p_bus.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac1063df2f714611aa2364bec91280bedbce409 GIT binary patch literal 7756 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_p_bus.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_p_bus.png new file mode 100644 index 0000000000000000000000000000000000000000..46716f8bde86afc4c382f2f2a99dc69cd14b05b9 GIT binary patch literal 20104 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_pointer_p_bus.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_light_red_pointer_p_bus.png new file mode 100644 index 0000000000000000000000000000000000000000..cd58e8be4e008091b87b6226ad2e2cb8a491f0b4 GIT binary patch literal 502 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 + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p_bus.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p_bus.xml index d341621241..85cc51afd0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p_bus.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_traffic_light_prompt_p_bus.xml @@ -14,7 +14,8 @@ android:textColor="#203555" android:textSize="@dimen/sp_28" android:layout_marginTop="@dimen/dp_55" - android:layout_marginStart="@dimen/dp_70" + android:layout_marginStart="@dimen/dp_61" + android:textStyle="bold" /> + diff --git a/core/mogo-core-res/src/main/res/values/dimens.xml b/core/mogo-core-res/src/main/res/values/dimens.xml index 6a2585cc0d..aec6045a64 100644 --- a/core/mogo-core-res/src/main/res/values/dimens.xml +++ b/core/mogo-core-res/src/main/res/values/dimens.xml @@ -4,6 +4,7 @@ + -70dp -60dp -30dp -27dp From 629fffd265a202c844139d9bcd6dd2c78e5d4a49 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 18:19:23 +0800 Subject: [PATCH 08/13] =?UTF-8?q?[6.7.0]=20[fea]=20[=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=88=B7=E5=B1=8F=E6=97=A5=E5=BF=97]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/common/module/utils/BigFrameAnimatorContainer.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/BigFrameAnimatorContainer.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/BigFrameAnimatorContainer.kt index b6449aa3da..b2a1863053 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/BigFrameAnimatorContainer.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/utils/BigFrameAnimatorContainer.kt @@ -133,7 +133,6 @@ class BigFrameAnimatorContainer (resId: Int, decodeImage = OCHThreadPoolManager.getsInstance().submit(object: Runnable{ override fun run() { while (true) { - val startTime = System.currentTimeMillis() val (bitmap1, options) = writeQueue.take() mIndex++ if (mIndex >= mFrames.size){ @@ -159,8 +158,6 @@ class BigFrameAnimatorContainer (resId: Int, if (bitmap != null) { readQueue.put(Pair(bitmap, options)) } - val dexTime = System.currentTimeMillis() - startTime - CallerLogger.d(TAG, "decode用时:${dexTime}ms index ${index}") } } }) From 2f78ffc2e5d97d1b83012211f073a7c1983095d3 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 18:20:24 +0800 Subject: [PATCH 09/13] =?UTF-8?q?[6.7.0]=20[fea]=20[catche=20=E4=BD=8FonLa?= =?UTF-8?q?youtChildren]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wigets/WrapContentLinearLayoutManager.kt | 32 +++++++++++++++++++ .../weaknet/ui/switchline/SwitchLineView.kt | 5 +-- .../ui/taskrunned/RunningTaskManagerView.kt | 5 +-- .../weaknet/ui/taskrunning/TaskRunningView.kt | 5 +-- .../routingselect/RoutingSelectView.kt | 16 ++-------- 5 files changed, 44 insertions(+), 19 deletions(-) create mode 100644 OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/WrapContentLinearLayoutManager.kt diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/WrapContentLinearLayoutManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/WrapContentLinearLayoutManager.kt new file mode 100644 index 0000000000..bd9557b5ce --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/WrapContentLinearLayoutManager.kt @@ -0,0 +1,32 @@ +package com.mogo.och.common.module.wigets + +import android.content.Context +import android.util.AttributeSet +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + + +class WrapContentLinearLayoutManager : LinearLayoutManager { + constructor(context: Context?) : super(context) + + constructor(context: Context?, orientation: Int, reverseLayout: Boolean) : super( + context, + orientation, + reverseLayout + ) + + constructor( + context: Context?, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attrs, defStyleAttr, defStyleRes) + + override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State) { + try { + super.onLayoutChildren(recycler, state) + } catch (e: IndexOutOfBoundsException) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwitchLineView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwitchLineView.kt index 47632a89a1..e091222846 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwitchLineView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwitchLineView.kt @@ -16,6 +16,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.wigets.WindowRelativeLayout +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager import com.mogo.och.shuttle.weaknet.R import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.repository.db.bean.LineDataBean @@ -52,7 +53,7 @@ class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallba private var animator:ObjectAnimator?=null - private lateinit var linearLayoutManager:LinearLayoutManager + private lateinit var linearLayoutManager: WrapContentLinearLayoutManager private var animatorStart = System.currentTimeMillis() @@ -62,7 +63,7 @@ class SwitchLineView: WindowRelativeLayout, SwtichLineModel.SwtichLineViewCallba } private fun initView(){ - linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager = WrapContentLinearLayoutManager(context) switch_line_rv.setLayoutManager(linearLayoutManager) mAdapter = SwitchLineAdapter(context, mutableListOf()) switch_line_rv.addItemDecoration( diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskManagerView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskManagerView.kt index f39b9abd5a..aa5ebea43d 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskManagerView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunned/RunningTaskManagerView.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.wigets.WindowRelativeLayout +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager import com.mogo.och.shuttle.weaknet.R import com.mogo.och.weaknet.bean.WaitUploadLine import kotlinx.android.synthetic.main.shuttle_wadk_task_running.view.aciv_show_data @@ -42,7 +43,7 @@ class RunningTaskManagerView: WindowRelativeLayout, RunningTastViewModel.Running private var viewModel:RunningTastViewModel?=null private lateinit var mAdapter: RunningTaskAdapter - private lateinit var linearLayoutManager:LinearLayoutManager + private lateinit var linearLayoutManager: WrapContentLinearLayoutManager init { LayoutInflater.from(context).inflate(R.layout.shuttle_wadk_task_running, this, true) @@ -56,7 +57,7 @@ class RunningTaskManagerView: WindowRelativeLayout, RunningTastViewModel.Running } - linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager = WrapContentLinearLayoutManager(context) rvDataLiet.setLayoutManager(linearLayoutManager) mAdapter = RunningTaskAdapter(context, mutableListOf()) rvDataLiet.addItemDecoration( diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt index 4eb0cc1fd0..fec5f9636a 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt @@ -14,6 +14,7 @@ import com.mogo.och.common.module.manager.autopilot.line.LineManager import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.wigets.CommonDialogStatus import com.mogo.och.common.module.wigets.CommonSlideView +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager import com.mogo.och.shuttle.weaknet.R import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.ui.bizswitch.SwtichBizeModel @@ -49,7 +50,7 @@ class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback private lateinit var mAdapter: TaskRunningAdapter - private lateinit var linearLayoutManager:LinearLayoutManager + private lateinit var linearLayoutManager: WrapContentLinearLayoutManager init { LayoutInflater.from(context).inflate(R.layout.shuttle_weak_task_running, this, true) @@ -57,7 +58,7 @@ class TaskRunningView: ConstraintLayout, TaskRunningModel.SwtichLineViewCallback } private fun initView(){ - linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager = WrapContentLinearLayoutManager(context) rl_running_task_station_list.setLayoutManager(linearLayoutManager) mAdapter = TaskRunningAdapter(context, mutableListOf()) rl_running_task_station_list.setAdapter(mAdapter) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt index 0db38e80c3..862a9a2ecf 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt @@ -5,31 +5,21 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.findViewTreeViewModelStoreOwner -import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.LinearLayoutManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.common.module.utils.FlowBus +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.TaxiUnmannedDriverProvider import com.mogo.och.unmanned.taxi.bean.GrayLineBean import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst import com.mogo.och.unmanned.taxi.ui.debug.DebugView import com.mogo.och.unmanned.taxi.ui.routing.RoutingSwitchModel -import com.mogo.och.unmanned.taxi.ui.routing.RoutingUIState import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingChooseLineItemOpenAnimator -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingUiIntent import com.mogo.och.unmanned.taxi.ui.routing.routingselect.RoutingSelectModel.SwtichRoutingViewCallback import kotlinx.android.synthetic.main.unmanned_routing_select.view.include_empty import kotlinx.android.synthetic.main.unmanned_routing_select.view.include_error import kotlinx.android.synthetic.main.unmanned_routing_select.view.switch_routing_rv -import kotlinx.coroutines.flow.map import me.jessyan.autosize.utils.AutoSizeUtils class RoutingSelectView: ConstraintLayout, SwtichRoutingViewCallback { @@ -52,7 +42,7 @@ class RoutingSelectView: ConstraintLayout, SwtichRoutingViewCallback { private var swtichViewModel: RoutingSwitchModel?=null private lateinit var mChooseLineListAdapter: RoutingItemAdapter - private lateinit var mLinearLayoutManager: LinearLayoutManager + private lateinit var mLinearLayoutManager: WrapContentLinearLayoutManager private val mRoutingLineList: MutableList = ArrayList() private var mCurrentChosenPosition: Int = -1 @@ -66,7 +56,7 @@ class RoutingSelectView: ConstraintLayout, SwtichRoutingViewCallback { private fun initView(){ - mLinearLayoutManager = LinearLayoutManager(context) + mLinearLayoutManager = WrapContentLinearLayoutManager(context) switch_routing_rv.layoutManager = mLinearLayoutManager switch_routing_rv.itemAnimator = TaxiRoutingChooseLineItemOpenAnimator() mChooseLineListAdapter = RoutingItemAdapter(context, mRoutingLineList) From ebadfdfc74265a3343463612b58e42ede3bc4835 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 18:22:13 +0800 Subject: [PATCH 10/13] =?UTF-8?q?[6.7.0]=20[fix]=20[=E5=9D=90=E6=A0=87?= =?UTF-8?q?=E9=94=99=E8=AF=AF]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/och/weaknet/model/OrderModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt index 5e1f49dfeb..91d02508ef 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt @@ -277,7 +277,7 @@ object OrderModel { }else{// 为出发展示 MapMakerManager.addMapMaker(TAG, BusConst.BUS_START_MAP_MAKER,startStation.lat,startStation.lon,R.raw.star_marker) } - MapMakerManager.addMapMaker(TAG, BusConst.BUS_END_MAP_MAKER,startStation.lat,startStation.lon,R.raw.end_marker) + MapMakerManager.addMapMaker(TAG, BusConst.BUS_END_MAP_MAKER,endStation.lat,endStation.lon,R.raw.end_marker) }else{ MapMakerManager.removeAllMapMarkerByOwner(TAG) } From 94a3a5852c2d4f6aeebb722644999253461ee34b Mon Sep 17 00:00:00 2001 From: renwj Date: Sat, 12 Oct 2024 19:24:51 +0800 Subject: [PATCH 11/13] =?UTF-8?q?[6.7.0][=E7=8A=B6=E6=80=81=E6=A0=8F]=20WI?= =?UTF-8?q?FI=E7=83=AD=E7=82=B9=E5=90=8D=E7=A7=B0=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E9=80=82=E9=85=8D=E4=B9=98=E5=AE=A2=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt index bbfae1d269..1f5598d1be 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt @@ -83,7 +83,7 @@ class WifiStateView @JvmOverloads constructor( resources.getDimension(R.dimen.dp_35) ) a.recycle() -// viewStatusBarTag.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(context,txtSize).toFloat()) + viewStatusBarTag.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(context,txtSize).toFloat()) wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager? wifiHandler = WifiHandler(this) From 73fb896ed93f3af898e7d51531519a592da3c2d9 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Sat, 12 Oct 2024 19:38:33 +0800 Subject: [PATCH 12/13] =?UTF-8?q?[6.7.0]=20[fea]=20[=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=87=AA=E9=A9=BE=E5=8A=A8=E7=94=BB]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/unmanned/taxi/ui/base/TaxiFragment.kt | 20 +++++++++++++++++++ .../layout/unmanned_taxi_base_fragment.xml | 12 +++++++++++ 2 files changed, 32 insertions(+) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt index dbca0cc86f..833f324793 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt @@ -28,10 +28,12 @@ import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.och.common.module.biz.login.OpenOrderStatusEnum import com.mogo.och.common.module.biz.order.TaxiOrderStatusEnum import com.mogo.och.common.module.utils.FlowBus +import com.mogo.och.common.module.wigets.StartAutopilotAnimationView import com.mogo.och.common.module.wigets.map.drawline.LineView import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst +import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.START_AUTOPILOT_ANIMATION_INTERVAL import com.mogo.och.unmanned.taxi.ui.navi.amap.TaxiAmapNaviFragment import com.mogo.och.unmanned.taxi.ui.navi.auto.TaxiRoutingNaviFragment import com.mogo.och.unmanned.taxi.ui.operational.TaxiOperationalDialogFragment @@ -41,6 +43,7 @@ import com.mogo.och.unmanned.taxi.utils.TPRouteDataTestUtils import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.unmannedMapCL import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.module_mogo_och_navi_panel_container import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.orderDebugView +import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.startAutopilotAnimationView import kotlinx.android.synthetic.main.unmanned_taxi_base_fragment.taxi_close_navi_icon import java.lang.ref.WeakReference @@ -193,6 +196,7 @@ class TaxiFragment :MvpFragment(), it.removeAllLines() it.removeAllPoints() } + startAutopilotAnimationView.cancelCountdown() super.onDestroyView() } @@ -351,7 +355,20 @@ class TaxiFragment :MvpFragment(), } fun showStartAutopilotBlinkAnimation() { + startAutopilotAnimationView.show( + StartAutopilotAnimationView.DirectionEnum.ALERT_WARNING_TOP, + START_AUTOPILOT_ANIMATION_INTERVAL, + object : StartAutopilotAnimationView.AnimationViewTimerListener{ + override fun onTimerResume(remainingTime: Long) { + resumeStartAutopilot(remainingTime) + } + override fun onTimerPause() { + pauseStartAutopilot() + } + + } + ) } fun pauseStartAutopilot() { @@ -367,12 +384,15 @@ class TaxiFragment :MvpFragment(), } private fun stopStartAutopilotBlinkAnimation() { + startAutopilotAnimationView.dismiss(StartAutopilotAnimationView.DirectionEnum.ALERT_WARNING_TOP) } fun pauseAutopilotBlinkAnimation() { + startAutopilotAnimationView.pause() } fun resumeAutopilotBlinkAnimation() { + startAutopilotAnimationView.resume() } fun setGuidShow() { diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml index daf8149f23..4afbacca22 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_taxi_base_fragment.xml @@ -83,5 +83,17 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toEndOf="@+id/unmannedMapCL"/> + + + \ No newline at end of file From dc62cf54666d238f2d7f582b69c14eacb3fc0732 Mon Sep 17 00:00:00 2001 From: renwj Date: Sat, 12 Oct 2024 19:42:59 +0800 Subject: [PATCH 13/13] =?UTF-8?q?[6.7.0][=E8=A7=86=E8=A7=92=E5=8F=98?= =?UTF-8?q?=E6=8D=A2]=20=E4=BF=AE=E6=AD=A3=E8=BF=9C=E8=A7=86=E8=A7=92?= =?UTF-8?q?=EF=BC=8C=E6=89=8B=E5=8A=A8=E5=88=87=E6=8D=A2=E8=A7=92=E5=BA=A6?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E8=87=AA=E5=8A=A8=E9=94=81=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/hmi/ui/widget/WifiStateView.kt | 3 ++- .../zhidaoauto/map/sdk/open/view/MapAutoView.kt | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt index 1f5598d1be..8ab18f4cf6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt @@ -16,6 +16,7 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_wifi_state.view.viewStatusBarTag @@ -80,7 +81,7 @@ class WifiStateView @JvmOverloads constructor( val a = context.obtainStyledAttributes(attrs, R.styleable.WifiStateView, defStyleAttr, 0) txtSize = a.getDimension( R.styleable.WifiStateView_wifi_size, - resources.getDimension(R.dimen.dp_35) + resources.getDimension(R.dimen.dp_30) ) a.recycle() viewStatusBarTag.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(context,txtSize).toFloat()) diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt index 21e2072e16..fc13a88e29 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/view/MapAutoView.kt @@ -447,13 +447,13 @@ open class MapAutoView : FrameLayout, LonLatPointListener, ITraffic,ILockLocatio mLocationAlt = lonLatPoint.altitude.toFloat() mLocationHeading = lonLatPoint.angle mLocationView?.getMyLocationStyle()?.setLonLat(lonLat, lonLatPoint.angle) - mMapStyleParams?.let { - if(it.getVrAngleMode() == ConstantExt.MAP_STYLE_VR_ANGLE_FAR - && TransformUtils.outOfScreen(context, lonLatPoint.longitude, lonLatPoint.latitude,mMapController)){ - setCenter() - mMapController?.resetChangeAngleTime() - } - } +// mMapStyleParams?.let { +// if(it.getVrAngleMode() == ConstantExt.MAP_STYLE_VR_ANGLE_FAR +// && TransformUtils.outOfScreen(context, lonLatPoint.longitude, lonLatPoint.latitude,mMapController)){ +// setCenter() +// mMapController?.resetChangeAngleTime() +// } +// } } val mogoLocation = MogoLocation() mogoLocation.lon = lonLatPoint.longitude