From 614a7d69dd49c767071fa41286c0057e96404b94 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 27 Sep 2024 16:07:34 +0800 Subject: [PATCH] =?UTF-8?q?[6.7.0]=E6=B6=88=E6=81=AF=E7=9B=92=E5=AD=90UI?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...MsgBoxBubbleView.kt => MsgBoxToastView.kt} | 18 +- .../ui/msgbox/adapter/MsgBoxBubbleAdapter.kt | 484 ------------------ .../ui/msgbox/adapter/MsgBoxToastAdapter.kt | 346 +++++++++++++ .../main/res/drawable/bg_msg_box_toast.9.png | Bin 0 -> 15028 bytes .../main/res/layout/item_msg_toast_v2x.xml | 50 ++ .../main/res/layout/view_map_container.xml | 2 +- .../src/main/res/values/strings.xml | 2 + 7 files changed, 406 insertions(+), 496 deletions(-) rename core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/{MsgBoxBubbleView.kt => MsgBoxToastView.kt} (93%) delete 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/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_toast.9.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_toast_v2x.xml 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/MsgBoxToastView.kt similarity index 93% rename from core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxBubbleView.kt rename to core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt index 24a9ce8433..c90d693762 100644 --- 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/MsgBoxToastView.kt @@ -16,29 +16,25 @@ 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.hmi.ui.msgbox.adapter.MsgBoxToastAdapter 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( +class MsgBoxToastView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 @@ -49,7 +45,7 @@ class MsgBoxBubbleView @JvmOverloads constructor( initView() } - var msgBoxBubbleAdapter: MsgBoxBubbleAdapter ?= null + var msgBoxToastAdapter: MsgBoxToastAdapter ?= null private val TAG = "MsgBoxBubbleView" private val dataList :ArrayList = ArrayList() @@ -62,8 +58,8 @@ class MsgBoxBubbleView @JvmOverloads constructor( linearLayoutManager.orientation = LinearLayoutManager.VERTICAL linearLayoutManager.stackFromEnd = true linearLayoutManager.reverseLayout = true - msgBoxBubbleAdapter = MsgBoxBubbleAdapter(context as Activity) - msgBoxBubbleAdapter?.setChangeListener(object : MsgBoxBubbleAdapter.ChangeViewListener{ + msgBoxToastAdapter = MsgBoxToastAdapter(context as Activity) + msgBoxToastAdapter?.setChangeListener(object : MsgBoxToastAdapter.ChangeViewListener{ override fun notifyView() { if(dataList.isEmpty()){ llMsgBubbleLayout.visibility = View.GONE @@ -71,7 +67,7 @@ class MsgBoxBubbleView @JvmOverloads constructor( } }) - rvBubbleList.adapter = msgBoxBubbleAdapter + rvBubbleList.adapter = msgBoxToastAdapter rvBubbleList.layoutManager = linearLayoutManager } @@ -200,7 +196,7 @@ class MsgBoxBubbleView @JvmOverloads constructor( llMsgBubbleLayout.visibility = View.VISIBLE val msgBoxCountDownBean = MsgBoxCountDownBean(msgBoxBean) dataList.add(msgBoxCountDownBean) - msgBoxBubbleAdapter?.setData(dataList) + msgBoxToastAdapter?.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 deleted file mode 100644 index 2bb05b64b3..0000000000 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxBubbleAdapter.kt +++ /dev/null @@ -1,484 +0,0 @@ -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/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt new file mode 100644 index 0000000000..a5676075e5 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/MsgBoxToastAdapter.kt @@ -0,0 +1,346 @@ +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.ContextCompat +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 MsgBoxToastAdapter(private val activity: Activity) : RecyclerView.Adapter() { + + private var data: ArrayList ?= null + + private var changeViewListener: ChangeViewListener?=null + + private val notice: Int = 1 + private val v2x: Int = 2 + private val report: Int = 3 + + + fun setData(data: ArrayList){ + this.data = data + if(data.size>4){ + data.removeAt(0) + } + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + report -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_report,parent,false) + BubbleReportHolder(view) + } + notice -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_notice,parent,false) + BubbleNoticeHolder(view) + } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_toast_v2x,parent,false) + BubbleV2XHolder(view) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + //系统信息消息 + 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 { + if(it[position].msgBoxBean.type == MsgBoxType.FSM){ + //FSM消息 + val fsmMsg = it[position].msgBoxBean.bean as FSMMsg + holder.tvV2XTitle.text = fsmMsg.title + holder.tvV2XContent.text = fsmMsg.content + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_warning_take_over + )) + }else if(it[position].msgBoxBean.type == MsgBoxType.AUTOPILOT){ + //域控制器连接消息 + val autopilotMsg = it[position].msgBoxBean.bean as AutopilotMsg + holder.tvV2XTitle.text = autopilotMsg.title + holder.tvV2XContent.text = autopilotMsg.content + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_warning_take_over + )) + }else if(it[position].msgBoxBean.type == MsgBoxType.SSMINFO){ + //SSM连接消息 + val ssmMsg = it[position].msgBoxBean.bean as SSMMsg + holder.tvV2XTitle.text = ssmMsg.title + holder.tvV2XContent.text = ssmMsg.content + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_warning_take_over + )) + }else if(it[position].msgBoxBean.type == MsgBoxType.FMINFO){ + //FM信息 + val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg + if(fmMsg.fmInfoList?.size == 0){ + holder.tvV2XContent.text = "建议操作:暂无" + holder.tvV2XTitle.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.tvV2XTitle.text = faultAction + //当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、 + // 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 + if(curFaultLevel == 5){ + holder.tvV2XContent.text = "建议操作:暂无" + }else{ + holder.tvV2XContent.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})" + } + //不同级别的Icon显示 + when(curFaultLevel){ + 0->{ + //重度预警样式 + holder.ivV2XImage.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + } + 1,2,3->{ + //中度预警样式 + holder.ivV2XImage.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + } + 4,5->{ + //轻度预警样式 + holder.ivV2XImage.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + } + } + } + }else if(it[position].msgBoxBean.type == MsgBoxType.V2X && it[position].msgBoxBean.sourceType == DataSourceType.SUMMARY){ + //汇总消息 + val summaryMsg = it[position].msgBoxBean.bean as V2XMsg + holder.tvV2XTitle.text = "蘑菇小助手" + holder.tvV2XContent.text = summaryMsg.content + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_tab_notice + )) + }else if(it[position].msgBoxBean.type == MsgBoxType.OPERATION){ + //运营平台 + val operationMsg = it[position].msgBoxBean.bean as OperationMsg + holder.tvV2XContent.text = operationMsg.content + when(operationMsg.type){ + 0->{ + //运营平台还车通知 + holder.tvV2XTitle.text = "还车通知" + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_msg_box_operation_return + )) + } + 1->{ + //运营平台靠边停车 + holder.tvV2XTitle.text = "运营平台" + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_msg_box_operation_stop + )) + } + 3->{ + //车门开启关闭失败 + holder.tvV2XTitle.text = "运营平台" + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.v2x_icon_shigu_sanjiaopai + )) + } + else->{ + //普通运营平台 + holder.tvV2XTitle.text = "运营平台" + holder.ivV2XImage.setImageDrawable( + ContextCompat.getDrawable( + activity, + R.drawable.icon_msg_box_operation + )) + } + } + }else{ + //V2X消息 + val msgBoxBean = it[position].msgBoxBean + val v2XMsg = msgBoxBean.bean as V2XMsg + 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.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)) + } + } + } + } + } + + 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 when (data!![position].msgBoxBean.type) { + MsgBoxType.REPORT -> { + report + } + MsgBoxType.NOTICE -> { + notice + } + 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) + } + + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNoticeImage: ImageView = itemView.findViewById(R.id.ivNoticeImage) + 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 tvV2XTitle: TextView = itemView.findViewById(R.id.tvV2XTitle) + var tvV2XContent: TextView = itemView.findViewById(R.id.tvV2XContent) + var clV2XLayout: ConstraintLayout = itemView.findViewById(R.id.clV2XLayout) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_toast.9.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_toast.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b74233c31fdf2c1035510a65eddf17b400533489 GIT binary patch literal 15028 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 + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_map_container.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_map_container.xml index bdcd212a63..28a2815b27 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_map_container.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_map_container.xml @@ -78,7 +78,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> - 故障发生时间减少 故障发生时间增加 + 消息盒子吐司图标 +