From 576a0c6add7b124a37267feffba9a9f4501ae87c Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 30 Nov 2022 23:32:00 +0800 Subject: [PATCH] =?UTF-8?q?[2.13.0]=E6=B6=88=E6=81=AF=E7=9B=92=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevaToolsProvider.kt | 5 +- .../badcase/BadCaseManager.kt | 23 ++-- .../badcase/biz/PassiveBadCaseWindow.kt | 16 ++- .../core/function/hmi/ui/MoGoHmiFragment.kt | 18 +++- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 29 +++-- .../hmi/ui/msgbox/DriverMsgBoxListView.kt | 36 ++++++- .../ui/msgbox/PassengerMsgBoxBubbleView.kt | 77 +++++++++++++ .../adapter/DriverMsgBoxBubbleAdapter.kt | 69 ++++++++++-- .../msgbox/adapter/DriverMsgBoxListAdapter.kt | 48 +++++++-- .../adapter/PassengerMsgBoxBubbleAdapter.kt | 102 ++++++++++++++++++ .../res/drawable-xhdpi/icon_msg_close.png | Bin 0 -> 269 bytes .../main/res/drawable-xhdpi/icon_msg_open.png | Bin 0 -> 269 bytes .../drawable-xhdpi/icon_notice_default.png | Bin 0 -> 19079 bytes .../icon_passenger_operation.png | Bin 0 -> 19096 bytes .../res/drawable/bg_msg_status_select.xml | 5 + .../src/main/res/layout/fragment_hmi.xml | 40 +++++-- .../res/layout/item_msg_box_ipc_report.xml | 14 ++- .../main/res/layout/item_msg_box_notice.xml | 50 ++++++--- .../res/layout/item_msg_box_operation.xml | 7 ++ .../src/main/res/layout/item_msg_box_v2x.xml | 50 +++++++++ .../layout/item_passenger_msg_box_notice.xml | 46 ++++++++ .../item_passenger_msg_box_operation.xml | 84 +++++++++++++++ .../layout_passenger_msg_box_bubble.xml | 8 ++ .../eagle/core/data/enums/EventTypeEnum.kt | 4 +- .../api/devatools/IDevaToolsProvider.kt | 3 +- .../call/devatools/CallerDevaToolsManager.kt | 5 +- .../main/res/drawable-xhdpi/icon_default.png | Bin 0 -> 16208 bytes 27 files changed, 673 insertions(+), 66 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_close.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_open.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_notice_default.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_passenger_operation.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml create mode 100644 core/mogo-core-res/src/main/res/drawable-xhdpi/icon_default.png diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 51cba44a50..7e2d572880 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter @@ -97,8 +98,8 @@ class DevaToolsProvider : IDevaToolsProvider { BadCaseManager.initAiCollect(view) } - override fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { - BadCaseManager.onReceiveBadCaseRecord(recordKey, fileName, activity) + override fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) { + BadCaseManager.onReceiveBadCaseRecord(msgBoxBean, activity,countdown) } override fun showFeedbackWindow(ctx: Context) { 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 77f3c3672d..944cad91bc 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 @@ -14,6 +14,8 @@ import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager import com.mogo.eagle.core.utilcode.kotlin.PX import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner @@ -23,10 +25,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.reminder.Reminder import com.mogo.eagle.core.utilcode.reminder.api.IReminder import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IGlobalStateChangeListener -import com.mogo.eagle.core.utilcode.util.ClickUtils -import com.mogo.eagle.core.utilcode.util.NetworkUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.badcase.biz.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord @@ -168,19 +167,29 @@ internal object BadCaseManager : LifecycleEventObserver { } } - fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { + fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) { CallerLogger.d("$M_DEVA$TAG", "收到录包结果回调${record}") CallerLogger.d("$M_DEVA$TAG", "开始创建被动录包弹窗,window num=${BadCaseConfig.windowNum}") - CallerLogger.d("$M_DEVA$TAG","key=${recordKey};filename${fileName}") ThreadUtils.runOnUiThread { val passiveBadCaseWindow = PassiveBadCaseWindow(activity) - passiveBadCaseWindow.setRecord(recordKey.toString(),fileName) + passiveBadCaseWindow.setRecord(msgBoxBean) passiveBadCaseWindow.setClickListener(object: PassiveBadCaseWindow.ClickListener{ override fun closeWindow() { passiveBadCaseWindow.hideFloatWindow() } }) passiveBadCaseWindow.showFloatWindow() + if(countdown){ + val countDownTimer = object: CountDownTimer(10000,1000){ + override fun onTick(p0: Long) { + } + + override fun onFinish() { + passiveBadCaseWindow.hideFloatWindow() + } + } + countDownTimer.start() + } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index f97420f379..1a4e463101 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -16,8 +16,11 @@ import android.widget.TextView import com.google.android.flexbox.FlexboxLayout import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.toast.TipToast @@ -59,6 +62,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var uploadReason: String = String() //上报原因,标签 private var recordKey: String?=null //录制bag包key private var recordFileName: String?=null //录制文件包名 + private var boxBean: MsgBoxBean ?= null private var longitude: Double?=null private var latitude: Double?=null @@ -132,11 +136,15 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene }else{ uploadAudio() } + //删除记录 + CallerMsgBoxManager.removeRecordInfo(mActivity, boxBean!!, recordKey!!) } tvPassiveCancel.setOnClickListener { BadCaseConfig.windowNum-- clickListener?.closeWindow() + //删除记录 + CallerMsgBoxManager.removeRecordInfo(mActivity, boxBean!!, recordKey!!) } mWindowParams = WindowManager.LayoutParams() @@ -343,9 +351,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) } - fun setRecord(key:String,fileName:String){ - recordKey = key - recordFileName = fileName + fun setRecord(msgBoxBean: MsgBoxBean){ + boxBean = msgBoxBean + val recordBagMsg = (msgBoxBean.bean as RecordBagMsg) + recordKey = recordBagMsg.key.toString() + recordFileName = recordBagMsg.fileName } fun setClickListener(clickListener: ClickListener) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index e86c041a40..9dd3593284 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -76,6 +76,7 @@ import com.mogo.eagle.core.function.hmi.ui.bindingcar.ToBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.bindingcar.UpgradeAppDialog import com.mogo.eagle.core.function.hmi.ui.camera.CameraListView import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog +import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.NoticeTrafficDialog import com.mogo.eagle.core.function.hmi.ui.setting.DebugSettingView @@ -171,6 +172,8 @@ class MoGoHmiFragment : MvpFragment(), private var reportListFloatWindow: ReportListFloatWindow? = null private var ipcReportWindow: IPCReportWindow? = null + private var passengerMsgBoxBubbleView: PassengerMsgBoxBubbleView ?= null + private var adUpgradeDialog: AdUpgradeDialog? = null private var lastSpeakJob: Job? = null @@ -297,7 +300,7 @@ class MoGoHmiFragment : MvpFragment(), } } - cbMsgBox.setOnCheckedChangeListener { _, isChecked -> + cbMsgBoxDriver.setOnCheckedChangeListener { _, isChecked -> if(isChecked){ viewDriverMsgBoxList.visibility = View.VISIBLE viewDriverMsgBoxBubble.visibility = View.GONE @@ -307,6 +310,19 @@ class MoGoHmiFragment : MvpFragment(), } } + cbMsgBoxPassenger.setOnCheckedChangeListener { _, isChecked -> + + } + + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + cbMsgBoxDriver.visibility = View.VISIBLE + viewDriverMsgBoxBubble.visibility = View.VISIBLE + } + if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + cbMsgBoxPassenger.visibility = View.VISIBLE + viewPassengerMsgBoxBubble.visibility = View.VISIBLE + } } @OptIn(ExperimentalCoroutinesApi::class) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index e0b3932da4..860941333a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -1,16 +1,20 @@ package com.mogo.eagle.core.function.hmi.ui.msgbox +import android.app.Activity import android.content.Context import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater +import android.widget.LinearLayout import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.marginTop import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.OperationMsg import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter @@ -35,19 +39,27 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( var driverMsgBoxBubbleAdapter: DriverMsgBoxBubbleAdapter ?=null private val TAG = "DriverMsgBoxBubbleView" + private val dataList :ArrayList = ArrayList() private fun initView() { val linearLayoutManager = LinearLayoutManager(context) linearLayoutManager.orientation = LinearLayoutManager.VERTICAL linearLayoutManager.stackFromEnd = true linearLayoutManager.reverseLayout = true - driverMsgBoxBubbleAdapter = DriverMsgBoxBubbleAdapter() + driverMsgBoxBubbleAdapter = DriverMsgBoxBubbleAdapter(context as Activity) rvBubbleList.adapter = driverMsgBoxBubbleAdapter rvBubbleList.layoutManager = linearLayoutManager } - override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + override fun onDataChanged(category: MsgCategory, msgBoxBean: MsgBoxBean) { + if(category == MsgCategory.RECORD_BAG){ + //弹出被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) + }else{ + dataList.add(msgBoxBean) + driverMsgBoxBubbleAdapter?.setData(dataList) + } } override fun onAttachedToWindow() { @@ -60,15 +72,12 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( CallerMsgBoxListenerManager.removeListener(TAG) } +// var i = 0 +// // fun setData(){ -// val list :ArrayList = ArrayList() -// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) -// val two = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) -// val three = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) -// list.add(one) -// list.add(two) -// list.add(three) -// driverMsgBoxBubbleAdapter?.setData(list) +// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试"+i++)) +// dataList.add(one) +// driverMsgBoxBubbleAdapter?.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/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt index fb593778d9..7bb930d794 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt @@ -39,6 +39,16 @@ class DriverMsgBoxListView @JvmOverloads constructor( val driverMsgBoxListAdapter= DriverMsgBoxListAdapter(context as Activity) rvMsgBoxList.adapter = driverMsgBoxListAdapter rvMsgBoxList.layoutManager = LinearLayoutManager(context) + //获取通知消息列表 + val noticeList: List? = CallerMsgBoxManager.getCachedNotifyData() + if(noticeList==null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(noticeList) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } + //通知 tvMsgNotice.setOnClickListener { @@ -50,6 +60,13 @@ class DriverMsgBoxListView @JvmOverloads constructor( viewBadCaseDivider.visibility = View.GONE //获取通知消息列表 val noticeList: List? = CallerMsgBoxManager.getCachedNotifyData() + if(noticeList==null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(noticeList.reversed()) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } // val nList: ArrayList = ArrayList() // val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知1",2)) @@ -80,6 +97,13 @@ class DriverMsgBoxListView @JvmOverloads constructor( //获取车辆系统信息列表 val ipcReportList: List? = CallerMsgBoxManager.getCachedSysInfoData() + if(ipcReportList == null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(ipcReportList.reversed()) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } // val ipcList: ArrayList = ArrayList() // val resultList:ArrayList = ArrayList() @@ -123,10 +147,14 @@ class DriverMsgBoxListView @JvmOverloads constructor( viewBadCaseDivider.visibility = View.VISIBLE //获取录包信息列表 -// val badCaseList: List? = CallerMsgBoxManager.getCachedRecordBagData() -// badCaseList?.let { -// driverMsgBoxListAdapter.setData(it) -// } + val badCaseList: List? = CallerMsgBoxManager.getCachedRecordBagData() + if(badCaseList == null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(badCaseList.reversed()) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } // val list : ArrayList = ArrayList() // val one = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt new file mode 100644 index 0000000000..5f4404e3e7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -0,0 +1,77 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.app.Activity +import android.content.Context +import android.graphics.PixelFormat +import android.util.AttributeSet +import android.util.DisplayMetrics +import android.view.* +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxBubbleAdapter +import com.mogo.eagle.core.utilcode.util.BarUtils +import kotlinx.android.synthetic.main.layout_passenger_msg_box_bubble.view.* + +/** + * @author XuXinChao + * @description 乘客端消息盒子气泡列表视图 + * @since: 2022/11/29 + */ +class PassengerMsgBoxBubbleView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener { + + private val TAG = "PassengerMsgBoxBubbleView" + var passengerMsgBoxBubbleAdapter: PassengerMsgBoxBubbleAdapter ?= null + init { + LayoutInflater.from(context).inflate(R.layout.layout_passenger_msg_box_bubble, this, true) + initView() + } + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + linearLayoutManager.stackFromEnd = true + linearLayoutManager.reverseLayout = true + passengerMsgBoxBubbleAdapter = PassengerMsgBoxBubbleAdapter() + rvPassengerBubbleList.adapter = passengerMsgBoxBubbleAdapter + rvPassengerBubbleList.layoutManager = linearLayoutManager + +// setData() + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + + } + +// fun setData(){ +// val list :ArrayList = ArrayList() +// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// val two = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// val three = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// list.add(one) +// list.add(two) +// list.add(three) +// passengerMsgBoxBubbleAdapter?.setData(list) +// } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + } + +} \ 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/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index 9fb3bd89d2..ab1f579879 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -1,18 +1,26 @@ 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.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.enums.EventTypeEnum import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager 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.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat @@ -21,22 +29,22 @@ import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat * @description 司机端消息盒子气泡视图RecyclerView适配器 * @since: 2022/11/25 */ -class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter(){ +class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.Adapter(){ private var data: ArrayList ?= null private val operation: Int = 1 private val notice: Int = 2 private val v2x: Int = 3 - private val obu: Int = 4 - private val report: Int = 5 - private val record: Int = 6 - private val traffic: Int = 7 + private val report: Int = 4 var countDownTimer: CountDownTimer?=null fun setData(data: ArrayList){ this.data = data + if(data.size>4){ + data.removeAt(0) + } notifyDataSetChanged() } @@ -44,9 +52,15 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( if(viewType == operation){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_operation,parent,false) return BubbleOperationHolder(view) - }else{ + }else if(viewType == report){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_report,parent,false) return BubbleReportHolder(view) + }else if(viewType == notice){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_notice,parent,false) + return BubbleNoticeHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_v2x,parent,false) + return BubbleV2XHolder(view) } } @@ -68,6 +82,29 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( } holder.tvBubbleReportType.text = resultStr } + }else if(holder is BubbleNoticeHolder){ + data?.let { + val noticeNormalData = it[position].bean as NoticeNormalData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].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 { + //云公告 + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(holder is BubbleV2XHolder){ + data?.let { + val v2XMsg = it[position].bean as V2XMsg + holder.tvV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvV2XContent.text = v2XMsg.content + holder.ivV2XImage.setImageDrawable(activity.resources.getDrawable(EventTypeEnum.getUpdateIconRes(v2XMsg.type))) + } } val msgBoxBean: MsgBoxBean = data!![position] @@ -93,8 +130,12 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( override fun getItemViewType(position: Int): Int { if(data!![position].type == MsgBoxType.OPERATION){ return operation - }else{ + }else if(data!![position].type == MsgBoxType.REPORT){ return report + }else if(data!![position].type == MsgBoxType.NOTICE){ + return notice + }else{ + return v2x } } @@ -111,6 +152,20 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( var tvBubbleOperationContent: TextView = itemView.findViewById(R.id.tvBubbleOperationContent) } + //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) + } } \ 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/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index 10068108a7..ac49088a0c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -11,15 +11,16 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView -import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.OperationMsg -import com.mogo.eagle.core.data.msgbox.RecordBagMsg +import com.mogo.eagle.core.data.enums.EventTypeEnum +import com.mogo.eagle.core.data.msgbox.* import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager 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 @@ -62,9 +63,12 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada }else if(viewType == operation){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_operation,parent,false) return MsgBoxOperation(view) - }else{ + }else if(viewType == notice){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_notice,parent,false) return MsgBoxNotice(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_v2x,parent,false) + return MsgBoxV2X(view) } } @@ -74,10 +78,11 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada data?.let { holder.tvBagReceiveTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) holder.tvBagRecordTime.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" - val recordBagMsg = (it[position].bean as RecordBagMsg) + val msgBoxBean = it[position] +// val recordBagMsg = (it[position].bean as RecordBagMsg) holder.tvRecordCheck.setOnClickListener { //打开被动录包弹窗 - CallerDevaToolsManager.onReceiveBadCaseRecord(recordBagMsg.key,recordBagMsg.fileName,activity) + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,activity,false) } } }else if(holder is MsgBoxIpcReportHolder){ @@ -111,6 +116,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvReportReasonOpen.text = "原因:${reportEntity.msg}" holder.tvStatusSelect.setOnClickListener { if(holder.tvReportLevelNormal.isVisible){ + holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_close),null,null,null) holder.ivReportImageNormal.visibility = View.GONE holder.tvReportLevelNormal.visibility = View.GONE holder.tvReportTimeNormal.visibility = View.GONE @@ -122,6 +128,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvReportTypeOpen.visibility = View.VISIBLE holder.tvReportReasonOpen.visibility = View.VISIBLE }else{ + holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_open),null,null,null) holder.ivReportImageNormal.visibility = View.VISIBLE holder.tvReportLevelNormal.visibility = View.VISIBLE holder.tvReportTimeNormal.visibility = View.VISIBLE @@ -143,6 +150,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvOperationTime.text = TimeUtils.millis2String(operationMsg.timestamp,getHourMinFormat()) holder.tvOperationStatusSelect.setOnClickListener { if(holder.ivOperationImageNormal.isVisible){ + holder.tvOperationStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_close),null,null,null) holder.ivOperationImageNormal.visibility = View.GONE holder.tvOperationTitleNormal.visibility = View.GONE holder.tvOperationContentNormal.visibility = View.GONE @@ -151,6 +159,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvOperationTitleOpen.visibility = View.VISIBLE holder.tvOperationContentOpen.visibility = View.VISIBLE }else{ + holder.tvOperationStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_open),null,null,null) holder.ivOperationImageNormal.visibility = View.VISIBLE holder.tvOperationTitleNormal.visibility = View.VISIBLE holder.tvOperationContentNormal.visibility = View.VISIBLE @@ -166,6 +175,23 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada val noticeNormalData = it[position].bean as NoticeNormalData holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].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 { + //云公告 + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(holder is MsgBoxV2X){ + data?.let { + val v2XMsg = it[position].bean as V2XMsg + holder.tvV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvV2XContent.text = v2XMsg.content + holder.ivV2XImage.setImageDrawable(activity.resources.getDrawable(EventTypeEnum.getUpdateIconRes(v2XMsg.type))) } } } @@ -221,10 +247,18 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada //Notice class MsgBoxNotice(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,OBU + class MsgBoxV2X(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) + } } \ 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/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt new file mode 100644 index 0000000000..3693ece7ce --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -0,0 +1,102 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +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.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat + +/** + * @author XuXinChao + * @description 乘客端消息盒子气泡视图RecyclerView适配器 + * @since: 2022/11/25 + */ +class PassengerMsgBoxBubbleAdapter: RecyclerView.Adapter() { + + private var data: ArrayList ?= null + + private val operation: Int = 1 + private val notice: Int = 2 + + var countDownTimer: CountDownTimer?=null + + fun setData(data: ArrayList){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if(viewType == operation){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_operation,parent,false) + return BubbleOperationHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_notice,parent,false) + return BubbleNoticeHolder(view) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if(holder is BubbleOperationHolder){ + data?.let { + val operationMsg = it[position].bean as OperationMsg + holder.tvPassengerOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvPassengerOperationContent.text = operationMsg.content + } + }else{ + data?.let { + + } + } + val msgBoxBean: MsgBoxBean = data!![position] + countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){ + override fun onTick(p0: Long) { + + } + + override fun onFinish() { + data?.remove(msgBoxBean) + notifyDataSetChanged() +// notifyItemRemoved(index) +// notifyItemRangeChanged(index,recordTypeEntity.size-index) + } + + } + countDownTimer?.start() + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + if(data!![position].type == MsgBoxType.OPERATION){ + return operation + }else{ + return notice + } + } + + //官方公告 + class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivPassengerOperationImage: ImageView = itemView.findViewById(R.id.ivPassengerOperationImage) + var tvPassengerOperationTitle: TextView = itemView.findViewById(R.id.tvPassengerOperationTitle) + var tvPassengerOperationContent: TextView = itemView.findViewById(R.id.tvPassengerOperationContent) + var tvPassengerOperationCheck: TextView = itemView.findViewById(R.id.tvPassengerOperationCheck) + var tvPassengerOperationTime: TextView = itemView.findViewById(R.id.tvPassengerOperationTime) + } + + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivPassengerNoticeImage: ImageView = itemView.findViewById(R.id.ivPassengerNoticeImage) + var ivPassengerNoticeTime: TextView = itemView.findViewById(R.id.ivPassengerNoticeTime) + var ivPassengerNoticeContent: TextView = itemView.findViewById(R.id.ivPassengerNoticeContent) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_close.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c9982f5f645fd184b318147491afbff957cf31 GIT binary patch literal 269 zcmV+o0rLKdP)Px#$4Nv%R45gFjy(#(Koo>?919B@3oUHCLCRFA6pK_^=_ztRA&nvkf~cLkeiQb= zuGwVZ5TEW-5uhg-f)q{4XwcVo1wFGPx#$4Nv%R45gdjWG(sKomrC919B@3oUHCLCRFA6oph;=_ztRA&nvkf~cLkzFGc) zS(2y&!|b0w^EYwMm2d~A$)8Zix@E$ng2Ek6e!Zovbr4tSPzoQKz!i?Z9V0WgEaJPV z?=WQWDHmMeuA|BqOlyCq}QQ=-i*Oo#re*e);2UhbkkXCTXJ9t4{#3`Z8`aGcvvsT TojL}=00000NkvXXu0mjfUjb^| literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_notice_default.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_notice_default.png new file mode 100644 index 0000000000000000000000000000000000000000..269dfdd86fcff0dc301f39e4c3ee98bcd720b44f GIT binary patch literal 19079 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 KMNUMnLSTaO^KPR6 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_passenger_operation.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_passenger_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..8ced8cb8af11f3c8ebd3d7f2e789fd4ea7ea1b64 GIT binary patch literal 19096 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 bR{#G4978l$)6rDg00000NkvXXu0mjfzqqx4 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml new file mode 100644 index 0000000000..21a5610625 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 566b59fc2e..5a2ea87992 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -102,6 +102,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + + + @@ -218,8 +234,20 @@ android:id="@+id/viewDriverMsgBoxBubble" android:layout_width="864px" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/cbMsgBox" - app:layout_constraintRight_toRightOf="@id/ivCameraIcon" + app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver" + app:layout_constraintRight_toRightOf="@id/viewLimitingVelocity" + android:visibility="gone" + /> + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml index a8eae24883..9d45f5fa4d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml @@ -68,12 +68,20 @@ android:id="@+id/tvStatusSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintRight_toRightOf="parent" - android:layout_margin="20px" android:text="折叠" android:textColor="#FFFFFFFF" android:textSize="24px" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toRightOf="parent" + android:layout_marginTop="25px" + android:layout_marginEnd="25px" + android:background="@drawable/bg_msg_status_select" + android:drawableStart="@drawable/icon_msg_open" + android:drawablePadding="10px" + android:paddingStart="15px" + android:paddingEnd="15px" + android:paddingTop="5px" + android:paddingBottom="5px" /> + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml index ff8a6fadab..8eb878c3d8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml @@ -63,6 +63,13 @@ app:layout_constraintRight_toRightOf="parent" android:layout_marginTop="25px" android:layout_marginEnd="25px" + android:background="@drawable/bg_msg_status_select" + android:drawableStart="@drawable/icon_msg_open" + android:drawablePadding="10px" + android:paddingStart="15px" + android:paddingEnd="15px" + android:paddingTop="5px" + android:paddingBottom="5px" /> + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml new file mode 100644 index 0000000000..12439dc04e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml new file mode 100644 index 0000000000..1218bd88b2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml new file mode 100644 index 0000000000..ac09584e77 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt index cb8155123f..d089573c31 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt @@ -707,7 +707,9 @@ enum class EventTypeEnum( ALERT_CAR_TROUBLE_WARNING.poiType -> { R.drawable.icon_car_red } - else -> 0 + else -> { + R.drawable.icon_default + } } } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index f5eb6bac20..a5a206c838 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -7,6 +7,7 @@ import com.alibaba.android.arouter.facade.template.IProvider import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import record_cache.RecordPanelOuterClass /** @@ -92,7 +93,7 @@ interface IDevaToolsProvider : IProvider { /** * 当工控机回调时调用 */ - fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) + fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) /** * 展示录包配置 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index 68e64f9cdb..aa24264cc5 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.utilcode.mogo.* @@ -123,8 +124,8 @@ object CallerDevaToolsManager { /** * 收到工控机回调时触发 */ - fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { - devaToolsProviderApi?.onReceiveBadCaseRecord(recordKey, fileName, activity) + fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) { + devaToolsProviderApi?.onReceiveBadCaseRecord(msgBoxBean, activity,countdown) } /** diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_default.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_default.png new file mode 100644 index 0000000000000000000000000000000000000000..e2caabe693ddb6424f98db29b9aa19927ac048e2 GIT binary patch literal 16208 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