From 0ea0604ef1c6f1bd5d27d17360246be369a8e739 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 22 Oct 2024 20:06:13 +0800 Subject: [PATCH] =?UTF-8?q?[6.7.0]=E5=86=B7=E5=90=AF=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevaToolsProvider.kt | 2 + .../coldstart/ColdStartAnalyticsManager.kt | 76 ++++++++++++++++++ .../coldstart/ColdStartConfig.kt | 54 +++++++++++++ .../coldstart/ColdStartManager.kt | 76 ++++++++++++++++++ .../core/function/hmi/ui/MoGoHmiProvider.kt | 10 +++ .../hmi/ui/widget/ColdStartAgainWindow.kt | 3 + .../function/hmi/ui/widget/ColdStartView.kt | 52 +++++++++--- .../res/drawable-xhdpi/bg_cold_start_now.png | Bin 0 -> 26656 bytes .../src/main/res/layout/view_cold_start.xml | 29 ++++++- .../src/main/res/values/strings.xml | 19 ++++- .../api/hmi/warning/IMoGoHmiProvider.kt | 5 ++ .../function/call/hmi/CallerHmiManager.kt | 8 ++ 12 files changed, 317 insertions(+), 17 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartAnalyticsManager.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartConfig.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_cold_start_now.png diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index ca49ae0e1c..55cb48a236 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -55,6 +55,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager import com.zhjt.mogo_core_function_devatools.block.MoGoBlockProviderImpl +import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartManager import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.exam.ExamControlManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter @@ -172,6 +173,7 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { BindingCarManager.init(mContext!!) // apmEnvProvider.init(if(DebugConfig.isDebug()) "0" else "1", "${ DebugConfig.getNetMode() }", mDockerVersion ?: "") BadCaseManager.init(mContext!!) + ColdStartManager.init(mContext!!) if (DebugConfig.isDebug()) { SdtManager.init(mContext!!, true, DetectResultImpl()) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartAnalyticsManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartAnalyticsManager.kt new file mode 100644 index 0000000000..c148d65cfb --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartAnalyticsManager.kt @@ -0,0 +1,76 @@ +package com.zhjt.mogo_core_function_devatools.coldstart + +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.commons.utils.MogoAnalyticUtils +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.utilcode.util.AppUtils + +/** + * 冷启动关键节点埋点统计管理 + */ +object ColdStartAnalyticsManager { + + private const val coldStartStep = "cold_start_step" //冷启动步骤埋点Key + + private const val eventParamPlateNumber = "plateNumber" //车牌号 + private const val eventParamCarSn = "carSn" //鹰眼SN + private const val eventParamMapVersion = "mapVersion" //工控机版本 + private const val eventParamEyeVersion = "eyeVersion" //鹰眼版本 + private const val eventParamAppFlavor = "appFlavor" //渠道信息 + private const val eventParamBranchHash = "branchHash" //Git Hash + private const val eventParamLatitude = "latitude" //纬度 + private const val eventParamLongitude = "longitude" //经度 + private const val eventParamStep = "step" //冷启动步骤 + + const val ipcConnectSuccess = "ipcConnectSuccess" //域控连接成功 + const val ipcConnectFail = "ipcConnectFail"//域控连接失败 + const val ssmConnectSuccess = "ssmConnectSuccess" //SSM连接成功 + const val ssmConnectFail = "ssmConnectFail"//SSM连接失败 + const val coldStartSuccess = "coldStartSuccess" //冷启动成功 + const val coldStartFail = "coldStartFail"//冷启动失败 + const val coldStartNow = "coldStartNow" //立即用车 + + /** + * 冷启动埋点统计 + * @param plateNumber 车牌号 + * @param carSn 鹰眼SN + * @param mapVersion 工控机版本 + * @param eyeVersion 鹰眼版本 + * @param appFlavor 渠道信息 + * @param branchHash Git Hash + * @param latitude 纬度 + * @param longitude 经度 + * @param step 冷启动步骤 + */ + private fun realColdStartStepAnalytics(plateNumber: String,carSn: String,mapVersion: String,eyeVersion: String, + appFlavor: String,branchHash: String,latitude: String,longitude: String, + step: String){ + val coldStartParams = HashMap() + coldStartParams[eventParamPlateNumber] = plateNumber + coldStartParams[eventParamCarSn] = carSn + coldStartParams[eventParamMapVersion] = mapVersion + coldStartParams[eventParamEyeVersion] = eyeVersion + coldStartParams[eventParamAppFlavor] = appFlavor + coldStartParams[eventParamBranchHash] = branchHash + coldStartParams[eventParamLatitude] = latitude + coldStartParams[eventParamLongitude] = longitude + coldStartParams[eventParamStep] = step + MogoAnalyticUtils.track(coldStartStep,coldStartParams) + } + + /** + * 冷启动埋点统计 + * @param step 冷启动步骤 + */ + fun coldStartStepAnalytics(step: String){ + realColdStartStepAnalytics(AppConfigInfo.plateNumber, SharedPrefsMgr.getInstance().sn, + CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "", + AppUtils.getAppVersionName(), AppConfigInfo.flavor,AppConfigInfo.workingBranchHash, + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude.toString(), + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude.toString(),step) + } + + +} \ 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/coldstart/ColdStartConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartConfig.kt new file mode 100644 index 0000000000..6a87032ae8 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartConfig.kt @@ -0,0 +1,54 @@ +package com.zhjt.mogo_core_function_devatools.coldstart + +import com.mogo.eagle.core.utilcode.util.SPUtils + +/** + * 冷启动配置参数 + */ +object ColdStartConfig { + + private var isShowing: Boolean = false + + private const val coldStartTime = "COLD_START_TIME" //启动时间 + private const val coldStartNow = "COLD_START_NOW" //立即用车 + + fun getShowWindowStatus(): Boolean{ + return isShowing + } + + fun setShowWindowStatus(isShowing: Boolean){ + this.isShowing = isShowing + } + + /** + * 获取上一次冷启动启动成功日期 + */ + fun getColdStartSuccessTime(): Long{ + return SPUtils.getInstance().getLong(coldStartTime) + } + + /** + * 记录冷启动成功日期 + */ + fun setColdStartSuccessTime(successTime: Long){ + SPUtils.getInstance().put(coldStartTime,successTime) + } + + /** + * 记录立即用车点击时间 + */ + fun setColdStartNowState(coldStartNowTime: Long){ + SPUtils.getInstance().put(coldStartNow,coldStartNowTime) + } + + /** + * 获取立即用车点击时间 + */ + fun getColdStartNowTime(): Long{ + return SPUtils.getInstance().getLong(coldStartNow) + } + + + + +} \ 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/coldstart/ColdStartManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt new file mode 100644 index 0000000000..72810d66b4 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt @@ -0,0 +1,76 @@ +package com.zhjt.mogo_core_function_devatools.coldstart + +import android.content.Context +import android.util.Log +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener +import com.mogo.eagle.core.function.api.och.IOchFunctionCallNotify +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.zhjt.mogo.adas.data.AdasConstants + +/** + * 冷启动管理 + */ +object ColdStartManager: IMoGoAutopilotStatusListener, IDataCenterBizListener { + + const val TAG = "ColdStartManager" + private var isColdStartNow: Boolean = false //当天是否点击了“立即用车” + private var isColdStartSuccess: Boolean = false //当天是否冷启动成功 + private var loginStatus: Boolean = false //当前登录状态 + private var ipcConnectedTime: Long = System.currentTimeMillis() + + + fun init(context: Context){ + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerDataCenterBizListener.addListener(TAG,this) + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + //获取当天是否点击过“立即用车” + val coldStartNowDay = millis2String(ColdStartConfig.getColdStartNowTime(), TimeUtils.getMdFormat()) + if(coldStartNowDay == currentDay){ + isColdStartNow = true + } + //获取当天是否冷启动成功 + val coldStartSuccessDay = millis2String(ColdStartConfig.getColdStartSuccessTime(), TimeUtils.getMdFormat()) + if(coldStartSuccessDay == currentDay){ + isColdStartSuccess = true + } + } + + override fun onAutopilotIpcConnectStatusChanged( + status: AdasConstants.IpcConnectionStatus, + reason: String? + ){ + //域控连接异常 + if(status != AdasConstants.IpcConnectionStatus.CONNECTED){ + //当前进入主页方式为立即用车,则在主页面不再展示冷启动页面 + if(isColdStartNow && !isColdStartSuccess){ + return + } + if(isColdStartNow && ColdStartConfig.getColdStartNowTime() > ColdStartConfig.getColdStartSuccessTime()){ + return + } + //已登录且距离上次冷启动成功超过1分钟,再次展示冷启动页面 + if(!ColdStartConfig.getShowWindowStatus() && loginStatus && System.currentTimeMillis().minus(ColdStartConfig.getColdStartSuccessTime())>60000){ + if(System.currentTimeMillis().minus(ipcConnectedTime) > 60000){ + CallerHmiManager.showColdStartWindow() + } + } + }else{ + ipcConnectedTime = System.currentTimeMillis() + } + } + + /** + * 当前登录状态 + * @param isLogin 是否登录 + */ + override fun invokeLoginStatus(isLogin: Boolean) { + super.invokeLoginStatus(isLogin) + loginStatus = isLogin + } + +} \ 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 c0cfd20528..9e9cd27db8 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 @@ -55,6 +55,7 @@ import com.mogo.eagle.core.function.hmi.ui.tools.ModifyBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.ToBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.UpgradeAppDialog import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog +import com.mogo.eagle.core.function.hmi.ui.widget.ColdStartAgainWindow import com.mogo.eagle.core.function.hmi.ui.widget.HDMapVisualAngleAdjustLayout import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.function.hmi.xiaozhi.XiaoZhiStateManager @@ -585,4 +586,13 @@ class MoGoHmiProvider : IMoGoHmiProvider { override fun isHdMapVisualAngleAdjustShow(): Boolean { return popOfVisualAngleAdjust.get()?.get()?.isShowing() ?: false } + + override fun showColdStartWindow() { + val activity = AppStateManager.currentActivity() ?: return + ThreadUtils.runOnUiThread { + val coldStartWindow = ColdStartAgainWindow(activity) + coldStartWindow.showFloatWindow() + } + } + } \ 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/widget/ColdStartAgainWindow.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartAgainWindow.kt index 54d9b9b6fd..51cd586556 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartAgainWindow.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartAgainWindow.kt @@ -22,6 +22,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack +import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartConfig import me.jessyan.autosize.utils.AutoSizeUtils /** @@ -107,12 +108,14 @@ class ColdStartAgainWindow constructor(activity: Activity){ mWindowParams!!.x = 0 mWindowParams!!.y = 0 mWindowManager!!.addView(mFloatLayout, mWindowParams) + ColdStartConfig.setShowWindowStatus(true) } } fun hideFloatWindow() { if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) + ColdStartConfig.setShowWindowStatus(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/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 9ff75c45eb..5f9805503c 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 @@ -23,11 +23,14 @@ import com.mogo.eagle.core.utilcode.util.ResourceUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo.adas.data.AdasConstants +import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartAnalyticsManager +import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartConfig 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.ivSsmConnectStatus import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartContent import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartNodeState +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 @@ -76,9 +79,13 @@ class ColdStartView @JvmOverloads constructor( } private fun initView(){ - tvSystemStartupTitle.setOnLongClickListener { + //立即用车 + tvColdStartNow.setOnClickListener{ hideColdStartView() - true + //立即用车埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartNow) + //保存点击时间 + ColdStartConfig.setColdStartNowState(System.currentTimeMillis()) } } @@ -218,6 +225,10 @@ class ColdStartView @JvmOverloads constructor( if(it.eventStatus == SsmInfo.CSState.COLD_START_READY){ //冷启动就绪 showColdStartSuccessView() + //冷启动成功埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess) + //记录冷启动成功时间 + ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis()) } tvColdStartContent.text = getColdStartEventStatus(it.eventStatus) nodeStatusSb.clear() @@ -301,7 +312,7 @@ class ColdStartView @JvmOverloads constructor( private fun showIPCConnectSuccessView(){ ipcRotationAnim?.cancel() ivIpcConnectStatus.rotation = 0f - tvSystemStartupTitle.text = resources.getString(R.string.cold_start_in_progress_title) + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_wait) ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success)) tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_success) //开启连接SSM倒计时 @@ -310,7 +321,9 @@ class ColdStartView @JvmOverloads constructor( viewSsmConnectDivider.visibility = View.VISIBLE ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) //旋转动画 - ssmRotationAnim = ObjectAnimator.ofFloat(ivSsmConnectStatus, "rotation", 0f, 360f) + if(ssmRotationAnim == null){ + ssmRotationAnim = ObjectAnimator.ofFloat(ivSsmConnectStatus, "rotation", 0f, 360f) + } ssmRotationAnim?.repeatCount = ValueAnimator.INFINITE ssmRotationAnim?.repeatMode = ValueAnimator.RESTART ssmRotationAnim?.duration = 1500 @@ -326,12 +339,15 @@ class ColdStartView @JvmOverloads constructor( viewColdStartDivider.visibility = View.GONE ivColdStartStatus.visibility = View.GONE tvColdStartContent.visibility = View.GONE + //域控连接成功埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectSuccess) } /** * 展示域控连接失败视图 */ private fun showIPCConnectFailView(reason: String?){ + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_exception) if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(reason)){ return } @@ -349,13 +365,17 @@ class ColdStartView @JvmOverloads constructor( viewColdStartDivider.visibility = View.GONE ivColdStartStatus.visibility = View.GONE tvColdStartContent.visibility = View.GONE - + //域控连接失败埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectFail) } private fun showIPCConnecting(){ + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_wait) ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) - tvIpcConnectContent.text = "正在连接域控..." - ipcRotationAnim = ObjectAnimator.ofFloat(ivIpcConnectStatus, "rotation", 0f, 360f) + tvIpcConnectContent.text = "正在重连域控..." + if(ipcRotationAnim == null){ + ipcRotationAnim = ObjectAnimator.ofFloat(ivIpcConnectStatus, "rotation", 0f, 360f) + } ipcRotationAnim?.repeatCount = ValueAnimator.INFINITE ipcRotationAnim?.repeatMode = ValueAnimator.RESTART ipcRotationAnim?.duration = 1500 @@ -383,6 +403,8 @@ class ColdStartView @JvmOverloads constructor( coldStartProcess() //主动查询冷启动状态 CallerAutoPilotControlManager.sendSsmFuncQueryColdStartState() + //SSM连接成功埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectSuccess) } ssmConnectStatus = true coldStartStatus = false @@ -392,7 +414,7 @@ class ColdStartView @JvmOverloads constructor( * 展示SSM连接成功视图 */ private fun showSSMConnectSuccessView(){ - tvSystemStartupTitle.text = resources.getString(R.string.cold_start_in_progress_title) + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_wait) //取消旋转动画 ssmRotationAnim?.cancel() //取消连接SSM超时等待倒计时 @@ -409,7 +431,9 @@ class ColdStartView @JvmOverloads constructor( tvColdStartContent.text = "启动中…" ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process)) //开启冷启动连接状态动画 - coldStartRotationAnim = ObjectAnimator.ofFloat(ivColdStartStatus, "rotation", 0f, 360f) + if(coldStartRotationAnim == null){ + coldStartRotationAnim = ObjectAnimator.ofFloat(ivColdStartStatus, "rotation", 0f, 360f) + } coldStartRotationAnim?.repeatCount = ValueAnimator.INFINITE coldStartRotationAnim?.repeatMode = ValueAnimator.RESTART coldStartRotationAnim?.duration = 1500 @@ -421,7 +445,7 @@ class ColdStartView @JvmOverloads constructor( * 展示SSM连接失败视图 */ private fun showSSMConnectFailView(){ - tvSystemStartupTitle.text = resources.getString(R.string.cold_start_fail_title) + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_exception) //取消旋转动画 ssmRotationAnim?.cancel() ivSsmConnectStatus.rotation = 0f @@ -448,6 +472,8 @@ class ColdStartView @JvmOverloads constructor( connectSSMTimer?.cancel() //展示连接SSM失败视图 showSSMConnectFailView() + //SSM连接失败埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectFail) } } connectSSMTimer?.start() @@ -468,6 +494,8 @@ class ColdStartView @JvmOverloads constructor( coldStartStatus = false //展示冷启动失败视图 showColdStartFailView() + //冷启动失败埋点统计 + ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartFail) } } connectColdStartTimer?.start() @@ -478,7 +506,7 @@ class ColdStartView @JvmOverloads constructor( * 冷启动失败视图 */ private fun showColdStartFailView(){ - tvSystemStartupTitle.text = resources.getString(R.string.cold_start_fail_title) + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_exception) coldStartRotationAnim?.cancel() ivColdStartStatus.rotation = 0f ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail)) @@ -490,7 +518,7 @@ class ColdStartView @JvmOverloads constructor( * 冷启动成功视图 */ private fun showColdStartSuccessView(){ - tvSystemStartupTitle.text = resources.getString(R.string.cold_start_success_title) + tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_success) 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/bg_cold_start_now.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_cold_start_now.png new file mode 100644 index 0000000000000000000000000000000000000000..44dfd6ee781ac3a01c4e4a4989c27840dcde47e7 GIT binary patch literal 26656 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 literal 0 HcmV?d00001 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 b9e400dd05..998743ab30 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 @@ -14,9 +14,9 @@ android:textSize="@dimen/sp_70" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" - android:text="@string/cold_start_in_progress_title" android:layout_marginTop="@dimen/dp_432" android:layout_marginStart="@dimen/dp_261" + android:text="@string/cold_start_title_tel_wait" /> + + + + \ 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 6d5a785236..2b2587dd2d 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 @@ -220,10 +220,21 @@ 系统启动中… 系统启动成功 系统启动失败 - 正在连接SSM… - 已连接SSM - SSM连接异常,建议重启车辆并上报问题 + 正在等待SSM信息 + 与SSM通信正常 + 超时未收到SSM信息,建议重启车辆并上报问题 系统启动成功,即将进入主页 - 系统启动异常,建议重启车辆并上报问题 + 系统启动异常,建议上报问题,可尝试重启车辆 + + 等待连接域控 + 连接域控异常 + 等待SSM信息 + 与SSM通信异常 + 等待系统启动 + 系统启动成功,即将进入主页 + 系统启动异常 + + 立即用车 + 启动未完成时,可能会导致自动驾驶等功能无法使用 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 cf34f1b926..b705a6ef8b 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 @@ -302,4 +302,9 @@ interface IMoGoHmiProvider :IProvider{ * 视角弹窗是否已展示 */ fun isHdMapVisualAngleAdjustShow(): Boolean + + /** + * 展示冷启动弹窗 + */ + fun showColdStartWindow() } \ 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 1e2be844e8..cd3d6461fc 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 @@ -440,4 +440,12 @@ object CallerHmiManager { fun isHdMapVisualAngleAdjustShow(): Boolean { return hmiProviderApi?.isHdMapVisualAngleAdjustShow() ?: false } + + /** + * 展示冷启动弹窗 + */ + fun showColdStartWindow(){ + hmiProviderApi?.showColdStartWindow() + } + } \ No newline at end of file