diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml
index ec0776154c..90ee278539 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml
@@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.mogo.eagle.core.function.hmi">
-
+
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt
new file mode 100644
index 0000000000..b899aade12
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectStatusView.kt
@@ -0,0 +1,205 @@
+package com.mogo.eagle.core.function.hmi.ui.widget
+
+import android.content.Context
+import android.graphics.Color
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.RelativeLayout
+import com.mogo.commons.utils.MogoAnalyticUtils
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
+import com.mogo.eagle.core.function.hmi.R
+import com.mogo.eagle.core.utilcode.util.NetworkUtils
+import com.mogo.eagle.core.utilcode.util.NetworkUtils.OnNetworkStatusChangedListener
+import com.mogo.eagle.core.utilcode.util.SpanUtils
+import kotlinx.android.synthetic.main.view_connect_status.view.tvADASStatus
+import kotlinx.android.synthetic.main.view_connect_status.view.tvNetStatus
+
+/**
+ * 当前APP的各种连接状态展示
+ * 网络连接、ADAS、外网
+ */
+class ConnectStatusView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : RelativeLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
+
+ companion object {
+ private const val TAG = "ConnectStatusView"
+ }
+
+ private var onNetworkStatusChangedListener: OnNetworkStatusChangedListener
+
+ // 断开网络的次数
+ private var disconnectNetCount = 0
+ private var disconnectNetTime = 0L
+
+ // 断开ADAS的次数
+ private var disconnectADASCount = 0
+ private var disconnectADASTime = 0L
+
+ init {
+ LayoutInflater.from(context).inflate(R.layout.view_connect_status, this, true)
+ val netSpan = SpanUtils.with(tvNetStatus)
+ netSpan.append("网络连接:")
+ if (NetworkUtils.isConnected()) {
+ netSpan.append("已连接")
+ .setForegroundColor(Color.GREEN)
+ } else {
+ disconnectNetCount++
+ netSpan.append("已断开")
+ .setForegroundColor(Color.RED)
+ netSpan.append("| 断链次数:")
+ .append("$disconnectNetCount")
+ .setForegroundColor(Color.RED)
+ }
+ netSpan.create()
+
+ onNetworkStatusChangedListener = object : OnNetworkStatusChangedListener {
+ override fun onDisconnected() {
+ disconnectNetCount++
+ disconnectNetTime = System.currentTimeMillis()
+ val netSpan = SpanUtils.with(tvNetStatus)
+ netSpan.append("网络连接:")
+ .append("已断开")
+ .setForegroundColor(Color.RED)
+ netSpan.append("| 断链次数:")
+ .append("$disconnectNetCount")
+ .setForegroundColor(Color.RED)
+ netSpan.create()
+ //netSpan.append("断开时常").append("$disconnectNetCount").setForegroundColor(Color.RED)
+
+ // 统计代码
+ val properties: MutableMap = HashMap()
+ properties["连接状态"] = "已断开"
+ properties["重连次数"] = "$disconnectNetCount"
+ MogoAnalyticUtils.track("SYS_NET_STATUS", properties)
+
+ }
+
+ override fun onConnected(networkType: NetworkUtils.NetworkType?) {
+ // 统计代码
+ val properties: MutableMap = HashMap()
+ properties["连接状态"] = "已连接"
+ properties["重连次数"] = "$disconnectNetCount"
+
+ val netSpan = SpanUtils.with(tvNetStatus)
+ netSpan.append("网络连接:")
+ .append("已连接")
+ .setForegroundColor(Color.GREEN)
+ netSpan.append("| 断链次数:")
+ .append("$disconnectNetCount")
+ .setForegroundColor(Color.RED)
+ if (disconnectNetTime != 0L) {
+ netSpan.append("| 断开时常:")
+ .append("${(System.currentTimeMillis() - disconnectNetTime) / 1000} s")
+ .setForegroundColor(Color.RED)
+ properties["断开时常"] =
+ "${(System.currentTimeMillis() - disconnectNetTime) / 1000} s"
+ }
+ netSpan.create()
+
+ MogoAnalyticUtils.track("SYS_NET_STATUS", properties)
+ }
+ }
+ }
+
+ override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) {
+ super.onAutopilotIpcConnectStatusChanged(status, reason)
+ tvADASStatus.post {
+ when (status) {
+ IPC_CONNECTION_STATUS.CONNECTED -> {
+ // 统计代码
+ val properties: MutableMap = HashMap()
+ properties["连接状态"] = "已连接"
+ properties["重连次数"] = "$disconnectADASCount"
+
+ val adasSpan = SpanUtils.with(tvADASStatus)
+ adasSpan.append("ADAS连接:")
+ .append("已连接")
+ .setForegroundColor(Color.GREEN)
+ adasSpan.append("| 重连次数:")
+ .append("$disconnectADASCount")
+ .setForegroundColor(Color.RED)
+
+ if (disconnectADASTime != 0L) {
+ adasSpan.append("| 断开时常:")
+ .append("${(System.currentTimeMillis() - disconnectADASTime) / 1000} s")
+ .setForegroundColor(Color.RED)
+ properties["断开时常"] =
+ "${(System.currentTimeMillis() - disconnectADASTime) / 1000} s"
+ }
+ adasSpan.create()
+
+ MogoAnalyticUtils.track("IPC_CONNECTION_STATUS", properties)
+ }
+
+ IPC_CONNECTION_STATUS.DISCONNECTED -> {
+ disconnectADASCount++
+ disconnectADASTime = System.currentTimeMillis()
+ val adasSpan = SpanUtils.with(tvADASStatus)
+
+ // 统计代码
+ val properties: MutableMap = HashMap()
+ properties["连接状态"] = "已连接"
+ properties["重连次数"] = "$disconnectADASCount"
+
+ MogoAnalyticUtils.track("IPC_CONNECTION_STATUS", properties)
+
+ adasSpan.append("ADAS连接:")
+ .append("已断开")
+ .setForegroundColor(Color.RED)
+
+ adasSpan.append("| 重连次数:")
+ .append("$disconnectADASCount")
+ .setForegroundColor(Color.RED)
+ adasSpan.create()
+ }
+ }
+ }
+ }
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+ NetworkUtils.registerNetworkStatusChangedListener(onNetworkStatusChangedListener)
+ CallerAutoPilotStatusListenerManager.addListener(TAG, this)
+ }
+
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ NetworkUtils.unregisterNetworkStatusChangedListener(onNetworkStatusChangedListener)
+ CallerAutoPilotStatusListenerManager.removeListener(TAG)
+ }
+
+ interface IPC_CONNECTION_STATUS {
+ companion object {
+ /**
+ * 已连接
+ */
+ const val CONNECTED = 0x00
+
+ /**
+ * 未连接
+ */
+ const val DISCONNECTED = 0x01
+
+ /**
+ * 正在连接
+ */
+ const val CONNECTING = 0x02
+
+ /**
+ * 正在搜索IP
+ */
+ const val SEARCH_ADDRESS = 0x03
+
+ /**
+ * 找不到可用IP 传入的IP不可用或固定IP列表中所有IP不可用
+ */
+ const val NOT_FOUND_ADDRESS = 0x04
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml
index 0b1e1b60cd..e5ef718f8c 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml
@@ -37,4 +37,11 @@
android:layout_height="680dp"
android:layout_gravity="bottom" />
+
+
+
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_connect_status.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_connect_status.xml
new file mode 100644
index 0000000000..767fe29dce
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_connect_status.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file