From 57316383c4230c9c4ebe472d88ba9cb427afc0ca Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 22 Feb 2023 11:47:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[opt3.0]=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 11 +- .../hmi/ui/msgbox/DriverMsgBoxListView.kt | 3 + .../hmi/ui/msgbox/MMsgBoxBubbleView.kt | 79 ++++++++ .../hmi/ui/msgbox/MMsgBoxButtonView.kt | 85 +++++++++ .../function/hmi/ui/msgbox/MMsgBoxListView.kt | 105 +++++++++++ .../msgbox/adapter/DriverMsgBoxListAdapter.kt | 20 ++ .../ui/msgbox/adapter/MMsgBoxBubbleAdapter.kt | 178 ++++++++++++++++++ .../ui/msgbox/adapter/MMsgBoxListAdapter.kt | 152 +++++++++++++++ .../drawable-xhdpi/icon_msg_box_m_normal.png | Bin 0 -> 23003 bytes .../drawable-xhdpi/icon_msg_box_m_select.png | Bin 0 -> 25166 bytes .../main/res/drawable/rv_divider_line_m.xml | 8 + .../main/res/drawable/selector_msg_box_m.xml | 5 + .../main/res/layout/item_m_msg_box_notice.xml | 85 +++++++++ .../res/layout/item_m_msg_box_summary.xml | 82 ++++++++ .../main/res/layout/item_m_msg_box_v2x.xml | 52 +++++ .../res/layout/item_m_msg_list_notice.xml | 83 ++++++++ .../res/layout/item_m_msg_list_summary.xml | 79 ++++++++ .../main/res/layout/item_m_msg_list_v2x.xml | 47 +++++ .../res/layout/item_msg_box_ipc_report.xml | 18 +- .../res/layout/item_msg_box_operation.xml | 2 +- .../res/layout/layout_m_msg_box_bubble.xml | 8 + .../main/res/layout/layout_m_msg_box_list.xml | 38 ++++ .../res/layout/view_m1_msg_box_button.xml | 30 +++ 23 files changed, 1164 insertions(+), 6 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxButtonView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxListView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxBubbleAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxListAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_m_normal.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_m_select.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_m.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box_m.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_notice.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_summary.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_v2x.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_notice.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_summary.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_v2x.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_m_msg_box_bubble.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_m_msg_box_list.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_m1_msg_box_button.xml 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 93ae969800..dc08cb75f7 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 @@ -7,6 +7,7 @@ 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.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener @@ -83,9 +84,13 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( if(isShowData){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if(category == MsgCategory.RECORD_BAG){ - //弹出被动录包弹窗 - CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) - }else{ + if(!FunctionBuildConfig.isDemoMode){ + //弹出被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) + } + } else if(category == MsgCategory.SYS_INFO){ + //todo 过滤MAP系统异常报警 + } else{ clMsgBubbleLayout.visibility = View.VISIBLE dataList.add(msgBoxBean) driverMsgBoxBubbleAdapter?.setData(dataList) 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 0a24a50f88..75e5e6f583 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 @@ -7,6 +7,7 @@ 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.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener @@ -17,6 +18,7 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxListAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.layout_driver_msg_box_list.view.* import org.greenrobot.eventbus.EventBus @@ -244,6 +246,7 @@ class DriverMsgBoxListView @JvmOverloads constructor( notifyData() ipcReportList?.let { linearLayoutManager?.scrollToPositionWithOffset(it.indexOf(msgBoxBean),0) + driverMsgBoxListAdapter?.setReportShowData(msgBoxBean) } } } \ 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/MMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt new file mode 100644 index 0000000000..0c4c752c14 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxBubbleView.kt @@ -0,0 +1,79 @@ +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 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.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +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.MMsgBoxBubbleAdapter +import com.mogo.eagle.core.function.msgbox.MsgBoxConfig +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import kotlinx.android.synthetic.main.layout_m_msg_box_bubble.view.* + +class MMsgBoxBubbleView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener { + + private val TAG = "MMsgBoxBubbleView" + private val dataList :ArrayList = ArrayList() + private var mMsgBoxBubbleAdapter: MMsgBoxBubbleAdapter?= null + private var isShowData = true + + init { + LayoutInflater.from(context).inflate(R.layout.layout_m_msg_box_bubble, this, true) + initView() + } + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + mMsgBoxBubbleAdapter = MMsgBoxBubbleAdapter(context as Activity) + rvMBubbleList.adapter = mMsgBoxBubbleAdapter + rvMBubbleList.layoutManager = linearLayoutManager + } + + /** + * 是否展示接收消息,消息盒子打开状态下不再展示气泡消息 + * @param show true 展示;false 不展示 + */ + fun isShowData(show: Boolean){ + isShowData = show + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + UiThreadHandler.post { + if(category == MsgCategory.NOTICE){ + if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X + || msgBoxList.type == MsgBoxType.OBU){ + MsgBoxConfig.noticeList.add(msgBoxList) + if(isShowData){ + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + dataList.add(msgBoxList) + mMsgBoxBubbleAdapter?.setData(dataList) + } + } + } + } + } + + 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/MMsgBoxButtonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxButtonView.kt new file mode 100644 index 0000000000..0509cdba13 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxButtonView.kt @@ -0,0 +1,85 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +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 kotlinx.android.synthetic.main.view_m1_msg_box_button.view.* + +class MMsgBoxButtonView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +): ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxEventListener { + + companion object { + const val TAG = "MMsgBoxButtonView" + } + + private var clickListener: ClickListener? = null + + init{ + LayoutInflater.from(context).inflate(R.layout.view_m1_msg_box_button, this, true) + initView() + } + + private fun initView(){ + cbMsgBoxM1.setOnCheckedChangeListener { _, isChecked -> + clickListener?.showMsgBoxList(isChecked) + msgBoxMTipView.visibility = View.GONE + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxEventListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxEventListenerManager.removeListener(TAG) + } + + override fun onSummaryClickEvent() { + + } + + /** + * 更新新消息提醒红点 + * @param isShow true:展示;false:不展示 + */ + override fun onUpdateTipEvent(isShow: Boolean) { + if(isShow){ + msgBoxMTipView.visibility = View.VISIBLE + }else{ + msgBoxMTipView.visibility = View.GONE + } + } + + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxM1.performClick() + } + + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxM1.performClick() + } + + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxM1.performClick() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener{ + fun showMsgBoxList(show: Boolean) + } + + +} \ 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/MMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxListView.kt new file mode 100644 index 0000000000..6b71ed67b8 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MMsgBoxListView.kt @@ -0,0 +1,105 @@ +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 androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.DividerItemDecoration +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.function.api.datacenter.msgbox.IMsgBoxEventListener +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +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.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MMsgBoxListAdapter +import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import kotlinx.android.synthetic.main.layout_m_msg_box_list.view.* + +class MMsgBoxListView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IMsgBoxEventListener { + + private val TAG = "MMsgBoxListView" + var mMsgBoxListAdapter: MMsgBoxListAdapter?= null + private var noticeList: ArrayList ?= null + + init{ + LayoutInflater.from(context).inflate(R.layout.layout_m_msg_box_list, this, true) + initView() + } + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + val divider = DividerItemDecoration(context, linearLayoutManager.orientation) + getDrawable(R.drawable.rv_divider_line_m)?.let { divider.setDrawable(it) } + mMsgBoxListAdapter = MMsgBoxListAdapter(context as Activity) + rvMList.adapter = mMsgBoxListAdapter + rvMList.layoutManager = linearLayoutManager + rvMList.addItemDecoration(divider) + //获取通知消息列表 + noticeList= CallerMsgBoxManager.getCachedNotifyData() as ArrayList? + noticeList = noticeList?.let { ArrayList(it.reversed()) } + noticeList?.let { + mMsgBoxListAdapter?.setData(it) + } + + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + UiThreadHandler.post{ + if(category == MsgCategory.NOTICE){ + if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X + || msgBoxList.type == MsgBoxType.OBU){ + noticeList?.add(0,msgBoxList) + noticeList?.let { + mMsgBoxListAdapter?.setData(it) + } + } + } + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxListenerManager.addListener(TAG,this) + CallerMsgBoxEventListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + CallerMsgBoxEventListenerManager.removeListener(TAG) + } + + override fun onSummaryClickEvent() { + + } + + override fun onUpdateTipEvent(isShow: Boolean) { + + } + + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) { + + } + + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) { + noticeList?.let { + rvMList.scrollToPosition(it.indexOf(msgBoxBean)) + } + } + + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) { + + } + +} \ 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 1968a19cfc..95ea8caef9 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 @@ -32,6 +32,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Adapter() { private var data: List? = null + private var reportBean: MsgBoxBean ?= null private val operation: Int = 1 private val notice: Int = 2 @@ -50,6 +51,10 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : notifyDataSetChanged() } + fun setReportShowData(reportClickBean: MsgBoxBean){ + reportBean = reportClickBean + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { when (viewType) { record -> { @@ -103,6 +108,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : } is MsgBoxIpcReportHolder -> { data?.let { it -> + val reportMsgBox = it[position] holder.tvReportTimeNormal.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" holder.tvReportTimeOpen.text = @@ -138,6 +144,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : holder.tvReportTypeNormal.text = resultStr holder.tvReportTypeOpen.text = resultStr holder.tvReportReasonOpen.text = "原因:${reportEntity.msg}" + holder.tvReportSrcOpen.text = "消息来源:${reportEntity.src}" var actionStr = "" for (action in reportEntity.actionsList) { actionStr = @@ -152,6 +159,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvStatusSelect.text = "折叠" holder.ivReportImageNormal.visibility = View.GONE holder.tvReportLevelNormal.visibility = View.GONE holder.tvReportTimeNormal.visibility = View.GONE @@ -162,6 +170,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : holder.tvReportTimeOpen.visibility = View.VISIBLE holder.tvReportTypeOpen.visibility = View.VISIBLE holder.tvReportReasonOpen.visibility = View.VISIBLE + holder.tvReportSrcOpen.visibility = View.VISIBLE holder.tvReportActionOpen.visibility = View.VISIBLE } else { holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds( @@ -170,6 +179,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvStatusSelect.text = "展开" holder.ivReportImageNormal.visibility = View.VISIBLE holder.tvReportLevelNormal.visibility = View.VISIBLE holder.tvReportTimeNormal.visibility = View.VISIBLE @@ -180,9 +190,16 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : holder.tvReportTimeOpen.visibility = View.GONE holder.tvReportTypeOpen.visibility = View.GONE holder.tvReportReasonOpen.visibility = View.GONE + holder.tvReportSrcOpen.visibility = View.GONE holder.tvReportActionOpen.visibility = View.GONE } } + reportBean?.let { + if(reportMsgBox.timestamp == it.timestamp){ + holder.tvStatusSelect.performClick() + } + } + } } is MsgBoxOperation -> { @@ -200,6 +217,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvOperationStatusSelect.text = "折叠" holder.ivOperationImageNormal.visibility = View.GONE holder.tvOperationTitleNormal.visibility = View.GONE holder.tvOperationContentNormal.visibility = View.GONE @@ -214,6 +232,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvOperationStatusSelect.text = "展开" holder.ivOperationImageNormal.visibility = View.VISIBLE holder.tvOperationTitleNormal.visibility = View.VISIBLE holder.tvOperationContentNormal.visibility = View.VISIBLE @@ -329,6 +348,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : var tvReportTimeOpen: TextView = itemView.findViewById(R.id.tvReportTimeOpen) var tvReportTypeOpen: TextView = itemView.findViewById(R.id.tvReportTypeOpen) var tvReportReasonOpen: TextView = itemView.findViewById(R.id.tvReportReasonOpen) + var tvReportSrcOpen: TextView = itemView.findViewById(R.id.tvReportSrcOpen) var tvReportActionOpen: TextView = itemView.findViewById(R.id.tvReportActionOpen) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxBubbleAdapter.kt new file mode 100644 index 0000000000..057bdf0cb6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxBubbleAdapter.kt @@ -0,0 +1,178 @@ +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.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.* +import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp +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.transform.GlideRoundedCornersTransform +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 MMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter() { + + private var data: ArrayList ?= null + + private val notice: Int = 1 + private val v2x: Int = 2 + private val summary: Int = 3 + + var countDownTimer: CountDownTimer?=null + + fun setData(data: ArrayList){ + this.data = data + if(data.size>3){ + data.removeAt(0) + } + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + notice -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_notice,parent,false) + BubbleNoticeHolder(view) + } + summary -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_summary,parent,false) + BubbleSummaryHolder(view) + } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_box_v2x,parent,false) + BubbleV2XHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is BubbleNoticeHolder -> { + data?.let { + val noticeFrCloudMsg = it[position].bean as NoticeFrCloudMsg + if(noticeFrCloudMsg.type == 0){ + val noticeNormalData = noticeFrCloudMsg.noticeNormalData + holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMNoticeContent.text = noticeNormalData?.content + GlideApp.with(activity).load(noticeNormalData?.imageUrl).placeholder(R.drawable.icon_passenger_operation) + .optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivMNoticeImage) + holder.tvMNoticeCheck.setOnClickListener { + //云公告 + noticeNormalData?.let { it1 -> CallerHmiManager.showNoticeNormalData(it1) } + } + }else if(noticeFrCloudMsg.type == 1){ + val noticeTrafficStylePushData = noticeFrCloudMsg.trafficPushData + holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMNoticeContent.text = noticeTrafficStylePushData?.content + GlideApp.with(activity).load(noticeTrafficStylePushData?.poiImgUrl).placeholder(R.drawable.icon_passenger_operation) + .optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivMNoticeImage) + holder.tvMNoticeCheck.setOnClickListener { + //云公告 + noticeTrafficStylePushData?.let { it1 -> CallerHmiManager.showTrafficBanner(it1) } + } + } + + } + } + is BubbleV2XHolder -> { + data?.let { + val msgBoxBean = it[position] + val v2XMsg = msgBoxBean.bean as V2XMsg + holder.tvMV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMV2XContent.text = v2XMsg.content + holder.ivMV2XImage.setImageDrawable(activity.resources.getDrawable( + EventTypeEnumNew.getUpdateIconRes(v2XMsg.type))) + holder.clMVeXLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleV2XListener(msgBoxBean) + } + } + } + is BubbleSummaryHolder -> { + data?.let { + val summaryMsg= it[position].bean as V2XMsg + holder.tvMSummaryTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMSummaryContent.text = summaryMsg.content + holder.tvMSummaryCheck.setOnClickListener { + //跳转全览模式 +// CallerHmiManager.showSmallFragment() + CallerMsgBoxEventListenerManager.invokeSummaryListener() + } + } + } + } + + 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 { + return if(data!![position].type == MsgBoxType.NOTICE){ + notice + }else if(data!![position].type == MsgBoxType.V2X && data!![position].sourceType == DataSourceType.SUMMARY){ + summary + } else{ + v2x + } + } + + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivMNoticeImage: ImageView = itemView.findViewById(R.id.ivMNoticeImage) + var tvMNoticeTitle: TextView = itemView.findViewById(R.id.tvMNoticeTitle) + var tvMNoticeContent: TextView = itemView.findViewById(R.id.tvMNoticeContent) + var tvMNoticeCheck: TextView = itemView.findViewById(R.id.tvMNoticeCheck) + var tvMNoticeTime: TextView = itemView.findViewById(R.id.tvMNoticeTime) + } + + //OBU、V2X + class BubbleV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivMV2XImage: ImageView = itemView.findViewById(R.id.ivMV2XImage) + var tvMV2XTime: TextView = itemView.findViewById(R.id.tvMV2XTime) + var tvMV2XContent: TextView = itemView.findViewById(R.id.tvMV2XContent) + var clMVeXLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clMVeXLayout) + } + + //汇总消息 + class BubbleSummaryHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvMSummaryContent: TextView = itemView.findViewById(R.id.tvMSummaryContent) + var tvMSummaryCheck: TextView = itemView.findViewById(R.id.tvMSummaryCheck) + var tvMSummaryTime: TextView = itemView.findViewById(R.id.tvMSummaryTime) + } + +} \ 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/MMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxListAdapter.kt new file mode 100644 index 0000000000..9e44371868 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MMsgBoxListAdapter.kt @@ -0,0 +1,152 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.app.Activity +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.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.NoticeFrCloudMsg +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.hmi.R +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 +import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp + +class MMsgBoxListAdapter(private val activity: Activity): RecyclerView.Adapter() { + + private var data: List ?= null + + private val notice: Int = 1 + private val v2x: Int = 2 + private val summary: Int = 3 + + fun setData(data: List){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + notice -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_notice,parent,false) + ListNoticeHolder(view) + } + summary -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_summary,parent,false) + ListSummaryHolder(view) + } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_m_msg_list_v2x,parent,false) + ListV2XHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is ListNoticeHolder -> { + data?.let { + val noticeFrCloudMsg = it[position].bean as NoticeFrCloudMsg + if(noticeFrCloudMsg.type == 0){ + val noticeNormalData = noticeFrCloudMsg.noticeNormalData + holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMNoticeContent.text = noticeNormalData?.content + GlideApp.with(activity).load(noticeNormalData?.imageUrl).placeholder(R.drawable.icon_notice_default) + .optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivMNoticeImage) + holder.tvMNoticeCheck.setOnClickListener { + //云公告 + noticeNormalData?.let { it1 -> CallerHmiManager.showNoticeNormalData(it1) } + } + }else if(noticeFrCloudMsg.type == 1){ + val noticeTrafficStylePushData = noticeFrCloudMsg.trafficPushData + holder.tvMNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMNoticeContent.text = noticeTrafficStylePushData?.content + GlideApp.with(activity).load(noticeTrafficStylePushData?.poiImgUrl).placeholder(R.drawable.icon_notice_default) + .optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivMNoticeImage) + holder.tvMNoticeCheck.setOnClickListener { + //云公告 + noticeTrafficStylePushData?.let { it1 -> CallerHmiManager.showTrafficBanner(it1) } + } + } + } + } + is ListV2XHolder -> { + data?.let { + val msgBoxBean = it[position] + val v2XMsg = msgBoxBean.bean as V2XMsg + holder.tvMV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMV2XContent.text = v2XMsg.content + holder.ivMV2XImage.setImageDrawable(activity.resources.getDrawable( + EventTypeEnumNew.getUpdateIconRes(v2XMsg.type))) + } + } + is ListSummaryHolder -> { + data?.let { + val summaryMsg= it[position].bean as V2XMsg + holder.tvMSummaryTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvMSummaryContent.text = summaryMsg.content + holder.tvMSummaryCheck.setOnClickListener { + //跳转全览模式 +// CallerHmiManager.showSmallFragment() + CallerMsgBoxEventListenerManager.invokeSummaryListener() + } + } + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + return if(data!![position].type == MsgBoxType.NOTICE){ + notice + }else if(data!![position].type == MsgBoxType.V2X && data!![position].sourceType == DataSourceType.SUMMARY){ + summary + } else{ + v2x + } + } + + //Notice + class ListNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivMNoticeImage: ImageView = itemView.findViewById(R.id.ivMNoticeImage) + var tvMNoticeTitle: TextView = itemView.findViewById(R.id.tvMNoticeTitle) + var tvMNoticeContent: TextView = itemView.findViewById(R.id.tvMNoticeContent) + var tvMNoticeCheck: TextView = itemView.findViewById(R.id.tvMNoticeCheck) + var tvMNoticeTime: TextView = itemView.findViewById(R.id.tvMNoticeTime) + } + + //OBU、V2X + class ListV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivMV2XImage: ImageView = itemView.findViewById(R.id.ivMV2XImage) + var tvMV2XTime: TextView = itemView.findViewById(R.id.tvMV2XTime) + var tvMV2XContent: TextView = itemView.findViewById(R.id.tvMV2XContent) + } + + //汇总消息 + class ListSummaryHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvMSummaryContent: TextView = itemView.findViewById(R.id.tvMSummaryContent) + var tvMSummaryCheck: TextView = itemView.findViewById(R.id.tvMSummaryCheck) + var tvMSummaryTime: TextView = itemView.findViewById(R.id.tvMSummaryTime) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_m_normal.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_m_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..858ead6571bc29a2524004a0077670aae8afc1f1 GIT binary patch literal 23003 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_m.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_m.xml new file mode 100644 index 0000000000..dd0d2fa8c0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line_m.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box_m.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box_m.xml new file mode 100644 index 0000000000..e1cbe83c46 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box_m.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/item_m_msg_box_notice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_notice.xml new file mode 100644 index 0000000000..77fc05c317 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_notice.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_summary.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_summary.xml new file mode 100644 index 0000000000..c77dabafe0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_summary.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_v2x.xml new file mode 100644 index 0000000000..27ae52a175 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_box_v2x.xml @@ -0,0 +1,52 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_notice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_notice.xml new file mode 100644 index 0000000000..b57c76a7c4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_notice.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_summary.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_summary.xml new file mode 100644 index 0000000000..319543cb67 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_summary.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_v2x.xml new file mode 100644 index 0000000000..deddc8f6e2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_m_msg_list_v2x.xml @@ -0,0 +1,47 @@ + + + + + + + + + + \ No newline at end of file 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 5911e16c42..29e1165bfb 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 @@ -70,7 +70,7 @@ android:id="@+id/tvStatusSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="折叠" + android:text="展开" android:textColor="#FFFFFFFF" android:textSize="24dp" app:layout_constraintTop_toTopOf="parent" @@ -163,12 +163,26 @@ /> + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_m_msg_box_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_m_msg_box_list.xml new file mode 100644 index 0000000000..70ec2ac202 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_m_msg_box_list.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_m1_msg_box_button.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_m1_msg_box_button.xml new file mode 100644 index 0000000000..0eb0cb4f85 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_m1_msg_box_button.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file From f78a32bbbcc7b9ac9848aad7352b1ddcf562e572 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 22 Feb 2023 14:44:21 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[Opt3.0][Update]=E6=96=B0=E5=A2=9Eplanning?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datacenter/autopilot/MoGoAutopilotControlProvider.kt | 4 ++++ .../function/api/autopilot/IMoGoAutopilotControlProvider.kt | 2 ++ .../function/call/autopilot/CallerAutoPilotControlManager.kt | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index fa5f14ed05..e68500d7c7 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -769,4 +769,8 @@ class MoGoAutopilotControlProvider : override fun sendRoboBusJinlvM1TaskCmd(roboBusJinlvM1Cmd: SpecialVehicleTaskCmdOuterClass.RoboBusJinlvM1Cmd): Boolean { return AdasManager.getInstance().sendRoboBusJinlvM1TaskCmd(roboBusJinlvM1Cmd) } + + override fun sendPlanningCmd(cmd: Int): Boolean { + return AdasManager.getInstance().sendPlanningCmd(cmd) + } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index 5559e67b9f..e1c50cce6c 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -312,4 +312,6 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { fun sendRoboBusJinlvM1SmallLampCmd(switchCmd: Int): Boolean fun sendRoboBusJinlvM1TaskCmd(roboBusJinlvM1Cmd: SpecialVehicleTaskCmdOuterClass.RoboBusJinlvM1Cmd): Boolean + + fun sendPlanningCmd(cmd: Int): Boolean } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 1980bf91db..1140e23f39 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -450,4 +450,8 @@ object CallerAutoPilotControlManager { fun sendRoboBusJinlvM1TaskCmd(roboBusJinlvM1Cmd: SpecialVehicleTaskCmdOuterClass.RoboBusJinlvM1Cmd): Boolean { return providerApi?.sendRoboBusJinlvM1TaskCmd(roboBusJinlvM1Cmd) ?: false } + + fun sendPlanningCmd(cmd: Int): Boolean { + return providerApi?.sendPlanningCmd(cmd) ?: false + } } \ No newline at end of file