[6.7.0]冷启动更改

This commit is contained in:
xuxinchao
2024-10-22 20:06:13 +08:00
parent 304f67ad36
commit 0ea0604ef1
12 changed files with 317 additions and 17 deletions

View File

@@ -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())
}

View File

@@ -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<String,Any>()
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)
}
}

View File

@@ -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)
}
}

View File

@@ -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
}
}

View File

@@ -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()
}
}
}

View File

@@ -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)
}
}

View File

@@ -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))

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -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"
/>
<ImageView
@@ -120,5 +120,32 @@
android:textColor="#B2FFFFFF"
/>
<TextView
android:id="@+id/tvColdStartNow"
android:layout_width="@dimen/dp_351"
android:layout_height="@dimen/dp_99"
android:background="@drawable/bg_cold_start_now"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginEnd="@dimen/dp_191"
android:layout_marginBottom="@dimen/dp_183"
android:text="@string/cold_start_now"
android:textSize="@dimen/sp_36"
android:textColor="@color/white"
android:gravity="center"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:text="@string/cold_start_now_tip"
android:textSize="@dimen/sp_28"
android:textColor="#82FFFFFF"
android:layout_marginEnd="@dimen/dp_191"
android:layout_marginBottom="@dimen/dp_116"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -220,10 +220,21 @@
<string name="cold_start_in_progress_title">系统启动中…</string>
<string name="cold_start_success_title">系统启动成功</string>
<string name="cold_start_fail_title">系统启动失败</string>
<string name="ssm_connect_loading">正在连接SSM</string>
<string name="ssm_connect_success">已连接SSM</string>
<string name="ssm_connect_fail">SSM连接异常,建议重启车辆并上报问题</string>
<string name="ssm_connect_loading">正在等待SSM信息</string>
<string name="ssm_connect_success">与SSM通信正常</string>
<string name="ssm_connect_fail">超时未收到SSM信息,建议重启车辆并上报问题</string>
<string name="cold_start_success_content">系统启动成功,即将进入主页</string>
<string name="cold_start_fail_content">系统启动异常,建议重启车辆并上报问题</string>
<string name="cold_start_fail_content">系统启动异常,建议上报问题,可尝试重启车辆</string>
<string name="cold_start_title_tel_wait">等待连接域控</string>
<string name="cold_start_title_tel_exception">连接域控异常</string>
<string name="cold_start_title_ssm_wait">等待SSM信息</string>
<string name="cold_start_title_ssm_exception">与SSM通信异常</string>
<string name="cold_start_title_sys_wait">等待系统启动</string>
<string name="cold_start_title_sys_success">系统启动成功,即将进入主页</string>
<string name="cold_start_title_sys_exception">系统启动异常</string>
<string name="cold_start_now">立即用车</string>
<string name="cold_start_now_tip">启动未完成时,可能会导致自动驾驶等功能无法使用</string>
</resources>

View File

@@ -302,4 +302,9 @@ interface IMoGoHmiProvider :IProvider{
* 视角弹窗是否已展示
*/
fun isHdMapVisualAngleAdjustShow(): Boolean
/**
* 展示冷启动弹窗
*/
fun showColdStartWindow()
}

View File

@@ -440,4 +440,12 @@ object CallerHmiManager {
fun isHdMapVisualAngleAdjustShow(): Boolean {
return hmiProviderApi?.isHdMapVisualAngleAdjustShow() ?: false
}
/**
* 展示冷启动弹窗
*/
fun showColdStartWindow(){
hmiProviderApi?.showColdStartWindow()
}
}