From b7d39ce6cdaa125e690fa5d988da7fff4780dcae Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 25 Oct 2024 17:30:17 +0800 Subject: [PATCH] =?UTF-8?q?[6.7.0]=E5=86=B7=E5=90=AF=E5=8A=A8=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coldstart/ColdStartAnalyticsManager.kt | 11 ++- .../coldstart/ColdStartNodeAdapter.kt | 47 ++++++++++ .../src/main/res/layout/item_node_status.xml | 7 ++ .../function/hmi/ui/widget/ColdStartView.kt | 94 +++++++++++++------ .../src/main/res/layout/view_cold_start.xml | 10 ++ .../data/deva/coldstart/ColdStartNodeInfo.kt | 13 +++ 6 files changed, 151 insertions(+), 31 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartNodeAdapter.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_node_status.xml create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/coldstart/ColdStartNodeInfo.kt 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 index c148d65cfb..5c38c979ca 100644 --- 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 @@ -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() 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) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartNodeAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartNodeAdapter.kt new file mode 100644 index 0000000000..ebdb04e21c --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartNodeAdapter.kt @@ -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(){ + + private var nodeList: ArrayList ?= null + + fun setData(data: ArrayList){ + 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) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_node_status.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_node_status.xml new file mode 100644 index 0000000000..607a5922ba --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_node_status.xml @@ -0,0 +1,7 @@ + + + + \ 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 2cf4a7e7aa..dd8a4584e4 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 @@ -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() 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("${nodeDetail}") - }else{ - nodeStatusSb.append("${nodeDetail}") + if(node.status == SsmInfo.NodeStatus.NODE_FINISH){ + val nodeInfo = ColdStartNodeInfo(node.nodeName,node.eventCode,getColdStartNodeStatus(node.status),node.desc) + nodeList.add(nodeInfo) } - nodeStatusSb.append("
") } - 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("${nodeDetail}") +// }else{ +// nodeStatusSb.append("${nodeDetail}") +// } +// nodeStatusSb.append("
") +// } +// 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() 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 998743ab30..452831fe2e 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 @@ -118,6 +118,16 @@ app:layout_constraintLeft_toLeftOf="@id/tvColdStartContent" android:textSize="@dimen/sp_32" android:textColor="#B2FFFFFF" + android:visibility="gone" + /> + +