From 204ce4c2eaee027f3d80338ac0ca07f7f4383477 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Tue, 13 Jun 2023 22:37:54 +0800 Subject: [PATCH] =?UTF-8?q?[3.3.0][Feat]=E6=96=B0=E5=A2=9E=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=9B=91=E6=8E=A7=E6=B1=87=E6=80=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 4 + .../status/StatusManager.kt | 4 + .../status/entity/Status.kt | 19 ++ .../status/flow/OverViewImpl.kt | 282 ++++++++++++++++++ .../status/model/StatusModel.kt | 13 +- .../status/ui/StatusSummaryView.kt | 34 +++ .../status/ui/adapter/StatusAdapter.kt | 21 +- .../res/drawable-xhdpi/icon_grey_warning.png | Bin 0 -> 291 bytes .../res/drawable-xhdpi/icon_red_warning.png | Bin 0 -> 291 bytes .../function/hmi/notification/WarningFloat.kt | 19 +- .../notification/WarningFloatWindowHelper.kt | 4 +- .../notification/WarningNotificationConfig.kt | 5 +- .../core/function/hmi/ui/MoGoHmiProvider.kt | 5 + .../hmi/ui/setting/StatusSummaryAdapter.kt | 57 ++++ .../hmi/ui/setting/StatusSummaryView.kt | 156 ++++++++++ .../function/hmi/ui/setting/StatusView.kt | 87 ++++++ .../main/res/drawable-xhdpi/cloud_socket.png | Bin 0 -> 480 bytes .../main/res/drawable-xhdpi/driver_server.png | Bin 0 -> 425 bytes .../src/main/res/drawable-xhdpi/gps.png | Bin 0 -> 487 bytes .../src/main/res/drawable-xhdpi/tracing.png | Bin 0 -> 319 bytes .../res/layout/item_status_summary_layout.xml | 35 +++ .../res/layout/view_status_summary_layout.xml | 32 ++ .../core/data/status/StatusSummaryEntity.kt | 10 + .../api/devatools/IMoGoDevaToolsListener.kt | 7 + .../api/hmi/warning/IMoGoHmiProvider.kt | 1 + .../api/telematic/IConnectStatusListener.kt | 5 + .../CallerDevaToolsListenerManager.kt | 24 ++ .../function/call/hmi/CallerHmiManager.kt | 4 + .../CallerTelematicStatusListenerManager.kt | 30 ++ 29 files changed, 843 insertions(+), 15 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_grey_warning.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_red_warning.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/cloud_socket.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/driver_server.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/gps.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/tracing.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_summary_layout.xml create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/status/StatusSummaryEntity.kt create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/telematic/IConnectStatusListener.kt create mode 100644 core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicStatusListenerManager.kt 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 e52a613b6a..5480df66b8 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 @@ -34,6 +34,8 @@ import com.mogo.eagle.core.function.datacenter.autopilot.telematic.TeleMsgHandle import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL @@ -144,6 +146,7 @@ class MoGoAutopilotControlProvider : } }, 1000, 10000) invokeNettyConnResult("司机端服务启动成功!") + CallerTelematicStatusListenerManager.invokeServerStatusChanged(true) } override fun onStopServer() { @@ -151,6 +154,7 @@ class MoGoAutopilotControlProvider : timer?.cancel() timer = null invokeNettyConnResult("司机端服务停止!") + CallerTelematicStatusListenerManager.invokeServerStatusChanged(false) } override fun onChannelConnect(channel: Channel?) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index b66f66a17e..755b7a2012 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -18,8 +18,11 @@ import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.entity.* +//import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus import com.zhjt.mogo_core_function_devatools.status.model.StatusModel import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.flow.OverViewImpl import com.zhjt.mogo_core_function_devatools.status.flow.can.CanImpl import com.zhjt.mogo_core_function_devatools.status.flow.gps.GpsImpl import com.zhjt.mogo_core_function_devatools.status.flow.ipc.IpcImpl @@ -73,6 +76,7 @@ object StatusManager { is GpsStatus -> GpsImpl(ctx) is TracingStatus -> TracingImpl(ctx) is RTKStatus -> RTKImpl(ctx) + is OverViewStatus -> OverViewImpl(ctx) } }.also { flows += it } for (f in flows) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt index 84bc45f909..1cff920d33 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt @@ -1,5 +1,6 @@ package com.zhjt.mogo_core_function_devatools.status.entity +import com.mogo.eagle.core.data.status.StatusSummaryEntity import com.mogo.eagle.core.function.api.autopilot.* import com.mogo.eagle.core.function.call.autopilot.* import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing @@ -228,6 +229,24 @@ class TracingStatus(var state: Tracing = UNKNOWN): Status() { override fun isException(): Boolean = state.isException() } +class OverViewStatus(var hasException: Boolean = false): Status() { + override fun isException(): Boolean { + return hasException + } + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + other as OverViewStatus + if (hasException != other.hasException) return false + return true + } + + override fun hashCode(): Int { + return 0 + } + +} + fun String.toState(msg: String?): Tracing? { val ss = msg?.split("|") var extra: Map? = null diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt new file mode 100644 index 0000000000..e2ce2558bd --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt @@ -0,0 +1,282 @@ +package com.zhjt.mogo_core_function_devatools.status.flow + +import android.Manifest +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.location.LocationManager +import android.util.Log +import androidx.core.location.LocationManagerCompat +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager +import com.mogo.eagle.core.utilcode.util.AppStateManager +import com.mogo.eagle.core.utilcode.util.IAppStateListener +import com.mogo.eagle.core.utilcode.util.PermissionUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.zhjt.mogo_core_function_devatools.status.entity.OverViewStatus +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.entity.toState +import mogo_msg.MogoReportMsg +import java.util.concurrent.atomic.AtomicBoolean + +internal class OverViewImpl(ctx: Context) : IFlow(ctx), + IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, + IConnectStatusListener, IMogoStatusChangedListener { + + companion object { + const val TAG = "OverViewImpl" + } + + // =====GPS相关===== + private val registered = AtomicBoolean(false) + + private var receiver: CheckLocationReceiver? = null + + @Volatile + private var isServerException = false + + @Volatile + private var isGpsException = false + + @Volatile + private var isCloudSocketException = false + + @Volatile + private var isTracingException = false + + @Volatile + private var isFirst = true + + inner class CheckLocationReceiver(private val onClose: ()->Unit, private val onOpen:()-> Unit) : BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == LocationManager.MODE_CHANGED_ACTION) { + if (isLocationEnabled()) { + onOpen.invoke() + } else { + onClose.invoke() + } + } + } + } + + private val onClose = { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } + + private val onOpen = { + if (!isGrandFineLocation()) { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } else { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } + } + + private fun isGrandFineLocation(): Boolean = try { + PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION) + } catch (t: Throwable) { + t.printStackTrace() + false + } + + private val onStateListener = object : IAppStateListener { + + override fun onAppStateChanged(isForeground: Boolean) { + if (isForeground) { + val enable = isLocationEnabled() + val grant = isGrandFineLocation() + if (!enable || !grant) { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } else { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } + } + } + } + + override fun onCreate() { +// // 蓝牙魔方状态 +// CallerDevaToolsListenerManager.addListener(TAG, this) + // 司机屏Server服务是否开启的状态 + CallerTelematicStatusListenerManager.addListener(TAG, this) + // 云socket连接状态 + MogoStatusManager.getInstance() + .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + + val isGranted = checkIsGpsException() + if (!isGranted) { + PermissionUtils.requestAccessFineLocation(object : PermissionUtils.SimpleCallback { + override fun onGranted() { + Log.d(TAG,"权限: ${Manifest.permission.ACCESS_FINE_LOCATION} 被授予了....") + if (isLocationEnabled()) { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } else { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } + } + + override fun onDenied() { + ToastUtils.showShort("定位权限被拒绝, 可能导致RTK定位不准确,请开启~") + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } + }) + } + + if (registered.compareAndSet(false, true)) { + ctx.registerReceiver(CheckLocationReceiver(onClose, onOpen).also { receiver = it }, IntentFilter().also { it.addAction(LocationManager.MODE_CHANGED_ACTION) }) + } +// // 工控机连接状态外层状态栏已显示,先隐藏 +// CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + private fun checkIsGpsException(): Boolean { + val isGranted = isGrandFineLocation() + AppStateManager.registerAppStateListener(onStateListener) + if (isLocationEnabled() && isGranted) { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } else { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } + return isGranted + } + + /** + * App定位是否打开 + */ + private fun isLocationEnabled() = LocationManagerCompat.isLocationEnabled(ctx.getSystemService(Context.LOCATION_SERVICE) as LocationManager) + + /** + * 魔方状态 + */ + override fun mofangStatus(status: Boolean) { + super.mofangStatus(status) +// if (!status) { +// send(OverViewStatus(true)) +// } + } + + /** + * 司机屏服务是否启动的状态 + */ + override fun onServerStatusChanged(isStarted: Boolean) { + super.onServerStatusChanged(isStarted) + if (!isStarted) { + isServerException = true + send(OverViewStatus(true)) + } else { + isServerException = false + checkIfNotException() + } + } + + /** + * 只监听云Socket状态 + */ + override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { + if (StatusDescriptor.CLOUD_SOCKET == descriptor) { + if (!isTrue) { + isCloudSocketException = true + send(OverViewStatus(true)) + } else { + isCloudSocketException = false + checkIfNotException() + } + } + } + + /** + * 工控机监控节点 + */ + override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { + super.onAutopilotGuardian(guardianInfo) + val code = guardianInfo?.code + val message = guardianInfo?.msg + val newState = code?.toState(message) + if (newState != null) { + when (newState) { + TracingStatus.Tracing.MAP_DATA_NOT_EXIST, TracingStatus.Tracing.TRACK_NOT_EXIST, + TracingStatus.Tracing.TRACK_LOAD_FAIL, TracingStatus.Tracing.ROUTE_FAILED, TracingStatus.Tracing.UNKNOWN -> { + if (!isTracingException) { + isTracingException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeTracingStatus(false) + } + } + TracingStatus.Tracing.MAP_TRA_TYPE, TracingStatus.Tracing.MAP_DATA_EXIST, + TracingStatus.Tracing.TRACK_FINDED, TracingStatus.Tracing.TRACK_LOADED, + TracingStatus.Tracing.ROUTE_LOADED -> { + // 默认是false,需要加第一次的判断 + if (isFirst || isTracingException) { + isFirst = false + isTracingException = false + // 不加锁,并行时多触发几次可接受 + checkIfNotException() + CallerDevaToolsListenerManager.invokeTracingStatus(true) + } + } + } + } + } + + private fun checkIfNotException() { + if (!isServerException && !isCloudSocketException && !isTracingException && !isGpsException) { + send(OverViewStatus(false)) + } + } + + /** + * 工控机连接状态 + */ + override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { + super.onAutopilotIpcConnectStatusChanged(status, reason) + } + + + override fun onDestroy() { + super.onDestroy() +// CallerDevaToolsListenerManager.removeListener(TAG) + CallerTelematicStatusListenerManager.removeListener(TAG) + MogoStatusManager.getInstance() + .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerAutoPilotStatusListenerManager.removeListener(TAG) +// CallerAutoPilotStatusListenerManager.removeListener(TAG) + + try { + if (registered.compareAndSet(true, false) && receiver != null) { + ctx.unregisterReceiver(receiver) + } + } catch (t: Throwable) { + t.printStackTrace() + } + AppStateManager.unRegisterAppStateListener(onStateListener) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt index b67983666b..91d6115301 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt @@ -2,13 +2,8 @@ package com.zhjt.mogo_core_function_devatools.status.model import androidx.lifecycle.* import com.mogo.eagle.core.function.call.autopilot.* -import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus -import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus -import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus +import com.zhjt.mogo_core_function_devatools.status.entity.* //import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus -import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus -import com.zhjt.mogo_core_function_devatools.status.entity.Status -import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.UNKNOWN import java.util.concurrent.atomic.* import kotlin.Pair @@ -19,11 +14,13 @@ internal class StatusModel : ViewModel() { const val TAG = "StatusModel" val DEFAULTS = Pair(null, ArrayList().also { + it += OverViewStatus() it += IpcStatus(CallerAutoPilotControlManager.isConnected()) it += CanStatus(false) - it += TracingStatus(UNKNOWN) +// it += TracingStatus(UNKNOWN) it += RTKStatus("", -1) - it += GpsStatus(enabled = false, isGranted = false) + // it += NetStatus(false) +// it += GpsStatus(enabled = false, isGranted = false) }) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt new file mode 100644 index 0000000000..1845640015 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt @@ -0,0 +1,34 @@ +package com.zhjt.mogo_core_function_devatools.status.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.zhjt.mogo_core_function_devatools.R + +/** + * 状态汇总View控件 + */ +class StatusSummaryView@JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout( + context, + attrs, + defStyleAttr +), IMoGoAutopilotStatusListener { + companion object{ + private const val TAG = "SummaryStatusView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_initiative_bad_case, this, true) + initView() + } + + private fun initView() { + + } +} \ No newline at end of file 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 8eb2ccbe6f..7d550b71f8 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 @@ -5,6 +5,7 @@ import android.view.* import android.widget.* import androidx.core.content.* import androidx.recyclerview.widget.* +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA @@ -15,6 +16,7 @@ import com.zhjt.mogo_core_function_devatools.status.entity.* import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* +import com.zhjt.mogo_core_function_devatools.status.ui.StatusSummaryView import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter.StatusViewHolder internal class StatusAdapter(val ctx: Context, var data: ArrayList): RecyclerView.Adapter() { @@ -39,9 +41,12 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } fun bind(status: Status) { -// itemView.onClick { + itemView.onClick { // ToastUtils.showShort(getText(status)) -// } + if (status is OverViewStatus) { + CallerHmiManager.showStatusSummaryDialog() + } + } when(status) { is IpcStatus -> { if (status.enabled) { @@ -99,6 +104,15 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_rtk_unknow) } } + is OverViewStatus -> { + if (status.hasException) { + iv.scaleType = ImageView.ScaleType.FIT_CENTER + iv.setImageResource(drawable.icon_red_warning) + } else { + iv.scaleType = ImageView.ScaleType.FIT_CENTER + iv.setImageResource(drawable.icon_grey_warning) + } + } } } @@ -140,6 +154,9 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec UNKNOWN -> "暂无轨迹" } } + is OverViewStatus -> { + "" + } } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_grey_warning.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_grey_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..3a94c8d5e492ebda01c8cedfb8df91370bdf2662 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4S0MfL>C+)OQw$0>>z4^B zM%BEu{m^PZU3rDt+p8K2>K*PkZVG?tV`~=k>Zc)3QrIg`mx$*=&Fs1pBc3_FS&_To zZq}08TJKXA8LK>XrXJg@bF@wD+JP(9QE4$RuSGh%ntkpi`-cdf>B6UYkCZU$tZTyTFIp6zoE^tnblgv!}E4=!~*+31zI kx}WD&l*-|)zx5>J>kL$sj)<*a0Q3rjr>mdKI;Vst0CSafSO5S3 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_red_warning.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_red_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ad91fee6fbb28b6805b338c31e07d865db81c5b6 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4S0H`SMDCKY>}3;$OU82l zG&c$Wg;+|0{DK)8_B*(%_x%O(_j|fHhG?8`?Y}75tiaRaS;!D1u^@o`!YKxYoAt|t z6r*Zh+J0!YpRT+@?d?^K1@#X18#jf&^szOIdG*tfCn@Zer%S|hp=Ng7i4o5n->k@8 za5rm7ZLRmIi;PvCI#Z8r);ZcHcJ06w>!`Gtm)9a4Ud=xDlKn%3&UE2Zyhloy_41h+ z{&g`GH?3sS^WV^B+05#)h4;g4;f?)%2?v}x4stti3M5>aa8Sx9VnXF?od=h?o^15W lT;0#}DoW+>*57)P@pT3&N=L-jF93Rl!PC{xWt~$(69BdWZ$AJ4 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt index 32ba03dead..5f66e68f52 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt @@ -41,6 +41,7 @@ class WarningFloat { } + /** * 浮窗的属性构建类,支持链式调用 */ @@ -136,6 +137,10 @@ class WarningFloat { config.immersionStatusBar = immersionStatusBar } + fun slideDel(status: Boolean) = apply { + this.config.defaultSlideDel = status + } + /** * 设置浮窗的出入动画 * @param floatAnimator 浮窗的出入动画,为空时不执行动画 @@ -194,7 +199,10 @@ class WarningFloat { content?.let { config.layoutId = null config.layoutView = it - Reminder.enqueue(getLifecycleOwner(activity), WarningFloatReminder(activity, config, it)) + Reminder.enqueue( + getLifecycleOwner(activity), + WarningFloatReminder(activity, config, it) + ) } } else { WarningFloatWindowManager.create(activity, config) @@ -214,7 +222,11 @@ class WarningFloat { } - internal class WarningFloatReminder(private val activity: Context, private val config: WarningNotificationConfig, content: View): ViewReminder(content) { + internal class WarningFloatReminder( + private val activity: Context, + private val config: WarningNotificationConfig, + content: View + ) : ViewReminder(content) { private var hasShow = false @@ -235,7 +247,8 @@ class WarningFloat { } } - fun isShow(): Boolean = WarningFloatWindowManager.getHelper(config.floatTag)?.isShow() ?: false + fun isShow(): Boolean = + WarningFloatWindowManager.getHelper(config.floatTag)?.isShow() ?: false fun resetExpireTime(expireTime: Long) { if (!isShow()) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt index 3ef7faaee2..c634c547fc 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt @@ -128,7 +128,9 @@ internal class WarningFloatWindowHelper( // 设置触摸监听,直接关掉弹窗 frameLayout?.setOnTouchListener { _, _ -> - exitAnim() + if(config.defaultSlideDel){ + exitAnim() + } false } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt index 79d025bdd4..e1beb19212 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt @@ -67,7 +67,10 @@ data class WarningNotificationConfig( var width: Int = WindowManager.LayoutParams.WRAP_CONTENT, // 窗口高度 - var height: Int = WindowManager.LayoutParams.WRAP_CONTENT + var height: Int = WindowManager.LayoutParams.WRAP_CONTENT, + + // 默认滑动删除 + var defaultSlideDel :Boolean = true ) { var isEnqueue: Boolean = false var isOverride: Boolean = true 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 0075ac6e66..e28d26179c 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 @@ -23,6 +23,7 @@ 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.status.StatusSummaryEntity import com.mogo.eagle.core.function.api.hmi.warning.IMoGoHmiProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.hmi.* @@ -33,6 +34,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.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog import com.mogo.eagle.core.function.hmi.ui.tools.ModifyBindingCarDialog @@ -357,4 +359,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { override fun is360LookAroundShowing(): Boolean { return lookAround.get()?.isShowing() ?: false } + override fun showStatusSummaryDialog() { + context?.let { StatusView.statusView.toggle(it) } + } } \ 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/setting/StatusSummaryAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt new file mode 100644 index 0000000000..f610f0dddb --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt @@ -0,0 +1,57 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.content.Context +import android.graphics.Color +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.status.StatusSummaryEntity +import com.mogo.eagle.core.function.hmi.R + +class StatusSummaryAdapter(private val ctx: Context, var data: ArrayList): RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = StatusViewHolder( + LayoutInflater.from(ctx).inflate(R.layout.item_status_summary_layout, parent, false)) + + override fun getItemCount(): Int = data.size + + override fun onBindViewHolder(holder: StatusViewHolder, position: Int) { + holder.bind(data[position]) + } + + class StatusViewHolder(item: View) : RecyclerView.ViewHolder(item) { + private val ivFuncView: ImageView by lazy { + itemView.findViewById(R.id.ivFuncView) + } + + private val tvStatusDesc: TextView by lazy { + itemView.findViewById(R.id.tvStatusDesc) + } + + fun bind(entity: StatusSummaryEntity) { + when(entity.type) { + 0 -> { + ivFuncView.setImageResource(R.drawable.driver_server) + } + 1 -> { + ivFuncView.setImageResource(R.drawable.gps) + } + 2 -> { + ivFuncView.setImageResource(R.drawable.cloud_socket) + } + 3 -> { + ivFuncView.setImageResource(R.drawable.tracing) + } + } + if (entity.isException) { + tvStatusDesc.setTextColor(Color.parseColor("#FF4444")) + } else { + tvStatusDesc.setTextColor(Color.parseColor("#FFFFFF")) + } + tvStatusDesc.text = entity.desc + } + } +} \ 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/setting/StatusSummaryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt new file mode 100644 index 0000000000..8b349668fe --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt @@ -0,0 +1,156 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.eagle.core.data.status.StatusSummaryEntity +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.kotlin.PX +import com.mogo.eagle.core.utilcode.rv.divider.CommonDividerItemDecoration +import com.mogo.eagle.core.utilcode.util.UiThreadHandler + +/** + * 状态汇总View控件 + */ +class StatusSummaryView@JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout( + context, + attrs, + defStyleAttr +), IConnectStatusListener, IMogoStatusChangedListener, + IMoGoDevaToolsListener { + companion object{ + private const val TAG = "SummaryStatusView" + } + + private var clickListener: ClickListener? = null + private var rvStatusView: RecyclerView? = null + private var adapter: StatusSummaryAdapter? = null + private val data by lazy { + ArrayList().also { + it.add(StatusSummaryEntity(0)) + it.add(StatusSummaryEntity(1)) + it.add(StatusSummaryEntity(2)) + it.add(StatusSummaryEntity(3)) + } + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_status_summary_layout, this, true) + initView() + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerDevaToolsListenerManager.addListener(TAG, this) + // 司机屏Server服务是否开启的状态 + CallerTelematicStatusListenerManager.addListener(TAG, this) + // 云socket连接状态 + MogoStatusManager.getInstance() + .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + } + + private fun initView() { + rvStatusView = findViewById(R.id.rvStatusView) + rvStatusView?.let { + it.itemAnimator?.apply { + changeDuration = 0 + addDuration = 0 + moveDuration = 0 + removeDuration = 0 + } + it.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + it.addItemDecoration( + CommonDividerItemDecoration.Builder() + .spanCountTBCare(false) + .horizontalInnerSpace(10.PX) + .build()) + StatusSummaryAdapter(context, data).apply { + adapter = this + it.adapter = this + } + } + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun showWindow(show: Boolean) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + // 司机屏Server服务是否开启的状态 + CallerTelematicStatusListenerManager.removeListener(TAG) + CallerDevaToolsListenerManager.removeListener(TAG) + // 云socket连接状态 + MogoStatusManager.getInstance() + .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerAutoPilotStatusListenerManager.removeListener(TAG) + } + + /** + * 司机屏服务是否启动的状态 + */ + override fun onServerStatusChanged(isStarted: Boolean) { + super.onServerStatusChanged(isStarted) + UiThreadHandler.post({ + if (data.size < 1) return@post + data[0].desc = "司机屏Server启动${if (isStarted) "正常" else "异常"}" + data[0].isException = !isStarted + adapter?.notifyItemChanged(0) + }, UiThreadHandler.MODE.QUEUE) + } + + override fun gpsStatus(status: Boolean) { + super.gpsStatus(status) + UiThreadHandler.post({ + if (data.size < 2) return@post + data[1].desc = "GPS${if (status) "正常" else "异常"}" + data[1].isException = !status + adapter?.notifyItemChanged(1) + }, UiThreadHandler.MODE.QUEUE) + } + + /** + * 云Socket + */ + override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { + if (StatusDescriptor.CLOUD_SOCKET == descriptor) { + UiThreadHandler.post({ + if (data.size < 3) return@post + data[2].desc = "云Socket连接${if (isTrue) "正常" else "异常"}" + data[2].isException = !isTrue + adapter?.notifyItemChanged(2) + }, UiThreadHandler.MODE.QUEUE) + } + } + + override fun tracingStatus(status: Boolean) { + super.tracingStatus(status) + // 发送事件前限制了频率 + UiThreadHandler.post({ + if (data.size < 4) return@post + data[3].desc = "寻迹算路${if (status) "正常" else "异常"}" + data[3].isException = !status + adapter?.notifyItemChanged(3) + }, UiThreadHandler.MODE.QUEUE) + } +} \ 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/setting/StatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusView.kt new file mode 100644 index 0000000000..424afa0987 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusView.kt @@ -0,0 +1,87 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +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.data.status.StatusSummaryEntity +import com.mogo.eagle.core.function.hmi.notification.WarningFloat +import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator +import com.mogo.eagle.core.utilcode.util.BarUtils +import com.mogo.eagle.core.utilcode.util.ScreenUtils +import me.jessyan.autosize.utils.AutoSizeUtils + +/** + * 汇总状态View的管理类 + */ +class StatusView private constructor() { + + private var mStatusSummaryViewFloat: WarningFloat.Builder? = null + private var mStatusSummaryView: StatusSummaryView? = null + + companion object { + val statusView by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + StatusView() + } + } + + fun toggle(context: Context, gravity: Int = Gravity.RIGHT, sidePattern: SidePattern = SidePattern.RIGHT) { + if (mStatusSummaryViewFloat != null) { + dismiss() + } else { + if (mStatusSummaryView == null) { + mStatusSummaryView = StatusSummaryView(context) + mStatusSummaryView?.setClickListener(object : StatusSummaryView.ClickListener { + override fun showWindow(show: Boolean) { + + } + }) + } + val height = AutoSizeUtils.dp2px(context, 1100f) + val maxHeight = ScreenUtils.getScreenHeight() - BarUtils.getStatusBarHeight() + val currentHeight = if(height>maxHeight) maxHeight else height + mStatusSummaryViewFloat = WarningFloat.with(context) + .setTag("StatusSummaryView") + .setLayout(mStatusSummaryView!!) + .setSidePattern(sidePattern) + .setGravity(gravity, offsetY = 70) + .setImmersionStatusBar(true) + .slideDel(false) + .setWindowHeight(currentHeight) + .setWindowWidth(AutoSizeUtils.dp2px(context, 600f)) + .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? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() + } + } + + fun dismiss() { + mStatusSummaryViewFloat?.let { + WarningFloat.dismiss(it.config.floatTag, false) + mStatusSummaryViewFloat = null + mStatusSummaryView = null + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/cloud_socket.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/cloud_socket.png new file mode 100644 index 0000000000000000000000000000000000000000..78010424f510345409e3d10b168f5568a0edae7c GIT binary patch literal 480 zcmV<60U!Q}P)=O+Yp!A5SH5;)ydKT000DZQchCy8luS6 zM@ZxdxDC{-!cQDH?I9n>Ta(te@4_b z-lAPC$AXS&lZo#FxO5X}`;g{4;rkA|1U~&J@5zVGrOm^hH2e-a|H0wUo|t3oW#myHi= W=O+Ypo65S81-cs$Vn000DZQchCI4chHdQu zH0c3Mrw4F5djNH~|CzR#QGuxVw8`*hK|bmaC~nu8tP*U8+v3=N!P{OV{{q>J1dt$5 z&3FAP1~`F$Wl905=hpyo5ev)%CQJBeaSxjId#2 z4+yO!Y$kF#Kb-6>2g(G#W>|?e-GHFBw)3`@z!`g&07)hwgA=H%p(PwfAI-Ydz&mNd z3!aw{o1z^axjH-hQC9QwNs}gec$LPsWSMvpU~Ye9X_9rVU#|jt)G8bX1h!$ySAz(X zxw#%)A`33z=#W#STLUG-d=ZB#Fv-Aujs~@G?<-iu=Ng$?g90EiVn4J2Iurf?f0g&U T*^-B200000NkvXXu0mjfV}!9g literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/gps.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/gps.png new file mode 100644 index 0000000000000000000000000000000000000000..a0a0ed4b98e0a213459c14f5d35ab4bcd32d7a32 GIT binary patch literal 487 zcmV=P+Yy%A5tiG`y2tSV000DZQchCwjCH{Wk#g-t20c!f~`$Dp^cO=`k|%s$kUh^|5QVnGXE-J;Ypt_;UhY~R+_r2diS zPal^9yXisD@?J3sgdnyFg-t*C$vfL+N*{YAFtR$2b+WQ%bBYzCD~}*LR~kJrPU1bu z68Pi}K>#&d>_uP@fC}FBG9n?UG9h*XEa69RE#3uH_(}7|jv_dfa4-x7Kn57jZLuJ9 z1$AKW5I}ulsZ9k9-pppPLn0{Ex0k}KH_-{IoTR-!FxQflHlonw*f~W|Iuy}yXlsZZ zi;v%qQ*?$PxJy6~m;%uhWVHxSjb=Z9IM?vpD{AN!sL@}3YNmRasL=mW*m-?n7>p)? zsA6s{5LtKd)Ggu5sis1U8KoGAorR9bOnMx4ijiUgie{l3$la2kpb{I`LbbqPY=MCi dHjWMS_yx4NbM?(mfw%ww002ovPDHLkV1mh2(1ZX0 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/tracing.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/tracing.png new file mode 100644 index 0000000000000000000000000000000000000000..856564c75dd7203d83d27fd9bd0144b4b32e7c32 GIT binary patch literal 319 zcmV-F0l@x=P)@P+Z31E5|-O|fYo*Y000DZQchCNMX|U5 zd@KMh3&83E1n&OVRLh6724<3)_~rRA#*@o9nL*rKikuWJ^Z;p8030RM*s#`x;HuI~? RE)oC$002ovPDHLkV1nS+f~Nog literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml new file mode 100644 index 0000000000..b4577984db --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_status_summary_layout.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_summary_layout.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_summary_layout.xml new file mode 100644 index 0000000000..f3e2382a3f --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_summary_layout.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/status/StatusSummaryEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/status/StatusSummaryEntity.kt new file mode 100644 index 0000000000..4c130e5bce --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/status/StatusSummaryEntity.kt @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.data.status + +/** + * 状态汇总 + */ +data class StatusSummaryEntity( + var type: Int, + var desc: String = "", + var isException: Boolean = false +) diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt index da403dc073..0162e6fcb3 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt @@ -55,4 +55,11 @@ interface IMoGoDevaToolsListener { } + fun gpsStatus(status:Boolean) {// true:开启并授权 + + } + + fun tracingStatus(status:Boolean) {// true:未异常 + + } } \ 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 d6d37017a1..680591b045 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 @@ -148,4 +148,5 @@ interface IMoGoHmiProvider :IProvider{ * 360环视弹窗是否正在展示 */ fun is360LookAroundShowing(): Boolean + fun showStatusSummaryDialog() } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/telematic/IConnectStatusListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/telematic/IConnectStatusListener.kt new file mode 100644 index 0000000000..aa20cd9b83 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/telematic/IConnectStatusListener.kt @@ -0,0 +1,5 @@ +package com.mogo.eagle.core.function.api.telematic + +interface IConnectStatusListener { + fun onServerStatusChanged(isStarted: Boolean) {} +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt index e5dbf6ed43..f96fcfffde 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt @@ -6,6 +6,15 @@ import com.mogo.eagle.core.function.call.base.CallerBase object CallerDevaToolsListenerManager : CallerBase() { + private var gpsStatus: Boolean = true + private var tracingStatus: Boolean = true + + override fun doSomeAfterAddListener(tag: String, listener: IMoGoDevaToolsListener) { + super.doSomeAfterAddListener(tag, listener) + listener.gpsStatus(gpsStatus) + listener.tracingStatus(tracingStatus) + } + fun invokeDevaToolsLogCatchStart() { M_LISTENERS.forEach { val listener = it.value @@ -62,4 +71,19 @@ object CallerDevaToolsListenerManager : CallerBase() { } } + fun invokeGpsStatus(status: Boolean) { + gpsStatus = status + M_LISTENERS.forEach { + val listener = it.value + listener.gpsStatus(status) + } + } + + fun invokeTracingStatus(status: Boolean) { + tracingStatus = status + M_LISTENERS.forEach { + val listener = it.value + listener.tracingStatus(status) + } + } } \ No newline at end of file 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 253f70b69a..4ada41acd0 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 @@ -219,4 +219,8 @@ object CallerHmiManager { fun isM1360LookAroundShowing(): Boolean { return hmiProviderApi?.is360LookAroundShowing() ?: false } + + fun showStatusSummaryDialog() { + hmiProviderApi?.showStatusSummaryDialog() + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicStatusListenerManager.kt new file mode 100644 index 0000000000..e880fb1364 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/telematic/CallerTelematicStatusListenerManager.kt @@ -0,0 +1,30 @@ +package com.mogo.eagle.core.function.call.telematic + +import android.util.Log +import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener +import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener +import com.mogo.eagle.core.function.call.base.CallerBase + +object CallerTelematicStatusListenerManager: CallerBase() { + + private const val TAG = "CallerTelematicStatusListenerManager" + + private var isServerStarted = false + + override fun doSomeAfterAddListener(tag: String, listener: IConnectStatusListener) { + super.doSomeAfterAddListener(tag, listener) + listener.onServerStatusChanged(isServerStarted) + } + + fun invokeServerStatusChanged(isStarted: Boolean) { + isServerStarted = isStarted + M_LISTENERS.forEach { + val listener = it.value + try { + listener.onServerStatusChanged(isStarted) + } catch (e: Exception) { + Log.e(TAG, "转发出现异常:${e.message}") + } + } + } +} \ No newline at end of file