[6.7.0]冷启动调整

This commit is contained in:
xuxinchao
2024-10-25 17:30:17 +08:00
parent 6f1164973f
commit b7d39ce6cd
6 changed files with 151 additions and 31 deletions

View File

@@ -23,6 +23,7 @@ object ColdStartAnalyticsManager {
private const val eventParamLatitude = "latitude" //纬度
private const val eventParamLongitude = "longitude" //经度
private const val eventParamStep = "step" //冷启动步骤
private const val eventParamReason = "reason" //原因
const val ipcConnectSuccess = "ipcConnectSuccess" //域控连接成功
const val ipcConnectFail = "ipcConnectFail"//域控连接失败
@@ -43,10 +44,11 @@ object ColdStartAnalyticsManager {
* @param latitude 纬度
* @param longitude 经度
* @param step 冷启动步骤
* @param reason 失败或者跳过原因
*/
private fun realColdStartStepAnalytics(plateNumber: String,carSn: String,mapVersion: String,eyeVersion: String,
appFlavor: String,branchHash: String,latitude: String,longitude: String,
step: String){
step: String,reason: String){
val coldStartParams = HashMap<String,Any>()
coldStartParams[eventParamPlateNumber] = plateNumber
coldStartParams[eventParamCarSn] = carSn
@@ -57,19 +59,22 @@ object ColdStartAnalyticsManager {
coldStartParams[eventParamLatitude] = latitude
coldStartParams[eventParamLongitude] = longitude
coldStartParams[eventParamStep] = step
coldStartParams[eventParamReason] =
MogoAnalyticUtils.track(coldStartStep,coldStartParams)
}
/**
* 冷启动埋点统计
* @param step 冷启动步骤
* @param reason 跳过或者失败原因
*/
fun coldStartStepAnalytics(step: String){
fun coldStartStepAnalytics(step: String,reason: String){
realColdStartStepAnalytics(AppConfigInfo.plateNumber, SharedPrefsMgr.getInstance().sn,
CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "",
AppUtils.getAppVersionName(), AppConfigInfo.flavor,AppConfigInfo.workingBranchHash,
CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude.toString(),
CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude.toString(),step)
CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude.toString()
,step,reason)
}

View File

@@ -0,0 +1,47 @@
package com.zhjt.mogo_core_function_devatools.coldstart
import android.graphics.Color
import android.os.CountDownTimer
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.data.deva.coldstart.ColdStartNodeInfo
import com.zhjt.mogo_core_function_devatools.R
class ColdStartNodeAdapter : RecyclerView.Adapter<ColdStartNodeAdapter.NodeInfoHolder>(){
private var nodeList: ArrayList<ColdStartNodeInfo> ?= null
fun setData(data: ArrayList<ColdStartNodeInfo>){
nodeList = data
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NodeInfoHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_node_status, parent, false)
return NodeInfoHolder(view)
}
override fun onBindViewHolder(holder: NodeInfoHolder, position: Int) {
nodeList?.let {
val node = it[position]
holder.tvNodeStatus.text = "${node.nodeName} ${node.status}"
if("启动成功" == node.status || "启动中…" == node.status){
holder.tvNodeStatus.setTextColor(Color.parseColor("#B2FFFFFF"))
}else{
holder.tvNodeStatus.setTextColor(Color.parseColor("#FFCD3D"))
}
}
}
override fun getItemCount() = nodeList?.size ?: 0
class NodeInfoHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var tvNodeStatus: TextView = itemView.findViewById(R.id.tvNodeStatus)
}
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tvNodeStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>

View File

@@ -3,9 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.Context
import android.os.Build
import android.os.CountDownTimer
import android.text.Html
import android.text.TextUtils
import android.util.AttributeSet
import android.util.Log
@@ -14,6 +12,8 @@ import android.view.View
import android.view.animation.LinearInterpolator
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.deva.coldstart.ColdStartNodeInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoColdStartStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
@@ -26,11 +26,12 @@ 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 com.zhjt.mogo_core_function_devatools.coldstart.ColdStartNodeAdapter
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.rvNodeList
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
@@ -72,23 +73,32 @@ class ColdStartView @JvmOverloads constructor(
private var coldStartRotationAnim: ObjectAnimator?= null //冷启动连接状态动画
private var connectColdStartTimer: CountDownTimer?= null //连接冷启动等待倒计时
private val nodeStatusSb = StringBuilder() //冷启动关键节点启动详情
private val nodeList = ArrayList<ColdStartNodeInfo>()
private var coldStartResultListener: ColdStartResultListener ?= null
private var newColdStart: Boolean = false //SSM是否支持新版冷启动
private var coldStartNodeAdapter: ColdStartNodeAdapter ?= null
private var reason: String = "" //上报原因
init {
LayoutInflater.from(context).inflate(R.layout.view_cold_start, this, true)
initView()
}
private fun initView(){
val linearLayoutManager = LinearLayoutManager(context)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
coldStartNodeAdapter = ColdStartNodeAdapter()
rvNodeList.adapter =coldStartNodeAdapter
rvNodeList.layoutManager = linearLayoutManager
//立即用车
tvColdStartNow.setOnClickListener{
hideColdStartView()
//立即用车埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartNow)
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartNow,reason)
//保存点击时间
ColdStartConfig.setColdStartNowState(System.currentTimeMillis())
}
@@ -225,7 +235,8 @@ class ColdStartView @JvmOverloads constructor(
coldStartStatus = true
showColdStartSuccessView()
//冷启动成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess)
reason = "冷启动成功"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess,reason)
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
@@ -260,28 +271,50 @@ class ColdStartView @JvmOverloads constructor(
showColdStartSuccessView()
}
//冷启动成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess)
reason = "冷启动成功"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess,reason)
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
tvColdStartContent.text = getColdStartEventStatus(it.eventStatus)
nodeStatusSb.clear()
it.nodeList.forEach {node->
Log.i(TAG,"node nodeName="+node.nodeName+"node status="+node.status)
val nodeDetail = node.nodeName+ " " + getColdStartNodeStatus(node.status)
if(node.status == SsmInfo.NodeStatus.NODE_FAILED || node.status ==SsmInfo.NodeStatus.NODE_TIMEOUT){
nodeStatusSb.append("<font color=\"#FFCD3D\">${nodeDetail}</font>")
}else{
nodeStatusSb.append("<font color=\"#B2FFFFFF\">${nodeDetail}</font>")
if(node.status == SsmInfo.NodeStatus.NODE_FINISH){
val nodeInfo = ColdStartNodeInfo(node.nodeName,node.eventCode,getColdStartNodeStatus(node.status),node.desc)
nodeList.add(nodeInfo)
}
nodeStatusSb.append("<br>")
}
tvColdStartNodeState.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(nodeStatusSb.toString(), Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(nodeStatusSb.toString())
it.nodeList.forEach {node->
if(node.status == SsmInfo.NodeStatus.NODE_STARTING){
val nodeInfo = ColdStartNodeInfo(node.nodeName,node.eventCode,getColdStartNodeStatus(node.status),node.desc)
nodeList.add(nodeInfo)
}
}
it.nodeList.forEach {node->
if(node.status == SsmInfo.NodeStatus.NODE_TIMEOUT || node.status == SsmInfo.NodeStatus.NODE_FAILED){
val nodeInfo = ColdStartNodeInfo(node.nodeName,node.eventCode,getColdStartNodeStatus(node.status),node.desc)
nodeList.add(nodeInfo)
}
}
coldStartNodeAdapter?.setData(nodeList)
// nodeStatusSb.clear()
// it.nodeList.forEach {node->
// Log.i(TAG,"node nodeName="+node.nodeName+"node status="+node.status)
//
// val nodeDetail = node.nodeName+ " " + getColdStartNodeStatus(node.status)
// if(node.status == SsmInfo.NodeStatus.NODE_FAILED || node.status ==SsmInfo.NodeStatus.NODE_TIMEOUT){
// nodeStatusSb.append("<font color=\"#FFCD3D\">${nodeDetail}</font>")
// }else{
// nodeStatusSb.append("<font color=\"#B2FFFFFF\">${nodeDetail}</font>")
// }
// nodeStatusSb.append("<br>")
// }
// tvColdStartNodeState.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Html.fromHtml(nodeStatusSb.toString(), Html.FROM_HTML_MODE_LEGACY)
// } else {
// Html.fromHtml(nodeStatusSb.toString())
// }
}
}
}
@@ -375,21 +408,22 @@ class ColdStartView @JvmOverloads constructor(
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
//域控连接成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectSuccess)
reason = "域控连接成功"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectSuccess,reason)
}
/**
* 展示域控连接失败视图
*/
private fun showIPCConnectFailView(reason: String?){
private fun showIPCConnectFailView(failReason: String?){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_exception)
if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(reason)){
if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(failReason)){
return
}
ipcRotationAnim?.cancel()
ivIpcConnectStatus.rotation = 0f
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail))
reason?.let {
failReason?.let {
tvIpcConnectContent.text = it
}
//隐藏SSM相关视图
@@ -401,7 +435,8 @@ class ColdStartView @JvmOverloads constructor(
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
//域控连接失败埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectFail)
this.reason = "域控连接失败:$failReason"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ipcConnectFail,reason)
}
private fun showIPCConnecting(){
@@ -437,7 +472,8 @@ class ColdStartView @JvmOverloads constructor(
//开始启动冷启动等待倒计时
coldStartProcess()
//SSM连接成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectSuccess)
reason = "SSM连接成功"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectSuccess,reason)
}
ssmConnectStatus = true
}
@@ -505,7 +541,8 @@ class ColdStartView @JvmOverloads constructor(
//展示连接SSM失败视图
showSSMConnectFailView()
//SSM连接失败埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectFail)
reason = "等待SSM超时"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectFail,reason)
}
}
connectSSMTimer?.start()
@@ -527,7 +564,8 @@ class ColdStartView @JvmOverloads constructor(
//展示冷启动失败视图
showColdStartFailView()
//冷启动失败埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartFail)
reason = "等待冷启动超时"
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartFail,reason)
}
}
connectColdStartTimer?.start()

View File

@@ -118,6 +118,16 @@
app:layout_constraintLeft_toLeftOf="@id/tvColdStartContent"
android:textSize="@dimen/sp_32"
android:textColor="#B2FFFFFF"
android:visibility="gone"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvNodeList"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_0"
app:layout_constraintTop_toBottomOf="@id/tvColdStartContent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@id/tvColdStartContent"
/>
<TextView

View File

@@ -0,0 +1,13 @@
package com.mogo.eagle.core.data.deva.coldstart
import android.os.CountDownTimer
/**
* 冷启动关键节点实体类
* @param nodeName 节点名称
* @param eventCode 上报事件
* @param status 启动中,启动成功,启动失败,启动超时
* @param desc 事件描述
*/
data class ColdStartNodeInfo(var nodeName: String,var eventCode: String,
var status: String,var desc: String)