diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt index 47f941268c..7285bb32b3 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeProvider.kt @@ -214,7 +214,7 @@ abstract class FacadeProvider : IMoGoFunctionProvider, ILoginCallback { CallerHmiManager.hideToolsView() ToggleDebugView.toggleDebugView.dismiss() SopView.sopView.dismiss() - CallerHmiManager.dismissFSMStatusDetailWindow() + CallerHmiManager.dismissFSMExceptionStatusWindow() CallerHmiManager.hideStatusSummaryDialog() commonService?.resetFragment() val fragment = LoginStatusManager.getFragment() diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt index 314aa5c913..5e7d1c0dd5 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/fsm/FSMImpl.kt @@ -132,7 +132,7 @@ internal class FSMImpl(ctx: Context) : IFlow(ctx), IMoGoAutopilotStat super.onLoginStatusUpdate(isLogin) if (!isLogin) { CallerLogger.d(TAG, "onLoginStatusUpdate isLogin=$isLogin") - CallerHmiManager.dismissFSMStatusDetailWindow() + CallerHmiManager.dismissFSMExceptionStatusWindow() } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 68e541a9da..fc975615d5 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -126,22 +126,24 @@ internal class StatusAdapter(val ctx: Context, var data: List) : Recycle when (status.state) { FSMStateCode.UnKnown -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_not_connected) - CallerHmiManager.dismissFSMStatusDetailWindow() + CallerHmiManager.dismissFSMExceptionStatusWindow() } FSMStateCode.NotExist -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_not_exist) - CallerHmiManager.dismissFSMStatusDetailWindow() + CallerHmiManager.dismissFSMExceptionStatusWindow() } FSMStateCode.ExistNormal -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_normal) - CallerHmiManager.dismissFSMStatusDetailWindow() + CallerHmiManager.dismissFSMExceptionStatusWindow() } FSMStateCode.ExistError -> { iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_fsm_error) - CallerHmiManager.showFSMStatusDetailWindow("FSM异常:", "#FF3B3B", status.desc) + CallerHmiManager.showFSMExceptionStatusWindow(ArrayList().also { + it += status.desc + }) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt index 7281a6c3bc..57ca6cd7da 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/StartAutoPilotStatusView.kt @@ -9,11 +9,11 @@ import androidx.core.content.ContextCompat import chassis.Chassis import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger -import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhjt.mogo_core_function_devatools.status.StatusManager import com.zhjt.mogo_core_function_devatools.status.entity.AcceleratorStatus import com.zhjt.mogo_core_function_devatools.status.entity.BrakeStatus @@ -131,9 +131,10 @@ class StartAutoPilotStatusView @JvmOverloads constructor( } FSMStateCode.ExistError -> { - // TODO fSMStatusLayout?.onClick { - ToastUtils.showLong("onClick") + CallerHmiManager.showFSMExceptionStatusWindow(ArrayList().also { + it += status.desc + }) } fSMStatusLayout?.setImageDrawable( ContextCompat.getDrawable( diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt new file mode 100644 index 0000000000..47115ebe99 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailView.kt @@ -0,0 +1,163 @@ +package com.mogo.eagle.core.function.hmi.bone.status.fsm + +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.ScrollView +import android.widget.TextView +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.zhjt.mogo_core_function_devatools.status.StatusManager +import com.zhjt.mogo_core_function_devatools.status.entity.FSMStateCode +import com.zhjt.mogo_core_function_devatools.status.entity.FSMStatus +import com.zhjt.mogo_core_function_devatools.status.entity.Status + +/** + * FSM状态展示 View + */ +class FSMStatusDetailView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout( + context, + attrs, + defStyleAttr +), StatusManager.IStatusListener { + companion object { + private const val TAG = "FSMStatusDetailView" + } + + private var tvTitle: TextView? = null + private var scrollLayout: ScrollView? = null + private var llFsmMsgContainerLayout: LinearLayout? = null + private var tvCloseBtn: TextView? = null + + init { + LayoutInflater.from(context).inflate(R.layout.view_status_fsm_layout, this, true) + initView() + } + + private fun initView() { + tvTitle = findViewById(R.id.tvTitle) + scrollLayout = findViewById(R.id.scrollLayout) + llFsmMsgContainerLayout = findViewById(R.id.fsmMsgContainerLayout) + tvCloseBtn = findViewById(R.id.btnClose) + tvCloseBtn?.onClick { + FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.dismiss() + } + } + + fun setFsmErrorStatus(msgArray: ArrayList) { + tvTitle?.text = "FSM异常" + runCatching { + val c = Color.parseColor("#FF4E41") + tvTitle?.setTextColor(c) + } + addFsmMsgItemView(msgArray) + + //监听最新 FSM 状态 + StatusManager.addListener(TAG, this) + } + + private fun setFsmNormalStatus() { + tvTitle?.text = "FSM正常" + runCatching { + val c = Color.parseColor("#2EACFF") + tvTitle?.setTextColor(c) + } + removeFsmMsgItemView() + } + + private fun setFsmUnknownStatus() { + tvTitle?.text = "FSM状态未知" + runCatching { + val c = Color.parseColor("#FFFFFF") + tvTitle?.setTextColor(c) + } + removeFsmMsgItemView() + } + + private fun setFsmNotExistStatus() { + tvTitle?.text = "FSM不存在" + runCatching { + val c = Color.parseColor("#FFFFFF") + tvTitle?.setTextColor(c) + } + removeFsmMsgItemView() + } + + private fun addFsmMsgItemView(msgArray: ArrayList) { + if (llFsmMsgContainerLayout == null) { + Logger.e(TAG, "addFsmMsmItemView llFsmMsgContainerLayout is null") + return + } + scrollLayout?.visibility = View.VISIBLE + llFsmMsgContainerLayout?.removeAllViews() + msgArray.forEach { + val itemView: View = LayoutInflater.from(context) + .inflate(R.layout.view_status_fsm_item_layout, llFsmMsgContainerLayout, false) + val leftImageView: ImageView = itemView.findViewById(R.id.leftImageView) + val rightTextView: TextView = itemView.findViewById(R.id.rightTextView) + rightTextView.text = it + llFsmMsgContainerLayout?.addView(itemView) + } + } + + private fun removeFsmMsgItemView() { + llFsmMsgContainerLayout?.removeAllViews() + //scrollLayout?.visibility = View.GONE + } + + /** + * @param changed: 变化的数据 + * @param all: 所有状态数据 + */ + override fun onStatusChanged(changed: List, all: List) { + changed.filterIsInstance().forEach { status -> + when (status) { + is FSMStatus -> { + handleFSMStatus(status) + } + } + } + } + + private fun handleFSMStatus(status: FSMStatus) { + when (status.state) { + FSMStateCode.NotExist -> { + setFsmNotExistStatus() + } + + FSMStateCode.UnKnown -> { + setFsmUnknownStatus() + } + + FSMStateCode.ExistNormal -> { + setFsmNormalStatus() + } + + FSMStateCode.ExistError -> { + // TODO 修改成多条 + setFsmErrorStatus(ArrayList().also { + it += status.desc + it += status.desc + it += status.desc + it += status.desc + it += status.desc + }) + } + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + StatusManager.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/bone/status/fsm/FSMStatusDetailWindowManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailWindowManager.kt new file mode 100644 index 0000000000..8d9e54242e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailWindowManager.kt @@ -0,0 +1,83 @@ +package com.mogo.eagle.core.function.hmi.bone.status.fsm + +import android.animation.Animator +import android.content.Context +import android.view.Gravity +import android.view.View +import android.view.WindowManager +import android.view.animation.OvershootInterpolator +import com.mogo.eagle.core.data.enums.SidePattern +import com.mogo.eagle.core.function.hmi.notification.WarningFloat +import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator + +/** + * FSM 状态弹框管理类 + */ +class FSMStatusDetailWindowManager private constructor() { + + private var mFSMStatusViewFloat: WarningFloat.Builder? = null + private var mFSMStatusDetailView: FSMStatusDetailView? = null + + companion object { + val fsmStatusDetailWindowManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + FSMStatusDetailWindowManager() + } + } + + fun showExceptionStatus( + context: Context, errorMsg: ArrayList + ) { + if (mFSMStatusDetailView == null) { + mFSMStatusDetailView = FSMStatusDetailView(context) + } + if (mFSMStatusViewFloat?.isShow() == true) { + mFSMStatusDetailView?.apply { + setFsmErrorStatus(errorMsg) + } + } else { + mFSMStatusDetailView?.apply { + setFsmErrorStatus(errorMsg) + } + mFSMStatusViewFloat = WarningFloat.with(context) + .setTag("FSMStatusView") + .setLayout(mFSMStatusDetailView!!) + .setSidePattern(SidePattern.AUTO_SIDE) + .setGravity(Gravity.CENTER) + .setImmersionStatusBar(false) + .slideDel(false) + .setWindowHeight(WindowManager.LayoutParams.WRAP_CONTENT) + .setWindowWidth(WindowManager.LayoutParams.WRAP_CONTENT) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? { + mFSMStatusViewFloat = null + mFSMStatusDetailView = null + return super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + } + }) + .show() + } + } + + fun dismiss() { + mFSMStatusViewFloat?.let { + WarningFloat.dismiss(it.config.floatTag, false) + } + } +} \ 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/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index cad2aabef1..67e61a3bc0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -35,7 +35,7 @@ import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.traffic.NoticeTrafficDialog import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView -import com.mogo.eagle.core.function.hmi.ui.setting.FSMStatusDetailWindowManager +import com.mogo.eagle.core.function.hmi.bone.status.fsm.FSMStatusDetailWindowManager import com.mogo.eagle.core.function.hmi.ui.setting.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog @@ -340,16 +340,16 @@ class MoGoHmiProvider : IMoGoHmiProvider { } /** - * 展示 FSM 状态详情弹框 + * 展示 FSM 异常状态弹框 */ - override fun showFSMStatusDetailWindow(title: String, titleColor:String, content: String) { - context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.show(it, title, titleColor, content)} + override fun showFSMExceptionStatusWindow(errorMsg: ArrayList) { + context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.showExceptionStatus(it, errorMsg)} } /** - * 关闭 FSM 状态详情弹框 + * 关闭 FSM 异常状态弹框 */ - override fun dismissFSMStatusDetailWindow() { + override fun dismissFSMExceptionStatusWindow() { context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.dismiss()} } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fsm_error_red_arrow.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fsm_error_red_arrow.png new file mode 100644 index 0000000000..e30e3b9265 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_fsm_error_red_arrow.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fsm_status_detail_close.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fsm_status_detail_close.xml new file mode 100644 index 0000000000..49c0646059 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_fsm_status_detail_close.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml index 8cc69fc2db..7e234745fd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/status_dialog_fsm_status_background.xml @@ -1,5 +1,22 @@ - - - + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_item_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_item_layout.xml new file mode 100644 index 0000000000..995b38abe8 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_item_layout.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml index 8652efbd43..3e0d736fcb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_fsm_layout.xml @@ -2,43 +2,66 @@ + tools:text="FSM异常,无法启动AD" /> + + + + + + + + - + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/scrollLayout" /> \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt index e6e5f4b47a..9187ba378f 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt @@ -2,12 +2,12 @@ package com.mogo.eagle.core.function.api.hmi.warning import android.view.ViewGroup import com.alibaba.android.arouter.facade.template.IProvider -import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean -import com.mogo.eagle.core.data.enums.WarningDirectionEnum -import com.mogo.eagle.core.data.map.Infrastructure import com.mogo.eagle.core.data.biz.notice.NoticeNormalData import com.mogo.eagle.core.data.biz.notice.NoticeTrafficStylePushData +import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo +import com.mogo.eagle.core.data.enums.WarningDirectionEnum +import com.mogo.eagle.core.data.map.Infrastructure import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State @@ -158,14 +158,14 @@ interface IMoGoHmiProvider :IProvider{ fun is360LookAroundShowing(): Boolean /** - * 展示 FSM 状态详情弹框 + * 展示 FSM 异常状态弹框 */ - fun showFSMStatusDetailWindow(title: String, titleColor:String, content: String) + fun showFSMExceptionStatusWindow(errorMsg: ArrayList) /** - * 关闭 FSM 状态详情弹框 + * 关闭 FSM 异常状态弹框 */ - fun dismissFSMStatusDetailWindow() + fun dismissFSMExceptionStatusWindow() fun showStatusSummaryDialog() diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 2d9c0a0e37..89312f9ede 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -16,8 +16,6 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State -import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger /** * @author xiaoyuzhou @@ -236,22 +234,17 @@ object CallerHmiManager { } /** - * 展示 FSM 状态详情弹框 + * 展示 FSM 异常状态弹框 */ - fun showFSMStatusDetailWindow(title: String, titleColor:String, content: String) { -// if (!CallerOrderListenerManager.isLoginStatus()) { -// CallerLogger.i(TAG, "showFSMStatusDetailWindow isLogin=false dismiss") -// dismissFSMStatusDetailWindow() -// return -// } - hmiProviderApi?.showFSMStatusDetailWindow(title, titleColor, content) + fun showFSMExceptionStatusWindow(errorMsg: ArrayList) { + hmiProviderApi?.showFSMExceptionStatusWindow(errorMsg) } /** - * 关闭 FSM 状态详情弹框 + * 关闭 FSM 异常状态弹框 */ - fun dismissFSMStatusDetailWindow() { - hmiProviderApi?.dismissFSMStatusDetailWindow() + fun dismissFSMExceptionStatusWindow() { + hmiProviderApi?.dismissFSMExceptionStatusWindow() } fun showStatusSummaryDialog() {