diff --git a/OCH/bus/passenger/src/main/res/jinlv/layout/p_bus_view_status_bar.xml b/OCH/bus/passenger/src/main/res/jinlv/layout/p_bus_view_status_bar.xml index 88c228c4f3..23bf8fc8d3 100644 --- a/OCH/bus/passenger/src/main/res/jinlv/layout/p_bus_view_status_bar.xml +++ b/OCH/bus/passenger/src/main/res/jinlv/layout/p_bus_view_status_bar.xml @@ -22,7 +22,7 @@ ', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_R);}}' + // ③能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/B2.gradle b/app/script/vehicleFlavors/B2.gradle index c98004a209..9eab0ec16c 100644 --- a/app/script/vehicleFlavors/B2.gradle +++ b/app/script/vehicleFlavors/B2.gradle @@ -23,7 +23,7 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'false' - // ③M2不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_P);add(chassis.Chassis.GearPosition.GEAR_R);}}' + // ③M2能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/C1.gradle b/app/script/vehicleFlavors/C1.gradle index c53d59f1b4..e83f026cb1 100644 --- a/app/script/vehicleFlavors/C1.gradle +++ b/app/script/vehicleFlavors/C1.gradle @@ -16,9 +16,8 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - // ③不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'null' - + // ③能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'null' // ⑤清扫车 默认模式(运营/云控) buildConfigField 'String', 'SWEEPER_DEFAULT_MODE', '\"Cloud\"' diff --git a/app/script/vehicleFlavors/M1.gradle b/app/script/vehicleFlavors/M1.gradle index 4db16a2c4a..454f16c6f2 100644 --- a/app/script/vehicleFlavors/M1.gradle +++ b/app/script/vehicleFlavors/M1.gradle @@ -13,9 +13,8 @@ project.android.productFlavors { // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"M1\"" - // ②构建的是否要动态更换模型 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'null' - + // ②M1能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' // ③不能启动自驾的档位 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'false' diff --git a/app/script/vehicleFlavors/T1T2.gradle b/app/script/vehicleFlavors/T1T2.gradle index 4446679e14..a653f6a7d1 100644 --- a/app/script/vehicleFlavors/T1T2.gradle +++ b/app/script/vehicleFlavors/T1T2.gradle @@ -17,8 +17,8 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - // ③不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_P);add(chassis.Chassis.GearPosition.GEAR_R);}}' + // ③能启动自驾的档位 MAP<360代码中会移除P档 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_P);}}' } diff --git a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java index 950f0e4a47..f76b47d647 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java +++ b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java @@ -481,69 +481,119 @@ public class ViewPressedStateLancet { text.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); return true; } - ColorStateList textColor = text.getTextColors(); if (textColor != null) { - int current = text.getCurrentTextColor(); - int pressed = textColor.getColorForState(new int[]{ android.R.attr.state_pressed }, Integer.MIN_VALUE); - if (pressed != Integer.MIN_VALUE && pressed != current) { + int defaultColor = textColor.getDefaultColor(); + int pressedColor = Color.argb((int)(Color.alpha(defaultColor) * alpha), Color.red(defaultColor), Color.green(defaultColor), Color.blue(defaultColor)); + if (!textColor.isStateful()) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- isStateful() => false hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- isStateful() => false hit ---" + "["+text+"]"); + }*/ + int[][] states = new int[2][1]; + int[] colors = new int[2]; + states[0] = new int[] { android.R.attr.state_pressed, -android.R.attr.state_focused, -android.R.attr.state_active }; + colors[0] = pressedColor; + states[1] = StateSet.WILD_CARD; + colors[1] = defaultColor; + ColorStateList newColor = new ColorStateList(states, colors); + text.setTag(R.id.click_pressed_attr_replaced_color, textColor); + text.setTextColor(newColor); + return true; + } + int pressed = textColor.getColorForState(new int[] { android.R.attr.state_pressed }, Integer.MIN_VALUE); + if (pressed != Integer.MIN_VALUE && pressed != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- pressed hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- pressed hit ---" + "["+text+"]"); + }*/ return false; } - int enableColor = textColor.getColorForState(new int[] { android.R.attr.state_enabled }, Integer.MIN_VALUE); - int defaultColor = current; - if (enableColor == Integer.MIN_VALUE && enableColor != current) { - defaultColor = textColor.getDefaultColor(); - } - int pressedColor = Color.argb((int)(Color.alpha(defaultColor) * alpha), Color.red(defaultColor), Color.green(defaultColor), Color.blue(defaultColor)); - int disableColor = textColor.getColorForState(new int[] { -android.R.attr.state_enabled }, Integer.MIN_VALUE); - int size = 2; - if (disableColor != Integer.MIN_VALUE && disableColor != current) { - size += 1; - } - boolean hasChecked = false; + int disabledColor = textColor.getColorForState(new int[] { -android.R.attr.state_enabled }, Integer.MIN_VALUE); int checkedColor = textColor.getColorForState(new int[] { android.R.attr.state_checked }, Integer.MIN_VALUE); - if (checkedColor != Integer.MIN_VALUE && checkedColor != current) { - hasChecked = true; - size += 1; + int unCheckedColor = textColor.getColorForState(new int[] { -android.R.attr.state_checked }, Integer.MIN_VALUE); + int selectedColor = textColor.getColorForState(new int[] { android.R.attr.state_enabled }, Integer.MIN_VALUE); + int unSelectedColor = textColor.getColorForState(new int[] { -android.R.attr.state_selected }, Integer.MIN_VALUE); + int size = 2; + if (disabledColor != Integer.MIN_VALUE && disabledColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- disabled hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- disabled hit ---" + "["+text+"]"); + }*/ + size++; } - boolean hasUnChecked = false; - int unCheckedColor = textColor.getColorForState(new int[]{ -android.R.attr.state_checked }, Integer.MIN_VALUE); - if (unCheckedColor != Integer.MIN_VALUE && unCheckedColor != current) { - hasUnChecked = true; - size += 1; + if (checkedColor != Integer.MIN_VALUE && checkedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- checked hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- checked hit ---" + "["+text+"]"); + }*/ + size++; + } + if (unCheckedColor != Integer.MIN_VALUE && unCheckedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- unchecked hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- unchecked hit ---" + "["+text+"]"); + }*/ + size++; + } + if (selectedColor != Integer.MIN_VALUE && selectedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- selected hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- selected hit ---" + "["+text+"]"); + }*/ + size++; + } + if (unSelectedColor != Integer.MIN_VALUE && unSelectedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- unselected hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- unselected hit ---" + "["+text+"]"); + }*/ + size++; } int[][] states = new int[size][1]; int[] colors = new int[size]; - states[0] = new int[] { android.R.attr.state_pressed, -android.R.attr.state_focused, -android.R.attr.state_active }; + states[0] = new int[] { android.R.attr.state_pressed }; colors[0] = pressedColor; - if (size > 2) { - states[1] = new int[] { -android.R.attr.state_enabled }; - colors[1] = disableColor; - states[2] = new int[] { android.R.attr.state_enabled }; - colors[2] = defaultColor; - if (hasChecked) { - states[3] = new int[] { android.R.attr.state_checked }; - colors[3] = checkedColor; - } - if (hasUnChecked) { - if (size > 4) { - states[4] = new int[] { -android.R.attr.state_checked }; - colors[4] = unCheckedColor; - } else { - states[3] = new int[] { -android.R.attr.state_checked }; - colors[3] = unCheckedColor; - } - } - } else { - states[1] = StateSet.WILD_CARD; - colors[1] = defaultColor; + int index = 1; + if (disabledColor != Integer.MIN_VALUE && disabledColor != defaultColor) { + states[index] = new int[] { -android.R.attr.state_enabled }; + colors[index] = disabledColor; + index++; } + if (checkedColor != Integer.MIN_VALUE && checkedColor != defaultColor) { + states[index] = new int[] { android.R.attr.state_checked }; + colors[index] = checkedColor; + index++; + } + if (unCheckedColor != Integer.MIN_VALUE && unCheckedColor != defaultColor) { + states[index] = new int[] { -android.R.attr.state_checked }; + colors[index] = unCheckedColor; + index++; + } + if (selectedColor != Integer.MIN_VALUE && selectedColor != defaultColor) { + states[index] = new int[] { android.R.attr.state_selected }; + colors[index] = selectedColor; + index++; + } + if (unSelectedColor != Integer.MIN_VALUE && unSelectedColor != defaultColor) { + states[index] = new int[] { -android.R.attr.state_selected }; + colors[index] = unSelectedColor; + index++; + } + states[index] = StateSet.WILD_CARD; + colors[index] = defaultColor; ColorStateList newColor = new ColorStateList(states, colors); text.setTag(R.id.click_pressed_attr_replaced_color, textColor); text.setTextColor(newColor); return true; } - return false; } if (view != null) { diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index b4c563a671..7de5eff93e 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -51,7 +51,7 @@ object ConfigStartUp { // 各个module需要的url FunctionBuildConfig.urlJson = GsonUtils.fromJson(BuildConfig.URLs, UrlConfig::class.java) //不能启动自动驾驶的档位 - FunctionBuildConfig.unableLaunchAutopilotGear = BuildConfig.UNABLE_LAUNCH_AUTOPILOT_GEAR + FunctionBuildConfig.launchAutopilotGear = BuildConfig.LAUNCH_AUTOPILOT_GEAR // 各车型宣传视频本地配置json FunctionBuildConfig.mediaUrlConfig = BuildConfig.mediaUrlConfig FunctionBuildConfig.musicUrlConfig = BuildConfig.musicUrlConfig diff --git a/config.gradle b/config.gradle index 7ee8c77407..2e42f48ff5 100644 --- a/config.gradle +++ b/config.gradle @@ -225,7 +225,7 @@ ext { btrace : "com.bytedance.btrace:rhea-core:2.0.0", mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.11", - log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.50", + log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.80", // 安全证书 passport_secret : "com.zhidaoauto:sdk-java:1.0.6-SNAPSHOT", diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 2815b8882d..b932142efa 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -129,10 +129,10 @@ class MoGoAutopilotControlProvider : .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false) - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtF()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) - .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) + .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// .build() @@ -228,7 +228,7 @@ class MoGoAutopilotControlProvider : val options = AdasOptions .newBuilder() .setPassenger(true) - .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) + .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) .build() AdasManager.getInstance() .create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) @@ -260,10 +260,10 @@ class MoGoAutopilotControlProvider : .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false)// 乘客端直连工控机改为false - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtF()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) - .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) + .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) .build() AdasManager.getInstance().create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// @@ -321,9 +321,9 @@ class MoGoAutopilotControlProvider : // 设置IP地址 val options = AdasOptions.newBuilder() .setPassenger(false) - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtF()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.SPECIFIED) .setSpecifiedAddress(autoPilotIp) .build() @@ -988,7 +988,7 @@ class MoGoAutopilotControlProvider : * @param resultCode 上报字段code */ override fun getReportResultDesc(resultCode: String): String { - return MogoReport.Result.getDesc(resultCode) + return MogoReport.ResultDesc.getDesc(resultCode) } /** @@ -996,7 +996,7 @@ class MoGoAutopilotControlProvider : * @param actionCode 上报字段code */ override fun getReportActionDesc(actionCode: String): String { - return MogoReport.Action.getDesc(actionCode) + return MogoReport.ActionDesc.getDesc(actionCode) } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index a98e8ef5cb..75d46a51f9 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.datacenter.autopilot.adapter import bag_manager.BagManagerOuterClass +import chassis.Chassis import chassis.ChassisStatesOuterClass import chassis.VehicleStateOuterClass import com.mogo.eagle.core.data.app.AppConfigInfo @@ -169,7 +170,7 @@ class MoGoAdasListenerImpl : OnAdasListener { ) { if (vehicleState != null) { //转向灯数据 - CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(vehicleState.light) +// CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(vehicleState.light) //刹车灯数据 CallerChassisLamplightListenerManager.invokeAutopilotBrakeLightData(vehicleState.brakeLightStatus) //方向盘转向角数据 @@ -231,10 +232,10 @@ class MoGoAdasListenerImpl : OnAdasListener { ) { if (chassisStates != null) { chassisStates.bcmSystemStates?.let { bcmSystemStates -> - bcmSystemStates.turnLightState?.let { - //转向灯数据 - CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(it) - } +// bcmSystemStates.turnLightState?.let { +// //转向灯数据 +// CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(it) +// } //刹车灯数据 CallerChassisLamplightListenerManager.invokeAutopilotBrakeLightData(bcmSystemStates.brakeLightState != 0) } @@ -277,6 +278,19 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + /** + * 底盘车灯状态 转换过的可以直接使用 + * 例如: + * 原始右转数据: 0 2 0 2 0 2。。。 + * 转换之后数据: 2 2 2 2 2 2。。。 + * + * @param light 车灯 目前域控发送车灯有 左传{@link Chassis.LightSwitch#LIGHT_LEFT} 右转{@link Chassis.LightSwitch#LIGHT_RIGHT} 危险报警灯{@link Chassis.LightSwitch#LIGHT_FLASH} + */ + override fun onLightSwitch(light: Chassis.LightSwitch) { + //转向灯数据 + CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(light) + } + //自动驾驶状态 @ChainLog( linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index c1bbbb09c0..9e41f5caa3 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -17,6 +17,7 @@ import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerParallelDrivingActionsListenerManager import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager @@ -59,13 +60,14 @@ class MoGoAdasMsgConnectStatusListenerImpl : private val isSentBasicInfoReq = AtomicBoolean(false)//是否已回复域控基础信息请求 @Volatile - private var certificationResult = "" + private var certificationResult = "未开启认证" init { CallerCloudListenerManager.addListener(TAG, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerAutopilotActionsListenerManager.setConnected(AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) CallerParallelDrivingActionsListenerManager.setConnected(AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) + CallerAutopilotCarConfigListenerManager.invokeAutopilotCertFileResult(certificationResult) } private fun connectToast(reason: String) { @@ -249,7 +251,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : */ override fun onCertification(status: AdasConstants.CertificationStatus) { if (status == AdasConstants.CertificationStatus.TIMEOUT) { - certificationResult = ":认证超时"; + certificationResult = ":证书认证超时" CallerLogger.d( "$M_D_C$TAG", "域控证书认证超时(表示域控未发送BasicInfoReq接口的数据【这种情况可能是连接出现了问题】)" @@ -257,24 +259,25 @@ class MoGoAdasMsgConnectStatusListenerImpl : } else { if (status != AdasConstants.CertificationStatus.NOT_ENABLED) { if (status == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_SUCCESS) { + certificationResult = ":成功校验域控证书" CallerLogger.d( "$M_D_C$TAG", - "域控证书链校验成功" + "成功校验域控证书" ) } else if (status == AdasConstants.CertificationStatus.ROOT_CRT_ERROR) { - certificationResult = ":ROOT证书异常"; + certificationResult = ":获取ROOT证书异常" CallerLogger.d( "$M_D_C$TAG", "ROOT证书异常(表示未传递证书,没有拿到ROOT证书)" ) } else if (status == AdasConstants.CertificationStatus.IPC_CRT_ERROR) { - certificationResult = ":域控证书异常"; + certificationResult = ":获取域控证书异常" CallerLogger.d( "$M_D_C$TAG", "域控证书异常(表示域控发送了BasicInfoReq接口的数据但是未传递证书或证书解码失败【失败的可能性很低】)" ) } else if (status == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_FAILED) { - certificationResult = ":证书链校验失败"; + certificationResult = ":域控证书校验失败" CallerLogger.d( "$M_D_C$TAG", "域控证书链校验失败(表示证书链未验证通过。证书不匹配、证书格式不正确)" @@ -282,6 +285,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : } } } + CallerAutopilotCarConfigListenerManager.invokeAutopilotCertFileResult(certificationResult) } private fun saveIntoMsgBox( @@ -341,7 +345,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : * 工控机获取SN */ override fun onAutopilotSNRequest(basicInfoReq: MessagePad.BasicInfoReq) { - CallerLogger.d("$M_D_C$TAG", "收到域控基础信息请求"); + CallerLogger.d("$M_D_C$TAG", "收到域控基础信息请求") isReceivedBasicInfoReq.set(true) if (!TextUtils.isEmpty(SharedPrefsMgr.getInstance().sn)) { syncBasicInfoToAutopilot() @@ -396,7 +400,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : } override fun tokenGot(token: String, sn: String) { - CallerLogger.d("$M_D_C$TAG", "SN获取成功=$sn"); + CallerLogger.d("$M_D_C$TAG", "SN获取成功=$sn") if (isReceivedBasicInfoReq.get() && !isSentBasicInfoReq.get()) {//已收到域控基础信息请求,但是之前SN没有所以还未回复,现在获取到SN后再进行回复 syncBasicInfoToAutopilot() } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt index 397d1222c0..18894c47d6 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt @@ -130,6 +130,9 @@ object DataManager { CallerMsgBoxListenerManager.invokeListener(MsgCategory.NOTICE, msg) } MsgBoxType.FMINFO -> { + synchronized(this) { + fmInfoList.add(msg) + } CallerMsgBoxListenerManager.invokeListener(MsgCategory.FM_INFO, msg) } MsgBoxType.VOICE -> { @@ -250,7 +253,7 @@ object DataManager { } } - private suspend fun getCacheMessages(context: Context): List = + private suspend fun getCacheMessages(context: Context): List = withContext(Dispatchers.IO) { delay(2000) return@withContext MsgBoxDb.getDb(context) @@ -326,7 +329,7 @@ object DataManager { } } else -> { - return@map MsgBoxBean(MsgBoxType.V2X, V2XMsg()) + return@map null } } } @@ -368,6 +371,13 @@ object DataManager { recordBagList.clear() } + if (fmInfoList.isNotEmpty()) { + fmInfoList.forEach { + msgInfoList.add(MsgBoxInfo(it.bean2Json, it.type.ordinal, it.timestamp)) + } + fmInfoList.clear() + } + if (msgInfoList.isNotEmpty()) { MsgBoxDb.getDb(context) .monitorDao() @@ -387,4 +397,14 @@ object DataManager { } } } + + fun queryFMInfoList(context: Context, startTime: Long, endTime: Long): List { + return MsgBoxDb.getDb(context).monitorDao() + .getFMInfoList(MsgBoxType.FMINFO.ordinal, startTime, endTime) + .map { boxInfo -> + MsgBoxBean(MsgBoxType.FMINFO, GsonUtils.fromJson(boxInfo.bean2Json, FMInfoMsg::class.java)).apply { + timestamp = boxInfo.timeStamp + } + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt index 106b464eef..41e0b64671 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt @@ -50,6 +50,14 @@ class MsgBoxProvider : IMsgBoxProvider { return DataManager.getRecordBagData() } + override fun queryFMInfoList( + context: Context, + startTime: Long, + endTime: Long + ): List { + return DataManager.queryFMInfoList(context, startTime, endTime) + } + override fun removeRecordInfo(context: Context, msgBoxBean: MsgBoxBean, key: String) { DataManager.removeRecordInfo(key, key) DataManager.delMsgBoxBean(context, msgBoxBean) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt index 923e574416..51124004f8 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt @@ -16,6 +16,9 @@ interface MsgBoxDao { @Query("SELECT * FROM t_msg_box") fun getAllCachedMessages(): List + @Query("SELECT * FROM t_msg_box WHERE json_obj_type == (:fmType) AND time_stamp >= (:startTime) AND time_stamp <= (:endTime)") + fun getFMInfoList(fmType: Int, startTime: Long, endTime: Long): List + @Query("DELETE FROM t_msg_box") fun deleteMsgTable() } \ 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/logcat/MoGoLogRecordProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt index ecab17f24d..09ba62e173 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt @@ -4,6 +4,7 @@ import android.Manifest import android.content.* import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Build +import android.os.Environment import android.os.Process import android.os.SystemClock import android.util.Log @@ -14,10 +15,13 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.core.log.record.* import com.mogo.core.log.record.config.* import com.mogo.core.log.record.config.crash.CrashConfig +import com.mogo.core.log.record.config.extra.IExtraFileToUpload +import com.mogo.core.log.record.config.extra.ToUploadFile import com.mogo.core.log.record.config.state.IStateProvider import com.mogo.core.log.record.model.UploadError import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.function.api.devatools.logcat.* +import com.mogo.eagle.core.utilcode.download.DownloadUtils import com.zhidao.loglib.bean.RemoteLogPushContent import com.zhjt.mogo_core_function_devatools.BuildConfig import com.zhjt.mogo_core_function_devatools.logcat.checker.AnrLogChecker @@ -25,6 +29,7 @@ import com.zhjt.mogo_core_function_devatools.logcat.config.LogRecordConfig import com.zhjt.mogo_core_function_devatools.logcat.uploader.* import kotlinx.coroutines.* import java.io.* +import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit.MINUTES import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicLong @@ -45,13 +50,12 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, private val lastUploadTime by lazy { AtomicLong(0) } override fun init(context: Context) { - val zip = File(context.getExternalFilesDir(null), "logcat/zip") val builder = LogcatConfig.Builder().context(context) .recordPeriod(MINUTES.toMillis(5)) // 5分钟一个文件 .maxSizeInLogDir((512 * 1024 * 1024).toLong()) // 512M最大容量 .recordDir(File(context.getExternalFilesDir(null), "logcat")) .pid(Process.myPid()) - .generateZipDir(zip.absolutePath) + .generateZipDir(File(context.getExternalFilesDir(null), "logcat/zip").absolutePath) .stateProvider(object : IStateProvider { override fun provide(divider: String?): Map { return mutableMapOf().also { itx -> @@ -104,6 +108,18 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, itx["协议版本号"] = AppConfigInfo.protocolVersionNumber itx["${divider}-7"] = divider itx["角色"] = AppConfigInfo.role + val downloads = try { + DownloadUtils.getAllDownloadRecords() + } catch (t: Throwable) { + emptyList() + } + if (downloads.isNotEmpty()) { + itx["${divider}-8"] = divider + itx["下载汇总"] = "(${downloads.size})" + downloads.forEach { + itx[it.first] = "\n\r----------------------------------------------------------${it.second}\n\r" + } + } } } }) @@ -114,26 +130,26 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, .systemTags("ActivityManager") .checker(AnrLogChecker()) } - -// if (BuildConfig.DEBUG) { -// builder.crashConfig( -// CrashConfig.Builder() -// .enabled(true) -// .crashDir(File(context.getExternalFilesDir(null), "logcat/crash")) -// .nativeCrash(true) -// .anr(true) -// .javaCrash(true) -// .build() -// ) -// } - LogcatManager.init(builder) - scope.launch { - try { - zip.takeIf { it.exists() }?.deleteRecursively() - } catch (t: Throwable) { - t.printStackTrace() - } + if (BuildConfig.DEBUG) { + builder.crashConfig( + CrashConfig.Builder() + .enabled(true) + .crashDir(File(context.getExternalFilesDir(null), "crash")) + .expireDuration(TimeUnit.DAYS.toMillis(3)) + .javaCrash(true) + .nativeCrash(true) + .anr(true) + .build() + ) } + builder.extraFilesToUpload(object : IExtraFileToUpload { + override fun filesToUpload(): List { + return ArrayList().also { + it.add(ToUploadFile(File(Environment.getExternalStorageDirectory(), "MLog"))) + } + } + }) + LogcatManager.init(builder) } override fun target(): Class { @@ -195,8 +211,8 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, return LogcatManager.export() } - override fun upload(): Unit = runBlocking { - val state = LogcatManager.upload(0, System.currentTimeMillis()) + override fun upload(startTime: Long, endTime: Long): Unit = runBlocking { + val state = LogcatManager.upload(startTime, endTime) if (state is UploadError) { throw AssertionError(state.toString()) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt index 3508e7fc2f..2faadac60d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt @@ -8,13 +8,20 @@ import android.content.IntentFilter import android.location.LocationManager import android.util.Log import androidx.core.location.LocationManagerCompat +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.IMogoStatusChangedListener import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager import com.mogo.eagle.core.utilcode.util.AppStateManager @@ -30,7 +37,8 @@ import java.util.concurrent.atomic.AtomicBoolean internal class OverViewImpl(ctx: Context) : IFlow(ctx), IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, - IConnectStatusListener, IMogoStatusChangedListener { + IConnectStatusListener, IMogoStatusChangedListener, IMoGoAutopilotCarConfigListener, + IMoGoCloudListener { companion object { const val TAG = "OverViewImpl" @@ -56,6 +64,9 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), @Volatile private var isAutopilotException = false + @Volatile + private var isAuthCrtException = false + @Volatile private var isFirst = true @@ -125,6 +136,8 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), MogoStatusManager.getInstance() .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerCloudListenerManager.addListener(TAG, this) val isGranted = checkIsGpsException() if (!isGranted) { @@ -268,11 +281,41 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), } private fun checkIfNotException() { - if (!isServerException && !isCloudSocketException && !isTracingException && !isGpsException && !isAutopilotException) { + if (!isServerException && !isCloudSocketException && !isTracingException && !isGpsException && !isAutopilotException && !isAuthCrtException) { send(OverViewStatus(false)) } } + override fun authCrtFile(device: String, root: String) { + super.authCrtFile(device, root) + isAuthCrtException = false + checkIfNotException() + } + + override fun authCrtError(errorMsg: String) { + super.authCrtError(errorMsg) + isAuthCrtException = true + send(OverViewStatus(true)) + } + + override fun onCertificationResult(msg: String) { + super.onCertificationResult(msg) + if (!SharedPrefsMgr.getInstance().getBoolean( + "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) + ) { + return + } + if(msg.contains("成功校验")){ + isAuthCrtException = false + checkIfNotException() + }else{ + isAuthCrtException = true + send(OverViewStatus(true)) + } + } + override fun onDestroy() { super.onDestroy() // CallerDevaToolsListenerManager.removeListener(TAG) @@ -280,6 +323,9 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), MogoStatusManager.getInstance() .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + CallerCloudListenerManager.removeListener(TAG) + try { if (registered.compareAndSet(true, false) && receiver != null) { ctx.unregisterReceiver(receiver) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt deleted file mode 100644 index 1845640015..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.status.ui - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.FrameLayout -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.zhjt.mogo_core_function_devatools.R - -/** - * 状态汇总View控件 - */ -class StatusSummaryView@JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : FrameLayout( - context, - attrs, - defStyleAttr -), IMoGoAutopilotStatusListener { - companion object{ - private const val TAG = "SummaryStatusView" - } - - init { - LayoutInflater.from(context).inflate(R.layout.view_initiative_bad_case, this, true) - initView() - } - - private fun initView() { - - } -} \ 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/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index 8415e33cc2..959553636e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -8,13 +8,17 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.MsgFmData import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener import com.mogo.eagle.core.function.api.order.IOrderListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager @@ -97,23 +101,53 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } } else if(category == MsgCategory.SYS_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + if(msgBoxBean.type == MsgBoxType.REPORT){ + val reportMsg = msgBoxBean.bean as ReportEntity + //P8-P1均只收在消息盒子里,P0消息盒子弹出,其中P0弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + var isShowReport = false + for(action in reportMsg.actionsList){ + if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){ + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + isShowReport = true + } + } + } + if(isShowReport){ + //展示消息 + showData(msgBoxBean) + } + } } else if(category == MsgCategory.FM_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if(FunctionBuildConfig.isTakeoverRemind){ //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 val fmInfoMsg = msgBoxBean.bean as FMInfoMsg - if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车 - || fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车 - || fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车 - ){ - //语音提示 - try { - SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) - }catch (e: Exception){ - e.printStackTrace() + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) + fmInfoMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + if(curFaultLevel == 0){ + //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + //语音提示 + try { + SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) + }catch (e: Exception){ + e.printStackTrace() + } + //展示消息 + showData(msgBoxBean) } - //展示消息 - showData(msgBoxBean) } } } else{ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index fc6ab08a14..18436b65e5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -21,6 +21,7 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform +import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout @@ -242,7 +243,6 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A is BubbleFmHolder ->{ data?.let { val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg - holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) if(fmMsg.policyTime == null){ holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) }else{ @@ -250,26 +250,43 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A } if(fmMsg.fmInfoList?.size == 0){ holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) }else{ - var curFaultLevel = 0 //默认级别,遍历数组找出级别最高的(level数越小大,级别越高) + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) fmMsg.fmInfoList?.forEach { faultInfo -> if(faultInfo.faultActionCount>0){ faultInfo.faultActionList.forEach {actionCode -> //获取建议操作级别,得到建议操作级别最高的操作 - if(MsgFmData.FaultAction.getFaultLevel(actionCode) > curFaultLevel){ + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) } } } } val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel) + holder.tvBubbleFmFault.text = faultAction //当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、 // 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 - if(curFaultLevel == 0){ + if(curFaultLevel == 5){ holder.tvBubbleFmFaultAction.text = "建议操作:暂无" }else{ holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})" } + //不同级别的Icon显示 + when(curFaultLevel){ + 0->{ + //重度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + } + 1,2,3->{ + //中度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + } + 4,5->{ + //轻度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + } + } } } } @@ -409,6 +426,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault) var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction) var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime) + var ivBubbleFmImage: ImageView = itemView.findViewById(R.id.ivBubbleFmImage) } //SSM连接消息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index a665a8dd12..4147dff501 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -173,39 +173,21 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : "时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}" holder.tvFmTime.text = fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1,getHourMinFormat()) } - //不同级别的Icon显示 - if(fmInfoMsg.policyCode == "FM_DP_ONLY_WARNING"){ - //警示 - holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) - holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) - }else if(fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT1" - || fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT2" - || fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT3"){ - //降速行驶 - holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) - holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open)) - }else if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" - || fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" - || fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP"){ - //安全停车 - holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) - holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open)) - } - //Title - holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) - holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) //建议操作 if(fmInfoMsg.fmInfoList.isNullOrEmpty()){ //建议操作暂无 holder.tvFmActionOpen.text = "建议操作:暂无" holder.tvFmActionNormal.text = "建议操作:暂无" + //Title + holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) + holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) }else{ val receiveFaultLevel = ArrayList() fmInfoMsg.fmInfoList!!.forEach { info -> if(info.faultActionCount != 0){ info.faultActionList.forEach { action -> //如果不包含此故障Level,则进行添加 - if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action)) && MsgFmData.FaultAction.getFaultLevel(action)!=0){ + if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action))){ receiveFaultLevel.add(MsgFmData.FaultAction.getFaultLevel(action)) } } @@ -216,7 +198,28 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : val faultActionStr: StringBuilder = StringBuilder() faultActionStr.append("建议操作:") receiveFaultLevel.sort() - receiveFaultLevel.reverse() +// receiveFaultLevel.reverse() + //Title + holder.tvFmTitleNormal.text = MsgFmData.FaultAction.getFaultAction(receiveFaultLevel[0]) + holder.tvFmTitleOpen.text = MsgFmData.FaultAction.getFaultAction(receiveFaultLevel[0]) + //不同级别的Icon显示 + when(receiveFaultLevel[0]){ + 0->{ + //重度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open)) + } + 1,2,3->{ + //中度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open)) + } + 4,5->{ + //轻度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) + } + } receiveFaultLevel.forEach {level-> if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank()){ faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level)) @@ -227,11 +230,11 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : faultActionStr.append(")") } if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank() || MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){ - faultActionStr.append("/") + faultActionStr.append(";") } } if(faultActionStr.length > 5){ - if(faultActionStr.endsWith("/")){ + if(faultActionStr.endsWith(";")){ faultActionStr.deleteCharAt(faultActionStr.lastIndex) } holder.tvFmActionOpen.text = faultActionStr.toString() @@ -243,6 +246,9 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : }else{ holder.tvFmActionOpen.text = "建议操作:暂无" holder.tvFmActionNormal.text = "建议操作:暂无" + //轻度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) } } //故障策略 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 9556510904..6bae51e4fa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -12,7 +12,6 @@ import android.os.Build import android.os.Process import android.text.Html import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -89,6 +88,7 @@ import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.kotlin.scope import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant @@ -204,7 +204,8 @@ internal class DebugSettingView @JvmOverloads constructor( // 高精地图是否已缓存 private var isHDCached = false - private var isClickCheckedCbSsl = false//是否已经点击且选中证书认证按钮 + //是否已经点击且选中证书认证按钮 + private var isCertCheck = false private var isFirstDownLoadCertHint = false init { @@ -1293,14 +1294,13 @@ internal class DebugSettingView @JvmOverloads constructor( } } //是否启用证书认证 - cbSsl.isChecked = - SharedPrefsMgr.getInstance().getBoolean( - MoGoConfig.AUTOPILOT_CERTIFICATION, - MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE - ) + val check = SharedPrefsMgr.getInstance().getBoolean( + "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) + isCertCheck = check + cbSsl.isChecked = check cbSsl.setOnCheckedChangeListener { _, isChecked -> - isClickCheckedCbSsl = isChecked -// 下载证书 if (isChecked) { if (CallerCloudCertManager.getRootCrtF().isNullOrEmpty()) { if (!isFirstDownLoadCertHint) { @@ -1308,25 +1308,31 @@ internal class DebugSettingView @JvmOverloads constructor( ToastUtils.showShort("证书文件不存在,正在下载") } cbSsl.isChecked = false + //下载证书 CallerCloudCertManager.certFileDownLoad { errorMsg -> ThreadUtils.runOnUiThread { + isCertCheck = false ToastUtils.showShort(errorMsg) } } + }else{ + isCertCheck = true } + }else{ + isCertCheck = false } SharedPrefsMgr.getInstance() - .putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, cbSsl.isChecked) + .putBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", cbSsl.isChecked) } } override fun authCrtFile(device: String, root: String) { super.authCrtFile(device, root) ThreadUtils.runOnUiThread { - if (isClickCheckedCbSsl) { + if (isCertCheck) { cbSsl.isChecked = true SharedPrefsMgr.getInstance() - .putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, true) + .putBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", true) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { tvCertFile.text = Html.fromHtml( @@ -1576,26 +1582,48 @@ internal class DebugSettingView @JvmOverloads constructor( //上传全量日志 exportAllLogs?.onClick { v -> - v.visibility = View.INVISIBLE - logLoadingView?.visibility = View.VISIBLE - v.scope.launch(Dispatchers.IO) { - var isUploadSuccess = false - try { - CallerDevaToolsManager.logcat()?.upload() - isUploadSuccess = true - } catch (t: Throwable) { - t.printStackTrace() - } - withContext(Dispatchers.Main) { - if (isUploadSuccess) { - ToastUtils.showShort("上传成功") - } else { - ToastUtils.showShort("上传失败") + ListPopupWindow(v.context).also { p -> + val items = LogcatUploadDuration.values() + p.setAdapter(LogcatUploadAdapter(v.context, items)) + p.anchorView = v + p.isModal = true + p.setBackgroundDrawable(ColorDrawable(Color.WHITE)) + p.setOnItemClickListener { _, _, position, _ -> + val item = items[position] + v.visibility = View.INVISIBLE + logLoadingView?.visibility = View.VISIBLE + p.dismiss() + v.scope.launch(Dispatchers.IO) { + val endTime = System.currentTimeMillis() + val startTime = when(item) { + LogcatUploadDuration.IN_15M -> endTime - TimeUnit.MINUTES.toMillis(15) + LogcatUploadDuration.IN_45M -> endTime - TimeUnit.MINUTES.toMillis(45) + LogcatUploadDuration.IN_1H -> endTime - TimeUnit.HOURS.toMillis(1) + LogcatUploadDuration.IN_2H -> endTime - TimeUnit.HOURS.toMillis(2) + LogcatUploadDuration.IN_3H -> endTime - TimeUnit.HOURS.toMillis(3) + LogcatUploadDuration.IN_6H -> endTime - TimeUnit.HOURS.toMillis(6) + LogcatUploadDuration.IN_1D -> endTime - TimeUnit.DAYS.toMillis(1) + LogcatUploadDuration.ALL -> 0 + } + var isUploadSuccess = false + try { + CallerDevaToolsManager.logcat()?.upload(startTime, endTime) + isUploadSuccess = true + } catch (t: Throwable) { + t.printStackTrace() + } + withContext(Dispatchers.Main) { + if (isUploadSuccess) { + ToastUtils.showShort("上传成功") + } else { + ToastUtils.showShort("上传失败") + } + logLoadingView?.visibility = View.INVISIBLE + exportAllLogs?.visibility = View.VISIBLE + } } - logLoadingView?.visibility = View.INVISIBLE - exportAllLogs?.visibility = View.VISIBLE } - } + }.show() } if (JunkConfig.isSupportJunkDetect) { @@ -1731,6 +1759,54 @@ internal class DebugSettingView @JvmOverloads constructor( } } + private enum class LogcatUploadDuration(val text: String) { + IN_15M("15分钟内"), + IN_45M("45分钟内"), + IN_1H("1小时内"), + IN_2H("2小时内"), + IN_3H("3小时内"), + IN_6H("6小时内"), + IN_1D("一天内"), + ALL("上传所有") + } + + private class LogcatUploadAdapter(private val ctx: Context, private val items: Array): BaseAdapter() { + override fun getCount(): Int { + return items.size + } + + override fun getItem(position: Int): Any { + return items[position] + } + + override fun getItemId(position: Int): Long { + return items[position].ordinal.toLong() + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + var result = convertView + val duration = items[position] + if (result == null) { + val temp = View.inflate(ctx, android.R.layout.simple_list_item_1, null) + temp.tag = Holder(temp.findViewById(android.R.id.text1)) + result = temp + } + val holder = result?.tag as? Holder + if (holder != null) { + holder.text?.setTextColor(Color.BLACK) + holder.text?.text = duration.text + } else { + val text = result?.findViewById(android.R.id.text1) + text?.setTextColor(Color.BLACK) + text?.text = duration.text + result?.tag = Holder(text) + } + return result!! + } + + private inner class Holder(val text: TextView? = null) + } + private enum class ApmVLogUploadDuration(val text: String) { IN_15M("15分钟内"), IN_45M("45分钟内"), @@ -2504,6 +2580,6 @@ internal class DebugSettingView @JvmOverloads constructor( paramIndexes = [0] ) private fun invokeCronetResult(json: String) { - Log.d("CronetNetwork", json) + CallerLogger.d(SceneConstant.M_HMI + "CronetNetwork", json) } } \ 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/setting/StatusSummaryAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt index e1109c28b6..15f0de63a3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt @@ -48,6 +48,9 @@ class StatusSummaryAdapter(private val ctx: Context, var data: ArrayList { ivFuncView.setImageResource(R.drawable.controller) } + 5 -> { + ivFuncView.setImageResource(R.drawable.ssl_check) + } } if (entity.isException) { tvStatusDesc.setTextColor(Color.parseColor("#FF4444")) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt index 165f28ed20..4faa82f169 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt @@ -2,19 +2,26 @@ package com.mogo.eagle.core.function.hmi.ui.setting import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.widget.FrameLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.IMogoStatusChangedListener import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.status.StatusSummaryEntity +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudCertManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager import com.mogo.eagle.core.function.hmi.R @@ -26,7 +33,7 @@ import com.zhjt.mogo.adas.data.AdasConstants /** * 状态汇总View控件 */ -class StatusSummaryView@JvmOverloads constructor( +class StatusSummaryView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 @@ -35,8 +42,9 @@ class StatusSummaryView@JvmOverloads constructor( attrs, defStyleAttr ), IConnectStatusListener, IMogoStatusChangedListener, - IMoGoDevaToolsListener, IMoGoAutopilotStatusListener { - companion object{ + IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarConfigListener, + IMoGoCloudListener { + companion object { private const val TAG = "SummaryStatusView" } @@ -50,6 +58,13 @@ class StatusSummaryView@JvmOverloads constructor( it.add(StatusSummaryEntity(2)) it.add(StatusSummaryEntity(3)) it.add(StatusSummaryEntity(4, "域控未连接", true)) + it.add( + StatusSummaryEntity( + 5, + CallerAutopilotCarConfigListenerManager.getCertFileResult(), + CallerCloudCertManager.getRootCrtF().isNullOrEmpty() + ) + ) } } @@ -67,6 +82,8 @@ class StatusSummaryView@JvmOverloads constructor( MogoStatusManager.getInstance() .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerCloudListenerManager.addListener(TAG, this) } private fun initView() { @@ -81,9 +98,10 @@ class StatusSummaryView@JvmOverloads constructor( it.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) it.addItemDecoration( CommonDividerItemDecoration.Builder() - .spanCountTBCare(false) - .horizontalInnerSpace(10.PX) - .build()) + .spanCountTBCare(false) + .horizontalInnerSpace(10.PX) + .build() + ) StatusSummaryAdapter(context, data).apply { adapter = this it.adapter = this @@ -108,6 +126,8 @@ class StatusSummaryView@JvmOverloads constructor( MogoStatusManager.getInstance() .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + CallerCloudListenerManager.removeListener(TAG) } /** @@ -168,30 +188,39 @@ class StatusSummaryView@JvmOverloads constructor( AdasConstants.IpcConnectionStatus.DISCONNECTED -> { pair = Pair("域控未连接", true) } + AdasConstants.IpcConnectionStatus.CONNECTED -> { pair = Pair("域控已连接", false) } + AdasConstants.IpcConnectionStatus.CONNECTING -> { pair = Pair("域控连接中", true) } + AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER, AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK -> { pair = Pair("域控重连中", true) } + AdasConstants.IpcConnectionStatus.CONNECT_EXCEPTION -> { pair = Pair("域控连接异常", true) } + AdasConstants.IpcConnectionStatus.ILLEGAL_ADDRESS -> { pair = Pair("非法域控地址", true) } + AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS -> { pair = Pair("正在搜索域控地址", true) } + AdasConstants.IpcConnectionStatus.NOT_FOUND_ADDRESS -> { pair = Pair("找不到可用的域控地址", true) } + AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT -> { pair = Pair("域控心跳超时", true) } + AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED -> { pair = Pair("域控主动断开连接", true) } @@ -203,4 +232,41 @@ class StatusSummaryView@JvmOverloads constructor( adapter?.notifyItemChanged(4) } } + + override fun authCrtFile(device: String, root: String) { + super.authCrtFile(device, root) + UiThreadHandler.post { + if (data.size < 6) return@post + data[5].desc = "本机证书已下载" + data[5].isException = false + adapter?.notifyItemChanged(5) + } + } + + override fun authCrtError(errorMsg: String) { + super.authCrtError(errorMsg) + UiThreadHandler.post { + if (data.size < 6) return@post + data[5].desc = "本机证书下载异常:$errorMsg" + data[5].isException = true + adapter?.notifyItemChanged(5) + } + } + + override fun onCertificationResult(msg: String) { + super.onCertificationResult(msg) + if (!SharedPrefsMgr.getInstance().getBoolean( + "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) + ) { + return + } + UiThreadHandler.post { + if (data.size < 6) return@post + data[5].desc = msg + data[5].isException = !msg.contains("成功校验") + adapter?.notifyItemChanged(5) + } + } } \ 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/StatusBarView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt index 3f261ace4a..74c84568f3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt @@ -119,7 +119,6 @@ class StatusBarView @JvmOverloads constructor( private fun setTextColor(color: Int) { viewTextClock.setTextColor(color) - viewStatusBarTag.setTextColor(color) } override fun onDetachedFromWindow() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt index 369e99fc18..a283bcd0fd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/WifiStateView.kt @@ -8,19 +8,27 @@ import android.net.wifi.WifiManager import android.os.Handler import android.os.Message import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatImageView +import android.util.Log +import android.util.TypedValue +import android.view.LayoutInflater +import android.widget.ImageView +import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import kotlinx.android.synthetic.main.view_wifi_state.view.viewStatusBarTag +import kotlinx.android.synthetic.main.view_wifi_state.view.viewWifiStateBg +import me.jessyan.autosize.utils.AutoSizeUtils import java.lang.ref.WeakReference +import kotlin.properties.Delegates class WifiStateView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : AppCompatImageView(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener { + context: Context, attrs: AttributeSet? = null,defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs), IMoGoSkinModeChangeListener { companion object { const val TAG = "WifiStateView" @@ -37,20 +45,46 @@ class WifiStateView @JvmOverloads constructor( override fun handleMessage(msg: Message) { super.handleMessage(msg) val view = stateViewWeakReference?.get() - view?.updateView(msg.what) { - view.setImageResource(it) + view?.updateLevel(msg.what) + } + } + } + private var wifiManager: WifiManager? = null + private var wifiHandler: WifiHandler? = null + + private var level: Int by Delegates.observable(0) { _, o, n -> + if (o != n) { + UiThreadHandler.post { + updateView(n){ + viewWifiStateBg.setImageResource(it) } } } } - private var wifiManager: WifiManager? = null - private var wifiHandler: WifiHandler? = null + private var wifiName: String by Delegates.observable("") { _, o, n -> + if (o != n) { + UiThreadHandler.post { + if(n.contains("unknow")){ + viewStatusBarTag.text = "" + }else{ + viewStatusBarTag.text = n + } + } + } + } - @Volatile - private var level: Int = 0 + private val txtSize: Float init { + LayoutInflater.from(context).inflate(R.layout.view_wifi_state, this, true) + val a = context.obtainStyledAttributes(attrs, R.styleable.WifiStateView, defStyleAttr, 0) + txtSize = a.getDimension( + R.styleable.WifiStateView_wifi_size, + resources.getDimension(R.dimen.dp_35) + ) + a.recycle() + viewStatusBarTag.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(context,txtSize).toFloat()) wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager? wifiHandler = WifiHandler(this) @@ -67,6 +101,8 @@ class WifiStateView @JvmOverloads constructor( return } val wifiInfo = wifiManager!!.connectionInfo + wifiName = wifiInfo.ssid.replace("\"","") + Log.i("emArrow", "wifiName: $wifiName") level = WifiManager.calculateSignalLevel(wifiInfo.rssi, 5) wifiHandler?.sendEmptyMessage(level) } @@ -95,9 +131,25 @@ class WifiStateView @JvmOverloads constructor( override fun onSkinModeChange(skinMode: Int) { wifiHandler?.sendEmptyMessage(level) + UiThreadHandler.post { + when (skinMode) { + 0 -> setStatusBarDarkOrLight(false) + 1 -> setStatusBarDarkOrLight(true) + } + } } - fun updateView(wifiState: Int, resId: ((Int) -> Unit)) { + private fun setStatusBarDarkOrLight(light: Boolean) = if (light) { + viewStatusBarTag.setTextColor(resources.getColor(R.color.color_2C2E30)) + } else { + viewStatusBarTag.setTextColor(resources.getColor(R.color.color_FFFFFF)) + } + + fun updateLevel(wifiState: Int){ + level = wifiState + } + + private fun updateView(wifiState: Int, resId: ((Int) -> Unit)) { when (FunctionBuildConfig.skinMode) { 0 -> { when (wifiState) { @@ -109,6 +161,7 @@ class WifiStateView @JvmOverloads constructor( 4 -> resId.invoke(R.drawable.wifi_light_state_five) } } + 1 -> { when (wifiState) { -1 -> resId.invoke(R.drawable.wifi_dark_state_one) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/ssl_check.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/ssl_check.png new file mode 100644 index 0000000000..1fe5c0f1a8 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/ssl_check.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml index c4847f676a..897357307c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml @@ -18,20 +18,9 @@ android:textSize="@dimen/dp_45" android:textStyle="bold" /> - - diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_wifi_state.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_wifi_state.xml new file mode 100644 index 0000000000..f7fe62dd7c --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_wifi_state.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml index b3f04dc3f8..751928af40 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml @@ -89,6 +89,10 @@ + + + +