[6.7.0]冷启动调整
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user