diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailDialog.kt new file mode 100644 index 0000000000..f14013128d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/status/fsm/FSMStatusDetailDialog.kt @@ -0,0 +1,150 @@ +package com.mogo.eagle.core.function.hmi.bone.status.fsm + +import android.content.Context +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +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.function.hmi.dialog.BaseFloatDialog +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状态展示 Dialog + */ +class FSMStatusDetailDialog(context: Context) : BaseFloatDialog(context), + StatusManager.IStatusListener { + companion object { + private const val TAG = "FSMStatusDetailDialog" + } + + private var tvTitle: TextView? = null + private var scrollLayout: ScrollView? = null + private var llFsmMsgContainerLayout: LinearLayout? = null + private var tvCloseBtn: TextView? = null + + init { + setContentView(R.layout.view_status_fsm_layout) + 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 { + dismiss() + StatusManager.removeListener(TAG) + } + } + + fun setFsmErrorStatus(msgArray: List) { + tvTitle?.text = "FSM异常" + runCatching { + val c = Color.parseColor("#FF4E41") + tvTitle?.setTextColor(c) + } + addFsmMsgItemView(msgArray, true) + + //监听最新 FSM 状态 + StatusManager.addListener(TAG, this) + } + + private fun setFsmNormalStatus() { + tvTitle?.text = "FSM正常" + runCatching { + val c = Color.parseColor("#26C14F") + tvTitle?.setTextColor(c) + } + addFsmMsgItemView(ArrayList().also { it += "FSM异常状态已恢复" }, false) + } + + private fun setFsmUnknownStatus() { + tvTitle?.text = "FSM状态未知" + runCatching { + val c = Color.parseColor("#FFCD3D") + tvTitle?.setTextColor(c) + } + removeFsmMsgItemView() + } + + private fun setFsmNotExistStatus() { + tvTitle?.text = "FSM不存在" + runCatching { + val c = Color.parseColor("#FFFFFF") + tvTitle?.setTextColor(c) + } + removeFsmMsgItemView() + } + + private fun addFsmMsgItemView(msgArray: List, isError: Boolean) { + 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) + leftImageView.setImageResource(if (isError) R.drawable.icon_fsm_error_red_arrow else R.drawable.icon_fsm_error_green_arrow) + 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 -> { + setFsmErrorStatus(status.descList) + } + } + } + + 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 index 5a20375177..13ec48fc6d 100644 --- 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 @@ -1,83 +1,33 @@ 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() { +object FSMStatusDetailWindowManager { - private var mFSMStatusViewFloat: WarningFloat.Builder? = null - private var mFSMStatusDetailView: FSMStatusDetailView? = null - - companion object { - val fsmStatusDetailWindowManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { - FSMStatusDetailWindowManager() - } - } + private var mFSMStatusDetailDialog: FSMStatusDetailDialog? = null fun showExceptionStatus( context: Context, errorMsg: List ) { - if (mFSMStatusDetailView == null) { - mFSMStatusDetailView = FSMStatusDetailView(context) + if (mFSMStatusDetailDialog == null) { + mFSMStatusDetailDialog = FSMStatusDetailDialog(context) } - if (mFSMStatusViewFloat?.isShow() == true) { - mFSMStatusDetailView?.apply { + if (mFSMStatusDetailDialog?.isShowing == true) { + mFSMStatusDetailDialog?.apply { setFsmErrorStatus(errorMsg) } } else { - mFSMStatusDetailView?.apply { + mFSMStatusDetailDialog?.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() + mFSMStatusDetailDialog?.show() } } fun dismiss() { - mFSMStatusViewFloat?.let { - WarningFloat.dismiss(it.config.floatTag, false) - } + mFSMStatusDetailDialog?.dismiss() } } \ 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 7b2fa8f6f7..73b8dd4159 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 @@ -45,7 +45,6 @@ import com.mogo.eagle.core.function.hmi.ui.lookaround.M1LookAroundView 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.operate.OperatePanelLayout import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView import com.mogo.eagle.core.function.hmi.ui.setting.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView @@ -357,14 +356,14 @@ class MoGoHmiProvider : IMoGoHmiProvider { * 展示 FSM 异常状态弹框 */ override fun showFSMExceptionStatusWindow(errorMsg: List) { - context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.showExceptionStatus(it, errorMsg)} + context?.let { FSMStatusDetailWindowManager.showExceptionStatus(it, errorMsg)} } /** * 关闭 FSM 异常状态弹框 */ override fun dismissFSMExceptionStatusWindow() { - context?.let { FSMStatusDetailWindowManager.fsmStatusDetailWindowManager.dismiss()} + context?.let { FSMStatusDetailWindowManager.dismiss()} } override fun showStatusSummaryDialog() {