From 33a2f2dfe465d2f3a9d8bd6ef6f21a0f10cf9b27 Mon Sep 17 00:00:00 2001 From: renwj Date: Tue, 14 Mar 2023 16:02:27 +0800 Subject: [PATCH] =?UTF-8?q?[dev=5Farch=5Fopt=5F3.0]=20=E4=BC=98=E5=8C=96Te?= =?UTF-8?q?xtView=E9=A2=91=E7=B9=81=E8=B0=83=E7=94=A8setText=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84=E9=A2=91=E7=B9=81=E7=BB=98=E5=88=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98;=20=E4=BC=98=E5=8C=96=E7=8A=B6=E6=80=81=E6=A0=8F?= =?UTF-8?q?=E4=B8=8A=E5=B7=A5=E6=8E=A7=E6=9C=BA=E7=9B=B8=E5=85=B3=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 + .../launcher/lancet/ObjectHashCodeProxy.java | 3 +- .../launcher/lancet/TextViewSetTextOpt.java | 40 ++++++++++++ build.gradle | 2 +- .../status/flow/can/CanImpl.kt | 23 ------- .../status/flow/trace/TracingImpl.kt | 63 ++++++++++++++----- .../function/hmi/ui/widget/VersionNameView.kt | 13 ++-- .../eagle/core/utilcode/kotlin/Extensions.kt | 18 +++--- 8 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java diff --git a/app/build.gradle b/app/build.gradle index b215e3967f..7015ee7a02 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,9 @@ if (!isAndroidTestBuild()) { object_hashcode { enable true } + TextView_setTextProxy { + enable true + } } } } diff --git a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java index 136585b373..428a52158a 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java +++ b/app/src/main/java/com/mogo/launcher/lancet/ObjectHashCodeProxy.java @@ -6,6 +6,7 @@ import com.knightboost.lancet.api.annotations.Group; import com.knightboost.lancet.api.annotations.ImplementedInterface; import com.knightboost.lancet.api.annotations.NameRegex; import com.knightboost.lancet.api.annotations.ReplaceInvoke; +import com.knightboost.lancet.api.annotations.TargetClass; import com.knightboost.lancet.api.annotations.TargetMethod; import com.knightboost.lancet.api.annotations.Weaver; import java.util.concurrent.ConcurrentHashMap; @@ -18,7 +19,7 @@ public class ObjectHashCodeProxy { public static final ConcurrentHashMap hashCodes = new ConcurrentHashMap<>(); @NameRegex("(com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.ThreadUtils|com\\.mogo\\.eagle\\.core\\.utilcode\\.util\\.UiThreadHandler)") - @ImplementedInterface(value = "java.lang.Object",scope = Scope.SELF) + @TargetClass(value = "java.lang.Object",scope = Scope.SELF) @TargetMethod(methodName = "hashCode") @ReplaceInvoke public static int hashCodeProxy(Object r) { diff --git a/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java b/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java new file mode 100644 index 0000000000..0a0ed2611f --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/TextViewSetTextOpt.java @@ -0,0 +1,40 @@ +package com.mogo.launcher.lancet; + +import android.os.Looper; +import android.util.Log; +import android.widget.TextView; + +import com.knightboost.lancet.api.Scope; +import com.knightboost.lancet.api.annotations.Group; +import com.knightboost.lancet.api.annotations.NameRegex; +import com.knightboost.lancet.api.annotations.ReplaceInvoke; +import com.knightboost.lancet.api.annotations.TargetClass; +import com.knightboost.lancet.api.annotations.TargetMethod; +import com.knightboost.lancet.api.annotations.Weaver; + +@Weaver +@Group("TextView_setTextProxy") +public class TextViewSetTextOpt { + + @NameRegex("(com\\.mogo|com\\.zhidao|com\\.elegant|com\\.zhidaoauto|com\\.zhjt).*") + @TargetClass(value = "android.widget.TextView",scope = Scope.ALL) + @TargetMethod(methodName = "setText") + @ReplaceInvoke + public static void setText(TextView view, CharSequence text) { + if (Looper.myLooper() != Looper.getMainLooper()) { + StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + StringBuilder sb = new StringBuilder(); + for (StackTraceElement trace : stackTrace) { + sb.append(trace.getClassName()).append(".").append(trace.getMethodName()).append("(").append(trace.getLineNumber()).append(")").append("\n"); + } + if (sb.length() > 1) { + sb.setLength(sb.length() - 1); + } + Log.e("ALERT", sb.toString()); + } + CharSequence old = view.getText(); + if (old != null && !old.equals(text)) { + view.setText(text); + } + } +} diff --git a/build.gradle b/build.gradle index 4cca99fc4e..15dd159557 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { classpath 'com.mogo.cloud:systrace:1.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath 'com.mogo.sticky:service:1.0.8' - classpath 'io.github.knight-zxw:lancet-plugin:0.0.4.5_mogo' + classpath 'io.github.knight-zxw:lancet-plugin:0.0.4.8_mogo' // classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt index f586b22478..0355ebb2b9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/can/CanImpl.kt @@ -10,10 +10,7 @@ import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus import com.zhjt.mogo_core_function_devatools.status.flow.IFlow -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import mogo_msg.MogoReportMsg.MogoReportMessage import system_master.SystemStatusInfo.StatusInfo import java.util.concurrent.atomic.AtomicInteger @@ -55,7 +52,6 @@ internal class CanImpl(ctx: Context) : override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { send(CanStatus(isCanEnabled())) - timeOutCheck() } private fun isCanEnabled(): Boolean { @@ -66,23 +62,19 @@ internal class CanImpl(ctx: Context) : override fun onAutopilotBrakeLightData(brakeLight: Boolean) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotSteeringData(steering: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotGearData(gear: GearPosition) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotDataException(timestamp: Long) { @@ -92,28 +84,23 @@ internal class CanImpl(ctx: Context) : override fun onAutopilotAcc(carAcc: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotThrottle(throttle: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotBrake(brake: Float) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) { send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) send(CanStatus(isCanEnabled())) - timeOutCheck() } override fun onAutopilotStatusRespByQuery(status: StatusInfo) { @@ -124,24 +111,14 @@ internal class CanImpl(ctx: Context) : } } - private fun timeOutCheck() { - job?.safeCancel() - launch(Dispatchers.Unconfined) { - delay(4000) - send(CanStatus(isCanEnabled())) - }.also { job = it } - } - override fun onDestroy() { super.onDestroy() job?.safeCancel() - CallerChassisAccStateListenerManager.removeListener(TAG) CallerChassisBrakeStateListenerManager.removeListener(TAG) CallerChassisGearStateListenerManager.removeListener(TAG) CallerChassisSteeringStateListenerManager.removeListener(TAG) CallerChassisThrottleStateListenerManager.removeListener(TAG) - CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerChassisLamplightListenerManager.removeListener(TAG) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt index f7018bcd9d..c9f9ff338c 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt @@ -9,6 +9,8 @@ import com.zhjt.mogo_core_function_devatools.status.entity.* import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* import com.zhjt.mogo_core_function_devatools.status.flow.* import mogo_msg.MogoReportMsg.MogoReportMessage +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatusListener { @@ -18,6 +20,14 @@ internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopi private var old: TracingStatus.Tracing = UNKNOWN + private val ipcConnectStatus by lazy { AtomicInteger() } + + private val ipcStatus by lazy { AtomicInteger() } + + private val reportCode by lazy { AtomicReference() } + + private val reportMsg by lazy { AtomicReference() } + override fun onCreate() { val code = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageCode() val msg = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageContent() @@ -30,32 +40,53 @@ internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopi override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) - val current = guardianInfo?.code - val newState = current?.toState(guardianInfo.msg) - if (newState != null) { - old = newState - send(TracingStatus(newState)) + val code = guardianInfo?.code + val message = guardianInfo?.msg + try { + if (code != reportCode.get() || message != reportMsg.get()) { + val newState = code?.toState(message) + if (newState != null) { + old = newState + send(TracingStatus(newState)) + } + } + } finally { + reportCode.set(code) + reportMsg.set(message) } } override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) - if (!CallerAutoPilotControlManager.isConnected()) { - old = UNKNOWN - send(TracingStatus(UNKNOWN)) + try { + if (ipcConnectStatus.get() != status) { + if (!CallerAutoPilotControlManager.isConnected()) { + old = UNKNOWN + send(TracingStatus(UNKNOWN)) + } + } + } finally { + ipcConnectStatus.set(status) } } override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { super.onAutopilotStatusResponse(autoPilotStatusInfo) - if (autoPilotStatusInfo.state != STATUS_AUTOPILOT_RUNNING) { - old = UNKNOWN - send(TracingStatus(UNKNOWN)) - return - } - if (old.isException()) { - old = TRACK_LOADED - send(TracingStatus(TRACK_LOADED)) + val state = autoPilotStatusInfo.state + try { + if (ipcStatus.get() != state) { + if (state != STATUS_AUTOPILOT_RUNNING) { + old = UNKNOWN + send(TracingStatus(UNKNOWN)) + return + } + if (old.isException()) { + old = TRACK_LOADED + send(TracingStatus(TRACK_LOADED)) + } + } + } finally { + ipcStatus.set(state) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index 383f583392..38f45fd28e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -11,10 +11,12 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.main.AppListActivity +import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_version_name.view.* +import kotlinx.coroutines.* /** * @author XuXinChao @@ -65,13 +67,16 @@ class VersionNameView @JvmOverloads constructor( */ @SuppressLint("SetTextI18n") private fun showCurrentMapVersion() { - UiThreadHandler.post { - tvMapVersionName?.let { - if (!dockerVersion.isNullOrEmpty()) { - it.text = "MAP:${dockerVersion}" + val old = tvMapVersionName?.text + val version = dockerVersion + if (!version.isNullOrEmpty() && old != version) { + scope.launch { + tvMapVersionName?.also { + it.text = version } } } + } override fun onAttachedToWindow() { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt index 69426b4941..1906970bf1 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/kotlin/Extensions.kt @@ -39,16 +39,18 @@ val T.lifecycleOwner: LifecycleOwner init { if (ViewCompat.isAttachedToWindow(this@lifecycleOwner)) { lifecycle.let { - if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { - it.currentState = Lifecycle.State.CREATED - } + post { + if (it.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { + it.currentState = Lifecycle.State.CREATED + } - if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { - it.currentState = Lifecycle.State.STARTED - } + if (it.currentState.isAtLeast(Lifecycle.State.CREATED)) { + it.currentState = Lifecycle.State.STARTED + } - if (it.currentState.isAtLeast(Lifecycle.State.STARTED)) { - it.currentState = Lifecycle.State.RESUMED + if (it.currentState.isAtLeast(Lifecycle.State.STARTED)) { + it.currentState = Lifecycle.State.RESUMED + } } } }