diff --git a/config.gradle b/config.gradle index c11724ee16..e696522f27 100644 --- a/config.gradle +++ b/config.gradle @@ -218,7 +218,7 @@ ext { weak_network : "com.mogo.weak:network:1.0.0", - mofang_runtime : "com.mogo.eagle.core.mofang:runtime:1.0.0" + mofang_runtime : "com.mogo.eagle.mofang.core:runtime:1.0.0" ] android = [ launcherApplicationId : "com.mogo.launcher", diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt new file mode 100644 index 0000000000..5e67e5f4e7 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt @@ -0,0 +1,47 @@ +package com.zhjt.mogo_core_function_devatools.mofang + +import android.os.Handler +import android.os.HandlerThread +import android.os.Process +import com.mogo.commons.utils.* + +internal class MoFangAnalyticUtils { + + companion object { + + // 魔方连接状态 + const val EVENT_MOFANG_CONNECT = "event_mofang_connect" + const val EVENT_SUB_START_CONNECT = "event_sub_start_connect" + const val EVENT_SUB_CONNECT_SUCCESS = "event_sub_connect_success" + const val EVENT_SUB_START_DISCONNECT = "event_sub_start_disconnect" + const val EVENT_SUB_DISCONNECT_SUCCESS = "event_sub_disconnect_success" + + // 魔方电量 + const val EVENT_BATTERY = "event_mofang_battery" + const val EVENT_BATTERY_VALUE = "battery" + + + // 收到魔方按键指令 + const val EVENT_INPUT = "event_mofang_input" + const val EVENT_INPUT_SUB_KEYCODE = "keycode" + const val EVENT_INPUT_SUB_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + + // 执行魔方按键指令 + const val EVENT_EXECUTE = "event_mofang_execute" + const val EVENT_EXECUTE_SUB_KEYCODE = "keycode" + const val EVENT_EXECUTE_SUB_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + + private val handler by lazy { HandlerThread("mofang-analytic-worker", Process.THREAD_PRIORITY_BACKGROUND).let { it.start(); Handler(it.looper) } } + + @JvmStatic + fun track(event: String, params: MutableMap) { + handler.post { + try { + MogoAnalyticUtils.track(event, params) + } catch (t: Throwable) { + t.printStackTrace() + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt index c3d2a8b4aa..bc472a3f42 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt @@ -5,6 +5,9 @@ import android.util.* import android.view.KeyEvent import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.network.utils.GsonUtil +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_SUB_KEYCODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_SUB_TYPE internal class MoFangCommandExecutor { @@ -37,6 +40,7 @@ internal class MoFangCommandExecutor { val acc = msg.obj as? Double if (acc != null) { send = acc != 0.0 + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $acc")) CallerAutoPilotControlManager.sendOperatorSetAcceleratedSpeed(acc) } @@ -55,6 +59,7 @@ internal class MoFangCommandExecutor { return@Callback true } val isLeft = msg.arg1 == -1 + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) if (isLeft) { linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message")) Log.d(TAG, "--- 左变道执行了 ----") @@ -74,6 +79,7 @@ internal class MoFangCommandExecutor { val autoPilotStatusInfo = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo() val parameters = autoPilotStatusInfo.autopilotControlParameters val json = GsonUtil.jsonFromObject(parameters) + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $json")) Log.d(TAG, "--- 启动自驾 ----入参:$json") CallerAutoPilotControlManager.startAutoPilot(parameters) @@ -89,6 +95,7 @@ internal class MoFangCommandExecutor { if (value != null && value != 0.0) { send = value != 2.0 Log.d(TAG, "--- 长按鸣笛 ---入参:$value") + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $value")) CallerAutoPilotControlManager.sendOperatorSetHorn(value) } @@ -142,6 +149,39 @@ internal class MoFangCommandExecutor { } } + private fun getKeycodeByWhat(what: Int): String? { + return when(what) { + MSG_WHAT_KEY_CODE_A -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A) + MSG_WHAT_KEY_CODE_B,MSG_WHAT_KEY_CODE_BL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B) + MSG_WHAT_KEY_CODE_C -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_C) + MSG_WHAT_KEY_CODE_D -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_D) + MSG_WHAT_KEY_CODE_E, MSG_WHAT_KEY_CODE_EL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_E) + MSG_WHAT_KEY_CODE_AB -> "${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A)},${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B)}" + else -> null + } + } + + private fun getInputTypeByWhat(what: Int): String? { + return when(what) { + MSG_WHAT_KEY_CODE_A, + MSG_WHAT_KEY_CODE_B, + MSG_WHAT_KEY_CODE_C, + MSG_WHAT_KEY_CODE_D, + MSG_WHAT_KEY_CODE_E -> { + "1" + } + MSG_WHAT_KEY_CODE_BL,MSG_WHAT_KEY_CODE_EL -> { + "2" + } + MSG_WHAT_KEY_CODE_AB -> { + "3" + } + else -> { + null + } + } + } + fun handleSingleClick(keycode: Int) { if (keycode == KeyEvent.KEYCODE_A) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt index 38120a957b..6057743514 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt @@ -14,6 +14,16 @@ import com.mogo.eagle.core.function.api.devatools.mofang.* import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider.OnMoFangStatusListener import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.eagle.core.utilcode.util.Utils +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY_VALUE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_KEYCODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_TYPE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_CONNECT_SUCCESS +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_DISCONNECT_SUCCESS +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_CONNECT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_DISCONNECT import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger @@ -57,20 +67,25 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } } + override fun onBluetoothStartConnect() { + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_START_CONNECT to "${System.currentTimeMillis()}")) + linkedLog.record(mapOf("connect" to "real-start")) + } + override fun connect() { try { - linkedLog.record(mapOf("connect" to "start")) + linkedLog.record(mapOf("connect" to "[手动触发]:${System.currentTimeMillis()}")) MoFangManager.connect() - linkedLog.record(mapOf("connect" to "success")) } catch (t: Throwable) { t.printStackTrace() - linkedLog.record(mapOf("connect" to "error: ${t.message}")) + linkedLog.record(mapOf("connect" to "[手动触发]:error -> ${t.message}")) throw t } } override fun disconnect() { try { + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_START_DISCONNECT to "${System.currentTimeMillis()}")) linkedLog.record(mapOf("disconnect" to "start")) MoFangManager.disconnect() linkedLog.record(mapOf("disconnect" to "success")) @@ -95,7 +110,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } override fun provideWindowCallback(delegate: Callback?): Callback { - val ret = MoFangManager.providerWindowCallback() + val ret = MoFangManager.provideWindowCallback() ret.setDelegate(delegate) return ret } @@ -110,6 +125,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen override fun onBluetoothBatteryChanged(battery: Int) { linkedLog.record(mapOf("callback" to "onBluetoothBatteryChanged:$battery")) + MoFangAnalyticUtils.track(EVENT_BATTERY, mutableMapOf(EVENT_BATTERY_VALUE to "$battery")) if (this.battery.get() != battery) { UiThreadHandler.post { listeners.values.forEach { @@ -127,6 +143,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } catch (t: Throwable) { t.printStackTrace() } + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_CONNECT_SUCCESS to "${System.currentTimeMillis()}")) UiThreadHandler.post { listeners.values.forEach { it.onMoFangConnected() @@ -141,6 +158,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } catch (t: Throwable) { t.printStackTrace() } + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_DISCONNECT_SUCCESS to "${System.currentTimeMillis()}")) UiThreadHandler.post { listeners.values.forEach { it.onMoFangDisconnected() @@ -149,15 +167,17 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } override fun onBluetoothKeyBoardCombineClicked(vararg keyCodes: Int) { + val keycodesText = keyCodes.joinToString(",") { KeyEvent.keyCodeToString(it) } if (isTest.get()) { toast.get()?.cancel() - Toast.makeText(Utils.getApp(), "组合键[${keyCodes.joinToString(",") { KeyEvent.keyCodeToString(it) }}]触发了\n[正式使用时,请关闭运营面板上的\"魔方指令\"测试开关]", Toast.LENGTH_SHORT).also { + Toast.makeText(Utils.getApp(), "组合键[$keycodesText]触发了\n[正式使用时,请关闭运营面板上的\"魔方指令\"测试开关]", Toast.LENGTH_SHORT).also { toast.set(it) }.show() return } try { - linkedLog.record(mapOf("command" to "combine_clicked: ${keyCodes.joinToString(",") { KeyEvent.keyCodeToString(it) } }")) + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keycodesText, EVENT_INPUT_SUB_TYPE to "3")) + linkedLog.record(mapOf("command" to "combine_clicked: $keycodesText")) executor.handleCombineClick(*keyCodes) } finally { UiThreadHandler.post { listeners.values.forEach { @@ -175,6 +195,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen return } try { + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "2")) linkedLog.record(mapOf("command" to "long_clicked: ${ KeyEvent.keyCodeToString(keyCode) }")) executor.handleLongClick(keyCode) } finally { @@ -187,15 +208,17 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen } override fun onBluetoothKeyboardClicked(keyCode: Int) { + val keycodeText = KeyEvent.keyCodeToString(keyCode) if (isTest.get()) { toast.get()?.cancel() - Toast.makeText(Utils.getApp(), "单击键[${KeyEvent.keyCodeToString(keyCode)}]触发了\n[正式使用时,请关闭运营面板上的\"魔方指令\"测试开关]", Toast.LENGTH_SHORT).also { + Toast.makeText(Utils.getApp(), "单击键[$keycodeText]触发了\n[正式使用时,请关闭运营面板上的\"魔方指令\"测试开关]", Toast.LENGTH_SHORT).also { toast.set(it) }.show() return } try { - linkedLog.record(mapOf("command" to "clicked: ${ KeyEvent.keyCodeToString(keyCode) }")) + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "1")) + linkedLog.record(mapOf("command" to "clicked: $keycodeText")) executor.handleSingleClick(keyCode) } finally { UiThreadHandler.post { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index 2642df0efb..ec0776154c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -58,7 +58,7 @@ android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize" android:enabled="true" android:hardwareAccelerated="true" - android:launchMode="singleTop" + android:launchMode="singleTask" android:resizeableActivity="false" android:resumeWhilePausing="true" android:screenOrientation="${SCREEN_ORIENTATION}" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index 16ff68f3c0..3e93aeb725 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -7,6 +7,7 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAIN; import android.content.Intent; +import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.os.Process; @@ -14,6 +15,7 @@ import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; @@ -200,6 +202,12 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis super.onBackPressed(); } + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + Log.d(TAG, " --- onConfigurationChanged --"); + } + @Override public void onSkinModeChange(int skinMode) { } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_mf_sop_operator.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_mf_sop_operator.xml new file mode 100644 index 0000000000..5f6580f198 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_mf_sop_operator.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file