diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt index 4ccbe398d2..1f28ff91d8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt @@ -2,7 +2,11 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.animation.ObjectAnimator import android.animation.ValueAnimator +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.ConnectivityManager import android.os.CountDownTimer import android.text.TextUtils import android.util.AttributeSet @@ -32,20 +36,21 @@ import kotlinx.android.synthetic.main.view_cold_start.view.ivColdStartStatus import kotlinx.android.synthetic.main.view_cold_start.view.ivIpcConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.ivNodeListMask import kotlinx.android.synthetic.main.view_cold_start.view.ivSsmConnectStatus +import kotlinx.android.synthetic.main.view_cold_start.view.ivWifiConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.rvNodeList import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartContent import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartNow import kotlinx.android.synthetic.main.view_cold_start.view.tvIpcConnectContent import kotlinx.android.synthetic.main.view_cold_start.view.tvSsmConnectContent import kotlinx.android.synthetic.main.view_cold_start.view.tvSystemStartupTitle -import kotlinx.android.synthetic.main.view_cold_start.view.viewColdStartDivider -import kotlinx.android.synthetic.main.view_cold_start.view.viewSsmConnectDivider +import kotlinx.android.synthetic.main.view_cold_start.view.tvWifiConnectContent import system_master.SsmInfo import system_master.SystemStatusInfo import java.util.Locale import java.util.regex.Matcher import java.util.regex.Pattern + /** * 冷启动呈现二期 * 前置展示冷启动过程和结果 @@ -63,12 +68,15 @@ class ColdStartView @JvmOverloads constructor( const val COLD_START_WAITING_TIME = 600000L //冷启动超时等待时间 } + private var wifiConnectStatus = false //WIFI连接状态,默认是未连接 private var ipcConnectStatus = false //连接域控状态,默认是未连接 private var ssmConnectStatus = false //SSM连接状态,默认是未连接 private var coldStartStatus = false //冷启动状态,默认是未冷启动成功 private var currentColdStartSuccess = false //冷启动成功状态,也是成功后动画完成状态 + private var wifiRotationAnim: ObjectAnimator?= null //WIFI连接状态动画 + private var ipcRotationAnim: ObjectAnimator?= null //域控连接状态动画 private var ssmRotationAnim: ObjectAnimator?= null //SSM连接状态动画 @@ -117,6 +125,11 @@ class ColdStartView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() + // 注册广播接收器 + val intentFilter = IntentFilter() + intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION) + context.applicationContext.registerReceiver(networkStateReceiver, intentFilter) + showWifiConnecting() CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerColdStartStateListenerManager.addListener(TAG,this) } @@ -125,24 +138,30 @@ class ColdStartView @JvmOverloads constructor( super.onDetachedFromWindow() CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerColdStartStateListenerManager.removeListener(TAG) + wifiRotationAnim?.cancel() ipcRotationAnim?.cancel() ssmRotationAnim?.cancel() connectSSMTimer?.cancel() coldStartRotationAnim?.cancel() connectColdStartTimer?.cancel() + // 取消注册广播接收器 + context.applicationContext.unregisterReceiver(networkStateReceiver) } override fun onAutopilotIpcConnectStatusChanged( status: AdasConstants.IpcConnectionStatus, reason: String? ){ + ipcConnectStatus = status == AdasConstants.IpcConnectionStatus.CONNECTED + if(!wifiConnectStatus){ + return + } ThreadUtils.runOnUiThread { - ipcConnectStatus = if(status == AdasConstants.IpcConnectionStatus.CONNECTED){ + if(status == AdasConstants.IpcConnectionStatus.CONNECTED){ //域控连接成功 - if(!ipcConnectStatus){ + if(ipcConnectStatus){ showIPCConnectSuccessView() } - true }else{ //域控连接失败 when(status){ @@ -206,8 +225,6 @@ class ColdStartView @JvmOverloads constructor( - - /** * 状态查询应答 * @param status 数据 @@ -331,6 +348,28 @@ class ColdStartView @JvmOverloads constructor( } } + private val networkStateReceiver: BroadcastReceiver = object: BroadcastReceiver(){ + override fun onReceive(context: Context?, intent: Intent?) { + if (intent!!.action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { + val connectivityManager = + context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val networkInfo = connectivityManager.activeNetworkInfo + ThreadUtils.runOnUiThread { + if (networkInfo != null && networkInfo.isConnected) { + // 网络连接可用 + connectWifiSuccess() + } else { + // 网络连接不可用 + showWifiConnecting() + } + } + + } + } + + } + + /** * 冷启动状态 */ @@ -392,12 +431,12 @@ class ColdStartView @JvmOverloads constructor( ipcRotationAnim?.cancel() ivIpcConnectStatus.rotation = 0f tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_success) //开启连接SSM倒计时 connectSSMProcess() //域控连接成功后开始展示SSM连接状态 - viewSsmConnectDivider.visibility = View.VISIBLE ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) //旋转动画 if(ssmRotationAnim == null){ @@ -411,13 +450,7 @@ class ColdStartView @JvmOverloads constructor( //设置SSM连接文案为连接中 tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_loading) tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, android.R.color.white)) - viewSsmConnectDivider.visibility = View.VISIBLE - ivSsmConnectStatus.visibility = View.VISIBLE - tvSsmConnectContent.visibility = View.VISIBLE //隐藏冷启动相关视图 - viewColdStartDivider.visibility = View.GONE - ivColdStartStatus.visibility = View.GONE - tvColdStartContent.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE //域控连接成功埋点统计 @@ -434,6 +467,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showIPCConnectFailView(failReason: String?){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_exception) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail)) if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(failReason)){ return } @@ -443,14 +477,7 @@ class ColdStartView @JvmOverloads constructor( failReason?.let { tvIpcConnectContent.text = it } - //隐藏SSM相关视图 - viewSsmConnectDivider.visibility = View.GONE - ivSsmConnectStatus.visibility = View.GONE - tvSsmConnectContent.visibility = View.GONE //隐藏冷启动相关视图 - viewColdStartDivider.visibility = View.GONE - ivColdStartStatus.visibility = View.GONE - tvColdStartContent.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE //域控连接失败埋点统计 @@ -462,8 +489,75 @@ class ColdStartView @JvmOverloads constructor( newColdStart = false } + /** + * 等待网络连接 + */ + private fun showWifiConnecting(){ + wifiConnectStatus = false + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_wifi_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) + ivWifiConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) + tvWifiConnectContent.text = resources.getString(R.string.wifi_connect_loading) + if(wifiRotationAnim == null){ + wifiRotationAnim = ObjectAnimator.ofFloat(ivWifiConnectStatus, "rotation", 0f, 360f) + } + wifiRotationAnim?.repeatCount = ValueAnimator.INFINITE + wifiRotationAnim?.repeatMode = ValueAnimator.RESTART + wifiRotationAnim?.duration = 1500 + wifiRotationAnim?.interpolator = LinearInterpolator() + wifiRotationAnim?.start() + //动画和计时器重置 + ipcRotationAnim?.cancel() + ivIpcConnectStatus.rotation = 0f + ssmRotationAnim?.cancel() + ivSsmConnectStatus.rotation = 0f + connectSSMTimer?.cancel() + coldStartRotationAnim?.cancel() + ivColdStartStatus.rotation = 0f + connectColdStartTimer?.cancel() + //域控连接状态展示 + ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait)) + tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_wait) + //SSM连接状态展示 + ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait)) + tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_wait) + //冷启动节点状态展示 + ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait)) + tvColdStartContent.text = resources.getString(R.string.cold_start_wait) + //隐藏Topic列表 + rvNodeList.visibility = View.GONE + ivNodeListMask.visibility = View.GONE + ipcConnectStatus = false + } + + private fun connectWifiSuccess(){ + wifiConnectStatus = true + wifiRotationAnim?.cancel() + ivWifiConnectStatus.rotation = 0f + ivWifiConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) + tvWifiConnectContent.text = resources.getString(R.string.wifi_connect_success) + //开始连接域控 + tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_loading) + ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) + if(ipcRotationAnim == null){ + ipcRotationAnim = ObjectAnimator.ofFloat(ivIpcConnectStatus, "rotation", 0f, 360f) + } + ipcRotationAnim?.repeatCount = ValueAnimator.INFINITE + ipcRotationAnim?.repeatMode = ValueAnimator.RESTART + ipcRotationAnim?.duration = 1500 + ipcRotationAnim?.interpolator = LinearInterpolator() + ipcRotationAnim?.start() + //隐藏冷启动相关视图 + rvNodeList.visibility = View.GONE + ivNodeListMask.visibility = View.GONE + if(ipcConnectStatus){ + showIPCConnectSuccessView() + } + } + private fun showIPCConnecting(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) tvIpcConnectContent.text = "正在重连域控..." if(ipcRotationAnim == null){ @@ -474,14 +568,7 @@ class ColdStartView @JvmOverloads constructor( ipcRotationAnim?.duration = 1500 ipcRotationAnim?.interpolator = LinearInterpolator() ipcRotationAnim?.start() - //隐藏SSM相关视图 - viewSsmConnectDivider.visibility = View.GONE - ivSsmConnectStatus.visibility = View.GONE - tvSsmConnectContent.visibility = View.GONE //隐藏冷启动相关视图 - viewColdStartDivider.visibility = View.GONE - ivColdStartStatus.visibility = View.GONE - tvColdStartContent.visibility = View.GONE rvNodeList.visibility = View.GONE ivNodeListMask.visibility = View.GONE } @@ -508,6 +595,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showSSMConnectSuccessView(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_wait) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) //取消旋转动画 ssmRotationAnim?.cancel() //取消连接SSM超时等待倒计时 @@ -518,9 +606,6 @@ class ColdStartView @JvmOverloads constructor( tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_success) tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, R.color.white)) //展示冷启动连接过程视图 - viewColdStartDivider.visibility = View.VISIBLE - ivColdStartStatus.visibility = View.VISIBLE - tvColdStartContent.visibility = View.VISIBLE rvNodeList.visibility = View.VISIBLE ivNodeListMask.visibility = View.VISIBLE tvColdStartContent.text = "启动中…" @@ -541,6 +626,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showSSMConnectFailView(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_exception) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail)) //取消旋转动画 ssmRotationAnim?.cancel() ivSsmConnectStatus.rotation = 0f @@ -606,6 +692,7 @@ class ColdStartView @JvmOverloads constructor( */ private fun showColdStartFailView(){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_exception) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail)) coldStartRotationAnim?.cancel() ivColdStartStatus.rotation = 0f ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail)) @@ -619,6 +706,7 @@ class ColdStartView @JvmOverloads constructor( private fun showColdStartSuccessView(){ if(coldStartStatus){ tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_success) + tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white)) coldStartRotationAnim?.cancel() ivColdStartStatus.rotation = 0f ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png index e469e824d2..f4191de57b 100644 Binary files a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_fail.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_wait.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_wait.png new file mode 100644 index 0000000000..e26a905ea3 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_cold_start_wait.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml index cdfd7a10f0..3eb4d5705b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_cold_start.xml @@ -20,15 +20,49 @@ /> + + + + + + #131415 - #FFCD3D + #FF4E41 \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index 7ed0580a39..8e9714dd69 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -213,19 +213,27 @@ 红绿灯信号来源 已发起上报 + Wifi连接状态图标 域控连接状态图标 SSM连接状态图标 冷启动状态图标 + 等待连接车辆WiFi… + 已连接车辆Wi-Fi + 待连接域控 + 连接域控… 已连接域控 系统启动中… 系统启动成功 系统启动失败 + 待连接SSM 正在等待SSM信息 与SSM通信正常 超时未收到SSM信息,建议重启车辆并上报问题 + 待启动 系统启动成功,即将进入主页 系统启动异常,建议上报问题,可尝试重启车辆 + 等待车辆上电 等待连接域控 连接域控异常,持续重试中 等待SSM信息