From 04c19301992309b154a6ed762cba0e2675ddfb91 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Thu, 26 Sep 2024 15:54:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[6.7.0]UI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../badcase/BadCaseManager.kt | 36 +- .../workorder/TakeOverReasonWindow.kt | 38 +- .../src/main/res/drawable/bg_reason_list.xml | 4 +- .../res/drawable/type_radio_button_select.xml | 2 +- .../main/res/layout/view_take_over_reason.xml | 2 + .../core/function/hmi/bone/BoneTabLayout.kt | 17 + .../function/hmi/bone/tab/FaultReasonView.kt | 4 +- .../function/hmi/bone/tab/ReportTypeView.kt | 10 +- .../function/hmi/bone/tab/WorkOrderView.kt | 14 +- .../hmi/ui/msgbox/MsgBoxBubbleView.kt | 206 ++++++++ .../ui/msgbox/adapter/MsgBoxBubbleAdapter.kt | 484 ++++++++++++++++++ .../main/res/layout/layout_msg_box_bubble.xml | 14 + .../src/main/res/layout/view_bone_tab.xml | 4 +- .../src/main/res/layout/view_work_order.xml | 29 +- 14 files changed, 798 insertions(+), 66 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index d708e09133..8551afd4d0 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -610,25 +610,25 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis override fun onAutopilotStatistics(statistics: AutopilotStatistics?) { statistics?.let { Log.i(TAG,"onAutopilotStatistics status = "+ it.status) - if(it.status == AutopilotStatistics.AUTOPILOT_START_STATUS.FAILED){ +// if(it.status == AutopilotStatistics.AUTOPILOT_START_STATUS.FAILED){ //触发一键上报 - ThreadUtils.runOnUiThread{ - val activity = AppStateManager.currentActivity() - if (activity !is AppCompatActivity) { - return@runOnUiThread - } - if(reportTypeWindow == null){ - reportTypeWindow = ReportTypeWindow(activity) - reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{ - override fun closeWindow() { - reportTypeWindow?.hideFloatWindow() - reportTypeWindow = null - } - }) - } - reportTypeWindow?.showOneClickReportWindow(xPosition,yPosition) - } - } +// ThreadUtils.runOnUiThread{ +// val activity = AppStateManager.currentActivity() +// if (activity !is AppCompatActivity) { +// return@runOnUiThread +// } +// if(reportTypeWindow == null){ +// reportTypeWindow = ReportTypeWindow(activity) +// reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{ +// override fun closeWindow() { +// reportTypeWindow?.hideFloatWindow() +// reportTypeWindow = null +// } +// }) +// } +// reportTypeWindow?.showOneClickReportWindow(xPosition,yPosition) +// } +// } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt index cf3fee59b3..7aeebbfd84 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt @@ -417,25 +417,25 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene @SuppressLint("ClickableViewAccessibility") override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { - when (motionEvent?.action) { - MotionEvent.ACTION_DOWN -> { - // 获取相对View的坐标,即以此View左上角为原点 - mInViewX = motionEvent.x - mInViewY = motionEvent.y - // 获取相对屏幕的坐标,即以屏幕左上角为原点 - mInScreenX = motionEvent.rawX - mInScreenY = motionEvent.rawY - } - MotionEvent.ACTION_MOVE -> { - // 更新浮动窗口位置参数 - mInScreenX = motionEvent.rawX - mInScreenY = motionEvent.rawY - mWindowParams!!.x = (mInScreenX - mInViewX).toInt() - mWindowParams!!.y = (mInScreenY - mInViewY).toInt() - // 手指移动的时候更新小悬浮窗的位置 - mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) - } - } +// when (motionEvent?.action) { +// MotionEvent.ACTION_DOWN -> { +// // 获取相对View的坐标,即以此View左上角为原点 +// mInViewX = motionEvent.x +// mInViewY = motionEvent.y +// // 获取相对屏幕的坐标,即以屏幕左上角为原点 +// mInScreenX = motionEvent.rawX +// mInScreenY = motionEvent.rawY +// } +// MotionEvent.ACTION_MOVE -> { +// // 更新浮动窗口位置参数 +// mInScreenX = motionEvent.rawX +// mInScreenY = motionEvent.rawY +// mWindowParams!!.x = (mInScreenX - mInViewX).toInt() +// mWindowParams!!.y = (mInScreenY - mInViewY).toInt() +// // 手指移动的时候更新小悬浮窗的位置 +// mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) +// } +// } return true } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml index bfb99ae3be..7456a3cde6 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_reason_list.xml @@ -3,7 +3,7 @@ - + - + + android:radius="@dimen/dp_10"/> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml index bb97c8a3a4..0913255420 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml @@ -191,6 +191,8 @@ android:visibility="gone" android:layout_marginTop="@dimen/dp_m_5" android:paddingTop="@dimen/dp_5" + android:layout_marginStart="@dimen/dp_m_1" + android:layout_marginEnd="@dimen/dp_m_1" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt index 2bb25033ac..177d0e00e9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/BoneTabLayout.kt @@ -8,7 +8,9 @@ import com.mogo.eagle.core.data.enums.Carmodel import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.bone.tab.FaultReasonView import com.mogo.eagle.core.function.hmi.bone.tab.ReportTypeView +import com.mogo.eagle.core.function.hmi.bone.tab.WorkOrderView import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -94,8 +96,23 @@ class BoneTabLayout @JvmOverloads constructor( override fun openWorkOrderView() { workOrderView.visibility = VISIBLE } + + override fun closeReportView() { + updateTabType(TabType.REPORT_INFO) + } }) + faultReasonView.setClickListener(object: FaultReasonView.ClickListener{ + override fun closeFaultReasonView() { + updateTabType(TabType.REPORT_INFO) + } + }) + + workOrderView.setClickListener(object: WorkOrderView.ClickListener{ + override fun closeWorkOrderView() { + updateTabType(TabType.REPORT_INFO) + } + }) } fun setCarNo(carNo: String?) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt index 9b5ca28692..1bf14a8954 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/FaultReasonView.kt @@ -325,6 +325,7 @@ class FaultReasonView @JvmOverloads constructor( //取消 tvFaultCancel.setOnClickListener { this@FaultReasonView.visibility = View.GONE + clickListener?.closeFaultReasonView() } } @@ -430,7 +431,7 @@ class FaultReasonView @JvmOverloads constructor( } interface ClickListener { - fun closeWindow() + fun closeFaultReasonView() } /** @@ -448,6 +449,7 @@ class FaultReasonView @JvmOverloads constructor( val successHandler = Handler(Looper.getMainLooper()) successHandler.postDelayed({ this@FaultReasonView.visibility = View.GONE + clickListener?.closeFaultReasonView() },1500) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt index 430fc72531..253aec586e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/ReportTypeView.kt @@ -120,8 +120,7 @@ class ReportTypeView @JvmOverloads constructor( //故障类 tvReportTypeFault.setOnClickListener { - //TODO 更改! - if(!ProjectUtils.isSaas()){ + if(ProjectUtils.isSaas()){ clickListener?.openFaultReasonView() }else{ //展示工单上报弹窗 @@ -144,10 +143,12 @@ class ReportTypeView @JvmOverloads constructor( val successHandler = Handler(Looper.getMainLooper()) successHandler.postDelayed({ this@ReportTypeView.visibility = View.GONE + clickListener?.closeReportView() },1500) }else{ ToastUtils.showShort("主动录包命令下发失败") this@ReportTypeView.visibility = View.GONE + clickListener?.closeReportView() } } } @@ -172,6 +173,7 @@ class ReportTypeView @JvmOverloads constructor( if(!hasReportOperate){ ThreadUtils.runOnUiThread { this@ReportTypeView.visibility = View.GONE + clickListener?.closeReportView() } } } @@ -201,6 +203,7 @@ class ReportTypeView @JvmOverloads constructor( val successHandler = Handler(Looper.getMainLooper()) successHandler.postDelayed({ this.visibility = View.GONE + clickListener?.closeReportView() },1500) } } @@ -210,6 +213,7 @@ class ReportTypeView @JvmOverloads constructor( ToastUtils.showShort("故障原因上报失败$msg") ThreadUtils.runOnUiThread { this.visibility = View.GONE + clickListener?.closeReportView() } } @@ -252,6 +256,8 @@ class ReportTypeView @JvmOverloads constructor( interface ClickListener { fun openFaultReasonView() fun openWorkOrderView() + + fun closeReportView() } fun setClickListener(clickListener: ClickListener) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt index 25fb89a38b..d47ece024e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/WorkOrderView.kt @@ -73,6 +73,8 @@ class WorkOrderView @JvmOverloads constructor( var ret = 0 // 函数调用返回值 private var audioStatus = false + private var clickListener: ClickListener? = null + init { LayoutInflater.from(context).inflate(R.layout.view_work_order, this, true) initView() @@ -90,7 +92,7 @@ class WorkOrderView @JvmOverloads constructor( private fun initEvent(){ CallerDevaToolsListenerManager.addListener(TAG, this) //弹窗展示时间 - tv_work_order_time.text = resources.getString(R.string.work_order_time) + + tv_work_order_time.text = millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat()) wrap_radio_group.setOnCheckedChangeListener{_, checkedId -> @@ -197,6 +199,7 @@ class WorkOrderView @JvmOverloads constructor( //取消 tv_work_order_cancel.setOnClickListener { this@WorkOrderView.visibility = View.GONE + clickListener?.closeWorkOrderView() } } @@ -302,6 +305,7 @@ class WorkOrderView @JvmOverloads constructor( ToastUtils.showShort("工单上报成功") ThreadUtils.runOnUiThread { this@WorkOrderView.visibility = View.GONE + clickListener?.closeWorkOrderView() } } @@ -309,4 +313,12 @@ class WorkOrderView @JvmOverloads constructor( ToastUtils.showShort("工单上报失败") } + interface ClickListener{ + fun closeWorkOrderView() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt new file mode 100644 index 0000000000..506fff2706 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt @@ -0,0 +1,206 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.function.api.autopilot.IMoGoNodeStateListener +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.order.IOrderListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerNodeStateListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MsgBoxBubbleAdapter +import com.mogo.eagle.core.function.msgbox.MsgBoxConfig +import com.mogo.eagle.core.utilcode.util.SoundPoolUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.zhjt.mogo.adas.data.bean.NodeStateInfo +import kotlinx.android.synthetic.main.layout_driver_msg_box_bubble.view.clMsgBubbleLayout +import kotlinx.android.synthetic.main.layout_msg_box_bubble.view.llMsgBubbleLayout +import kotlinx.android.synthetic.main.layout_msg_box_bubble.view.rvBubbleList + +/** + * 司机端消息盒子气泡视图改版视图 + */ +class MsgBoxBubbleView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IOrderListener{ + + init { + LayoutInflater.from(context).inflate(R.layout.layout_msg_box_bubble, this, true) + initView() + } + + var msgBoxBubbleAdapter: MsgBoxBubbleAdapter ?= null + + private val TAG = "DriverMsgBoxBubbleView" + private val dataList :ArrayList = ArrayList() + private var isShowData = true + private var isShowSummary = false //是否展示汇总消息 + + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + linearLayoutManager.stackFromEnd = true + linearLayoutManager.reverseLayout = true + msgBoxBubbleAdapter = MsgBoxBubbleAdapter(context as Activity) + msgBoxBubbleAdapter?.setChangeListener(object : MsgBoxBubbleAdapter.ChangeViewListener{ + override fun notifyView() { + if(dataList.isEmpty()){ + llMsgBubbleLayout.visibility = View.GONE + } + } + + }) + rvBubbleList.adapter = msgBoxBubbleAdapter + rvBubbleList.layoutManager = linearLayoutManager + } + + /** + * 是否展示接收消息,消息盒子打开状态下不再展示气泡消息 + * @param show true 展示;false 不展示 + */ + fun isShowData(show: Boolean){ + isShowData = show + } + + override fun onDataChanged(category: MsgCategory, msgBoxBean: MsgBoxBean) { + UiThreadHandler.post({ + when (category) { + MsgCategory.NOTICE -> { + MsgBoxConfig.noticeList.add(msgBoxBean) + } + MsgCategory.SYS_INFO -> { + MsgBoxConfig.systemInfoList.add(msgBoxBean) + } + MsgCategory.RECORD_BAG -> { + MsgBoxConfig.recordBagList.add(msgBoxBean) + } + else -> {} + } + if(isShowData){ + if(category == MsgCategory.RECORD_BAG){ + if(!FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isShowBagRecordWindow){ + //弹出被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + } + } else if(category == MsgCategory.SYS_INFO){ + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + if(msgBoxBean.type == MsgBoxType.REPORT){ + val reportMsg = msgBoxBean.bean as ReportEntity + //P8-P1均只收在消息盒子里,P0消息盒子弹出,其中P0弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + var isShowReport = false + for(action in reportMsg.actionsList){ + if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){ + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + isShowReport = true + } + } + } + if(isShowReport){ + //展示消息 + showData(msgBoxBean) + } + } + } else if(category == MsgCategory.FM_INFO){ + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + if(FunctionBuildConfig.isTakeoverRemind){ + //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 + val fmInfoMsg = msgBoxBean.bean as FMInfoMsg + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) + fmInfoMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + if(curFaultLevel == 0){ + //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 + // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 + // if (hasNoneFSMNode()) { + //语音提示 + try { + SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) + }catch (e: Exception){ + e.printStackTrace() + } + //展示消息 + showData(msgBoxBean) + //} + } + } + } + } else{ + if(msgBoxBean.sourceType == DataSourceType.SUMMARY){ + //在一次订单中汇总消息只展示一次 + if(isShowSummary){ + showData(msgBoxBean) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + isShowSummary = false + } + }else{ + if(msgBoxBean.type == MsgBoxType.V2X){ + //鹰眼650需求,不再展示气泡态V2X消息 + return@post + } + showData(msgBoxBean) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + } + } + } + }, UiThreadHandler.MODE.QUEUE) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxListenerManager.addListener(TAG,this) + CallerOrderListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + CallerOrderListenerManager.removeListener(TAG) + } + + override fun onUpdateOrderStatus(inOrder: Boolean) { + isShowSummary = inOrder + } + + private fun showData(msgBoxBean: MsgBoxBean){ + clMsgBubbleLayout.visibility = View.VISIBLE + val msgBoxCountDownBean = MsgBoxCountDownBean(msgBoxBean) + dataList.add(msgBoxCountDownBean) + msgBoxBubbleAdapter?.setData(dataList) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt new file mode 100644 index 0000000000..2bb05b64b3 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt @@ -0,0 +1,484 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.app.Activity +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.AutopilotMsg +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.data.msgbox.FSMMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.msgbox.NoticeFrCloudMsg +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.SSMMsg +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp +import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform +import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat +import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout + +class MsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.Adapter() { + + private var data: ArrayList ?= null + + private var changeViewListener: ChangeViewListener?=null + + private val operation: Int = 1 + private val operationReturn: Int = 10 + private val operationStop: Int = 11 + private val operationDoorSwitchFail: Int = 13 //车门开启、关闭失败 + private val notice: Int = 2 + private val v2x: Int = 3 + private val report: Int = 4 + private val summary: Int = 5 + private val fm: Int = 6 + private val ssm: Int = 7 + private val autopilot: Int = 8 + private val fsm: Int = 9 + private val none: Int = 10 + + fun setData(data: ArrayList){ + this.data = data + if(data.size>4){ + data.removeAt(0) + } + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + when (viewType) { + operation -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_operation,parent,false) + return BubbleOperationHolder(view) + } + operationReturn -> { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_bubble_operation_return, parent, false) + return BubbleOperationReturnHolder(view) + } + operationStop -> { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_bubble_operation_stop, parent, false) + return BubbleOperationStopHolder(view) + } + operationDoorSwitchFail ->{ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_msg_bubble_operation_door, parent, false) + return BubbleOperationDoorFailHolder(view) + } + report -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_report,parent,false) + return BubbleReportHolder(view) + } + notice -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_notice,parent,false) + return BubbleNoticeHolder(view) + } + summary -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_summary,parent,false) + return BubbleSummaryHolder(view) + } + fm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_fm,parent,false) + return BubbleFmHolder(view) + } + ssm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_ssm,parent,false) + return BubbleSsmHolder(view) + } + autopilot -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_autopilot,parent,false) + return BubbleAutopilotHolder(view) + } + fsm -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_fsm,parent,false) + return BubbleFSMHolder(view) + } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_v2x,parent,false) + return BubbleV2XHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is BubbleOperationHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean + val operationMsg = msgBoxBean.bean as OperationMsg + holder.tvBubbleOperationTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvBubbleOperationContent.text = operationMsg.content + holder.clBubbleOperationLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleOperationListener(msgBoxBean) + } + } + } + //运营平台还车通知 + is BubbleOperationReturnHolder -> { + data?.let { + val operationReturnMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvOperationReturnContent.text = operationReturnMsg.content + holder.tvOperationReturnTime.text = + TimeUtils.millis2String(operationReturnMsg.timestamp, getHourMinFormat()) + } + } + //运营平台靠边停车 + is BubbleOperationStopHolder -> { + data?.let { + val operationStopMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvOperationStopTime.text = + TimeUtils.millis2String(operationStopMsg.timestamp, getHourMinFormat()) + holder.tvOperationStopContent.text = operationStopMsg.content + } + } + //车门开启关闭失败 + is BubbleOperationDoorFailHolder -> { + data?.let{ + val operationDoorMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvOperationDoorTime.text = + TimeUtils.millis2String(operationDoorMsg.timestamp, getHourMinFormat()) + holder.tvOperationDoorContent.text = operationDoorMsg.content + } + } + //系统信息消息 + is BubbleReportHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean + val reportEntity = msgBoxBean.bean as ReportEntity + holder.tvBubbleReportTime.text = "时间:${TimeUtils.millis2String(it[position].msgBoxBean.timestamp)}" + holder.tvBubbleReceiveTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + var resultStr = "类型:" + for (result in reportEntity.resultList){ + resultStr = "${resultStr}${CallerAutoPilotControlManager.getReportResultDesc(result)}" + } + holder.tvBubbleReportType.text = resultStr + holder.clReportLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleReportListener(msgBoxBean) + } + } + } + //云公告消息 + is BubbleNoticeHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean.bean + val noticeFrCloudMsg = msgBoxBean as NoticeFrCloudMsg + if(noticeFrCloudMsg.type == 0){ + val noticeNormalData = noticeFrCloudMsg.noticeNormalData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvNoticeContent.text = noticeNormalData?.content + GlideApp.with(activity).load(noticeNormalData?.imageUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivNoticeImage) + holder.tvNoticeCheck.setOnClickListener { + //云公告 + if (noticeNormalData != null) { + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(noticeFrCloudMsg.type == 1){ + val noticeTrafficStylePushData = noticeFrCloudMsg.trafficPushData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvNoticeContent.text = noticeTrafficStylePushData?.content + GlideApp.with(activity).load(noticeTrafficStylePushData?.poiImgUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivNoticeImage) + holder.tvNoticeCheck.setOnClickListener { + //云公告 + if (noticeTrafficStylePushData != null) { + CallerHmiManager.showTrafficBanner(noticeTrafficStylePushData) + } + } + } + } + } + //V2X消息 + is BubbleV2XHolder -> { + data?.let { + val msgBoxBean = it[position].msgBoxBean + val v2XMsg = msgBoxBean.bean as V2XMsg + holder.tvV2XTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvV2XContent.text = v2XMsg.content + holder.ivV2XImage.setImageDrawable(ResourcesCompat.getDrawable(activity.resources,EventTypeEnumNew.getUpdateIconRes(v2XMsg.type),null)) + holder.clV2XLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleV2XListener(msgBoxBean) + } + if(v2XMsg.type== EventTypeEnumNew.TYPE_VERIFICATION_SUCCESSFUL.poiType||v2XMsg.type == EventTypeEnumNew.TYPE_DEVICE_STATUS_NORMAL.poiType){ + holder.itemView.setBackgroundResource(R.drawable.bg_temp_v2x_success) + }else{ + holder.itemView.setBackgroundResource(R.drawable.bg_msg_box_v2x) + } + if(v2XMsg.communicationType.isNullOrEmpty()){ + holder.tvV2XTitle.text = EventTypeEnumNew.getEventTitle(v2XMsg.type) + }else{ + holder.tvV2XTitle.text = String.format(activity.resources.getString(R.string.v2x_title_content), + v2XMsg.communicationType, EventTypeEnumNew.getEventTitle(v2XMsg.type)) + } + } + } + //汇总消息 + is BubbleSummaryHolder -> { + data?.let { + val summaryMsg = it[position].msgBoxBean.bean as V2XMsg + holder.tvSummaryTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + holder.tvSummaryContent.text = summaryMsg.content + } + } + //FM信息 + is BubbleFmHolder ->{ + data?.let { + val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg + if(fmMsg.policyTime == null){ + holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) + }else{ + holder.tvBubbleFmTime.text = TimeUtils.millis2String(fmMsg.policyTime!!,getHourMinFormat()) + } + if(fmMsg.fmInfoList?.size == 0){ + holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) + }else{ + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) + fmMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel) + holder.tvBubbleFmFault.text = faultAction + //当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、 + // 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 + if(curFaultLevel == 5){ + holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + }else{ + holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})" + } + //不同级别的Icon显示 + when(curFaultLevel){ + 0->{ + //重度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + } + 1,2,3->{ + //中度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + } + 4,5->{ + //轻度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + } + } + } + } + } + //SSM连接消息 + is BubbleSsmHolder ->{ + data?.let { + val ssmMsg = it[position].msgBoxBean.bean as SSMMsg + holder.tvSsmTitle.text = ssmMsg.title + holder.tvSsmContent.text= ssmMsg.content + holder.tvSsmTime.text = TimeUtils.millis2String(ssmMsg.timestamp,getHourMinFormat()) + } + } + //域控制器连接消息 + is BubbleAutopilotHolder ->{ + data?.let { + val autopilotMsg = it[position].msgBoxBean.bean as AutopilotMsg + holder.tvAutopilotTitle.text = autopilotMsg.title + holder.tvAutopilotContent.text = autopilotMsg.content + holder.tvAutopilotTime.text = TimeUtils.millis2String(autopilotMsg.timestamp,getHourMinFormat()) + } + } + + //FSM消息 + is BubbleFSMHolder ->{ + data?.let { + val fsmMsg = it[position].msgBoxBean.bean as FSMMsg + holder.tvFSMTitle.text = fsmMsg.title + holder.tvFSMContent.text = fsmMsg.content + holder.tvFSMTime.text = TimeUtils.millis2String(fsmMsg.timestamp,getHourMinFormat()) + } + } + } + + val msgBoxBean: MsgBoxCountDownBean = data!![position] + msgBoxBean.countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){ + override fun onTick(p0: Long) { + + } + + override fun onFinish() { + data?.remove(msgBoxBean) + changeViewListener?.notifyView() + notifyDataSetChanged() + } + + } + msgBoxBean.countDownTimer?.start() + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + return if(data!![position].msgBoxBean.type == MsgBoxType.OPERATION){ + when ((data!![position].msgBoxBean.bean as OperationMsg).type) { + 0 -> { + //运营平台还车通知 + operationReturn + } + 1 -> { + //运营平台靠边停车 + operationStop + } + 3 -> { + //车门开启关闭失败 + operationDoorSwitchFail + } + else -> { + //普通运营平台 + operation + } + } + }else if(data!![position].msgBoxBean.type == MsgBoxType.REPORT){ + report + }else if(data!![position].msgBoxBean.type == MsgBoxType.NOTICE){ + notice + }else if(data!![position].msgBoxBean.type == MsgBoxType.V2X && data!![position].msgBoxBean.sourceType == DataSourceType.SUMMARY){ + summary + }else if(data!![position].msgBoxBean.type == MsgBoxType.FMINFO){ + fm + }else if(data!![position].msgBoxBean.type == MsgBoxType.SSMINFO){ + ssm + }else if(data!![position].msgBoxBean.type == MsgBoxType.AUTOPILOT){ + autopilot + }else if(data!![position].msgBoxBean.type == MsgBoxType.FSM){ + fsm + } else { + v2x + } + } + + fun setChangeListener(listener: ChangeViewListener){ + changeViewListener = listener + } + + interface ChangeViewListener{ + fun notifyView() + } + + //车辆系统信息 + class BubbleReportHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleReportTime: TextView = itemView.findViewById(R.id.tvBubbleReportTime) + var tvBubbleReportType: TextView = itemView.findViewById(R.id.tvBubbleReportType) + var tvBubbleReceiveTime: TextView = itemView.findViewById(R.id.tvBubbleReceiveTime) + var clReportLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clReportLayout) + } + + //运营平台 + class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleOperationTime: TextView = itemView.findViewById(R.id.tvBubbleOperationTime) + var tvBubbleOperationContent: TextView = itemView.findViewById(R.id.tvBubbleOperationContent) + var clBubbleOperationLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clBubbleOperationLayout) + } + + //运营平台还车通知 + class BubbleOperationReturnHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvOperationReturnTime: TextView = itemView.findViewById(R.id.tvOperationReturnTime) + var tvOperationReturnContent: TextView = itemView.findViewById(R.id.tvOperationReturnContent) + } + + //运营平台靠边停车通知 + class BubbleOperationStopHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvOperationStopTime: TextView = itemView.findViewById(R.id.tvOperationStopTime) + var tvOperationStopContent: TextView = itemView.findViewById(R.id.tvOperationStopContent) + } + //车门开启关闭失败 + class BubbleOperationDoorFailHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvOperationDoorTime: TextView = itemView.findViewById(R.id.tvOperationDoorTime) + var tvOperationDoorContent: TextView = itemView.findViewById(R.id.tvOperationDoorContent) + } + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNoticeImage: ImageView = itemView.findViewById(R.id.ivNoticeImage) + // var tvNoticeTitle: TextView = itemView.findViewById(R.id.tvNoticeTitle) + var tvNoticeTime: TextView = itemView.findViewById(R.id.tvNoticeTime) + var tvNoticeCheck: TextView = itemView.findViewById(R.id.tvNoticeCheck) + var tvNoticeContent: TextView = itemView.findViewById(R.id.tvNoticeContent) + } + + //V2X + class BubbleV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivV2XImage: ImageView = itemView.findViewById(R.id.ivV2XImage) + var tvV2XTime: TextView = itemView.findViewById(R.id.tvV2XTime) + var tvV2XContent: TextView = itemView.findViewById(R.id.tvV2XContent) + var clV2XLayout: ConstraintLayout = itemView.findViewById(R.id.clV2XLayout) + var tvV2XTitle: TextView = itemView.findViewById(R.id.tvV2XTitle) + } + + //汇总消息 + class BubbleSummaryHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvSummaryContent: TextView = itemView.findViewById(R.id.tvSummaryContent) + var tvSummaryTime: TextView = itemView.findViewById(R.id.tvSummaryTime) + } + + //FM消息 + class BubbleFmHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault) + var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction) + var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime) + var ivBubbleFmImage: ImageView = itemView.findViewById(R.id.ivBubbleFmImage) + } + + //SSM连接消息 + class BubbleSsmHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivSsmImage: ImageView = itemView.findViewById(R.id.ivSsmImage) + var tvSsmTitle: TextView = itemView.findViewById(R.id.tvSsmTitle) + var tvSsmTime: TextView = itemView.findViewById(R.id.tvSsmTime) + var tvSsmContent: TextView = itemView.findViewById(R.id.tvSsmContent) + } + + //域控制器连接状态消息 + class BubbleAutopilotHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivAutopilotImage: ImageView = itemView.findViewById(R.id.ivAutopilotImage) + var tvAutopilotTitle: TextView = itemView.findViewById(R.id.tvAutopilotTitle) + var tvAutopilotTime: TextView = itemView.findViewById(R.id.tvAutopilotTime) + var tvAutopilotContent: TextView = itemView.findViewById(R.id.tvAutopilotContent) + } + + //FSM状态消息(现阶段提示启动自驾失败消息,过渡阶段提示,未来展示fsm消息提醒) + class BubbleFSMHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivFSMImage: ImageView = itemView.findViewById(R.id.ivFSMImage) + var tvFSMTitle: TextView = itemView.findViewById(R.id.tvFSMTitle) + var tvFSMTime: TextView = itemView.findViewById(R.id.tvFSMTime) + var tvFSMContent: TextView = itemView.findViewById(R.id.tvFSMContent) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml new file mode 100644 index 0000000000..e8a0ce25ed --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_msg_box_bubble.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_tab.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_tab.xml index af1410dfa0..fefbf2a188 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_tab.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_tab.xml @@ -41,8 +41,8 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginStart="@dimen/dp_280" - android:layout_marginBottom="@dimen/dp_180" + android:layout_marginStart="@dimen/dp_270" + android:layout_marginBottom="@dimen/dp_170" /> - - From 87aab03e36c620593b636c8905cb400fd48b3ac6 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 26 Sep 2024 16:21:49 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[6.7.0]=20[fea]=20[=E6=BB=91=E5=8A=A8?= =?UTF-8?q?=E5=87=BA=E5=8F=91=E5=8A=A8=E7=94=BB=E5=B1=95=E7=A4=BA]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/facade/view/OchCustomViewProvider.kt | 5 ++++ OCH/shuttle/driver_weaknet/build.gradle | 1 + .../driver_weaknet/src/main/assets/data.json | 1 + .../src/main/assets/images/img_0.png | Bin 0 -> 3517 bytes .../src/main/assets/images/img_1.png | Bin 0 -> 3208 bytes .../src/main/assets/images/img_2.png | Bin 0 -> 1654 bytes .../driver_weaknet/src/main/assets/slide.json | 1 + .../ui/switchtask/SwitchLineTaskAdapter.kt | 3 +++ .../och/weaknet/view/BizLeaveStationView.kt | 14 +++++++++- .../drawable/bus_task_current_station_bg.xml | 2 +- .../shuttle_weak_task_leave_station_view.xml | 24 +++++++++++++----- .../src/main/res/values/colors.xml | 1 + config.gradle | 1 + 13 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 OCH/shuttle/driver_weaknet/src/main/assets/data.json create mode 100644 OCH/shuttle/driver_weaknet/src/main/assets/images/img_0.png create mode 100644 OCH/shuttle/driver_weaknet/src/main/assets/images/img_1.png create mode 100644 OCH/shuttle/driver_weaknet/src/main/assets/images/img_2.png create mode 100644 OCH/shuttle/driver_weaknet/src/main/assets/slide.json diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt index 8dbc57d0d5..1ebac9af0b 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/view/OchCustomViewProvider.kt @@ -33,6 +33,11 @@ class OchCustomViewProvider : IOchCustomViewProvider { if(temp is FacadeProvider){ commonService = temp.commonService } + }else{ + val temp = ARouter.getInstance().build(FacadeConst.PASSENGER_PATH).navigation(context) + if(temp is FacadeProvider){ + commonService = temp.commonService + } } } diff --git a/OCH/shuttle/driver_weaknet/build.gradle b/OCH/shuttle/driver_weaknet/build.gradle index 3f2bd62161..a230b9a66d 100644 --- a/OCH/shuttle/driver_weaknet/build.gradle +++ b/OCH/shuttle/driver_weaknet/build.gradle @@ -61,6 +61,7 @@ dependencies { implementation rootProject.ext.dependencies.roomRxjava implementation rootProject.ext.dependencies.androidxrecyclerview kapt rootProject.ext.dependencies.recyclerviewadapterhelper + implementation rootProject.ext.dependencies.lottie implementation rootProject.ext.dependencies.androidxroomruntime kapt rootProject.ext.dependencies.androidxroomcompiler diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/data.json b/OCH/shuttle/driver_weaknet/src/main/assets/data.json new file mode 100644 index 0000000000..62cb3f9e9d --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/assets/data.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":25,"ip":0,"op":55,"w":774,"h":120,"nm":"滑动等待背景","ddd":0,"assets":[{"id":"image_0","w":774,"h":120,"u":"images/","p":"img_2.png","e":0},{"id":"comp_0","nm":"预合成 1","fr":25,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[99]},{"t":55,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[687,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,127,100]},{"t":55,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"形状图层 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37,"s":[95]},{"t":50,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[587,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[100,127,100]},{"t":50,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"形状图层 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[31]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[100]},{"t":45,"s":[31]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[487,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[100,127,100]},{"t":45,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"形状图层 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[100]},{"t":40,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":27,"s":[100,127,100]},{"t":40,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"形状图层 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[99]},{"t":35,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[287,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":22,"s":[100,127,100]},{"t":35,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"形状图层 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[99]},{"t":30,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[100,127,100]},{"t":30,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"形状图层 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[100]},{"t":25,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,59.438,0],"ix":2,"l":2},"a":{"a":0,"k":[-328.25,-4.062,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[100,127,100]},{"t":25,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[8,50],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-328.21,-4.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":55,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[387,60,0],"ix":1,"l":2},"s":{"a":0,"k":[107,52,100],"ix":6,"l":2}},"ao":0,"w":774,"h":120,"ip":0,"op":55,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"滑动等待背景.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[387,60,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":55,"st":0,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/images/img_0.png b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0aec427bb49c484430f7a50a72724f8b0b2eadd8 GIT binary patch literal 3517 zcmYjUc{~(e*C$IVR7zu4w)_}dmKcOFO!g%jKV+vtCJd4#)Ppp(WStsjDnpnd`yl(i z46=+ZjrQEx~VOb>e70HR|R%(#jP%@=?PcJyau{WyBfgBE!{Dk(M) z(v~dom6gleFjt1>5GuxV^)HKwkJk%c%YC#dD3^q9Mt>2}`)Vj3(WYf+;A1Qr=fh=Z z02j9~Ktmraa9AR9Y86lFX&-*}uCMe?g_e!;FOb=v?bp4aeaPznGykk!y*3mkoeK_O zmespwbqNq7m8h$%67zYKU{I6gD&ur+J5^vMr{jQKd; zNx2p`o4*bJbk#iOP^pE%a{#NPG|N2vxmj{R2ZGnhXEO1z$p6ytaZ_o9&qDiw#dNyG z`A~F*7kn#uK8Y{xp%=OUIxBzh%vD=h-=gzh-g0PKXS z0TU$H`O1Q|pTG~rt(~VyRX2=}w{rGhtgQ~8fZT%DO9~e^KW}p>y)%Quc9SXhqFKkM zsSel`6$Erp!RN1=ur*$_n1s5iC*cAcvNe^FLEP5CSAy?pj!z%$!Sgy|d|eKXs#bo~ z4k!3O;#!G2-}j!|{7ZPJm1%x!x=GhTiKMi=@?4BpMSPretwyG0sGC#e;y5@x(GL8CImBU_~$ zq1f{hOz6s$PLRwD$!Aii%gJ@cK6>#oe8X_h#x&uU<}IMpY=|8=q0w0UCeuU_Muz<{ z?CFteAw-UZQx4Q>uMv7brFaQ3`0>|s^+t3_V>;Y>u*Jf?KMZop@`#OrXF?ejT z&p>yu&p8U){8KV!B3y|zmJ+ zts*BEL0OXV5nNrV_L(0V%ziG*N%CpoP?u_=VM-tHrXU`^oCOSpxUHnMu_CS;n!6fK z=*LTP3fn&mcvfQ={A#BpQtcQiJ66DQNj?olYAZX$ooh;eS&Zw6qU3T4$-zgFWeR0} z2k~Q-?D4y{t$#=Bkri4~VhW1149AKX!73E7fMcqYfh91jzI^9h`xBv@-WP)h_nacY zmKWFjca}{qpg#CTbpl^lLB(5!WFI9ejf@BFd8uE=R}Gi7r2v#3>)hm!KzICV)=R%y z=9j^#?I1W02U@avL(BSkV)e&QnvRbEJ%MgAnAlmTMdglm<$ld==ke(t4eC5@i#-T>2&R?pi>Qe9PeZ=W zqm~neFd1zezC+J5J)sj?Ac`Q5Bav7QJXv4J10|Af>!~H}Qtwen8=r?!g3YP}IYQ4* zev50~l45nP&K&XqqjtZL=S1gH!7Yv2nHsHg4!M!b9rjI?j)6oC_-vb%4qx!l1k-ty zy^Fy1CJg~(Px~qiA)9=E7 z$MKXP4we|Zm2crhWY+t56!Wh#@5_R=?LL&0b3}nj;lgtuzg)MGpE=pXlMpGRym+v{3j1X5MXd{${N|tc;WXtSy`^3P5@go?$#@_?8uAp zepyUPCo~MsX$-LaDo%^aB4oFmTY-h5@zZ z(A*NE|DrZ~hd0)Hx(5<(iP{XH*s-?1vpwYVs{T;}IT}w~ahYdBb}5 zWQMS*y19ff(%qYW1bm}VMa+8{xZ62OD}FaaB{3m)oz#`tBQYu;N(_`Oqe@Z(WMSKL zIjx(%pEP#~mO` ze(_gYE#DjdzZ|WLkedYKT8lSw|2${o}VrUYO9 zxBCYP>okxUB;S~Jr@S#H5xzY(=E93q1C|Numj+e~9Bzcd!?4p)fG`AO(CBt|plp(R z1I>f5t&l-TKD)%3I^ee)yL=>u`mu8|#5wpNC7$H&j2k7zXFjTf&`NoKya-MphHMM^ z63ZTWV~jL>L))iyomB6uuhaZXl0g6=!*8d|p}a^7yb1iPEzMT!Pj6!!7I33laLwR! zRMc|tL4NlcfsB#_-}-ZcGN>mf{kpo3d1Upe@Rv1Y!YC=R^9d+JJHaHj56XKpmL*l) z^xFI3edGf!2wWe-e_IQrp%Iq7%8U5AKMKlF>(is1(3+e1v+w`E3sOO(|Lh;}`?EV_ zYlasTu-}^~EiqrVmuQ!M5KGQI?cMKf;s?>kL6EoTERF;KE! z-nmp><|SEjYjxlBxWQ!}e(=4*;_X^5`Xay{`D8Qu=^lyY@U*VhwAf))#)Zp5r7{{g z`8_OLi-Nm3_JwRRTo#*A6f7HUmF!&IHr*qH>cQ3L7#(~+B3&EOSypG!_$Jlp9yOz! z38uqP;zr5{$+k@^!t-|lWvD%comxr>f@GFM2}oX+tN0`oCLAd>-e;|tD{#Zf)y$ND z?KrHed{lIkLM85>ILQj?v_Tc#+HlP#TB6*ecwP_}gn3DIHv-$)qG4}9p zT7mqD&RtaIXK7brQO0knrKwj?3gS=UzXnX`bba_{fO^?l9Ak9%^tScDA&o+c7b7xaW7&vL_h(`K!VY2Vf7X%hX8e=rbVndiL7o@Q`#0OFvvYjv{t zFwJKC0<|P^&v4nk=Kf{DpXH19dGirV|KTdBkI2Oz(Orv>)6e{oio0EBAio2;Ymj}9 z-qD_>~7II5uWw-7#) za{=tJj-;bCK&a^mM`jYqAAfI@v?KJ}Y6^Y~7D5zn-|E*5j!7MTSij5=zQG&dUSfG%5NXBeJL0^K$J)lgRx zIO%u6xqgejUf-Y=2zL9aeIjcPP<_CGg0yL@K6}FKydvkW)9Sek7is~O2*K?n#EBt0 z!0EUuRQ|E>RKK!t{!kNYwdredeT|Qu+1e0!H-K7|yKPRY8X(1?Z+i0NPABBpHADBt zhyS<)UYo;vRV+a3`P*-LcU*oj#9y$J>xwS%dBLoq&=2>ejl~19gc}FuGm1nHXF?7o z!(TgA;S)|2N-mbv2HAwsgtUYZ?Kmkuq0=kL9xzv{=UHAS+>46<)0Hu`<;R{1VZ~La YOy;MR?;ys0L1$kl13gm+5$yEx-}G_s2LJ#7 literal 0 HcmV?d00001 diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/images/img_1.png b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef15cc4691efcdd7831da6ab324658ebcb1efb0 GIT binary patch literal 3208 zcmeHK`CAj$8cxC_28cjWFa@kZLA|IDMG!?G-~zaya+wg6Wn7?I+Ok9tBM?G*^{P`@C1Oj2Yug_Y40zr?WeNUiHefm(Iz0-aXx&Gc>1X+_+kM_sfaE@=p=FJ2< z?K_n~JhG1fO{r)f3+lu(h z?C%VT3Q(F+)O2PT(bh9P(~jtGaWvG{-(gI{XJsAlxOl?ER1{#HMXLgpE5yqR z8xB-XY)l~#Nf6b9!9v`iu9p=j8dkur-0LCAf0l?V#GwIhB|Q0|Dto_(ykDB$ULU)> zLh@}u5*&A>p25;ts`ru{`g*pAlS_EP!_wYIcVo!Hi2+T&cn2Ibn>pqCgQ`oAKstA| zn8(S256?@#KoLqQi96zo?2hPt{#Ocrt0it1SRES@^@hT1Gq#0Ky~i)9YV`C$%y$7Keyins&T#F{uEA1Gd%>N< zliRYQ%$MQwN+PudHjmyKy?Y_=a`kTtYU_>1XJ2dx*8r|HWxKJG{g+B3_?rS9ixqdTuXc3DV&nwWaZQwKl_ z+BU0h=Q_hJKJJyGTZ^40lCY#gT;VRcq_*1To0HRa&!okMdL|d4mBvYEcq;II)|~TG ziN~r_&!Zmp7CUyzjJM#N&lTiF4$6D)P3Vo3(1XRU15F-i+}}+3ORLq7F+S1uR%JOZ z^z?K7qIm8LH_QyT-c-#R8C8v+KR1e$1|8^H`DV#iz&k+@4wVfQ(3qBQFm-$*XUU^~ z#em9?M)Jo+RKNCzV;g~6H)v!TI+G@YRmwv{GTZ_bPd-UJNp{ao#Tq+ZgK;n`HX^6V zg-G;;zyZ1KM<#0N9;g*VdVFKRJf7hTEpcDB)pVK57w9wL4F|P zNK{OACJS5J!`|S7mLt(b$|p+pdur5)k)*~MAeCr$j1m4xNOc~fIPjzo#6xYEh7`+| zC1-$h>b04VqUqZj`epk7MlXEeQ)8t|Ob|gz z^(>z*3jtR1h!}El*Y}`eMA%!l#}v`o6h!g0F!GGf2=!qx=~uGn zf&JOUV(zWLuH#NJ8wNcs;QnViIQGtG(3iKXf5)e5LR)Y5CpZI^&oH6od=uSosxzYN zQz`SzxB#6Tt)S8Qr+Cm~X%Hklacm{1uu&_BunevOM(atb*#BYqpNGYVncynF1K3R@ zeFJrEU%I!v*lB}~tjN_AGhvPMOKZT*bx6go!NQG|V>UV&3t2cge-R}WQ{1%y#CImS z>QhSEuSvE6HbLu2n@{GS5!M%5!2(%WlyCI5(iF^M1t0wtm=qv{u)(+Cw-U4W(qWX}^x%5$8KYIGhwa z7~_-o2<1!X&?+MT#9me#0(Vd=SX>rUQZL5R?s|YWZe@SC?YiH}Zd9F|R()lRr>f2c z3RGzZdP|a}X{s#e*D&68mW**HJ!QBPxzw4|rfhcC9MWFLU9IzyrS+G)Xtnkk}O&EVgQZ zgw?16d`4o$zLxpxY*3?LKFerM{RT{Mj#0oni)7Y@ua?ytPG0)z!Y9+Y9xwVzM*JHZbe@x(})XI*V7`7q4;a zz}E&r@x4xb?VuO;TxGMviM}Z*SiDHZ?!01ZGT#h$dAaAaNSIK32zCfeYS+$|JxMG2 z>ZfKL!z;0b@yi3T!5A{h4VGAH2iq5|HKVQ};O1u`wt~Q6=>#># zE{rxbHQ4$>!uNCR!?-!{cM^Ei_F0D?r_OFouNQ2zW>w{mmM?ScBYy|EYqz}RmFDOB zmC1#%E(-0;*vz-HMkKxK9=;Jvjh>DiP1g_~`AbWCJm$}y`WN84&Tp;E3rYPCBjh4n literal 0 HcmV?d00001 diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/images/img_2.png b/OCH/shuttle/driver_weaknet/src/main/assets/images/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b68ce5eb1d77d1e49b8e32001863e57db92eec GIT binary patch literal 1654 zcmd5+`%{xg6kUm=AmF2jM1lkz6)EzP5&;dAf(nHILK4*BJz{KtBmz;45VcS!MF_3a zT8PG4M+kWldDx0PRYXOgj)q5-0A&ypk*J6SXrMRJKcYW;yLY}lyZ794&u(Ev*glID zHY*T97QsP*kqBY15NDYf#vtsN4klA}(7_Ctmwo)gx7_W8U^AC;ATuC6IWd!!j*v-N zM(Bg^uc+)$r(owuHaR4O?Ba+;{#E|BX6uWy=mye$f2-@K>8z&4` zO$lpz-=)#UB_2w3`;3F6xcz$b_%GCyq8XWf>^wrloxj(PzdG(Yl#%LOVy&Fg9GtG> zHtKj^|9tFSj=UincEFnuUu#`@cPts15 z)7JYwsLXGx((L6lsUz(XN~nLKe66895#PRIOEm8lvm^pjBZPFek0h5R@!TfV zthGcdF)PS&MMx3D7ZW6YzAwmx`Jn~8(oZnCeK|teJfh&kB6DXN#kVv!zwOX;Koste z;%%^?>J@jA`DQx3Jid@e{8(k3$|_R6WIL9^)Qzw*8`oBqUj2(NM(+} zmn=iWSp#Wjq7&J2AHO5(K+n=CvaYA=?wDlG-JB0?*}P^n9Ng{) zTMr}T#kAX5-^#>M1~+(s)!pthF%uTKyOi0}wXhlUXvt+a#Lt`vpFmSbjz?iAtbBi^ zOlkuM^)XeMlPxLw4X*uimuki)C~=G@p495wo;hKuEfhX&$4c-7gJ0e~JM>2G)?dYo z$p%X_+szAKwd6QHcIwFpUITYBjVE51k;hM1V?9YWvzeU4^_I|OCr;&@me-OUkE7`0 za-uGg9vW`PPYv<<@f=rO1pKANhS~y;3om)o+6tM`yiX7=HM)f+xG6P(ESuqZS)sxk za};h_W2(O~i!|8=rVEfXK3-0=(cY>YPAl+kYdMf}SqTo)*^(FyThs)?RK=Zz@zb)o z8w~>;G9Qqk)4iI<>M! literal 0 HcmV?d00001 diff --git a/OCH/shuttle/driver_weaknet/src/main/assets/slide.json b/OCH/shuttle/driver_weaknet/src/main/assets/slide.json new file mode 100644 index 0000000000..d17a977599 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/assets/slide.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":25,"ip":0,"op":25,"w":774,"h":120,"nm":"矩形@2x","ddd":0,"assets":[{"id":"image_0","w":87,"h":100,"u":"images/","p":"img_0.png","e":0},{"id":"image_1","w":774,"h":120,"u":"images/","p":"img_1.png","e":0},{"id":"comp_0","nm":"预合成 1","fr":25,"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"t":13,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1371,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1511,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1231,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1371,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[1091,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1231,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[951,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[1091,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[811,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[951,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[671,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[811,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[531,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[671,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[391,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[531,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[251,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[391,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"img_0.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":25,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[111,60,0],"to":[23.333,0,0],"ti":[-23.333,0,0]},{"t":25,"s":[251,60,0]}],"ix":2,"l":2},"a":{"a":0,"k":[43.5,50,0],"ix":1,"l":2},"s":{"a":0,"k":[173.563,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":8,"ty":0,"nm":"预合成 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[770,60,0],"ix":1,"l":2},"s":{"a":0,"k":[50.649,90,100],"ix":6,"l":2}},"ao":0,"w":1540,"h":120,"ip":0,"op":25,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"img_1.png","cl":"png","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[387,60,0],"ix":2,"l":2},"a":{"a":0,"k":[387,60,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":25,"st":0,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt index 38f210681c..55ff7d88dd 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchtask/SwitchLineTaskAdapter.kt @@ -71,10 +71,12 @@ class SwitchLineTaskAdapter( if(checkTask!!.taskId==task.taskId){ checkTask = null mTaskItemClickListener?.onItemClick(currentPosition,false) + notifyItemChanged(currentPosition) }else { resetOther() checkTask = task mTaskItemClickListener?.onItemClick(currentPosition,true) + notifyItemChanged(currentPosition) } } @@ -88,6 +90,7 @@ class SwitchLineTaskAdapter( if(checkTask!=null && result.taskId==checkTask!!.taskId){ checkTask = null notifyItemChanged(index) + return } } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt index 72aa680c1f..7504d76eb1 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/view/BizLeaveStationView.kt @@ -9,8 +9,11 @@ import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.shuttle.weaknet.R import kotlinx.android.synthetic.main.shuttle_weak_task_leave_station_view.view.actv_draggable +import kotlinx.android.synthetic.main.shuttle_weak_task_leave_station_view.view.lottie_bg class BizLeaveStationView @JvmOverloads constructor( context: Context, @@ -38,6 +41,7 @@ class BizLeaveStationView @JvmOverloads constructor( init { LayoutInflater.from(context).inflate(R.layout.shuttle_weak_task_leave_station_view, this, true) draggableButton = findViewById(R.id.actv_draggable) + lottie_bg.setImageAssetsFolder("images") } override fun onAttachedToWindow() { @@ -87,7 +91,12 @@ class BizLeaveStationView @JvmOverloads constructor( duration = 100 }.start() }else if (draggableButton.translationX>=(width-draggableButton.width)){ - slideListener?.slideEnd() + lottie_bg.setAnimation("data.json") + lottie_bg.playAnimation() + actv_draggable.setTextColor(ResourcesUtils.getColor(R.color.shuttle_driver_80FFFFFF)) + RxUtils.createSubscribe(1_000) { + slideListener?.slideEnd() + } }else{ ObjectAnimator.ofFloat( draggableButton, "translationX", draggableButton.translationX, @@ -106,6 +115,9 @@ class BizLeaveStationView @JvmOverloads constructor( override fun onVisibilityAggregated(isVisible: Boolean) { super.onVisibilityAggregated(isVisible) if(isVisible){ + lottie_bg.setAnimation("slide.json") + lottie_bg.playAnimation() + actv_draggable.setTextColor(ResourcesUtils.getColor(R.color.white)) ObjectAnimator.ofFloat( draggableButton, "translationX", draggableButton.translationX, 0f diff --git a/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml b/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml index 5d58260925..9dc73b9a7c 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/drawable/bus_task_current_station_bg.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml index ce187c43ba..ff7fa80565 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_task_leave_station_view.xml @@ -7,14 +7,24 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"> - + + + + + + + + + + app:layout_constraintTop_toTopOf="parent" + app:lottie_fileName="slide.json" + app:lottie_loop="true" + app:lottie_autoPlay="true"/> #BF0E3DBC #BF1E2E89 #D4D4D4 + #80FFFFFF \ No newline at end of file diff --git a/config.gradle b/config.gradle index 1af3e24e20..5fe07c2dfa 100644 --- a/config.gradle +++ b/config.gradle @@ -20,6 +20,7 @@ ext { localbroadcastmanager : "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0", // flexbox flexbox : 'com.google.android.flexbox:flexbox:3.0.0', + lottie :'com.airbnb.android:lottie:5.2.0', guava :'com.google.guava:guava:29.0-android', // 测试 junit : "junit:junit:4.12", From 0b2aa647412f0577f0daef46f6dd66b66a41e7bd Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 26 Sep 2024 17:14:05 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[6.7.0][=E7=8A=B6=E6=80=81=E6=A0=8F?= =?UTF-8?q?=E6=94=B9=E7=89=88]=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/taxi/ui/BaseTaxiTabFragment.java | 68 +++--- app/build.gradle | 2 +- .../hmi/ui/operate/OperatePanelLayout.kt | 193 ++++++++++++++++-- .../preferences/PreferenceWithSpeedSetting.kt | 35 +++- .../main/res/layout/layout_operate_panel.xml | 2 +- ...yout_operate_panel_detail_recyclerview.xml | 2 + ...layout_operate_panel_preference_header.xml | 2 + ...rate_panel_preference_details_business.xml | 30 +-- .../core/data/config/FunctionBuildConfig.kt | 7 + ...CallerAutopilotCarConfigListenerManager.kt | 2 + 10 files changed, 271 insertions(+), 72 deletions(-) diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index b4482c5db0..cee8353a29 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -17,8 +17,8 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Group; +import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentTransaction; import com.mogo.commons.mvp.IView; @@ -29,7 +29,6 @@ import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener; 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.autopilot.CallerAutopilotRecordListenerManager; -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager; import com.mogo.eagle.core.function.hmi.map.MapContainerLayout; import com.mogo.eagle.core.function.view.MapRoamView; @@ -46,9 +45,6 @@ import com.mogo.och.taxi.R; import java.lang.ref.WeakReference; -import me.jessyan.autosize.utils.AutoSizeUtils; - - /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 *

@@ -56,7 +52,7 @@ import me.jessyan.autosize.utils.AutoSizeUtils; * * @author tongchenfei */ -public abstract class BaseTaxiTabFragment> extends MvpFragment implements IMogoMapListener{ +public abstract class BaseTaxiTabFragment> extends MvpFragment implements IMogoMapListener { private static final String TAG = "BaseOchFragment"; private RelativeLayout ctvAutopilotStatusRL; @@ -66,7 +62,7 @@ public abstract class BaseTaxiTabFragment - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE,true) + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, true) ); // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态 findViewById(R.id.btnAutopilotEnable).setOnClickListener(view -> - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE,true) + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, true) ); // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人 findViewById(R.id.btnAutopilotRunning).setOnClickListener(view -> - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING,true) + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, true) ); findViewById(R.id.btnAutopilotmanco).setOnClickListener(view -> - onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING,true)); + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING, true)); tvOperationStatus.setOnClickListener(new OnPreventFastClickListener() { @Override @@ -190,16 +186,19 @@ public abstract class BaseTaxiTabFragment(new TaxiPersonalDialogFragment()); - personalDialogFragment.get().show(getActivity().getSupportFragmentManager(), "service_data"); + FragmentActivity activity = getActivity(); + if (activity != null) { + personalDialogFragment.get().show(activity.getSupportFragmentManager(), "service_data"); + } } }); - CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()),10); + CallerEagleBaseFunctionCall4OchManager.INSTANCE.addSingleToolKitCustomItem(lineView, new LineView(getContext()), 10); } } @@ -245,7 +244,7 @@ public abstract class BaseTaxiTabFragment(KEY_DEMO_SWITCH)?.also { + it.extras.putBoolean("is_pressed", false) + changeValue(it, checked) + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + CallerHmiViewControlListenerManager.removeListener(TAG) + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.operate_panel_preference_details_demo, rootKey) } @@ -427,13 +458,17 @@ class OperatePanelLayout : LinearLayout { override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { when (preference.key) { KEY_DEMO_SWITCH -> { + val isPressed = preference.extras.getBoolean("is_pressed", true) + if (!isPressed) { + preference.extras.remove("is_pressed") + return true + } val isChecked = newValue as? Boolean ?: false hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode) clickEventAnalytics("美化模式", isChecked) FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode) - CallerSopSettingManager.invokeDemoModeListener(isChecked) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode) } @@ -455,14 +490,35 @@ class OperatePanelLayout : LinearLayout { } } - class HdMapPreferenceFragmentCompat : OperatePanelDetailBase() { + class HdMapPreferenceFragmentCompat : OperatePanelDetailBase(), ISopSettingListener { companion object { + private const val TAG = "HdMapPreferenceFragmentCompat" private const val KEY_DANGER_OBSTACLES_COLOR_MARK = "danger_obstacles_color_mark" private const val KEY_ROUTE_GUIDE_LINE_DYNAMIC_EFFECT = "route_guide_line_dynamic_effect" private const val KEY_POINT_CLOUD_EFFECT = "point_cloud_effect" private const val KEY_SELF_CAR_APERTURE = "self_car_aperture" } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + CallerSopSettingManager.addListener(TAG, this) + } + + override fun onDestroyView() { + super.onDestroyView() + CallerSopSettingManager.removeListener(TAG) + } + + override fun onPointCloudClickEvent(status: Boolean) { + super.onPointCloudClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_POINT_CLOUD_EFFECT)?.also { changeValue(it, status) } + } + + override fun onCarApertureClickEvent(status: Boolean) { + super.onCarApertureClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_SELF_CAR_APERTURE)?.also { changeValue(it, status) } + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.operate_panel_preference_details_hdmap, rootKey) } @@ -539,11 +595,12 @@ class OperatePanelLayout : LinearLayout { private const val KEY_RED_OR_GREEN_LIGHT_MERGE_MARKER = "red_or_green_light_merge_marker" private const val KEY_FAULT_REPORT_TIP = "fault_report_tip" private const val KEY_LIMIT_SPEED_MARKER = "limit_speed_marker" - private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode" - private const val KEY_LOOK_AROUND_360 = "look_around_360" private const val KEY_WEATHER_EFFECT_SWITCH = "weather_effect_switch" private const val KEY_SYSTEM_BOOT_STATUS_SHOW = "system_boot_status_show" + private const val KEY_SELF_ROUTING_VERIFY_MODE = "self_routing_verify_mode" private const val KEY_UNMANNED_DEMO_PULL_INTERVAL = "unmanned_demo_pull_interval" + private const val KEY_SWEEPER_CLOUD_CONTROL = "sweeper_cloud_control" + private const val KEY_LOOK_AROUND_360 = "look_around_360" } override fun getDefaultVal(pref: Preference): Any? { @@ -575,6 +632,16 @@ class OperatePanelLayout : LinearLayout { KEY_UNMANNED_DEMO_PULL_INTERVAL -> { return CallerUnmannedListenerManager.getVirtualTaskPullTaskIntervalF() } + KEY_SWEEPER_CLOUD_CONTROL -> { + if (!isEnabled(pref)) { + return false + } + return if (SweeperVehicleConfigUtils.isSPExistCurrentSweeperModeConfig()) { + SweeperVehicleConfigUtils.isSPCurrentSweeperCloudMode() + } else { + SweeperVehicleConfigUtils.isDefaultSweeperCloudMode(FunctionBuildConfig.sweeperDefaultMode) + } + } } return super.getDefaultVal(pref) } @@ -590,6 +657,9 @@ class OperatePanelLayout : LinearLayout { KEY_WEATHER_EFFECT_SWITCH -> { AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) } + KEY_SWEEPER_CLOUD_CONTROL -> { + return AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode) && (SweeperVehicleConfigUtils.isDefaultSweeperCanSwitchMode(FunctionBuildConfig.sweeperCanSwitchMode)) + } else -> super.isEnabled(pref) } } @@ -606,7 +676,7 @@ class OperatePanelLayout : LinearLayout { PreferenceWithUnmanInterval.Interval.FORTY_FIVE_SECOND -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(45) PreferenceWithUnmanInterval.Interval.NEVER -> CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(-1) } - clickEventAnalytics("Taxi无人化演练任务拉取时间间隔",true) + clickEventAnalytics("Taxi无人化演练任务拉取时间间隔", true) } } return super.onPreferenceClick(preference) @@ -701,6 +771,27 @@ class OperatePanelLayout : LinearLayout { HmiBuildConfig.isShowConnectionProgressView = isChecked CallerHmiViewControlListenerManager.updateConnectionProgressView(isChecked) } + KEY_SWEEPER_CLOUD_CONTROL -> { + val isChecked = newValue as? Boolean ?: false + val activity = AppStateManager.currentActivity() + if (activity != null) { + val confirmDialog = SweeperModeChangedConfirmDialog(activity) + confirmDialog.setClickListener(object: SweeperModeChangedConfirmDialog.ClickListener { + override fun confirm() { + CallerSweeperModeListenerManager.invokeSweeperModeListeners( + if (isChecked) SweeperVehicleConfigUtils.BUSINESS_MODE_CLOUD + else SweeperVehicleConfigUtils.BUSINESS_MODE_OPERATE + ) + } + + override fun cancel() { + preferenceScreen.findPreferenceReal(KEY_WEATHER_EFFECT_SWITCH)?.also { changeValue(it, !isChecked) } + } + }) + confirmDialog.showSweeperModeChangeConfirmDialog() + } + clickEventAnalytics("清扫云控业务",isChecked) + } } return super.onPreferenceChange(preference, newValue) } @@ -788,8 +879,9 @@ class OperatePanelLayout : LinearLayout { } } - class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase() { + class VehiclesPreferenceFragmentCompat : OperatePanelDetailBase(), IMoGoAutopilotCarConfigListener, ISopSettingListener, IViewControlListener { companion object { + private const val TAG = "VehiclesPreferenceFragmentCompat" private const val KEY_PNC_PARK_INTERSECTION_CAR = "pnc_park_intersection_car" private const val KEY_PNC_PARK_OVERTAKE_CAR = "pnc_park_overtake_car" private const val KEY_DETOUR_RETARD_PARK = "detour_retard_park" @@ -807,10 +899,52 @@ class OperatePanelLayout : LinearLayout { private const val KEY_OVERTAKE_SPEED_THRESHOLDSS = "overtake_speed_thresholds" } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerSopSettingManager.addListener(TAG, this) + CallerHmiViewControlListenerManager.addListener(TAG, this) + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun updateFuncMode(tag: String, checked: Boolean) { + super.updateFuncMode(tag, checked) + if (tag == FUNC_MODE_RAIN) { + preferenceScreen.findPreferenceReal(KEY_RAIN_DAY)?.also { + it.extras.putBoolean("is_pressed", false) + changeValue(it, checked) + } + } + } + + override fun onDestroyView() { + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + CallerSopSettingManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) + super.onDestroyView() + } + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.operate_panel_preference_details_vehicles, rootKey) } + override fun onExamControlClickEvent(status: Boolean) { + super.onExamControlClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_EXAM_FUNCTION_PANEL)?.also { changeValue(it, status) } + } + + override fun onRainModeClickEvent(status: Boolean) { + super.onRainModeClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_RAIN_DAY)?.also { changeValue(it, status) } + } + + override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { + super.onAutopilotCarConfig(carConfigResp) + lifecycleScope.launch { + val max = carConfigResp.speedLimit * 3.6 + preferenceScreen.findPreferenceReal(KEY_AUTO_PILOT_SPEED_THRESHOLDS)?.update(listOf("0", "$max", "$max", "5")) + } + } + override fun isEnabled(pref: Preference): Boolean { when (pref.key) { KEY_AUTO_PILOT_SPEED_THRESHOLDS, KEY_OVERTAKE_SPEED_THRESHOLDSS -> { @@ -855,13 +989,14 @@ class OperatePanelLayout : LinearLayout { KEY_PURE_OBU_MODE -> { return FunctionBuildConfig.fusionMode == 5 } + KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { + return listOf("0.0", "${FunctionBuildConfig.maxSpeedLimit}", "${FunctionBuildConfig.maxSpeedLimit}", "5.0") + } KEY_CHANGE_LANE_SPEED_THRESHOLDS -> { - return setOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5") + return listOf("3.0", "7.0", "${FunctionBuildConfig.detouringSpeed}", "0.5") } KEY_OVERTAKE_SPEED_THRESHOLDSS -> { - return setOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5") - } - KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { //TODO renwj 自动驾驶速度阈值,旧版本没有看到 + return listOf("3.0", "12.5", "${FunctionBuildConfig.overTakeSpeed}", "0.5") } } return super.getDefaultVal(pref) @@ -871,7 +1006,20 @@ class OperatePanelLayout : LinearLayout { Log.d(TAG, "-- onPreferenceClick --:pref -> $preference") when (preference.key) { KEY_AUTO_PILOT_SPEED_THRESHOLDS -> { - FunctionBuildConfig.detouringSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toFloat()).toInt() + FunctionBuildConfig.maxSpeedLimit = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.maxSpeedLimit) + val isSuccess = CallerAutoPilotControlManager.setAutoPilotSpeed(FunctionBuildConfig.maxSpeedLimit.toInt()) + when { + isSuccess -> { + ToastUtils.showShort("车速设置成功,立即生效") + } + else -> { + ToastUtils.showShort("设置车速失败,请启动域控制器") + } + } + return true + } + KEY_CHANGE_LANE_SPEED_THRESHOLDS -> { + FunctionBuildConfig.detouringSpeed = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.detouringSpeed.toDouble()).toInt() hmiAction("SOP 变道绕障的目标障碍物速度阈值", FunctionBuildConfig.detouringSpeed) val isSuccess = CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble()) if (isSuccess == true) { @@ -882,9 +1030,10 @@ class OperatePanelLayout : LinearLayout { hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "失败") } clickEventAnalytics("变道速度阈值", true) + return true } KEY_OVERTAKE_SPEED_THRESHOLDSS -> { - FunctionBuildConfig.overTakeSpeed = preference.extras.getFloat(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed) + FunctionBuildConfig.overTakeSpeed = preference.extras.getDouble(PreferenceWithSpeedSetting.KEY_BUNDLE_CURRENT_VALUE, FunctionBuildConfig.overTakeSpeed.toDouble()).toFloat() val isSuccess = CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble()) if (isSuccess == true) { ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功") @@ -894,6 +1043,7 @@ class OperatePanelLayout : LinearLayout { hmiAction("SOP 超车目标障碍物速度阈值设置", "失败") } clickEventAnalytics("超车速度阈值", true) + return true } } return super.onPreferenceClick(preference) @@ -906,12 +1056,14 @@ class OperatePanelLayout : LinearLayout { hmiAction("SOP PNC-park-会车, ", isChecked) CallerAutoPilotControlManager.sendParkVehCross(isChecked) FunctionBuildConfig.isOpenParkVehCross = isChecked + return true } KEY_PNC_PARK_OVERTAKE_CAR -> { val isChecked = newValue as? Boolean ?: false hmiAction("SOP PNC-park-超车, ", isChecked) CallerAutoPilotControlManager.sendParkVehOvertake(isChecked) FunctionBuildConfig.isOpenOvertake = isChecked + return true } KEY_DETOUR_RETARD_PARK -> { val isChecked = newValue as? Boolean ?: false @@ -919,8 +1071,14 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendDetouring(isChecked) FunctionBuildConfig.isDetouring = isChecked clickEventAnalytics("绕障类功能", isChecked) + return true } KEY_RAIN_DAY -> { + val isPressed = preference.extras.getBoolean("is_pressed", true) + if (!isPressed) { + preference.extras.remove("is_pressed") + return true + } val isChecked = newValue as? Boolean ?: false hmiAction("SOP 雨天模式开关, ", isChecked) clickEventAnalytics("雨天模式", isChecked) @@ -928,6 +1086,7 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.setRainMode(isChecked) CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked) CallerSopSettingManager.invokeRainModeListener(isChecked) + return true } KEY_WEAK_NET_DECELERATION_PARK -> { val isChecked = newValue as? Boolean ?: false @@ -935,6 +1094,7 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked) hmiAction("SOP 弱网减速停车, ", isChecked) clickEventAnalytics("弱网减速停车", isChecked) + return true } KEY_FAULT_DECELERATION_PARK -> { val isChecked = newValue as? Boolean ?: false @@ -942,6 +1102,7 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked) hmiAction("SOP 故障减速停车, ", isChecked) clickEventAnalytics("故障减速停车", isChecked) + return true } KEY_EXAM_FUNCTION_PANEL -> { val isChecked = newValue as? Boolean ?: false @@ -949,36 +1110,42 @@ class OperatePanelLayout : LinearLayout { CallerDevaToolsManager.showExamControlWindow(isChecked) hmiAction("SOP 考试功能面板, ", isChecked) clickEventAnalytics("考试功能面板", isChecked) + return true } KEY_ALL_MERGE_MODE -> { FunctionBuildConfig.fusionMode = 1 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_BLIND_AREA_MODE -> { FunctionBuildConfig.fusionMode = 2 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_BEYOND_VISUAL_RANGE_MODE -> { FunctionBuildConfig.fusionMode = 3 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_TRANSPARENT_TRANSFER_MODE -> { FunctionBuildConfig.fusionMode = 4 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } KEY_PURE_OBU_MODE -> { FunctionBuildConfig.fusionMode = 5 hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode) clickEventAnalytics("融合模式", true) CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode) + return true } } return super.onPreferenceChange(preference, newValue) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt index aa5d4c529d..746b02b3ba 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/preferences/PreferenceWithSpeedSetting.kt @@ -21,24 +21,34 @@ class PreferenceWithSpeedSetting : Preference { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context) : super(context) - private var mDefaultValueSet: Any? = null + private var mSpeedData: Any? = null + private var mFlag = true override fun setDefaultValue(defaultValue: Any?) { super.setDefaultValue(defaultValue) - mDefaultValueSet = defaultValue + mSpeedData = defaultValue notifyChanged() } + fun update(data: List) { + mSpeedData = data + notifyChanged() + } + + override fun onSetInitialValue(defaultValue: Any?) { + super.onSetInitialValue(defaultValue) + } + override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) - val defaultSet = mDefaultValueSet ?: return - if (defaultSet !is Set<*> || defaultSet.size != 4) { + val speedData = mSpeedData ?: return + if (speedData !is List<*> || speedData.size != 4) { throw AssertionError() } - val min = (defaultSet.elementAt(0) as String).toFloat() - val max = (defaultSet.elementAt(1) as String).toFloat() - var cur = (defaultSet.elementAt(2) as String).toFloat() - val step = (defaultSet.elementAt(3) as String).toFloat() + val min = (speedData.elementAt(0) as String).toDouble() + val max = (speedData.elementAt(1) as String).toDouble() + var cur = (speedData.elementAt(2) as String).toDouble() + val step = (speedData.elementAt(3) as String).toDouble() if (min > max) { throw AssertionError() } @@ -52,7 +62,7 @@ class PreferenceWithSpeedSetting : Preference { val btnOk = holder.findViewById(R.id.bt_ok) val speedLimit = holder.findViewById(R.id.tv_speed_limit) as? TextView if (speedLimit?.tag != null && speedLimit.tag is Float) { - cur = max(cur, speedLimit.tag as Float) + cur = max(cur, speedLimit.tag as Double) } speedLimit?.text = cur.toString() val minus = holder.findViewById(R.id.iv_speed_minus) @@ -83,11 +93,14 @@ class PreferenceWithSpeedSetting : Preference { speedLimit?.tag = addAfter speedLimit?.text = addAfter.toString() } - btnOk.isEnabled = false + if (mFlag) { + mFlag = false + btnOk.isEnabled = false + } btnOk.setOnClickListener(null) btnOk.onClick { onPreferenceClickListener?.also { - extras.putFloat(KEY_BUNDLE_CURRENT_VALUE, cur) + extras.putDouble(KEY_BUNDLE_CURRENT_VALUE, cur) it.onPreferenceClick(this) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml index 0e11fe1a9f..b33f81bce6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/dp_86" android:layout_marginStart="@dimen/dp_60" - android:layout_marginTop="@dimen/dp_112" + android:layout_marginTop="@dimen/dp_56" android:orientation="horizontal"> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml index 78d511e5e8..3dfd09b5b0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_operate_panel_preference_header.xml @@ -2,6 +2,7 @@ - - + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index c68c7834f4..f4b11751e2 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -441,4 +441,11 @@ object FunctionBuildConfig { @Volatile @JvmField var welcomeWords: String? = null + + /** + * 最大限速值 + */ + @Volatile + @JvmField + var maxSpeedLimit: Double = 0.0 } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt index dbf75c5c27..be3164e6b4 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.autopilot +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.call.base.CallerBase import mogo.telematics.pad.MessagePad @@ -28,6 +29,7 @@ object CallerAutopilotCarConfigListenerManager : CallerBase