From d1e7a801195b6584b55628906f68a8cc960fd2bd Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 29 Nov 2022 20:02:39 +0800 Subject: [PATCH 01/16] [2.13.0] fix bug of traffic type enmu and update func of vip --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 3 +- .../network/FuncConfigNetWorkModel.kt | 1 - .../receiver/V2XWarningBroadcastReceiver.kt | 1 + .../core/function/v2x/vip/VipCarManager.kt | 41 +++++++++++++------ .../eagle/core/data/enums/TrafficTypeEnum.kt | 2 +- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index 24e3e35b0f..a06f425ef2 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -318,7 +318,8 @@ class MoGoAdasListenerImpl : OnAdasListener { header: MessagePad.Header, carConfigResp: MessagePad.CarConfigResp? ) { - if (/*HdMapBuildConfig.isMapLoaded &&*/ carConfigResp != null) { + if (carConfigResp != null) { + //todo emArrow startUp时确认数据完整性 AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt index 694f4a0b4b..10540e4e12 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt @@ -34,7 +34,6 @@ class FuncConfigNetWorkModel { if (error == null) { error = onError } - //todo test map["sn"] = MoGoAiCloudClientConfig.getInstance().sn map["mac"] = DeviceUtils.getMacAddress() map["channelVersion"] = FuncConfigConst.getChannelCode() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt index 7eb5d55f3d..244d170bfa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt @@ -83,6 +83,7 @@ class V2XWarningBroadcastReceiver : BroadcastReceiver() { V2XMsg(v2xType.toString(), alertContent, ttsContent) ) ) + //预留调试入口 CallerHmiManager.warningV2X(v2xType.toString(), alertContent, ttsContent, tag, null, true, 5000L) } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt index 507a6d9dfd..58bdfe1aac 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt @@ -9,14 +9,20 @@ import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VIP import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N +import com.mogo.eagle.core.data.enums.EventTypeEnum +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.V2XMsg import com.mogo.eagle.core.data.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.trafficlight.currentRoadTrafficLight import com.mogo.eagle.core.data.trafficlight.isGreen +import com.mogo.eagle.core.data.trafficlight.isRed import com.mogo.eagle.core.data.v2x.VipMessage import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager import com.mogo.eagle.core.function.v2x.trafficlight.core.MogoTrafficLightManager @@ -25,11 +31,6 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.eagle.core.data.enums.EventTypeEnum -import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.V2XMsg -import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.zhjt.service_biz.BizConfig class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListener, @@ -205,6 +206,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe MogoTrafficLightManager.INSTANCE.turnLightToGreen( result!!.lightId, result!!.crossId, bearing, controlTime, { + // 请求变灯成功,直接提示 if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { CallerLogger.d("$M_V2X$TAG", "变灯请求成功") showWarning( @@ -213,7 +215,22 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType ) - } else { + return@turnLightToGreen + } + + // 请求变灯失败,根据灯态来提示。 此处灯态未获取到 + if (this.result == null || this.result?.currentRoadTrafficLight() == null) { + showWarning( + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + "稍后重试", + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType + ) + return@turnLightToGreen + } + + // 如果当前为红灯,则提示 + if (this.result!!.currentRoadTrafficLight()!!.isRed()) { val time = if (it.countDown / 60 >= 1) { "${it.countDown / 60}分${it.countDown % 60}秒后重试" } else { @@ -230,6 +247,11 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType ) + } else { + CallerLogger.d( + "$M_V2X$TAG", + "变灯请求失败,当前为非红灯不做展示 , light : ${result.toString()} , trafficLightControl : $it" + ) } }, { errorMsg -> @@ -246,12 +268,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe tag: String ) { CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg(v2xType, - alertContent.toString(), - ttsContent) - ) + MsgBoxBean(MsgBoxType.V2X, V2XMsg(v2xType, alertContent.toString(), ttsContent)) ) CallerHmiManager.warningV2X( v2xType, alertContent, ttsContent, tag, diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt index 7a22d0063a..685caa9ec0 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt @@ -38,7 +38,7 @@ enum class TrafficTypeEnum( R.raw.traffic_xiankuang ), TYPE_TRAFFIC_ID_PEOPLE( - 3, + 1, "人", R.raw.traffic_people, R.raw.xingren, From 2f9034a1ace9e070af6799a05891b8095571560a Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 30 Nov 2022 09:04:42 +0800 Subject: [PATCH 02/16] =?UTF-8?q?[2.13.0]=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90=E5=8F=B8=E6=9C=BA=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/report/IPCReportManager.kt | 69 +++--- .../DevaToolsProvider.kt | 4 +- .../badcase/BadCaseManager.kt | 6 +- .../badcase/biz/PassiveBadCaseWindow.kt | 2 +- .../core/function/hmi/ui/MoGoHmiFragment.kt | 28 ++- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 74 ++++++ .../hmi/ui/msgbox/DriverMsgBoxListView.kt | 154 ++++++++++++ .../adapter/DriverMsgBoxBubbleAdapter.kt | 116 +++++++++ .../msgbox/adapter/DriverMsgBoxListAdapter.kt | 230 ++++++++++++++++++ .../main/res/drawable-xhdpi/icon_bad_case.png | Bin 0 -> 11897 bytes .../res/drawable-xhdpi/icon_msg_box_close.png | Bin 0 -> 24088 bytes .../res/drawable-xhdpi/icon_msg_box_open.png | Bin 0 -> 28765 bytes .../drawable-xhdpi/icon_msg_box_operation.png | Bin 0 -> 14948 bytes .../icon_report_error_normal.png | Bin 0 -> 15791 bytes .../drawable-xhdpi/icon_report_error_open.png | Bin 0 -> 3058 bytes .../icon_report_warning_normal.png | Bin 0 -> 15930 bytes .../icon_report_warning_open.png | Bin 0 -> 3097 bytes .../main/res/drawable/bg_msg_box_divider.xml | 5 + .../main/res/drawable/selector_msg_box.xml | 5 + .../src/main/res/layout/fragment_hmi.xml | 43 +++- .../src/main/res/layout/item_bad_case.xml | 76 ++++++ .../res/layout/item_msg_box_ipc_report.xml | 143 +++++++++++ .../main/res/layout/item_msg_box_notice.xml | 52 ++++ .../res/layout/item_msg_box_operation.xml | 121 +++++++++ .../res/layout/item_msg_bubble_operation.xml | 65 +++++ .../res/layout/item_msg_bubble_report.xml | 73 ++++++ .../layout/layout_driver_msg_box_bubble.xml | 15 ++ .../res/layout/layout_driver_msg_box_list.xml | 89 +++++++ .../src/main/res/layout/view_sop_setting.xml | 4 +- .../src/main/res/values/color.xml | 2 + .../api/devatools/IDevaToolsProvider.kt | 2 +- .../call/devatools/CallerDevaToolsManager.kt | 4 +- .../eagle/core/utilcode/util/TimeUtils.java | 4 + 33 files changed, 1336 insertions(+), 50 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bad_case.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_close.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_open.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_operation.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_error_normal.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_error_open.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_warning_normal.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_warning_open.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_divider.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_bad_case.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_notice.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_operation.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_bubble.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml diff --git a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/report/IPCReportManager.kt b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/report/IPCReportManager.kt index e691962e86..ec5ad32669 100644 --- a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/report/IPCReportManager.kt +++ b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/report/IPCReportManager.kt @@ -51,41 +51,52 @@ class IPCReportManager : IMoGoAutopilotStatusListener { */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { guardianInfo?.let{ - //Error 弹窗并有提示音 if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE) || it.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) - || it.resultList.contains(RESULT_REMOTEPILOT_DISABLE)){ - if(ipcErrorReportList.size>19){ - ipcErrorReportList.removeLast() - } + || it.resultList.contains(RESULT_REMOTEPILOT_DISABLE) + || it.resultList.contains(RESULT_AUTOPILOT_INFERIOR) + || it.resultList.contains(RESULT_SHOW_WARNING) + || it.resultList.contains(RESULT_REMOTEPILOT_INFERIOR)){ val reportEntity = ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()), it.src,it.level,it.msg,it.code,it.resultList,it.actionsList) CallerMsgBoxManager.saveMsgBox(MsgBoxBean(MsgBoxType.REPORT, reportEntity)) - ipcErrorReportList.add(0, reportEntity) - //当前不处于美化模式时,展示监控节点上报 - if(!FunctionBuildConfig.isDemoMode){ - if(FunctionBuildConfig.isReportWarning){ - CallerHmiManager.showIPCReportWindow(ipcErrorReportList,ipcWarningReportList,1) - } - } - } - //Warning 不弹窗也不会有提示音 - else if(it.resultList.contains(RESULT_AUTOPILOT_INFERIOR) - || it.resultList.contains(RESULT_SHOW_WARNING) - || it.resultList.contains(RESULT_REMOTEPILOT_INFERIOR)){ - if(ipcWarningReportList.size>19){ - ipcWarningReportList.removeLast() - } - ipcWarningReportList.add(0, - ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()), - it.src,it.level,it.msg,it.code,it.resultList,it.actionsList)) - //当前不处于美化模式时,展示监控节点上报 - if(!FunctionBuildConfig.isDemoMode){ - if(FunctionBuildConfig.isReportWarning){ - CallerHmiManager.showIPCReportWindow(ipcErrorReportList,ipcWarningReportList,2) - } - } } + +// //Error 弹窗并有提示音 +// if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE) +// || it.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) +// || it.resultList.contains(RESULT_REMOTEPILOT_DISABLE)){ +// if(ipcErrorReportList.size>19){ +// ipcErrorReportList.removeLast() +// } +// val reportEntity = ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()), +// it.src,it.level,it.msg,it.code,it.resultList,it.actionsList) +//// CallerMsgBoxManager.saveMsgBox(MsgBoxBean(MsgBoxType.REPORT, reportEntity)) +// ipcErrorReportList.add(0, reportEntity) +// //当前不处于美化模式时,展示监控节点上报 +// if(!FunctionBuildConfig.isDemoMode){ +// if(FunctionBuildConfig.isReportWarning){ +// CallerHmiManager.showIPCReportWindow(ipcErrorReportList,ipcWarningReportList,1) +// } +// } +// } +// //Warning 不弹窗也不会有提示音 +// else if(it.resultList.contains(RESULT_AUTOPILOT_INFERIOR) +// || it.resultList.contains(RESULT_SHOW_WARNING) +// || it.resultList.contains(RESULT_REMOTEPILOT_INFERIOR)){ +// if(ipcWarningReportList.size>19){ +// ipcWarningReportList.removeLast() +// } +// ipcWarningReportList.add(0, +// ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()), +// it.src,it.level,it.msg,it.code,it.resultList,it.actionsList)) +// //当前不处于美化模式时,展示监控节点上报 +// if(!FunctionBuildConfig.isDemoMode){ +// if(FunctionBuildConfig.isReportWarning){ +// CallerHmiManager.showIPCReportWindow(ipcErrorReportList,ipcWarningReportList,2) +// } +// } +// } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 119b51b41e..5ba5156aad 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -94,8 +94,8 @@ class DevaToolsProvider : IDevaToolsProvider { BadCaseManager.initAiCollect(view) } - override fun onReceiveBadCaseRecord(record: RecordPanelOuterClass.RecordPanel,activity: Activity) { - BadCaseManager.onReceiveBadCaseRecord(record,activity) + override fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { + BadCaseManager.onReceiveBadCaseRecord(recordKey, fileName, activity) } override fun showFeedbackWindow(ctx: Context) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 1b65d8c4ce..77f3c3672d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -168,13 +168,13 @@ internal object BadCaseManager : LifecycleEventObserver { } } - fun onReceiveBadCaseRecord(record: RecordPanelOuterClass.RecordPanel,activity: Activity) { + fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { CallerLogger.d("$M_DEVA$TAG", "收到录包结果回调${record}") CallerLogger.d("$M_DEVA$TAG", "开始创建被动录包弹窗,window num=${BadCaseConfig.windowNum}") - CallerLogger.d("$M_DEVA$TAG","key=${record.key};filename${record.filename}") + CallerLogger.d("$M_DEVA$TAG","key=${recordKey};filename${fileName}") ThreadUtils.runOnUiThread { val passiveBadCaseWindow = PassiveBadCaseWindow(activity) - passiveBadCaseWindow.setRecord(record.key.toString(),record.filename) + passiveBadCaseWindow.setRecord(recordKey.toString(),fileName) passiveBadCaseWindow.setClickListener(object: PassiveBadCaseWindow.ClickListener{ override fun closeWindow() { passiveBadCaseWindow.hideFloatWindow() diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index ff83556e2b..f97420f379 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -307,7 +307,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene SizeUtils.dp2px(10f), SizeUtils.dp2px(10f), SizeUtils.dp2px(10f)) - checkBox.textSize = AutoSizeUtils.dp2px(mActivity,34f).toFloat() + checkBox.textSize = AutoSizeUtils.dp2px(mActivity,18f).toFloat() checkBox.text = it.reason checkBox.isChecked = it.isChecked checkBox.setOnCheckedChangeListener(this@PassiveBadCaseWindow) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 5844a486fa..736f671801 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -296,6 +296,17 @@ class MoGoHmiFragment : MvpFragment(), } } } + + cbMsgBox.setOnCheckedChangeListener { _, isChecked -> + if(isChecked){ + viewDriverMsgBoxList.visibility = View.VISIBLE + viewDriverMsgBoxBubble.visibility = View.GONE + }else{ + viewDriverMsgBoxList.visibility = View.GONE + viewDriverMsgBoxBubble.visibility = View.VISIBLE + } + } + } @OptIn(ExperimentalCoroutinesApi::class) @@ -323,14 +334,6 @@ class MoGoHmiFragment : MvpFragment(), override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("$M_HMI$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}") - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.RECORD, RecordBagMsg( - recordPanel.key, recordPanel.stat, recordPanel.id, - recordPanel.type, recordPanel.filename, recordPanel.note - ) - ) - ) if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) { if (recordPanel.stat == 100 || recordPanel.stat == 101) { //成功结束录制 @@ -369,7 +372,14 @@ class MoGoHmiFragment : MvpFragment(), if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) { //只在司机屏生效,乘客屏不生效 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - activity?.let { CallerDevaToolsManager.onReceiveBadCaseRecord(recordPanel, it) } + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.RECORD, RecordBagMsg( + recordPanel.key, recordPanel.stat, recordPanel.id, + recordPanel.type, recordPanel.filename, recordPanel.note + ) + ) + ) } } if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && ( 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 new file mode 100644 index 0000000000..e0b3932da4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -0,0 +1,74 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter +import kotlinx.android.synthetic.main.layout_driver_msg_box_bubble.view.* + +/** + * @author XuXinChao + * @description 司机端消息盒子气泡视图 + * @since: 2022/11/25 + */ +class DriverMsgBoxBubbleView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener { + + init { + LayoutInflater.from(context).inflate(R.layout.layout_driver_msg_box_bubble, this, true) + initView() + } + + var driverMsgBoxBubbleAdapter: DriverMsgBoxBubbleAdapter ?=null + + private val TAG = "DriverMsgBoxBubbleView" + + private fun initView() { + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + linearLayoutManager.stackFromEnd = true + linearLayoutManager.reverseLayout = true + driverMsgBoxBubbleAdapter = DriverMsgBoxBubbleAdapter() + rvBubbleList.adapter = driverMsgBoxBubbleAdapter + rvBubbleList.layoutManager = linearLayoutManager + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + } + +// fun setData(){ +// val list :ArrayList = ArrayList() +// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// val two = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// val three = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// list.add(one) +// list.add(two) +// list.add(three) +// driverMsgBoxBubbleAdapter?.setData(list) +// } + +} \ 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/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt new file mode 100644 index 0000000000..fb593778d9 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt @@ -0,0 +1,154 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.enums.EventTypeEnum +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.RecordBagMsg +import com.mogo.eagle.core.data.notice.NoticeNormalData +import com.mogo.eagle.core.data.report.ReportEntity +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxListAdapter +import kotlinx.android.synthetic.main.layout_driver_msg_box_list.view.* + +/** + * @author XuXinChao + * @description 司机端消息盒子打开列表视图 + * @since: 2022/11/25 + */ +class DriverMsgBoxListView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr){ + + init { + LayoutInflater.from(context).inflate(R.layout.layout_driver_msg_box_list, this, true) + initView() + } + + private fun initView() { + val driverMsgBoxListAdapter= DriverMsgBoxListAdapter(context as Activity) + rvMsgBoxList.adapter = driverMsgBoxListAdapter + rvMsgBoxList.layoutManager = LinearLayoutManager(context) + + //通知 + tvMsgNotice.setOnClickListener { + tvMsgNotice.setTextColor(resources.getColor(R.color.msg_box_title_color)) + tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) + viewNoticeDivider.visibility = View.VISIBLE + viewIpcReportDivider.visibility = View.GONE + viewBadCaseDivider.visibility = View.GONE + //获取通知消息列表 + val noticeList: List? = CallerMsgBoxManager.getCachedNotifyData() + +// val nList: ArrayList = ArrayList() +// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知1",2)) +// val two = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知2",2)) +// val three = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知3",2)) +// val four = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知4",2)) +// val five = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知5",2)) +// val normalData = NoticeNormalData() +// normalData.content = "测试数据" +// val six = MsgBoxBean(MsgBoxType.NOTICE, normalData) +// +// nList.add(one) +// nList.add(two) +// nList.add(three) +// nList.add(four) +// nList.add(five) +// nList.add(six) +// driverMsgBoxListAdapter.setData(nList) + } + //车辆系统信息 + tvMsgIpcReport.setOnClickListener { + tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgIpcReport.setTextColor(resources.getColor(R.color.msg_box_title_color)) + tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF)) + viewNoticeDivider.visibility = View.GONE + viewIpcReportDivider.visibility = View.VISIBLE + viewBadCaseDivider.visibility = View.GONE + + //获取车辆系统信息列表 + val ipcReportList: List? = CallerMsgBoxManager.getCachedSysInfoData() + +// val ipcList: ArrayList = ArrayList() +// val resultList:ArrayList = ArrayList() +// resultList.add("RESULT_AUTOPILOT_DISABLE") +// val result:ArrayList = ArrayList() +// result.add("RESULT_AUTOPILOT_INFERIOR") +// val one = ReportEntity(System.currentTimeMillis().toString(),"","","自动驾驶失败1","code", +// resultList,resultList) +// val beanOne = MsgBoxBean(MsgBoxType.REPORT,one) +// beanOne.timestamp = System.currentTimeMillis() +// val two = ReportEntity(System.currentTimeMillis().toString(),"","","自动驾驶失败2","code", +// resultList,resultList) +// val beanTwo = MsgBoxBean(MsgBoxType.REPORT,two) +// beanTwo.timestamp = System.currentTimeMillis() +// val three = ReportEntity(System.currentTimeMillis().toString(),"","","自动驾驶失败3","code", +// resultList,resultList) +// val beanThree = MsgBoxBean(MsgBoxType.REPORT,three) +// beanThree.timestamp = System.currentTimeMillis() +// val four = ReportEntity(System.currentTimeMillis().toString(),"","","自动驾驶失败4","code", +// resultList,resultList) +// val beanFour = MsgBoxBean(MsgBoxType.REPORT,four) +// beanFour.timestamp = System.currentTimeMillis() +// val five = ReportEntity(System.currentTimeMillis().toString(),"","","自动驾驶失败5","code", +// result,result) +// val beanFive = MsgBoxBean(MsgBoxType.REPORT,five) +// beanFive.timestamp = System.currentTimeMillis() +// ipcList.add(beanOne) +// ipcList.add(beanTwo) +// ipcList.add(beanThree) +// ipcList.add(beanFour) +// ipcList.add(beanFive) +// driverMsgBoxListAdapter.setData(ipcList) + } + //录包 + tvMsgBadCase.setOnClickListener { + tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF)) + tvMsgBadCase.setTextColor(resources.getColor(R.color.msg_box_title_color)) + viewNoticeDivider.visibility = View.GONE + viewIpcReportDivider.visibility = View.GONE + viewBadCaseDivider.visibility = View.VISIBLE + + //获取录包信息列表 +// val badCaseList: List? = CallerMsgBoxManager.getCachedRecordBagData() +// badCaseList?.let { +// driverMsgBoxListAdapter.setData(it) +// } + +// val list : ArrayList = ArrayList() +// val one = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) +// one.timestamp = System.currentTimeMillis() +// val two = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) +// two.timestamp = System.currentTimeMillis() +// val three = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) +// three.timestamp = System.currentTimeMillis() +// val four = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) +// four.timestamp = System.currentTimeMillis() +// val five = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) +// five.timestamp = System.currentTimeMillis() +// +// list.add(one) +// list.add(two) +// list.add(three) +// list.add(four) +// list.add(five) +// driverMsgBoxListAdapter.setData(list) + } + + } + + +} \ 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/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 new file mode 100644 index 0000000000..9fb3bd89d2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -0,0 +1,116 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.report.ReportEntity +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat + +/** + * @author XuXinChao + * @description 司机端消息盒子气泡视图RecyclerView适配器 + * @since: 2022/11/25 + */ +class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter(){ + + private var data: ArrayList ?= null + + private val operation: Int = 1 + private val notice: Int = 2 + private val v2x: Int = 3 + private val obu: Int = 4 + private val report: Int = 5 + private val record: Int = 6 + private val traffic: Int = 7 + + var countDownTimer: CountDownTimer?=null + + fun setData(data: ArrayList){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if(viewType == operation){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_operation,parent,false) + return BubbleOperationHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_report,parent,false) + return BubbleReportHolder(view) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if(holder is BubbleOperationHolder){ + data?.let { + val operationMsg = it[position].bean as OperationMsg + holder.tvBubbleOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvBubbleOperationContent.text = operationMsg.content + } + }else if(holder is BubbleReportHolder){ + data?.let { + val reportEntity = it[position].bean as ReportEntity + holder.tvBubbleReportTime.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" + holder.tvBubbleReceiveTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + var resultStr = "类型:" + for (result in reportEntity.resultList){ + resultStr = "${resultStr}${CallerAutoPilotManager.getReportResultDesc(result)}" + } + holder.tvBubbleReportType.text = resultStr + } + } + + val msgBoxBean: MsgBoxBean = data!![position] + countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){ + override fun onTick(p0: Long) { + + } + + override fun onFinish() { + data?.remove(msgBoxBean) + notifyDataSetChanged() +// notifyItemRemoved(index) +// notifyItemRangeChanged(index,recordTypeEntity.size-index) + } + + } + countDownTimer?.start() + + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + if(data!![position].type == MsgBoxType.OPERATION){ + return operation + }else{ + return report + } + } + + //车辆系统信息 + class BubbleReportHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleReportTime: TextView = itemView.findViewById(R.id.tvBubbleReportTime) + var tvBubbleReportType: TextView = itemView.findViewById(R.id.tvBubbleReportType) + var tvBubbleReceiveTime: TextView = itemView.findViewById(R.id.tvBubbleReceiveTime) + } + + //运营平台 + class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBubbleOperationTime: TextView = itemView.findViewById(R.id.tvBubbleOperationTime) + var tvBubbleOperationContent: TextView = itemView.findViewById(R.id.tvBubbleOperationContent) + } + + + +} \ 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/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 new file mode 100644 index 0000000000..10068108a7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -0,0 +1,230 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.annotation.SuppressLint +import android.app.Activity +import android.util.Log +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.core.view.isVisible +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.RecordBagMsg +import com.mogo.eagle.core.data.notice.NoticeNormalData +import com.mogo.eagle.core.data.report.ReportEntity +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.hmi.R +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.RoundConstraintLayout + +/** + * @author XuXinChao + * @description 司机端消息盒子列表视图RecyclerView适配器 + * @since: 2022/11/25 + */ +class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Adapter(){ + + private var data: List ?= null + + private val operation: Int = 1 + private val notice: Int = 2 + private val v2x: Int = 3 + private val obu: Int = 4 + private val report: Int = 5 + private val record: Int = 6 + private val traffic: Int = 7 + + //Error + val RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE" + val RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED" + val RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE" + + fun setData(data: List){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if(viewType == record){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_bad_case,parent,false) + return BadCaseHolder(view) + }else if(viewType == report){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_ipc_report,parent,false) + return MsgBoxIpcReportHolder(view) + }else if(viewType == operation){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_operation,parent,false) + return MsgBoxOperation(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_notice,parent,false) + return MsgBoxNotice(view) + } + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if(holder is BadCaseHolder){ + data?.let { + holder.tvBagReceiveTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvBagRecordTime.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" + val recordBagMsg = (it[position].bean as RecordBagMsg) + holder.tvRecordCheck.setOnClickListener { + //打开被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(recordBagMsg.key,recordBagMsg.fileName,activity) + } + } + }else if(holder is MsgBoxIpcReportHolder){ + data?.let { it -> + holder.tvReportTimeNormal.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" + holder.tvReportTimeOpen.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" + val reportEntity = (it[position].bean as ReportEntity) + if(reportEntity.resultList.contains(RESULT_AUTOPILOT_DISABLE) + || reportEntity.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) + || reportEntity.resultList.contains(RESULT_REMOTEPILOT_DISABLE)){ + //Error + holder.ivReportImageNormal.setImageDrawable(getDrawable(R.drawable.icon_report_error_normal)) + holder.ivReportImageOpen.setImageDrawable(getDrawable(R.drawable.icon_report_error_open)) + holder.tvReportLevelNormal.text = "Error" + holder.tvReportLevelOpen.text = "Error" + }else{ + //Warning + holder.ivReportImageNormal.setImageDrawable(getDrawable(R.drawable.icon_report_warning_normal)) + holder.ivReportImageOpen.setImageDrawable(getDrawable(R.drawable.icon_report_warning_open)) + holder.tvReportLevelNormal.text = "Warning" + holder.tvReportLevelOpen.text = "Warning" + } + holder.tvReportTimeNormal.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" + holder.tvReportTimeOpen.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" + var resultStr = "类型:" + for (result in reportEntity.resultList){ + resultStr = "${resultStr}${CallerAutoPilotManager.getReportResultDesc(result)}" + } + holder.tvReportTypeNormal.text = resultStr + holder.tvReportTypeOpen.text = resultStr + holder.tvReportReasonOpen.text = "原因:${reportEntity.msg}" + holder.tvStatusSelect.setOnClickListener { + if(holder.tvReportLevelNormal.isVisible){ + holder.ivReportImageNormal.visibility = View.GONE + holder.tvReportLevelNormal.visibility = View.GONE + holder.tvReportTimeNormal.visibility = View.GONE + holder.tvReportTypeNormal.visibility = View.GONE + + holder.ivReportImageOpen.visibility = View.VISIBLE + holder.tvReportLevelOpen.visibility = View.VISIBLE + holder.tvReportTimeOpen.visibility = View.VISIBLE + holder.tvReportTypeOpen.visibility = View.VISIBLE + holder.tvReportReasonOpen.visibility = View.VISIBLE + }else{ + holder.ivReportImageNormal.visibility = View.VISIBLE + holder.tvReportLevelNormal.visibility = View.VISIBLE + holder.tvReportTimeNormal.visibility = View.VISIBLE + holder.tvReportTypeNormal.visibility = View.VISIBLE + + holder.ivReportImageOpen.visibility = View.GONE + holder.tvReportLevelOpen.visibility = View.GONE + holder.tvReportTimeOpen.visibility = View.GONE + holder.tvReportTypeOpen.visibility = View.GONE + holder.tvReportReasonOpen.visibility = View.GONE + } + } + } + }else if(holder is MsgBoxOperation){ + data?.let { + val operationMsg = it[position].bean as OperationMsg + holder.tvOperationContentNormal.text = operationMsg.content + holder.tvOperationContentOpen.text = operationMsg.content + holder.tvOperationTime.text = TimeUtils.millis2String(operationMsg.timestamp,getHourMinFormat()) + holder.tvOperationStatusSelect.setOnClickListener { + if(holder.ivOperationImageNormal.isVisible){ + holder.ivOperationImageNormal.visibility = View.GONE + holder.tvOperationTitleNormal.visibility = View.GONE + holder.tvOperationContentNormal.visibility = View.GONE + + holder.ivOperationImageOpen.visibility = View.VISIBLE + holder.tvOperationTitleOpen.visibility = View.VISIBLE + holder.tvOperationContentOpen.visibility = View.VISIBLE + }else{ + holder.ivOperationImageNormal.visibility = View.VISIBLE + holder.tvOperationTitleNormal.visibility = View.VISIBLE + holder.tvOperationContentNormal.visibility = View.VISIBLE + + holder.ivOperationImageOpen.visibility = View.GONE + holder.tvOperationTitleOpen.visibility = View.GONE + holder.tvOperationContentOpen.visibility = View.GONE + } + } + } + }else if(holder is MsgBoxNotice){ + data?.let { + val noticeNormalData = it[position].bean as NoticeNormalData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvNoticeContent.text = noticeNormalData.content + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + + override fun getItemViewType(position: Int): Int { + return when(data!![position].type){ + MsgBoxType.OPERATION -> operation + MsgBoxType.NOTICE -> notice + MsgBoxType.V2X -> v2x + MsgBoxType.OBU -> obu + MsgBoxType.REPORT -> report + MsgBoxType.RECORD -> record + MsgBoxType.TRAFFIC -> traffic + } + } + + //录包实体 + class BadCaseHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBagRecordTime: TextView= itemView.findViewById(R.id.tvBagRecordTime) + var tvBagReceiveTime: TextView = itemView.findViewById(R.id.tvBagReceiveTime) + var tvRecordCheck: TextView = itemView.findViewById(R.id.tvRecordCheck) + } + + //车辆系统信息 + class MsgBoxIpcReportHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivReportImageNormal: ImageView = itemView.findViewById(R.id.ivReportImageNormal) + var tvReportLevelNormal: TextView = itemView.findViewById(R.id.tvReportLevelNormal) + var tvReportTimeNormal: TextView = itemView.findViewById(R.id.tvReportTimeNormal) + var tvReportTypeNormal: TextView = itemView.findViewById(R.id.tvReportTypeNormal) + var tvStatusSelect: TextView = itemView.findViewById(R.id.tvStatusSelect) + var ivReportImageOpen: ImageView = itemView.findViewById(R.id.ivReportImageOpen) + var tvReportLevelOpen: TextView = itemView.findViewById(R.id.tvReportLevelOpen) + var tvReportTimeOpen: TextView = itemView.findViewById(R.id.tvReportTimeOpen) + var tvReportTypeOpen: TextView = itemView.findViewById(R.id.tvReportTypeOpen) + var tvReportReasonOpen: TextView = itemView.findViewById(R.id.tvReportReasonOpen) + } + + //运营平台 + class MsgBoxOperation(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivOperationImageNormal: ImageView = itemView.findViewById(R.id.ivOperationImageNormal) + var tvOperationTitleNormal: TextView = itemView.findViewById(R.id.tvOperationTitleNormal) + var tvOperationContentNormal: TextView = itemView.findViewById(R.id.tvOperationContentNormal) + var tvOperationStatusSelect: TextView = itemView.findViewById(R.id.tvOperationStatusSelect) + var tvOperationTime: TextView = itemView.findViewById(R.id.tvOperationTime) + var ivOperationImageOpen: ImageView = itemView.findViewById(R.id.ivOperationImageOpen) + var tvOperationTitleOpen: TextView = itemView.findViewById(R.id.tvOperationTitleOpen) + var tvOperationContentOpen: TextView = itemView.findViewById(R.id.tvOperationContentOpen) + } + + //Notice + class MsgBoxNotice(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNoticeImage: ImageView = itemView.findViewById(R.id.ivNoticeImage) + var tvNoticeTime: TextView = itemView.findViewById(R.id.tvNoticeTime) + var tvNoticeContent: TextView = itemView.findViewById(R.id.tvNoticeContent) + } + + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bad_case.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_bad_case.png new file mode 100644 index 0000000000000000000000000000000000000000..ac98617e0f179fe1249feadf4860a83d13886f76 GIT binary patch literal 11897 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_close.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_close.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ad6d51debe347f6eed1a6b4ba179dd9f05c133 GIT binary patch literal 24088 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 Y0AXs(pX{o)Q~&?~07*qoM6N<$f_1}7DF6Tf literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_operation.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_box_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..1da53e85da03c871c84afd2425334055284e99a3 GIT binary patch literal 14948 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

QaubFMBARFi-5j=Yy$^U31<`gkw`OP$!l z5BV(00*g)W4qfWM9Nzlc;MH4yb#mU^A5E{&QB#0AtaiKi!&ibfE9f`s8n-?#X z(?4=q`RrHp=@4O#))n<5?{!GI|MA0@`GDgOm%N4ePyey2T+W3TPROZ?8A^Zil+v+Q=EkR;<;Uuugrmn_S@J#Kh%z2BCJ@bsX?o3f#P~JYd z5XRU3O64OtLr2tWEx-XjpreFgP0Ejo_}wl52^EQKHEU3v(&HA z2hcCSLWix-{Q$G+Gtlq9pj@DDDA>&aHGj)PWYZcZCmzJAEG{%mkVWo>W4BOFP*c{{ zYb0zj!Q~nMc4gVJRfgolRSPf8d{j=#ng4o0+2+^4AT+Aq;}4U~I3JSMAP4Vgp4FTp zmkB!89zAny##Gw#m@v;~dwl~3IYU{%5g4SYEV9xBH{?_icGY}V-hwrP`n*CviP_|x# zSa|11fHtH+sN}dN*r+!U81ZS9=Kp@KzGqBwG}fQIT%_CddF-$0222}u4aaD0?Shgd zFsb?A*Jh&0&#|hUWuwZ#7JY<`ud-mF*s5F~4Au=k=su^r+ zfE=(=I~nef_4`N_>!2kUHl1#qizvDI_?Xl0fY>3<+VD}GqsET(&=MHTyzYuX#gA2Jg<-*+ZN(uEMsIx0Hu%CPPI%Yh(=mef!R@pQF1G38v`?hR_j2Fiaq&6DPRm7C z&bwLU-wG@KuD8^mCaBHz2kg>l(K)U14oB-%1Lhr*3$-xtI*%@{|+zEgRPJ20vc3QCN8Wf9(AaE=TBejGy!q`gMP=w-XBK zSQ5<)=Gjot00attHu-QK8>WMQ=^t~C{mQz1YChzVBU%YP=H7?sb?=ZHo>G8sUL;4v z86IFXEEw24R*~yeW%6b>ZmRPe6v!E-aW%p#y$=mm!((f(nD+y8Ab~#JNodmB zVv`YED01)~IAK(}Q@^nAA$=StzG)QAK1v@0{EJ^YwA?{Ic@*#leaH8dA3L}_{Q>K3 z&$`oKK5_YhFX(w&0)Oy=;A}1qe2v+tm_8@u8oXiffA#$CJP_34@_hP&M;%&@KZ=)7 zLoxQ>cU3w0#6!wMb)UK)gx#Taef-P%%0u;QJ$#*Gllp~c-pi2px_%ycFCzwcrTjkl z3}hZUWlrW!E$1qUo0CWsI7wm{CW!$w=)42eVl=s#K|d5q26}Pk-?h?VJJDbGDC#h$ z+c!PofVT6rqZz1TU!*JMEqZ&7A6nt*&x@)$Y#AT=>hAKwzr94aZ}*a8CTq$I9=5+tvjZ`4DACJw(*+1$h2d%6gBpbw`@yq!l{fwi zUuIJ-b9(va&s*y>&IvPnI~Wa8>1!Ikxs$%Pajn51w}TEpDOVn`rX2D8H&3*;52GEy zdLw-*&|Bg-HNcByc*E&vjvHh{metlm6m=ttE2LAcuSOF^f8+eyJIWcK9X`nBm_Udl zd+0$MCgmpktGR+uSY+u-_?E8&^RS@EJ{KnPwJL%7qFa$59Hec<;sK zGx`R8YVU=~iD_-B{R$eJ#Gr<2bts*D_kGIgzjRP}()~7+o9XqnJH$I0G@B;tXN0_E z9_OrXCa+0(+ea@cU%9Y;1(iVEni_9R&7$f##lQNWE-zcQDISMfy)df*24mT>zi|Y{ z1(b9e1u7X^KO$?_MN(RZPi@NW^xhtR?4zuD$@KrI2KR0Y0ay*~WSHV?7#+>&!@5q+ zoa;|tMe8(O^viTUE%M~aeMoKl=*jbUAAM+f(D8f@a7frasD9Ge$i_DP9NX{f%V}Tw z{f)Jo`sb@X}DDR!OCJ{QP`5^OIbpvGcJFxxn9J)4t^qciFET$628t_)Y@ZjnoC+0Kt?B=e&=9t+IQuWM7_*2W7li$R&ANJ7; zj{fuMhVNcjz99#P4W6r(D2}v90Xv9j&o?{C8xPj+sMI3*&4zlhMWgE})OVv){o{^U zTW){Tb>$en$-u?TrFzZ$RefajbLVa;JN0_?n8WuePk+c^<*vu*NRe;%vC`y}=0cM? zjb+kfxNthI>*w^$ftv zI5n|;vw|kKxu30RJQZRa!VKKKxnsUo+Z=L)n@_t~mWX%1+ z^tV)m7bg$~oihh*6+@{c+NgZ&qw`fC4%w)3_q;gC^CPl$^i(?>I1%D>yi9o_yU%S8 zERVkDe&vM2h96nU^HYvcA)FuPxU!tSDZ#kAL>ER+dn-SChz&+qYpc!X!@L8~-fZS| z)uWP|A3i#3gZbW+k7Qrs^vxa0?d4Qgtxoc~EHAqOHKf*Tx>N-H3mv_u42jJ?20J4? z_)n($UwT>jrV`Olg$<5vfKvoo@628$Sqi(XJ-8%9g;QlWnc{IIi_&O{>PCwy0iL^! zr7HGO@kz+CQf{uJ>!EkqSnhp`HTpuBQMPZ5uJGh3@9rf&U;pu)KF!)C4}e%?&NzVF zbn?-tzJ}AUB)lARlXc|M+%&vV3S=Z`$Mpe?A8lwto4%8w^XP32GHzZ+@2$7LZSu8h zHA5Do&WM%b3#TuVzuy^(T9sV@OAYo0$(lwosZI6ixiwdEY+USWk3Uzp z-q5K05K~I)OS$P``ss(8tk)@Zjb75sm5q97vr$dgSBdq`kDfR6JpNt1-~63R7yNS$ z-{8#xReWgQP`Tk!h1_sjb8PX+Lw4>G_QMg}ZejX)w;t6r)^;+h`K6hmctgjW;S9uw zt|SAaXN$KioH;q!z-1orvFzCR;^`q*%$IL!ZQK}a!INZ@)uilXIX<#b)oNIc2*snh zZloy9)zRW_2)MB50cta;)N}DoH}LIfZ}!9*58X@VMRkrkpHA!jWjCspgq-x>`Iz^l z#+1A@S5b3?oFmpcHMkwM)hF(7qp_#@H64bs&pfolLQHw{UY2@BZi0IXbyae$GkNg-QqSRi9YtB$gpF_ShNq{a6@E0)}u5H zsLl07QGeGjCk+YlvWV=cSE6Xf4MpI4f-k3#xZ)L>L*PNd;f5zmrgjk8<^D4*O z=ILK6smD3_np6WZj|_@O3g3@jA3l2K*sI>YYHfHaVjF6|bwU$8MBPx)?ntH=ZMW}C za|HW>ie{&&pJM=EuW#CH#RuJLx$2=e$)2T`iVu~gfA_%%l2LTx^}{=PTa7dr3`zB7v$EL7A^)}=w!GV!x- z8;-N+(W0=)0x)Z1j7{Ow4CX$q;#f=I=wr^t9VOoytoMQaD>~w#{PrsPcGpSv!Q(S= zvJ*+WSZVRgIVVK}N-ywL1^^fr-?WtpRouh>Sm*HjMdPY>jhoLaJySr3&mD~D&GbAv07 zj3IfN5E{AF(&Hgv!pHp*ycG6>Upv?{-hLCKlz*DOqx=MK?K+3OcwiUa>v8mf<(cyQ z1p^3?FwnN5k=(}1$bt`z9W=5~MDUC;9i);|Ig+SHrJJZZN4K9}dx~AP_u+vZ^Xgxe zcpO1)24c-YB@df+GIV`z#^a;2u}S8gy+lL#VCo1SpH5BpX3F|<^3`cBuAEn#?hReL zd3wUGUHX7tDf(ob94G1?Hq`Fx8KxbF)o0vgM+%ig-NP*p(hZG&iOt^9t91n9bm!*D*?Ow` z6%~PhLoHZUKQiz2UbT!QGmA}U7q#7ht9ny})u1nw@zw4s@%V^ec#S?rkGIP%equr! zzXBdVv4bXNFZVM+^<`U`F|dhUaCME(zb4Ja=hbd7p!pX~{#r>sy9P((g|w^A%tcAq zgT;<@hLR&nNczL3^p%m5~q(J89u^;YiD=->FA6O z8s2sQWy6S^dHCdzIaD{>UR~ZfIn|(R@DN|u0IJ~6pPs4(JvT`&p?IweGKD8%WXtJ$ z8KxnMtNuX zIqg9XZ{5{=xJE~CVl4c@^;m zts0Dj2dpbkl9%_ux1oedGzCQ7^Wz2g#c*N4_n7$VnthSrhA*+fc-fuNY*qJ;SHv>)^<>KRpoVIvsP*ojymWGp_pVJB4u&7Lx^yX|j;K$Mk%U zwcJ(eeB$G3;+y}P4|9B^FrG`~P$T(Rme{0WyzIyL=n^-2z4Uzb{2Aq$SNBE+{`NGo zjy>62ZQZJ8Pyf5#;Ca1(!xxG0z+y$Ra72tObViT7zTB{0AQz$*xM4cH^_piv4PRvq zkFV-msuq6vtVm$xayc8ndN+b1HNq>#yYo9m0 z!>--s9a`WfJE15Um8S?Tf#}B+3^F#1!^4Unxo8U75?w6Nko)$c8wSzfHexO#WA>*XPFuNUXN({;Z-y@h_|=+z4NP#1v6 zT3%laR~ngAR*Pu~cDB(k!Q&ET#f^Oj7kRU-xd_?t@bP07utuL(k01NAaSa%ZWS`LX zRK334>-Tf*=UP0p`dtejR|~r8e@q{#3$RzIc*h!83zq`*G77xMxs<`V*qVDm!2uTE z+q4Cb;`aF117Cud1MBfy_4r%~Z@GT0LLW2u&G~oeZ~FcKj#|>nxZa+F6JSi|UpaaA zQ3sXVs3BqL%bu!Eo$0`Y!H$1#{9E9x|wBoU6NW}+#-@bNQUb1r!A4(sr zuirr3`0>vQanQ<4X}n9{c*$JW)a6ZqvCGKhy}!pkNLUygUIYGb{O$1*v%QWr4q z(pQ7uym?dk-{WuA*Nkp(l6BtTiL8{s?KV%>p8dV@FxC6vD)LEc;LY4b2^cKE#qapG zDA~9{7&0m*%|f&senu`#{0a9xeIMvUdKK_~9j))u50158vjKBs9LfF0nA@^Bt$W7w z=G(WIlXUc)qz_J>s0*HB(xfaVP3>u#+icA&?f|hRXn4^Jbo%|MVth~y{b2tKa?2)n zBNV14H^S8RE~SG`nI538xo*8=pwGHqYe!OCwepQDe*pX1+Ku0P4UcbVKct$yemyfPydX-PyuRCodHoe8{US5@Zseeb1Gm83FPNJ8ciDzOr@0YOj*f-?pXB?ua^0c}7K z1q5sw(Y77v7R3%Uh~U5=0>Te*02u;811f|mL=qr#DybwDGSrx=dhho4|JGXjocpR0 z5|Tjh*SqSTz4uz*`qtWO?S1Zj_r77${sXj4Kibx8TWTjS&9}9arM6Z}I&nH}2e!#% z^<+9--KK5zw6*;t-&f;p8gEj+N%~EaZ5HOHrD?llGHDk|e!;?AyKv11+ExDnQqv~i zZi|@yd|P?_HSM8Gtvyn)pRUI`73UxoM)jIB6}EAqV{x8)j1FnE(NLh0MmoT0v{{!g zN%PUkw4JlC`p}Q9dCx{R#J5%ZwkYtmk7@sDve?S(`( zEQ(R$T$Tck{8i3t>T|EH(7Y^5g*?9ac!u+HSVcZXD#>0w(-Z? zy%pHcEKb{5O5>@Oe1aW{I6jqCJW2|P%cyB?y8)I3Ea0Hn%~z>_Y7DnJ-O}gYyf9gM z<6$3ZUmbb6M-2)09@D13*%mgQ+s>RWwV&7Nc$7}-+z?!4S&}SP*Hw*BWf9`^0W4Hj z#;0;DPaDCESdJgf;}#!0!zMHTCv|<}+<`~F@yNfsYHNACC-g-7EpOB3+-L9WFaGLN zmCG0DHh6442j+>3Q#wwl$9}%8><14CU|nI<-fTI9jAG#={AW zlQt9}^>nry6}HPlRg0{`#7RuP+yHnjxtTMTifM>SY$@z~4q%Xr>PEeqe^pzx`jtn0 zXw&uP`xael?cY@Qx)slD{LK8*r_;sXX-nYQxPMXJ-5nX6eQ~ql`JCZW{NO6 zp~Hp=jO{x~5sZp$UGfdI-T%NBF4-?_DtrCYc#EdLd+#IH{lVlN=kF-?Z)Q(8-_&;F z8SVahIrZ8>2%t2=!2CLklp{o2rPzC~gQE$Jg3r zw0nHSKDLkeDnKjgM_Vu(a6Tq~sjlces{Y&v`DW z)2|qY-0h*bE=gkcU_Y{@(#1b;hJ8P1-Y#{$%^B;JJIR5#Qb9WBPeP=gAyguHB`ampq?19Oc@BBEuR>)%wzspv-n`we)-Y>d#deI2HS~q{TA57RpX%2A zTorm->F$o6IPR9VB&$y7a?U_!0h5z1 z7C0*}Y!wHL{g$7!3z;~UZA9cVvIOw8An8+jf7qL8rg4|o1cIBG5@;w*O=VZ zt-sj0tB9{Zqn)WmyibocEQVH#j(J@B+KnJFk>s+mILl*Y2y`v`F+7g^AJCo`)4TS1 zmljwrrhaKUnY>l6l2=s0Y8OWWB3YIA(y>}Eel2WHDKPi(Bw1deYeey>eHV}pRT&QfV+{q#M@ z?caWK@{zV{@bZm~?(_-v$yIR)mITl{YR97`vjR0rMgpQm540AEJnX%~M9$iGGMI|W z{*urB^L8)3@F!h4n(<$9Jga!i{3FE)|A>*;g3k(+DNjF%X+GVBRG)!*bI4|B8M6fy z3;83G$zv|Nx&4{OV}rr;4vg*;!N$kTJ$pJ`I@|tOU^(_;ogXIwCyqPyjKguB3d;8HJjB6;~v`fP55tnt z+uo$;nFqo}_HgbMCwzA41!%s}7Jj|~>uY(nJki&=qqiNQiG(m3C5$OctIR9-8d~MW zc@%O%d&0VoP`zqlAP79y;xeMk6F-{g=`asAAZTSj6Jy3(<~<%;<((?bN3q13gZI|f zpK^#tAuhM+{^r^XPxwsxU*+nK_O-@4WXIRJGJKyB<5$Z)7_$tEbP}}-NUX={Wh@WT zV8g1T5Yjja@|5;zJ|izo*$lB1r+PqDDQGnYhp@+z?|s|9-w_+x0~)o#9xil+1(ajf zZO)7z6@D`xj?=O|+ZWHAzAZ@Y=T7*1do%Dm+F0csYFi$^&k(YoM-hNxZI%^S-iKrb>~)Y%ZK$> zIRx5+EzcxlRvyKXn1Py4kcLbRO}Uj`V2pyBA|3pPD545Hyc+pJH(9lF=Z?2;xZl0@ zE&c87?@)m^-qK#CMVwA(!`Fi4s+LSZ6>JtpQ{R$Gj6E1mpBmSCwMml3_UM_{hG0$$ zOxTAc$7yfQOrp@?i%#H(MU$?FK~mp7i#ueo6!}LNB4f*ccum$^&p3YUd;HkD)rJY{ zh$uKv4|vJaUJ;zUb$ZQf!~XVP%fr{T;3Ges+<%h8xma|VFowj7=c0)dn9pflZ$P>k zjmKOjFo&&+qmdEFfWO)#Wp5m4RMb)`eZXzx; zq6WgIEa=Ea($axt+#AE%B=wrW>ae$ZZvJT}etz-Ky3N-aL^NLqp+j+zo3s~v<}TAW0e6|UZGJjE_1N>;#b2jvR^P5$ zG~bCK^r*Pla@&giS^+yoG>Wyy#&qDCs841P~*YAPC?-Mjs=)@ z44uM~A=fytVegY`eEO3<%||?gf7`QuC1E!Hupi>XSH`bF$<6KnbRjOUlbDzz>PBfE ze)LxGD!siG?>!XlZS;0=8~S#gzK2TsPsv|whV+a7zPKS4K}P{Q(lL7kiBsFNsKh`K z!4xKXtiu1Z?9kAwVZ{40kxsB|-;J$*0)y{H_tXT7iDeNmJUSI0alsuji!hUIK^2b*_pzV{6 zZ?(J40_&#?enBBVs1j3Qz*eCLGfo|E7OMP(g_R{r1PLEn*^gzhu*g$vjKC*n+1q3! z(=cXAOD4YJFMI2q>>&bAbtxv2DuMubaf1e7nOmA`@5Qo^OW1UIm%yMlUamP1gblr8 z&~8``B}^7k#Xpd_~AnWPbynlYS~TD|0`2(-(L z6q7K44?Bwu4jqO}X*2eTF<$`!md@mhSD-U3{5yWB>hyL8iFG{7V=aH9SG5(7RkDq~ zd<<)?G!%XaX~0+pf&5lNdaf)V=`80{I$7&*oWz%py<4w9CUk-@*_EA-On*SdNS zgIdXqYWkeE_r{CcB?@fx<0K+xh2v;*>`oUJ?aE*e-f=F|D>ysB zPdDmu5X~STf>B<#&&^MdJK>A%njwZ^w8s;C{iW?`a&ZKtwTUPhMT!eG18xFf>tUNVZ#c;=CKWco4Fwx~Ieju8(WB`?0x&&bPmF@2^l zbrDDM5(hl>(9|_#&VakakR^>Ofku_anUw)H7=|3%$Y0^eADh8Ij~RtF5XE;0i>mgZNq6>A^R_B#C7SR?XkIZkLUQDzXi zsrTk7ASVKalAvC*grz)`UFHB1Zz%dSDIMo#Y3HuCQZKmJSYgzm z{4pQ$X@})Ulii9x5Ex1f+&!nGUno#E0JQ%7ZdtndnHv617!23l3an2qp5k2rE5sRC z$ik3ym)w%XL|m~DCsVjwX`Kwe|;V|&Si8_Wn-HX@(qc*{rszFm9v%i3gVm!Bf$NdT^+vx|u; zZ~vmAS;xgYfVoegeOhOEFc4zTbBKZ?<&e29*y@e&bEItGMupc=RB9JS3x75b^{|vFr#e z5Og8eAn@ivrf*&akKUNXl^>W07@awn+P)9_v39_tpKMo%(xvp_E^4I$YEGeM8X<|> zCzIGfbzgBvLWj}}Gv*EfJjFHFEu-H3y>DhTVHj*`&UUyvEksn>gksPn@o6D?%36USNJzk=A!AVml@# zFNz)?7UU#4JC-=s%Rq8sbuczcVAvOf@u}9X>vieiJq={kZ;=$r#ZuohOL2)|D00VG zR=PZH$>EsF4m$H9O?+*fetRDUY+ac6_FUm$jk)@0QQVkUp#o!&*T(v^0kY5#3><@v zn2alCFf?qnNe}+=&iO}&B(A-{{ykK-PJ)QZd!tBPy>6YSTXPE9n;k}=eStYB98;c) zE0>w;PO;m-!7F=p5(%gtJ@G*p3k9nOnCg3x#h$j_wCL;k*gey*H&@B_V9#b^)7b?k zm}Y1i+KqFDKebwaAE&%DaWGUUs_r{t-T4OlZX!0vZ|1s)VY;Z_CpNUvtLVuiGotDe zl~rdZc3fF9cnU`f2#3TKst5{n$x)C1S|y_DW8zTFT!&k&3?c5%rAjCBdMLeO&w2IW zNjo@XIF7lWQ!PjiS1HC_XYLV~{U@LBPOxN{F7e7mz1JTeqeeAeR*)!89E`|M7OW?b zV58v{vhWvU)?FK>b4jKj9C~CdG;Do>r~37P`XD)9frZ(uae#ZoHFc?D51!};$6dO12ugjA**$e188vTF9+#0?YSbx%v<%W zvksHdnnzxvw{@QC$Vue5I3s!C#hmi7eQ~=^aWofLKb-K$age37LnbJDi&8qNBU#vw zaSqM?V-X$fK_O?T6XFDtDQ?FAoO~?wutCVUB}Z{bFMLYBtSGj1g0oQI>XB861V)9n zp7*J??flP#Pwezxl}{T2&9O#g#8j9v&PQY_H@#6-?{O4HSVpwwxe@C>mJJ7{>F zqdBO8AOn*!QJfxj!y6sz?B8*e6}*_yMlxm@Y&@qVrXZ=qs#}j_$oo{}!5=d7)~W5q z5HSY5Sfk>&xT86^<#sH4Z0{r_r{ytT+PbA({f4vKCw}U2?dpH}AivwH&CR#A{(T>4 z|MH|W+tqJ=U7OyrJ@`9^d=o>igZHFaPk%6&X=Egei`<7H&@No+B5%baoLtacMv6<^ zc)>n7N=A`|yZ1#W9CQFSbDMsm9i|u$V$z9Y&0-`u?m`Ez9=Hy9B+vdJu!aB(vn%k? zWR-I4Ezfz!lrwr4R0;HRW!-`aK2NW)SzKd(kjldM1IqA!Pxjh8-Ok>BwCzipp7 z^NjZ8*S)??cJ1JIPPV-d*srbFZ{IerF@^ogpZ-}p_vfD2Zu-dk(>`O&;8~ONf+wj) zp`;)RQ-z3dh!r)Zi#BY4An`H??PNGXfL>N*+|6%rZ9s4zibE7-7h z9b6a0%y8o31aB|}mzP#n^HU1^ZwpGj=?56cZO=)gp zhh1fB6DYv1~Y_SM(_d0X1P&9`FW+xO^uw-cZ9D{b|IPmfIn7n>_N_df2v?c|rA-ERKG zhufvEdrjMZ%{5xjv|ab1545j+^qi)rYLI=c8s@|!E4_YyO&&4|Uu_tViYMi4ex2Rq zQrGPzAB{tfi~>*nD*D7>S17K&D-?jE4uXMjRt{#c8O8*U-=VOOMGN^bc4nNkA5ViP{TKKeb8ZfBy$Ryq$Lc2e*yyep|chZ}e-xZrP?V^xV%KK;H0JgPQxBI=mi~ z(Y$_wz=bB2KeRO_Z|Ez3UOIX`Y_F011)1WAyQ}dAPq+=W1&#G_2q!Iek6F>!8nQTr zj%VZ$8~t}cWBb~5Aq#uxGPIeI?UCTCBByW)mKRejp}(mBsGn}e7^Q4^@sWFTw6^`r z=e4i?!SA)}&;4u^R(|vw=Gsw@IiubCX}{Fw4>%;SiH|S8B8K2kKaNwmnBS`%`uLw| z2kF*)^_$<&Zv5Ce3I&W>LFI#e;o_#sI@VZCa@+YpA*}o}s`1b}JtheP)7q~zn$*Uy zHi~s1V+y?5!U{4Fx@Kf_4kG4#F%d=tX;tFWz8AXq;3pP!W2D_8L)Z%#r_;$MQ#Oi| z7#PNZuMHR&usEEy#T%|`m%sWI?ecg1t-{xb-1$6v$o;>o9rv6Uw3R37yGFb*%2)b< zpn|gR@*DDsY5u^2+fmPYep~ayk8T^@_$O`KMHjXut&c+ZPOJguo^x@lg4JBT*OqhP zZ7@>T(CZx4A>_;WuulRFUDpN8^|ytPCs<>O6ESh+6pc?fB*Yam^w9##bZj4mmN0ge zc|nra*(OY$MBDg8!3`lvjzYv7S<00~Vlks-I{TY%Y@ayeN7__h+wvt3CuyG}4{s+v z`&Zij5C5U`lYH{ywa7M3Z*pfWjI(UArPgr>Pu%+p_J>Yk8Mma*rklG!$r)0t$U&Z>p57Tfbd77 z&=i|?U=$nTY6Qe=xP72W8xIHluz-Qn3rae#4V!VxigRmrgm71qtJoO!Q!am*WXHkS z@#w|WEw?n@xZu?8wQ6NM{;B`Dt$D&z+GIhWh4=5P8S#5<8GwCeVD^Wf(%~cH>#-2- zwC(qxhqryd>p|_te|%@V;h*#~VY_zvoAJm!g?4RaJ>({QKr<_2riKEIyW#LzBwcJ1 zBMk{Wb7?SJny#2W-~oHhX})?4PIT;;un#9;sw*B%GjQV7GPL?v!C9C=qW3OD7|pPn zsP_p%NJ5=xjVUO%m^#I!?}Y}NZ*q)m>Xv-a{Z4I%J^2^?+-VNtPg`$V_=>9v$vnA+ zQ(bSQI8fPO$66CBUN+D{kNN4g;;7?&hw`2SE(nb*VHPcmR#W%nDtJMY%bA?Ha)UwS zIe6nbYy@h0<@R$|^Ir5m20Hl=RuC0Q7$Nt9lE26uh=PI;*$@MP3Y>hwn=<5jKuKfj ztCLE?5>Sh+0%-2jWI0*86`XkR$E~^Ij?4;Qg`@X#6Eu>ikLj+(w(Y|6+V-oiB&fFX zhIqf1-80k`jhaQs5*{j4;e%TO@JL#rT4l5;GQbjU>T_%;e$xBZmZxWkK{9-$TL z$&hb{DQ7O7-=V78B(bHu3KSfXLmWC0E?(Go9}Wh4J>U`drcZyeed!giXxp#dDA~|f z-D^!d`B#3q?RT1fRN65TTiQ8JrolmP4es<5ftq^OUMf~F6@q2hXLF{A-IOVJXNy2- zp8Le}A^)19P+OeeZ=3#vg8oROT8L`*Kpufw=Uo*t=3arbH{M4^D$kM;4E7ERf3f3w z5aZwygSCs~f@K2HF{cRTgEQv@VQlD(v2Seo5-Znaj>MRQ7gfTTXXvkZ?JL{oUi|Cr zmg_e9lYPe1{f}aXdr?0}gUCk4KDUd`& z#F0PNnK82x7c6Am&NWG#F!it7$$oBW(n<7 z9oX)?=9zUBdnSUwK#xqm1Bh3;6wW$iGsTUfX}N>KX9nGFE489kG~ zv9%3!8D!W-{gCM~ne062tL>Hr4L64(jZDho!>Oc#=gDS5@`bTY1&7Q!T}oGxTT#0< z%<*rNGy^Jxgvtgz#jD!%o%1&o&Sgy*`NPhf#Vbi1uC9eO;u-hxw~@JfG9$7kG~aY>t&b5bFGTE|B1)8y^lRH4DqQ4cY~EDoYeL^>PXju=jClz zUOr%)gY-dSGS_um9v3H;$3hci0aPKwymUQ>l2CLXB>RdnviJueIc=`|>z`!)+ljnY zd5I%WV`EH;E5J;+7D@Fb2hd5G3{5-HU&5w+@R`vV#GTC(1o3=opXIl7z0f2S3h>Jw zRTya_VZefS25WPrV%M(tR7v2uy;sg`lt?nRdQW%N-rfkl?Jw#V8Hv-0q>_G#Owl4F zsA;%$5b7EGV3v%W8Nh*w{4otRku$A$Jo>Zd1Ffl<>OlYw zqGC5LC665 z=z-7d`w}D@rOA`ZLlh#+!jNkfKIDN7QpTmXt4#yS((tUJGsY zsoyCs8Tj<^Pb3j#GmnvfHhACt2+sI%~P9iT*70cwtkP%9(#$#;iR+VFQ&LOzq#&I-8SkvkafJJ=(A4#PUXoMOS z#IKAEo|XHQ;XCp5g3C`0@Iy7?A^0jDHVX$G(vEx5Pq$0o@)pN?^Z8$F|Nh)(wACk{ z>@{t^@Pf8$E3t)(Li(FeR^Qo<#o0S5e9P6vhR#R_@gLyph*utM|XwQJUdPN%XL7a1Ev{hG&~ z*$(^;y&V}-6?AL++PR-;H-7fBE^bEO4qA6gJM@RoFlF%S%Kcq-e#obLb=7c#4AroXin!SR?*s!&LJ2B(spnn zchrm{j6#~P?3H_n$%|Xs@R{xUSN?`Rg^3q1Ci87ofSJNXF|FrAhAepa0xQ<^MHH43 zTWt&%RUEzr(`!TOosE-T`aA9DCp@z-9$QbJ!n`dF?8 zF)oqq(dj`*Hp$qGmBjfZKI9nq_8Z!YgPHZh>qm?NCmBT_?7@KaR=95Mmz&>j<--QD z{ZV~d{oS^-J;$C#q3u<}h_cJg=8%mvu^|xXVPFJ6@oI-!ZXZF(i>o@tH-7kijW1gc zdDNrZio*^!Z!EkLkcKV}Y6?V;ydHYG+#Fxmq6)vlfgw5EyYu8?(+jWX;lm#Pq;}Bv zp5AW$%)jZwhO4}Wm4_eE_W!O2wuM9eSNd=k&Ey)=)5fU?Nu;30&P~K)QO_TyPF9=? zVj@iPjkuOr`FGE9sZrPkuy}kA`&hb-pKQ>Y&ym6NBjzx3Vx2fa#S@9vP!2)|MU)>m zC9`$mYxSz2kpzyJTKLjH0%G>NJnFZ7<$`wE1sC|I=6Nr-A3SQ5%?YT9`ub2G9v*&0 zuAUap$(1Dta5<(Zh@x>kI}un3!lxrK8EX^z%EV)9A768@eF$O}Rz0k4pElNUph7I_6( zYZ>HWK)z^|>&h>`=c0bs#dr*^=biQF&4@YP2d)5fjTD!bX=*$5_9GAuEcS;!=)vu% zpMQGZ`n3t`BpXCf305B`Tk~ESQ^!SOJ3+@FbG}2j^ef)-rgrmrpZ8{C!+C?McTCws z;+){GjFXFkF3%U3F2@El+YRb(zDs%M1vRqOr<~f3e%1@x3jH)eBwhq? z&z#JV@k)8?dFQq(-tgMC`I1X*f8D?SYrF1K=eDCCdq%t0>SR_2}*5oi+-l*-S2Eyz4rt9{^&*DQBYA}8g$&9c}>@1`#Ytsoqf!4+xBlH5cdo6USI z)Vvba=><}C(l=Ci?30%-lJ`1PpYWXhmNr?XKRRL{l^+>Fn8!R~O1)lX-}u45Z(fh7g=g%iADI&-Zyh>DloBBGt(Wx}lLL=&iPKoF!OX*G#vT!EGB-VI-Ic@NSPE+? z1ejcPdb>!t4 z-?gU*CT!VgUi}(EW9~?ni-KD6fU6fc z3GwR##G>5*j+(>~TM}SbP{C|Zt{s2da_E|S-Rtl#T(hMZbW@D>Tff!X3yy1t$ld9I zEe$;cTp=XbD&Bx$0r>Tf8wC);48R1zgWUME^DSET_2LL-e1X~jyT7lkL)xxuuhCC8T!1M)eFm*oT&4dg+LvRQJ!8&z1_V7 z&`QTz)O^Lx$@L(0nNOn@&Z?`xvy}-<0bbPx)&wIaYLd|E2mHf!OTZj?L ze7NwMMQm24PMtCIw9*ZuS{s^Nn~}9Z{-VJC5BtGT0;q>mK%$UQRP{dowhSDy)X(p` zx*hzz4{Hamy-(YA$wh5ZFT}WgZnFvNM*hg7^XrugOpN5F`mQI4YK*J6BL)$Z zgSpAV3tqix>Ec4ukF70V|M1Bt{0mtsM;(;J8HaOgi;T%QVUWogaYF8R(Pa<;u*Nls zk#N|l)#3E_GpT0viu#DBKBpb{qd%1el)^sfu~N@z^^jgdo(3Qz0N?)9GxkGY2I(EM zuYKsf?ef2QSKF~kceGTkIOxE3+>@W!4tnV6k}b8bee9q0JgXC{5BiDK&!-x=fLTy= zF02cRj5ySc=c0zpuGRNkpa6x!XbUtYn6VBuIH377=SgBT7U%l!_{EnUGx^Qm%tQoN zx{nFhD<9ULA&%GB!H5(cd&bUhO%BMh&IWB8bjubqBc~ujRGpR=m=|BGPPlK|XYD%O zN>@22yluypa(;XfffG<0%vnMhaRtz?Xz|T-r*5^^ee|Pkafd!FVm|~$+h4crB?Ynh z;!7PiOQwLmuo`!ns>fLWees(%A_7mtPv|0lzC%hjvwq?+7_Q87SOr0jv2h)e7#rUS zrqh?7x}m)o@wjCOgXpR=+CEGATMgpzdvg(-(-^BCpc+*m;iLyl@YZH*1eXiIVQ@l} zyw-;TJ5DW!(!b<8UrF;8wTrGfUp}!B>R<{T4P!NuU9F11+zFS?r>OuLD*?k-oWxkI zIH2_lCk=dCPCq`m$;(n|@m7l`VJRNgY^WV2B7OEek{{{&!E!*tj%_59WXFoRl_#FG ze%qCXj4pLI>7pb5u5DE$e`K?AD1mp0Q4tJ2dLVsFKtUBj6|IEIQdo}cS#q}xL+o83 zPKC^!Jo-8%>PapSUfB3~Pe5=^zGS|QmQFo7;~03COcFX{JE?>8x!=cDF+ zK_yugee9or^*?m*PkBI*o z7Mpq=E?K@fj`d+qOWRsd?^Uqy8;d0z8a+ceGepZd!IqT{Y1()br5$7B?zkimy&sYV zcMK3mOGT1K-m+klnJR&(I_aERaP~u=4`gM}vI&m|ZM4)btj&zT>(|-} zk4+Uf?9mLTnnaB4?Z8ICMlCot`j(ux-db_Z%VkgP%17yI;_XeRxasYqJYfP31qd1Q z3cBkOKk#P35o7_wiUkd*dVe1Yr<7Zq53w$FYB|+Tg>=}Ky~nac7paQg{#2OpTZQN; zX4&?b;FH|;8q>f~JTPp8nj;$H7@No7oaCoyv3VgJ@)$b;zI4=eW=gp|*v^g<1G_hj z%*A->x()5$k?pA|T-r@&q1#+Ip>$w~o{L;*YKBn$T zqUR`8y{74z6ySI@IGOr4m0bFNu(u;yv(}&OE7K&WnyhdDB-W(lG^HzTV1D6i3G9tsv=%du%6}`OqxW z2N?OkoVsD@p^77;M6u^K-k*C$Af0c|)2jSah~biApopS4Xa|Wb!eT*PKaz%?Ma0M| zU1GP_Onn}yf{|2yJ5GqBXYPmSkjL}1WMFwX-F1>fR`!G!Cn`B{Eg3|}`Exjo%fFR2 z2B;MhKOik>9UTf~Cg23g$JYZcNP%RDy)iyg@@Cjs^WEOoKe(=l5oWZx_60Ela2;{N{H~q@h$uIOkz4g#k(qpVJEpw*}>+<3??n%(d3p8?> zeI)`qweHVEVHZBF9dR-r^wttek0;_%L=xrFlhZzkGYe;)GzDLAS6_PUY~#&`LGm)B z;i|7E{5zb`S~qYa9NA-wDD9P{_pjS9{gK;ydNI9SCm0}2x4`Gh*?9znQ~Q^wm)Sh*(|@oH8wh*H56av)D_M7LS^4kr z%d-5#TU?gq`W*qhdUShq_EkO8(6jEc&*gWW<%8YTE8Bi&-I3xFi#*=3cGW{xoV;`A zj!!EXzX4L#4u*-NgqFc5Ar2Hk$ii`4t>RK|(@alw5Z|iF1cCvDUj#fsIXK>wp$#^`Q#$5l;*wH?ew$Z~ql{r6FQ9(W3rt;iK-i zq5X5x-tO)WonTmx{N#=c^rO&EmvgPznQ?I8k&vQ*p+YawXwlesAr`ZXvGhg#*uGAH zf!1MbpWupDeQ*k5RBb8)%ujJ$kQsX$nx{DN?idOOL=xNQDYP$*k;Oj%pu(ExR?E$i zI`r6knz4WyVQRyGay+REf76$IBgMtv9WF3N$9#J6ul3^|FJR2lA}LHFXr7Zosy@eo z40+cvVDXt8-dy+MDp{1p2{X`RM#YY0B!HyGcsF~{Qrb<9;eZ91?af#ThiO@yV|&|z z2;LxOoc3Bn70b|CKeRI~e8@^tVj20jP3V>9v-LUe%V$jQz$94ifWa7g*#qZZzBFBW zp%dZ-48ca+vG7^|wk$r15VM{jO^4!$$9#cxkzEZ422L1;0*&lR7SQyy+1dAbZvPx8$f{MMRd9I=E4c}ZW`#QJLi=?8oNCsMd*^ukRhA8d!5@^g2lxUk)+ z0z+`j>h=p-`g^=qT}Xq2CUD0biS}p1CG#3sEV^2JEG(4Sa${`os1s&D*yrwcs!NZWPX{?nh-=aO$C{#ukqUIcTe!Y6VRXkuAhtUD4J z6J)XQfe)5ZD_^}hVYA%M_BwG+;;eZl9KW&2z`BIQy3BtSVH`#If;I{!YcD449h=C> zK&>BN%!yzB7~8}$`~TqFp=%zs?)>XEkHYsTjai-X5#GA zwW_SfnH$^3cq}J;jD}^5@o?IY$t#(OO~0WJnLSI6Do&*A{SKA%Kq^*T_S1(|apEZL zQ&usfakCSs>}24aOwK;_>c!{EZz9Uz&h;7Dog-OpecAoze|B+k@pXz+-`|Q>Zb+O* zmFPjv$S_@;SoM{d*+jxLYhMKld~%vFyjfqjN{hliw#ncpiZ|HL^18Z)*nh6X-KbFE zF;W`w#JY*P;v3@cxJA8Meu+LE`i8$0BI;Xf;pNt}cS3%}16G`-cf8)AbE-ev!_sMe zQM(n&CDuudZID>oMUpCcK^3z-CT-+v*c|YM4c#C|R-48{7h<>Kqk@;4680MV?&H%9 zLC6CJXRI^U9b?;2=l}&~I=xyibDwX^aaNzEd-@JZ4Ari~#^w28t8LSz&!`*c1lkKJLJD=jQ- z)=o0>p;@L6u;tRce`VYEtovNE`C7zxSBnVlF81WT=sVj}^=&_|(z;hU`7At>3M6C| z1iBon_lb7?Q;r>*L46d%41D&5g|jM%XO>CFD#!LF8hq9BJ~m_f@@IJ{bq%|^iv$%L4uF~lA@fjz zir>nAnOoTFnRn##T&(U)W9i@2cFAe;k6T(={9_gRm`F;U#L7@6&{e4T^shY88$}x1%jIntM!_Q~$U>eeN+q&969S@B z>oUgm2>ZeZR}~_PHKXI!UJYJ7&>Q31e#C*CRyvmt*{E_|r-6Qr#p~ziSFb(ws>Roj zAm!<9??wl|EgnP@J-YlWY|x&w@+iB#%M|(q$At zIyzd)t#_dU8=E8{BV6G_ljdW+#^tLbz!kEJTkjq%>eoZQb#A)wd+RprxYch;FCTYj zUoqaDKE5vZCF|PZ`iX_-DMimzVf+U|%ESdY;$)UQW!in9ts@(+R0zk=1f zU^BPge4cfwRZ-W1k@m+MnK?m$w*t}Lhk+xQE67lEi_0S(jo=y)`>GX#;r~2!vlNC_7m|1x3 zhMn3R`inCY{jThGlU}InMbVVset+ToWZ^=7-*Wv*-rI10k5_%$7x?yMn7_iwA8Nd1 t`>K5x=eKRs-!t08AC0;_w%_iU{|A1IpA9#1vwHvl002ovPDHLkV1i-Emx2HQ literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_error_open.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_report_error_open.png new file mode 100644 index 0000000000000000000000000000000000000000..75cbf7793b5be92683cb29936ad9aafbbc6cb976 GIT binary patch literal 3058 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_divider.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_divider.xml new file mode 100644 index 0000000000..96fc4dc99d --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_divider.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box.xml new file mode 100644 index 0000000000..dca4cc1eed --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/selector_msg_box.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index f1eef9611d..566b59fc2e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -167,7 +167,6 @@ android:layout_height="120dp" android:layout_marginTop="30dp" android:layout_marginEnd="40dp" - android:background="@drawable/bg_waring_limiting_velocity" android:elevation="@dimen/dp_10" android:gravity="center" @@ -181,6 +180,48 @@ app:layout_goneMarginTop="40dp" tools:visibility="gone" /> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml new file mode 100644 index 0000000000..a8eae24883 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_notice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_notice.xml new file mode 100644 index 0000000000..6bd7c2fc06 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_notice.xml @@ -0,0 +1,52 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml new file mode 100644 index 0000000000..ff8a6fadab --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_operation.xml new file mode 100644 index 0000000000..cf5281b473 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_operation.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml new file mode 100644 index 0000000000..1737bbf3af --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_bubble.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_bubble.xml new file mode 100644 index 0000000000..967b30a914 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_bubble.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml new file mode 100644 index 0000000000..45b131202c --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_driver_msg_box_list.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml index 5d7d219244..a77286ff33 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml @@ -123,8 +123,8 @@ android:padding="@dimen/dp_20" android:background="@drawable/radio_button_normal_background_right" android:textColor="#000" - android:textOff="关闭OBU" - android:textOn="开启OBU" + android:textOff="开启OBU" + android:textOn="关闭OBU" android:textSize="@dimen/dp_24" app:layout_constraintTop_toBottomOf="@id/tbRainMode" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml index 673fe26115..333b277f12 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml @@ -10,6 +10,8 @@ #3B4577 #256BFF + #FF1BB7FF + #6200EE #3700B3 #03DAC5 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index 872f4f8b9b..f5eb6bac20 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -92,7 +92,7 @@ interface IDevaToolsProvider : IProvider { /** * 当工控机回调时调用 */ - fun onReceiveBadCaseRecord(record: RecordPanelOuterClass.RecordPanel,activity: Activity) + fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) /** * 展示录包配置 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index b09062156c..68e64f9cdb 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -123,8 +123,8 @@ object CallerDevaToolsManager { /** * 收到工控机回调时触发 */ - fun onReceiveBadCaseRecord(record: RecordPanelOuterClass.RecordPanel,activity: Activity) { - devaToolsProviderApi?.onReceiveBadCaseRecord(record,activity) + fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { + devaToolsProviderApi?.onReceiveBadCaseRecord(recordKey, fileName, activity) } /** diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java index 12bb0d36c3..1de99c382e 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java @@ -43,6 +43,10 @@ public final class TimeUtils { return getSafeDateFormat("HH:mm:ss"); } + public static SimpleDateFormat getHourMinFormat(){ + return getSafeDateFormat("HH:mm"); + } + @SuppressLint("SimpleDateFormat") public static SimpleDateFormat getSafeDateFormat(String pattern) { Map sdfMap = SDF_THREAD_LOCAL.get(); From 2ce908ce3fc56d6fa385e86cdab03606bfdb3b02 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 30 Nov 2022 11:17:55 +0800 Subject: [PATCH 03/16] [2.13.0] add test code of vip to xin chao --- .../hmi/ui/setting/DebugSettingView.kt | 7 +- .../core/function/v2x/vip/VipCarManager.kt | 144 +++++++++--------- 2 files changed, 75 insertions(+), 76 deletions(-) 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 7d0d1bd056..b9a62441f8 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 @@ -77,6 +77,7 @@ import com.mogo.map.MogoMapUIController import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* import com.mogo.eagle.core.function.business.routeoverlay.* +import com.mogo.eagle.core.function.v2x.vip.VipCarManager import com.zhidao.easysocket.utils.L import com.zhidao.support.adas.high.other.permission.BackgrounderPermission import com.zhjt.mogo_core_function_devatools.env.* @@ -598,12 +599,14 @@ class DebugSettingView @JvmOverloads constructor( tbIsDemoMode.visibility = View.GONE } + // 雨天模式,上一次勾选的数据 tbIsRainMode.isChecked = FunctionBuildConfig.isRainMode //雨天模式 tbIsRainMode.setOnCheckedChangeListener { _, isChecked -> - CallerAutoPilotManager.setRainMode(isChecked) - FunctionBuildConfig.isRainMode = isChecked + VipCarManager.INSTANCE.turnLight(25) +// CallerAutoPilotManager.setRainMode(isChecked) +// FunctionBuildConfig.isRainMode = isChecked } //雨天模式按钮只在司机屏生效,乘客屏不显示 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt index 58bdfe1aac..5f33f1af73 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt @@ -18,10 +18,8 @@ import com.mogo.eagle.core.data.trafficlight.currentRoadTrafficLight import com.mogo.eagle.core.data.trafficlight.isGreen import com.mogo.eagle.core.data.trafficlight.isRed import com.mogo.eagle.core.data.v2x.VipMessage -import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager @@ -65,7 +63,13 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe .registerOnMessageListener(401025, this) //首次进入应用查询是否为VIP车辆 - requestVip() +// requestVip() + + //todo emArrow test + CallerHmiManager.vipIdentification(true) + CallVipSetListenerManager.invokeVipSetStatus(true) + CallerTrafficLightListenerManager.registerTrafficLightListener(TAG, this) + CallerTrafficLightListenerManager.registerEnterCrossRoadListener(TAG, this) } override fun handleMessage(msg: Message): Boolean { @@ -104,9 +108,9 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { - if (!vip) { - return - } +// if (!vip) { //todo emArrow test +// return +// } if (exit) { CallerLogger.d("$M_V2X$TAG", "驶离路口,返回 , then resetConditions") @@ -196,69 +200,70 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } } - private fun turnLight(controlTime: Int) { - if (result == null || mContext == null) return - val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) - if (locationClient != null) { - val bearing = - locationClient.lastKnowLocation.bearing.toDouble() - CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ") - MogoTrafficLightManager.INSTANCE.turnLightToGreen( - result!!.lightId, result!!.crossId, bearing, controlTime, - { - // 请求变灯成功,直接提示 - if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { - CallerLogger.d("$M_V2X$TAG", "变灯请求成功") - showWarning( - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType - ) - return@turnLightToGreen - } + fun turnLight(controlTime: Int) { +// if (result == null || mContext == null) return +// val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) +// if (locationClient != null) { +// val bearing = +// locationClient.lastKnowLocation.bearing.toDouble() + CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ") + MogoTrafficLightManager.INSTANCE.turnLightToGreen( +// result!!.lightId, result!!.crossId, bearing, controlTime, + 100445, "10037", 90.0, controlTime, + { + // 请求变灯成功,直接提示 + if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { + CallerLogger.d("$M_V2X$TAG", "变灯请求成功") + showWarning( + EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType + ) + return@turnLightToGreen + } - // 请求变灯失败,根据灯态来提示。 此处灯态未获取到 - if (this.result == null || this.result?.currentRoadTrafficLight() == null) { - showWarning( - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + "稍后重试", - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType - ) - return@turnLightToGreen - } + // 请求变灯失败,根据灯态来提示。 此处灯态未获取到 + if (this.result == null || this.result?.currentRoadTrafficLight() == null) { + showWarning( + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + "稍后重试", + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType + ) + return@turnLightToGreen + } - // 如果当前为红灯,则提示 - if (this.result!!.currentRoadTrafficLight()!!.isRed()) { - val time = if (it.countDown / 60 >= 1) { - "${it.countDown / 60}分${it.countDown % 60}秒后重试" - } else { - val temp = if (it.countDown == 0) { - 1 - } else { - it.countDown - } - "${temp}秒后重试" - } - showWarning( - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + time, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType - ) + // 如果当前为红灯,则提示 + if (this.result!!.currentRoadTrafficLight()!!.isRed()) { + val time = if (it.countDown / 60 >= 1) { + "${it.countDown / 60}分${it.countDown % 60}秒后重试" } else { - CallerLogger.d( - "$M_V2X$TAG", - "变灯请求失败,当前为非红灯不做展示 , light : ${result.toString()} , trafficLightControl : $it" - ) + val temp = if (it.countDown == 0) { + 1 + } else { + it.countDown + } + "${temp}秒后重试" } - }, - { errorMsg -> - CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") - ToastUtils.showLong("服务异常,请稍后重试") - }) - } + showWarning( + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + time, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType + ) + } else { + CallerLogger.d( + "$M_V2X$TAG", + "变灯请求失败,当前为非红灯不做展示 , light : ${result.toString()} , trafficLightControl : $it" + ) + } + }, + { errorMsg -> + CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") + ToastUtils.showLong("服务异常,请稍后重试") + }) +// } } private fun showWarning( @@ -270,15 +275,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe CallerMsgBoxManager.saveMsgBox( MsgBoxBean(MsgBoxType.V2X, V2XMsg(v2xType, alertContent.toString(), ttsContent)) ) - CallerHmiManager.warningV2X( - v2xType, alertContent, ttsContent, tag, - object : IMoGoWarningStatusListener { - override fun onShow() {} - override fun onDismiss() {} - }, - true, - 5000L - ) } fun destroy() { From ada76d313677f8665a1dc57416247976424fd70b Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 30 Nov 2022 11:49:21 +0800 Subject: [PATCH 04/16] [2.13.0] reset the vip test code --- .../hmi/ui/setting/DebugSettingView.kt | 5 +- .../core/function/v2x/vip/VipCarManager.kt | 139 +++++++++--------- 2 files changed, 69 insertions(+), 75 deletions(-) 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 b9a62441f8..82504edac8 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 @@ -604,9 +604,8 @@ class DebugSettingView @JvmOverloads constructor( tbIsRainMode.isChecked = FunctionBuildConfig.isRainMode //雨天模式 tbIsRainMode.setOnCheckedChangeListener { _, isChecked -> - VipCarManager.INSTANCE.turnLight(25) -// CallerAutoPilotManager.setRainMode(isChecked) -// FunctionBuildConfig.isRainMode = isChecked + CallerAutoPilotManager.setRainMode(isChecked) + FunctionBuildConfig.isRainMode = isChecked } //雨天模式按钮只在司机屏生效,乘客屏不显示 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt index 5f33f1af73..018853805a 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt @@ -20,6 +20,7 @@ import com.mogo.eagle.core.data.trafficlight.isRed import com.mogo.eagle.core.data.v2x.VipMessage import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager @@ -63,13 +64,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe .registerOnMessageListener(401025, this) //首次进入应用查询是否为VIP车辆 -// requestVip() - - //todo emArrow test - CallerHmiManager.vipIdentification(true) - CallVipSetListenerManager.invokeVipSetStatus(true) - CallerTrafficLightListenerManager.registerTrafficLightListener(TAG, this) - CallerTrafficLightListenerManager.registerEnterCrossRoadListener(TAG, this) + requestVip() } override fun handleMessage(msg: Message): Boolean { @@ -108,9 +103,9 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { -// if (!vip) { //todo emArrow test -// return -// } + if (!vip) { + return + } if (exit) { CallerLogger.d("$M_V2X$TAG", "驶离路口,返回 , then resetConditions") @@ -201,69 +196,69 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } fun turnLight(controlTime: Int) { -// if (result == null || mContext == null) return -// val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) -// if (locationClient != null) { -// val bearing = -// locationClient.lastKnowLocation.bearing.toDouble() - CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ") - MogoTrafficLightManager.INSTANCE.turnLightToGreen( -// result!!.lightId, result!!.crossId, bearing, controlTime, - 100445, "10037", 90.0, controlTime, - { - // 请求变灯成功,直接提示 - if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { - CallerLogger.d("$M_V2X$TAG", "变灯请求成功") - showWarning( - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType - ) - return@turnLightToGreen - } - - // 请求变灯失败,根据灯态来提示。 此处灯态未获取到 - if (this.result == null || this.result?.currentRoadTrafficLight() == null) { - showWarning( - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + "稍后重试", - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType - ) - return@turnLightToGreen - } - - // 如果当前为红灯,则提示 - if (this.result!!.currentRoadTrafficLight()!!.isRed()) { - val time = if (it.countDown / 60 >= 1) { - "${it.countDown / 60}分${it.countDown % 60}秒后重试" - } else { - val temp = if (it.countDown == 0) { - 1 - } else { - it.countDown - } - "${temp}秒后重试" + if (result == null || mContext == null) return + val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) + if (locationClient != null) { + val bearing = + locationClient.lastKnowLocation.bearing.toDouble() + CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ") + MogoTrafficLightManager.INSTANCE.turnLightToGreen( + result!!.lightId, result!!.crossId, bearing, controlTime, +// 100445, "10037", 90.0, controlTime, //衡阳25号路口测试数据 + { + // 请求变灯成功,直接提示 + if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { + CallerLogger.d("$M_V2X$TAG", "变灯请求成功") + showWarning( + EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType + ) + return@turnLightToGreen } - showWarning( - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + time, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType - ) - } else { - CallerLogger.d( - "$M_V2X$TAG", - "变灯请求失败,当前为非红灯不做展示 , light : ${result.toString()} , trafficLightControl : $it" - ) - } - }, - { errorMsg -> - CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") - ToastUtils.showLong("服务异常,请稍后重试") - }) -// } + + // 请求变灯失败,根据灯态来提示。 此处灯态未获取到 + if (this.result == null || this.result?.currentRoadTrafficLight() == null) { + showWarning( + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + "稍后重试", + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType + ) + return@turnLightToGreen + } + + // 如果当前为红灯,则提示 + if (this.result!!.currentRoadTrafficLight()!!.isRed()) { + val time = if (it.countDown / 60 >= 1) { + "${it.countDown / 60}分${it.countDown % 60}秒后重试" + } else { + val temp = if (it.countDown == 0) { + 1 + } else { + it.countDown + } + "${temp}秒后重试" + } + showWarning( + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + time, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType + ) + } else { + CallerLogger.d( + "$M_V2X$TAG", + "变灯请求失败,当前为非红灯不做展示 , light : ${result.toString()} , trafficLightControl : $it" + ) + } + }, + { errorMsg -> + CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") + ToastUtils.showLong("服务异常,请稍后重试") + }) + } } private fun showWarning( From 621c8f36d2c54df0ecefcf9003d86f10ea830835 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 30 Nov 2022 12:59:28 +0800 Subject: [PATCH 05/16] [2.13.0] fix bug of sn token invoke --- .../mogo/launcher/stageone/HttpDnsStartUp.kt | 18 ++++++++++++------ .../MoGoAdasMsgConnectStatusListenerImpl.kt | 2 +- .../trace/TraceManager.kt | 4 ++-- .../core/function/hmi/ui/MoGoHmiFragment.kt | 4 ++-- .../function/api/cloud/IMoGoCloudListener.kt | 2 +- .../call/cloud/CallerCloudListenerManager.kt | 4 ++-- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt index a3a37c3b0d..bd03b1596e 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -21,6 +21,7 @@ import com.mogo.commons.device.Devices import com.mogo.commons.network.NetConfigUtils import com.mogo.commons.network.Utils import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.constants.HostConst import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_FAIL import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_SUCCESS @@ -39,7 +40,6 @@ import com.mogo.eagle.core.utilcode.util.ProcessUtils import com.mogo.eagle.core.utilcode.util.ThreadPoolService import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.map.location.GDLocationClient -import com.mogo.eagle.core.data.constants.HostConst import com.rousetime.android_startup.AndroidStartup import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.service.chain.ChainLog @@ -202,9 +202,9 @@ class HttpDnsStartUp : AndroidStartup() { override fun onTokenGot(token: String, sn: String) { clientConfig.token = token // 由于存在token过期问题,在更新后会回调至此处,增加二次判定 - if(!gotToken){ - CallerLogger.d(SceneConstant.M_MAIN + TAG, "onTokenGot ") - CallerCloudListenerManager.invokeCloudTokenGot(token) + if (!gotToken) { + CallerLogger.d(SceneConstant.M_MAIN + TAG, "onTokenGot token : $token , sn :$sn") + CallerCloudListenerManager.invokeCloudTokenGot(token, sn) // 异步初始化NetConfig asyncInit() // HttpDns ttl回调 --- socketTTL @@ -270,7 +270,10 @@ class HttpDnsStartUp : AndroidStartup() { HttpDnsConst.HTTP_DNS_ADDRESS_TYPE_HTTP ) ?: return if (dnsCacheIp != cacheIp) { - CallerLogger.d(SceneConstant.M_MAIN + TAG, "获取缓存Dns IP : $dnsCacheIp , 原缓存 IP : $cacheIp") + CallerLogger.d( + SceneConstant.M_MAIN + TAG, + "获取缓存Dns IP : $dnsCacheIp , 原缓存 IP : $cacheIp" + ) startSocketService() cacheIp = dnsCacheIp } @@ -352,7 +355,10 @@ class HttpDnsStartUp : AndroidStartup() { clientPkFileName = "sn" ) override fun onError(code: String, msg: String?) { - CallerLogger.d(SceneConstant.M_MAIN + TAG, "socket-onError code : $code , msg : $msg") + CallerLogger.d( + SceneConstant.M_MAIN + TAG, + "socket-onError code : $code , msg : $msg" + ) } }) // 开启Socket长链服务 diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index a9da4f3990..bac4a75aaa 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -191,7 +191,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, } - override fun tokenGot(sn: String) { + override fun tokenGot(token: String, sn: String) { syncBasicInfoToAutopilot(sn) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt index a0c48db9ec..c71096ce5a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt @@ -32,7 +32,7 @@ class TraceManager : IMoGoCloudListener { @Synchronized fun init(context: Context) { - if(init){ + if (init) { return } // 初始化Trace抓取服务 @@ -101,7 +101,7 @@ class TraceManager : IMoGoCloudListener { init = true } - override fun tokenGot(sn: String) { + override fun tokenGot(token: String, sn: String) { FileWriteManager.getInstance().updateDeviceId(sn) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 736f671801..e86c041a40 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -950,7 +950,7 @@ class MoGoHmiFragment : MvpFragment(), SharedPrefsMgr.getInstance(it) .putLong("roadwork", System.currentTimeMillis() / 1000) } - CallerAutoPilotManager.sendTripInfo(5, "", "", "", false); + CallerAutoPilotManager.sendTripInfo(5, "", "", "", false) } } @@ -1564,7 +1564,7 @@ class MoGoHmiFragment : MvpFragment(), EXIT_AUTOPILOT_FOR_LOCATION, EXIT_AUTOPILOT_FOR_CHASSIS, EXIT_AUTOPILOT_FOR_DISTANCE -> { - showWarningV2X( + warningV2X( EventTypeEnum.TAKE_OVER_EVENT.poiType, EventTypeEnum.TAKE_OVER_EVENT.content, EventTypeEnum.TAKE_OVER_EVENT.tts, diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt index a59f644004..89cf1c82cc 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt @@ -2,5 +2,5 @@ package com.mogo.eagle.core.function.api.cloud interface IMoGoCloudListener { - fun tokenGot(sn:String) + fun tokenGot(token: String, sn: String) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudListenerManager.kt index dc9b71dfb9..5c6208c3d6 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudListenerManager.kt @@ -53,10 +53,10 @@ object CallerCloudListenerManager { /** * 分发获取到的设备sn */ - fun invokeCloudTokenGot(sn: String) { + fun invokeCloudTokenGot(token: String, sn: String) { M_CLOUD_LISTENER.forEach { val listener = it.value - listener.tokenGot(sn) + listener.tokenGot(token, sn) } } } \ No newline at end of file From 86a579be697ebc39a1e01731b592a8ea91091d42 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 30 Nov 2022 14:19:07 +0800 Subject: [PATCH 06/16] =?UTF-8?q?[2.13.0][fix]=E8=A7=A3=E5=86=B3=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E5=AE=89=E8=A3=85Tts=E4=B8=8D=E7=94=9F=E6=95=88?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原因:首次安装sn没有缓存到sp,然后Tts初始化时机比从后台获取要靠前 --- .../DevaToolsProvider.kt | 3 ++ .../tts/TtsManager.kt | 36 +++++++++++++++++++ .../function/main/MainMoGoApplication.java | 1 - .../java/com/mogo/commons/voice/AIAssist.java | 9 +++++ .../main/java/com/mogo/tts/base/IMogoTTS.java | 2 ++ .../main/java/com/mogo/tts/pad/PadTTS.java | 15 +++++--- 6 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/tts/TtsManager.kt diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 5ba5156aad..51cba44a50 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -18,6 +18,8 @@ import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager import com.zhjt.mogo_core_function_devatools.status.* import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager +import com.zhjt.mogo_core_function_devatools.tts.TtsManager +import com.zhjt.mogo_core_function_devatools.tts.TtsManager.Companion.ttsManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager import record_cache.RecordPanelOuterClass @@ -35,6 +37,7 @@ class DevaToolsProvider : IDevaToolsProvider { } override fun initBiz() { + ttsManager.initTts(mContext!!) traceManager.init(mContext!!) bizConfigCenter.init(mContext!!) FuncConfigImpl.init() diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/tts/TtsManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/tts/TtsManager.kt new file mode 100644 index 0000000000..2cf11f8d9f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/tts/TtsManager.kt @@ -0,0 +1,36 @@ +package com.zhjt.mogo_core_function_devatools.tts + +import android.content.Context +import com.elegant.utils.storage.SharedPrefsMgr +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener +import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.zhjt.mogo_core_function_devatools.trace.TraceManager + +class TtsManager : IMoGoCloudListener { + + companion object { + + const val TAG = "TtsManager" + + val ttsManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + TtsManager() + } + } + + fun initTts(context: Context) { + val sn = SharedPrefsMgr.getInstance(context).getString("sn") + if (sn.isNullOrEmpty()) { + CallerCloudListenerManager.registerCloudListener(TraceManager.TAG, this) + } + AIAssist.getInstance(context) + } + + override fun tokenGot(token: String, sn: String) { + ThreadUtils.runOnUiThread { + AIAssist.getInstance(AbsMogoApplication.getApp()).initTtsAgain(sn) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index 8e88df6202..d4645449a7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -67,7 +67,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { initCrashConfig(); initLogConfig(); initTipToast(); - AIAssist.getInstance(this); initModules(); if (DebugConfig.isDebug()) { initKoom(); diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java index 1cf0660cf4..e8d509617b 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java @@ -62,6 +62,15 @@ public class AIAssist { } } + /** + * 重新初始化Tts(首次sn获取比较慢,而TTS初始化比较早会拿不到授权) + */ + public void initTtsAgain(String sn) { + if (mTTS != null) { + mTTS.initTts(sn); + } + } + /** * 是否语音注册成功 * diff --git a/tts/tts-base/src/main/java/com/mogo/tts/base/IMogoTTS.java b/tts/tts-base/src/main/java/com/mogo/tts/base/IMogoTTS.java index 14e78ec55f..c6940c17a7 100644 --- a/tts/tts-base/src/main/java/com/mogo/tts/base/IMogoTTS.java +++ b/tts/tts-base/src/main/java/com/mogo/tts/base/IMogoTTS.java @@ -13,6 +13,8 @@ public */ interface IMogoTTS extends IProvider { + void initTts(String sn); + /** * 释放资源 */ diff --git a/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java b/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java index 97e4475d5c..ced07980ba 100644 --- a/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java +++ b/tts/tts-pad/src/main/java/com/mogo/tts/pad/PadTTS.java @@ -23,7 +23,7 @@ import com.aispeech.export.engines.AILocalTTSEngine; import com.aispeech.export.intent.AILocalTTSIntent; import com.aispeech.export.listeners.AITTSListener; import com.aispeech.lite.AuthType; -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.elegant.utils.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; @@ -125,13 +125,20 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList } } - private void initTtsConfig() { + @Override + public void initTts(String sn) { + if (!mHasAuth && sn != null && !sn.isEmpty()) { + initTtsConfig(sn); + } + } + + private void initTtsConfig(String sn) { try { CallerLogger.INSTANCE.d(TAG, "initTtsConfig"); //在线授权配置 AuthConfig.Builder onlineBuilder = new AuthConfig.Builder() .setType(AuthType.ONLINE) - .setCustomDeviceName(MoGoAiCloudClientConfig.getInstance().getSn()); + .setCustomDeviceName(sn); //echo 配置 EchoConfig echoConfig = new EchoConfig.Builder() @@ -719,7 +726,7 @@ public class PadTTS implements IMogoTTS, VoiceClient.VoiceCmdCallBack, OnTtsList mVoiceClient = new VoiceClient(mContext); mVoiceClient.setCallBack(this); initFlushStatus(); - initTtsConfig(); + initTts(SharedPrefsMgr.getInstance(mContext).getString("sn")); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查是否有悬浮窗权限 if (Settings.canDrawOverlays(context)) { From b325005fe696af09546ae959e42ac792b289bed0 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 30 Nov 2022 14:57:21 +0800 Subject: [PATCH 07/16] =?UTF-8?q?[2.13.0]=20=E5=90=84=E4=B8=AA=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E5=B0=86=E5=AE=9A=E4=BD=8D=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=94=B9=E4=B8=BA=20CallerMapLocationListene?= =?UTF-8?q?rManager=20IMoGoMapLocationListener?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...IBusPassengerControllerStatusCallback.java | 4 +- .../passenger/model/BusPassengerModel.java | 43 +++++--------- .../presenter/BaseBusPassengerPresenter.java | 3 +- .../ui/BusPassengerRouteFragment.java | 3 +- .../IBusControllerStatusCallback.java | 4 +- .../com/mogo/och/bus/model/BusOrderModel.java | 57 ++++++++---------- .../mogo/och/bus/presenter/BusPresenter.java | 3 +- .../utils/CoordinateCalculateRouteUtil.java | 58 ++++++++++++------- .../ISweeperControllerStatusCallback.java | 4 +- .../och/sweeper/model/SweeperOrderModel.java | 37 +++++------- .../sweeper/presenter/SweeperPresenter.java | 3 +- ...TaxiPassengerControllerStatusCallback.java | 4 +- .../passenger/model/TaxiPassengerModel.java | 36 +++++------- .../presenter/BaseTaxiPassengerPresenter.java | 3 +- .../TaxiPassengerServingOrderPresenter.java | 3 +- .../ui/TaxiPassengerServingOrderFragment.java | 3 +- .../ITaxiControllerStatusCallback.java | 4 +- .../com/mogo/och/taxi/model/TaxiModel.java | 40 ++++++------- .../och/taxi/presenter/TaxiPresenter.java | 3 +- 19 files changed, 146 insertions(+), 169 deletions(-) diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java index 3263ade5b3..cc0bc3f4c7 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java @@ -1,6 +1,6 @@ package com.mogo.och.bus.passenger.callback; -import android.location.Location; +import com.mogo.eagle.core.data.map.MogoLocation; /** * Created on 2022/3/31 @@ -11,5 +11,5 @@ public interface IBusPassengerControllerStatusCallback { // 是否vr map模式 void onVRModeChanged(boolean isVRMode); // 自车定位 - void onCarLocationChanged(Location location); + void onCarLocationChanged(MogoLocation location); } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index 9a25f2e312..7f9811f074 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -2,7 +2,6 @@ package com.mogo.och.bus.passenger.model; import android.content.Context; import android.content.Intent; -import android.location.Location; import android.net.ConnectivityManager; import android.os.Handler; import android.os.Message; @@ -11,7 +10,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.amap.api.maps.model.LatLng; -import com.mogo.aicloud.services.socket.IMogoLifecycleListener; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.debug.DebugConfig; @@ -22,8 +20,10 @@ import com.mogo.commons.module.status.MogoStatusManager; import com.mogo.commons.module.status.StatusDescriptor; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; @@ -32,8 +32,6 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.NetworkUtils; -import com.mogo.map.navi.IMogoCarLocationChangedListener2; -import com.mogo.module.common.MogoApisHandler; import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse; import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResponse; import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResult; @@ -70,7 +68,7 @@ import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STAT public class BusPassengerModel { private static final String TAG = BusPassengerModel.class.getSimpleName(); - private List mRoutePoints = new ArrayList<>(); + private List mRoutePoints = new ArrayList<>(); private static final class SingletonHolder { private static final BusPassengerModel INSTANCE = new BusPassengerModel(); @@ -88,14 +86,13 @@ public class BusPassengerModel { private IBusPassegerDriverStatusCallback mDriverStatusCallback; //出车收车状态 private IBusPassengerRouteLineInfoCallback mRouteLineInfoCallback; // bus路线信息更新 -// private double mLongitude, mLatitude; - private Location mLocation = null; + private MogoLocation mLocation = null; private BusPassengerRoutesResult routesResult = null; List mStations = new ArrayList<>(); private int mNextStationIndex = 0;// 要到达站的index - private List mTwoStationsRouts = new ArrayList<>(); + private List mTwoStationsRouts = new ArrayList<>(); private int mPreRouteIndex = 0; private static final int MSG_QUERY_BUS_P_STATION = 1001; @@ -252,11 +249,8 @@ public class BusPassengerModel { CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener ); - // 达到起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .registerCarLocationChangedListener( TAG, mCarLocationChangedListener2); + // 定位监听 + CallerMapLocationListenerManager.INSTANCE.addListener(TAG, mMapLocationListener,false); //2021.11.1 自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); @@ -265,11 +259,8 @@ public class BusPassengerModel { private void releaseListeners() { MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 注销到达起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); + // 注销定位监听 + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG,false); MogoAiCloudSocketManager.getInstance(mContext) .unregisterLifecycleListener(10010); @@ -302,15 +293,9 @@ public class BusPassengerModel { } }; - // 自车定位 - private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { - + private final IMoGoMapLocationListener mMapLocationListener = new IMoGoMapLocationListener() { @Override - public void onCarLocationChanged2( Location location ) { - //位置变化时,通过围栏判断是否到达x点 - // TODO: 2022/3/31 -// mLongitude = location.getLongitude(); -// mLatitude = location.getLatitude(); + public void onLocationChanged(@Nullable MogoLocation location, int from, boolean isGps) { mLocation = location; for (IBusPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ callback.onCarLocationChanged(location); @@ -406,7 +391,7 @@ public class BusPassengerModel { public void updateRoutePoints(List routePoints){ mRoutePoints.clear(); - List latLngModels = CoordinateCalculateRouteUtil + List latLngModels = CoordinateCalculateRouteUtil .coordinateConverterWgsToGcjLocations(mContext,routePoints); mRoutePoints.addAll(latLngModels); calculateTwoStationsRoute(); @@ -454,14 +439,14 @@ public class BusPassengerModel { calculateTwoStationsRoute(); } if (mTwoStationsRouts.size() > 0 && mLocation != null){ - Map> lastPointsMap = CoordinateCalculateRouteUtil + Map> lastPointsMap = CoordinateCalculateRouteUtil .getRemainPointListByCompareNew(mPreRouteIndex,mTwoStationsRouts,mLocation); for (int index: lastPointsMap.keySet()) { mPreRouteIndex = index; break; } - for (List lastPoints: lastPointsMap.values()){ + for (List lastPoints: lastPointsMap.values()){ float lastSumLength = 0; if (lastPoints.size() == 1){ //只是最后一个点,计算当前位置和最后一个点的距离 lastSumLength = CoordinateUtils.calculateLineDistance( diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java index 505a26d7a5..f742af5eb1 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java @@ -9,6 +9,7 @@ import androidx.lifecycle.LifecycleOwner; import com.amap.api.maps.model.LatLng; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -109,7 +110,7 @@ public class BaseBusPassengerPresenter extends Presenter mView.onCarLocationChanged(location)); } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java index e56557e570..19be9fe6ef 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java @@ -15,6 +15,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.amap.api.maps.model.LatLng; import com.elegant.utils.UiThreadHandler; import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; @@ -337,7 +338,7 @@ public class BusPassengerRouteFragment extends lastBearing = bearing; } - public void onCarLocationChanged(Location location) { + public void onCarLocationChanged(MogoLocation location) { updateSpeedView(location.getSpeed()); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java index e03e963942..e10afc44e7 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java @@ -1,6 +1,6 @@ package com.mogo.och.bus.callback; -import android.location.Location; +import com.mogo.eagle.core.data.map.MogoLocation; /** * Created on 2021/9/10 @@ -11,7 +11,7 @@ public interface IBusControllerStatusCallback { // 是否vr map模式 void onVRModeChanged(boolean isVRMode); // 自车定位 - void onCarLocationChanged(Location location); + void onCarLocationChanged(MogoLocation location); //开始开启自动驾驶 void startOpenAutopilot(); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java index 52f7723cad..2ecb253a13 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java @@ -7,11 +7,11 @@ import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_ARRIVING; import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_STOPPED; import android.content.Context; -import android.location.Location; import android.os.Handler; import android.os.Message; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.maps.model.LatLng; @@ -19,25 +19,24 @@ import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.IMogoOnMessageListener; import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.AbsMogoApplication; -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.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -import com.mogo.map.navi.IMogoCarLocationChangedListener2; -import com.mogo.module.common.MogoApisHandler; import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; @@ -149,29 +148,24 @@ public class BusOrderModel { public void init() { mContext = AbsMogoApplication.getApp(); loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); - // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传 - String productFlavor = DebugConfig.getProductFlavor(); - if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) { - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2); - MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); + // 定位监听 + CallerMapLocationListenerManager.INSTANCE.addListener(TAG, mMapLocationListener, false); - //自动驾驶路线规划接口 - CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); + MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - //开启自驾后 异常信息返回 - OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener); + //自动驾驶路线规划接口 + CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); - OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(//监听运营消息 - OCHSocketMessageManager.INSTANCE.getMsgMonitorType(), - mMogoOnMessageListener); + //开启自驾后 异常信息返回 + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener); - OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(//监听核销乘客 - OCHSocketMessageManager.INSTANCE.getMsgWriteOffPassengerType(), - mWriteOffPassengeOnMessageListener); - } + OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(//监听运营消息 + OCHSocketMessageManager.INSTANCE.getMsgMonitorType(), + mMogoOnMessageListener); + + OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(//监听核销乘客 + OCHSocketMessageManager.INSTANCE.getMsgWriteOffPassengerType(), + mWriteOffPassengeOnMessageListener); //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 @@ -335,11 +329,8 @@ public class BusOrderModel { //startOrStopQueryPassengerWriteOff(false); MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 注销到达起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); + // 注销定位监听 + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG,false); //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); @@ -382,11 +373,9 @@ public class BusOrderModel { }; // 自车定位 - private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { - + private final IMoGoMapLocationListener mMapLocationListener = new IMoGoMapLocationListener() { @Override - public void onCarLocationChanged2(Location location) { -// CallerLogger.INSTANCE.d(M_BUS + TAG,"location = "+location.getLongitude()+","+location.getLatitude()); + public void onLocationChanged(@Nullable MogoLocation location, int from, boolean isGps) { mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); if (mControllerStatusCallback != null) { @@ -401,7 +390,7 @@ public class BusOrderModel { }; //根据围栏判断,是否到达站点 - private void judgeArrivedStation(Location location) { + private void judgeArrivedStation(MogoLocation location) { if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) { CallerLogger.INSTANCE.e(M_BUS + TAG, "到站数组越界"); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index c4d1be3b85..b46124078c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -14,6 +14,7 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -236,7 +237,7 @@ public class BusPresenter extends Presenter } @Override - public void onCarLocationChanged(Location location) { + public void onCarLocationChanged(MogoLocation location) { if (null != location) { runOnUIThread(() -> mView.updateSpeedView(location.getSpeed())); } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java index 879a69086e..acd799461a 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java @@ -6,6 +6,7 @@ import android.location.Location; import com.amap.api.maps.CoordinateConverter; import com.amap.api.maps.model.LatLng; import com.mogo.cloud.commons.utils.CoordinateUtils; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import java.util.ArrayList; @@ -26,7 +27,20 @@ public class CoordinateCalculateRouteUtil { float sumLength = 0; - if (points.get(1) instanceof Location){ + if (points.get(1) instanceof MogoLocation){ + //计算全路径总距离 + for (int i = 0;i + 1< points.size();i++){ + MogoLocation locationPre = (MogoLocation) points.get(i); + MogoLocation location = (MogoLocation) points.get(i+1); + double preLat = locationPre.getLatitude(); + double preLon = locationPre.getLongitude(); + double laLat = location.getLatitude(); + double laLon = location.getLongitude(); + + float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); + sumLength += length; + } + }else if (points.get(1) instanceof Location){ //计算全路径总距离 for (int i = 0;i + 1< points.size();i++){ Location locationPre = (Location) points.get(i); @@ -172,12 +186,12 @@ public class CoordinateCalculateRouteUtil { } - public static List coordinateConverterWgsToGcjLocations(Context mContext, List models) { + public static List coordinateConverterWgsToGcjLocations(Context mContext, List models) { //转成MogoLatLng集合 - List list = new ArrayList<>(); + List list = new ArrayList<>(); for (MessagePad.Location m : models) { LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m); - Location location = new Location("gcj_provider"); + MogoLocation location = new MogoLocation(); location.setBearing((float) m.getHeading()); location.setLatitude(mogoLatLng.latitude); location.setLongitude(mogoLatLng.longitude); @@ -186,11 +200,11 @@ public class CoordinateCalculateRouteUtil { return list; } - public static List coordinateConverterLatlngToLocation(List models) { + public static List coordinateConverterLatlngToLocation(List models) { //转成MogoLatLng集合 - List list = new ArrayList<>(); + List list = new ArrayList<>(); for (LatLng m : models) { - Location location = new Location("gcj_provider"); + MogoLocation location = new MogoLocation(); location.setLatitude(m.latitude); location.setLongitude(m.longitude); list.add(location); @@ -198,10 +212,10 @@ public class CoordinateCalculateRouteUtil { return list; } - public static List coordinateConverterLocationToLatLng(Context mContext, List models) { + public static List coordinateConverterLocationToLatLng(Context mContext, List models) { //转成MogoLatLng集合 List list = new ArrayList<>(); - for (Location m : models) { + for (MogoLocation m : models) { LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m.getLongitude(),m.getLatitude()); list.add(mogoLatLng); } @@ -215,21 +229,21 @@ public class CoordinateCalculateRouteUtil { * @param realLocation * @return */ - public static Map> getRemainPointListByCompareNew(int preIndex, - List mRoutePoints, - Location realLocation) { - Map> routePonits = new HashMap<>(); - List latePoints = new ArrayList<>(); // 剩余轨迹集合 + public static Map> getRemainPointListByCompareNew(int preIndex, + List mRoutePoints, + MogoLocation realLocation) { + Map> routePonits = new HashMap<>(); + List latePoints = new ArrayList<>(); // 剩余轨迹集合 int currentIndex = 0; //记录疑似点 if (mRoutePoints.size() > preIndex){ //基础点 - Location baseLatLng = mRoutePoints.get(preIndex); + MogoLocation baseLatLng = mRoutePoints.get(preIndex); float baseDiffDis = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), realLocation.getLatitude() ,baseLatLng.getLongitude(),baseLatLng.getLongitude());// lon,lat, prelon, prelat for (int i= preIndex; i < mRoutePoints.size(); i++){ - Location latLng = mRoutePoints.get(i); + MogoLocation latLng = mRoutePoints.get(i); //todo 先看index对应点的方向和realLocation方向是否一致, 方向角度不能过90度 if (Math.abs(realLocation.getBearing() - latLng.getBearing()) <= 90){ float diff = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), @@ -244,12 +258,12 @@ public class CoordinateCalculateRouteUtil { } Logger.d( "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ "); if (currentIndex == mRoutePoints.size()-1){ - Location location = mRoutePoints.get(currentIndex); + MogoLocation location = mRoutePoints.get(currentIndex); // LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); latePoints.add(location); }else { - List locations = mRoutePoints.subList(currentIndex,mRoutePoints.size()-1); - for (Location location: locations) { + List locations = mRoutePoints.subList(currentIndex,mRoutePoints.size()-1); + for (MogoLocation location: locations) { // LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); latePoints.add(location); } @@ -260,16 +274,16 @@ public class CoordinateCalculateRouteUtil { return routePonits; } - public static int getArrivedPointIndexNew(int preIndex, List mRoutePoints, + public static int getArrivedPointIndexNew(int preIndex, List mRoutePoints, double realLon,double realLat) { int currentIndex = preIndex; //记录疑似点 //基础点 - Location baseLatLng = mRoutePoints.get(0); + MogoLocation baseLatLng = mRoutePoints.get(0); float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon, realLat , baseLatLng.getLongitude(), baseLatLng.getLongitude());// lon,lat, prelon, prelat for (int i = 0; i < mRoutePoints.size(); i++) { - Location latLng = mRoutePoints.get(i); + MogoLocation latLng = mRoutePoints.get(i); //todo 先看index对应点的方向和realLocation方向是否一致, 方向角度不能过90度 // if (Math.abs(realLocation.getBearing() - latLng.getBearing()) <= 90) { float diff = CoordinateUtils.calculateLineDistance(realLon, diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperControllerStatusCallback.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperControllerStatusCallback.java index 95543610ff..7a831a7c0e 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperControllerStatusCallback.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperControllerStatusCallback.java @@ -1,6 +1,6 @@ package com.mogo.och.sweeper.callback; -import android.location.Location; +import com.mogo.eagle.core.data.map.MogoLocation; /** * Created on 2021/9/10 @@ -11,7 +11,7 @@ public interface ISweeperControllerStatusCallback { // 是否vr map模式 void onVRModeChanged(boolean isVRMode); // 自车定位 - void onCarLocationChanged(Location location); + void onCarLocationChanged(MogoLocation location); //开始开启自动驾驶 void startOpenAutopilot(); } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java index 46958b0642..f95034ce34 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java @@ -9,6 +9,7 @@ import android.os.Handler; import android.os.Message; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; @@ -22,10 +23,13 @@ import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; +import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.util.NetworkUtils; @@ -127,18 +131,14 @@ public class SweeperOrderModel { public void init() { mContext = AbsMogoApplication.getApp(); - // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传 - String productFlavor = DebugConfig.getProductFlavor(); - if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) { - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2); - MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); + // 定位监听 + CallerMapLocationListenerManager.INSTANCE.addListener(TAG,mMapLocationListener,false); + + MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); + + //自动驾驶路线规划接口 + CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); - //自动驾驶路线规划接口 - CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); - } //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 @@ -261,11 +261,8 @@ public class SweeperOrderModel { public void release() { startOrStopOrderLoop(false); MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 注销到达起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); + // 注销定位监听 + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG,false); //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); @@ -289,11 +286,9 @@ public class SweeperOrderModel { }; // 自车定位 - private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { - + private final IMoGoMapLocationListener mMapLocationListener = new IMoGoMapLocationListener() { @Override - public void onCarLocationChanged2(Location location) { -// CallerLogger.INSTANCE.d(M_BUS + TAG,"location = "+location.getLongitude()+","+location.getLatitude()); + public void onLocationChanged(@Nullable MogoLocation location, int from, boolean isGps) { mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); if (mControllerStatusCallback != null) { @@ -308,7 +303,7 @@ public class SweeperOrderModel { }; //根据围栏判断,是否到达起点 - private void judgeStartStation(Location location) { + private void judgeStartStation(MogoLocation location) { if (backgroundCurrentStationIndex + 1 > stationList.size() - 1) { return; diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java index 02a7075a08..6f3e5c5281 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java @@ -12,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -238,7 +239,7 @@ public class SweeperPresenter extends Presenter } @Override - public void onCarLocationChanged(Location location) { + public void onCarLocationChanged(MogoLocation location) { if (null != location) { runOnUIThread(() -> mView.updateSpeedView(location.getSpeed())); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java index 8ad329a33a..dd4b3336fd 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java @@ -1,6 +1,6 @@ package com.mogo.och.taxi.passenger.callback; -import android.location.Location; +import com.mogo.eagle.core.data.map.MogoLocation; /** * Created on 2021/9/10 @@ -11,5 +11,5 @@ public interface IOCHTaxiPassengerControllerStatusCallback { // 是否vr map模式 void onVRModeChanged(boolean isVRMode); // 自车定位 - void onCarLocationChanged(Location location); + void onCarLocationChanged(MogoLocation location); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index c1fddf11d7..0fe9c85f35 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -2,7 +2,6 @@ package com.mogo.och.taxi.passenger.model; import android.content.Context; import android.content.Intent; -import android.location.Location; import android.net.ConnectivityManager; import android.os.Looper; @@ -23,12 +22,15 @@ import com.mogo.commons.module.status.StatusDescriptor; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; import com.mogo.eagle.core.function.api.v2x.LimitingVelocityListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -36,8 +38,6 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -import com.mogo.map.navi.IMogoCarLocationChangedListener2; -import com.mogo.module.common.MogoApisHandler; import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; @@ -61,7 +61,6 @@ import com.mogo.och.taxi.passenger.callback.ITaxiPassengerVeloctityCallback; import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager; -import com.mogo.aicloud.services.socket.IMogoLifecycleListener; import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager; import org.jetbrains.annotations.NotNull; @@ -123,7 +122,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private double mLongitude, mLatitude; - private List mLocationsModels = new ArrayList<>(); + private List mLocationsModels = new ArrayList<>(); private TaxiPassengerModel() { } @@ -233,11 +232,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); IntentManager.getInstance().registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 达到起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .registerCarLocationChangedListener( TAG, mCarLocationChangedListener2); + // 定位监听 + CallerMapLocationListenerManager.INSTANCE.addListener(TAG,mMapLocationListener,false); //2021.11.1 自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); @@ -249,11 +245,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private void releaseListeners() { MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 注销到达起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); + // 注销定位监听 + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG,false); MogoAiCloudSocketManager.getInstance(mContext) .unregisterLifecycleListener(10010); @@ -416,7 +409,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } // TODO: 2021/9/12 - public void calculateTravelDistance(Location carLocation){ + public void calculateTravelDistance(MogoLocation carLocation){ if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) { double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0); double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); @@ -455,10 +448,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback }; // 自车定位 - private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { - + private final IMoGoMapLocationListener mMapLocationListener = new IMoGoMapLocationListener() { @Override - public void onCarLocationChanged2( Location location ) { + public void onLocationChanged(@Nullable MogoLocation location, int from, boolean isGps) { //位置变化时,通过围栏判断是否到达x点 if (location != null && checkCurrentOCHOrder()) { if (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.OnTheWayToEnd) { @@ -467,7 +459,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); -// CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude); + // CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude); for (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ callback.onCarLocationChanged(location); } @@ -583,7 +575,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback }; public void startToRouteAndWipe(List models) { - List locationsModels = CoordinateCalculateRouteUtil + List locationsModels = CoordinateCalculateRouteUtil .coordinateConverterWgsToGcjLocations(mContext,models); mLocationsModels.clear(); mLocationsModels.addAll(locationsModels); @@ -724,7 +716,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback mAutopilotPlanningCallback.setLineMarker(data.data); } mLocationsModels.clear(); - List locationsModels = CoordinateCalculateRouteUtil. + List locationsModels = CoordinateCalculateRouteUtil. coordinateConverterLatlngToLocation(data.data); mLocationsModels.addAll(locationsModels); startOrStopRouteAndWipe(true); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 1b3690a812..8044606a9a 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -10,6 +10,7 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.map.CallerSmpManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -119,7 +120,7 @@ public class BaseTaxiPassengerPresenter extends Presenter mView.onCarLocationChanged(location)); long currentTimeMillis = System.currentTimeMillis(); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java index aac6f552c0..f4b2772305 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java @@ -22,6 +22,7 @@ import androidx.fragment.app.FragmentTransaction; import com.amap.api.maps.model.LatLng; import com.mogo.commons.mvp.MvpFragment; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -351,7 +352,7 @@ public class TaxiPassengerServingOrderFragment extends } - public void onCarLocationChanged(Location location) { + public void onCarLocationChanged(MogoLocation location) { updateSpeedView(location.getSpeed()); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java index 439f6ea974..070559f406 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java @@ -1,6 +1,6 @@ package com.mogo.och.taxi.callback; -import android.location.Location; +import com.mogo.eagle.core.data.map.MogoLocation; /** * Created on 2021/9/10 @@ -11,7 +11,7 @@ public interface ITaxiControllerStatusCallback { // 是否vr map模式 void onVRModeChanged(boolean isVRMode); // 自车定位 - void onCarLocationChanged(Location location); + void onCarLocationChanged(MogoLocation location); //开始开启自动驾驶 void startOpenAutopilot(); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 715e9d2d7e..96e581d318 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -7,7 +7,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAX import android.content.Context; import android.content.Intent; -import android.location.Location; import android.net.ConnectivityManager; import androidx.annotation.NonNull; @@ -27,18 +26,19 @@ import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -import com.mogo.map.navi.IMogoCarLocationChangedListener2; -import com.mogo.module.common.MogoApisHandler; import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager; import com.mogo.och.common.module.biz.common.socketmessage.data.OCHOperationalMessage; import com.mogo.och.common.module.biz.constant.LoginStatusManager; @@ -128,11 +128,11 @@ public class TaxiModel { private volatile boolean isRestartAutopilot = false; - private List mRoutePoints = new ArrayList<>(); + private List mRoutePoints = new ArrayList<>(); private int mPreRouteIndex = 0; private double mLongitude, mLatitude; - private Location mLocation = null; + private MogoLocation mLocation = null; private LoginService loginService; @@ -220,11 +220,9 @@ public class TaxiModel { CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 达到起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2); + + //定位监听, 传false是高德坐标系 + CallerMapLocationListenerManager.INSTANCE.addListener(TAG,mMapLocationLIstener,false); //2021.11.1 自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); @@ -258,11 +256,8 @@ public class TaxiModel { private void releaseListeners() { MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 注销到达起始站围栏监听 - MogoApisHandler.getInstance() - .getApis() - .getRegisterCenterApi() - .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); + // 注销地图监听 + CallerMapLocationListenerManager.INSTANCE.removeListener(TAG,false); OCHSocketMessageManager.INSTANCE.releaseSocketMessageListener(OCHSocketMessageManager.INSTANCE.getMsgMonitorType()); @@ -993,7 +988,7 @@ public class TaxiModel { } //根据围栏判断,是否到达起点 - private void judgeStartStation(Location location) { + private void judgeStartStation(MogoLocation location) { if (mCurrentOCHOrder == null || mCurrentOCHOrder.startSiteGcjPoint == null || mCurrentOCHOrder.startSiteGcjPoint.size() < 2) { return; @@ -1050,10 +1045,9 @@ public class TaxiModel { }; // 自车定位 - private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { - + private final IMoGoMapLocationListener mMapLocationLIstener = new IMoGoMapLocationListener() { @Override - public void onCarLocationChanged2(Location location) { + public void onLocationChanged(@Nullable MogoLocation location, int from, boolean isGps) { //位置变化时,通过围栏判断是否到达x点 if (location != null && checkCurrentOCHOrder()) { if (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToStart) { @@ -1074,7 +1068,7 @@ public class TaxiModel { } }; - private void judgeEndStation(Location location) { + private void judgeEndStation(MogoLocation location) { if (mCurrentOCHOrder == null || mCurrentOCHOrder.endSiteGcjPoint == null || mCurrentOCHOrder.endSiteGcjPoint.size() < 2) { return; @@ -1376,14 +1370,14 @@ public class TaxiModel { return; } if (mRoutePoints.size() > 0 && mLocation != null){ - Map> lastPointsMap = CoordinateCalculateRouteUtil + Map> lastPointsMap = CoordinateCalculateRouteUtil .getRemainPointListByCompareNew(mPreRouteIndex,mRoutePoints, mLocation); for (int index: lastPointsMap.keySet()) { mPreRouteIndex = index; break; } - for (List lastPoints: lastPointsMap.values()){ + for (List lastPoints: lastPointsMap.values()){ float lastSumLength = 0; if (lastPoints.size() == 1) { //只是最后一个点,计算当前位置和最后一个点的距离 lastSumLength = CoordinateUtils.calculateLineDistance( @@ -1437,7 +1431,7 @@ public class TaxiModel { public void onSuccess(QueryOrderRouteResp data) { if (data != null && data.data != null && mRoutePoints.size() == 0) { mRoutePoints.clear(); - List routePoints = CoordinateCalculateRouteUtil + List routePoints = CoordinateCalculateRouteUtil .coordinateConverterLatlngToLocation(data.data); mRoutePoints.addAll(routePoints); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 57e8d6cdf6..c869bb7fc2 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -12,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -313,7 +314,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } @Override - public void onCarLocationChanged(Location location) { + public void onCarLocationChanged(MogoLocation location) { if (null != location){ runOnUIThread(() -> { mView.updateSpeedView(location.getSpeed()); From 573bc5a3857daec44f7d96fdbaf60643d54fb36e Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 30 Nov 2022 15:51:21 +0800 Subject: [PATCH 08/16] =?UTF-8?q?2.13.0=20=E6=B7=BB=E5=8A=A0=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E9=9D=A2=E6=9D=BF=20obu=E7=8A=B6=E6=80=81=E7=9A=84?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/obu/mogo/MogoPrivateObuNewManager.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt index 32984120d6..21b7e3d2cd 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt @@ -122,6 +122,9 @@ class MogoPrivateObuNewManager private constructor() { * HV车辆基础信息 CvxHvCarIndInfo CvxHvInfoIndInfo */ override fun onMogoObuHvBasics(p0: MogoObuHvBasicsData?) { + mObuStatusInfo.obuHvStatus = true + CallerObuListenerManager.invokeListener(mObuStatusInfo) + if (p0 != null && p0.vehBasicsMsg != null) { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", @@ -169,6 +172,9 @@ class MogoPrivateObuNewManager private constructor() { */ override fun onMogoObuRvWarning(data: MogoObuRvWarningData) { super.onMogoObuRvWarning(data) + mObuStatusInfo.obuRvStatus = true + CallerObuListenerManager.invokeListener(mObuStatusInfo) + if (!data.warningMsg.warningData.isNullOrEmpty()) { // 更新数据,远车数据,之前要匹配uuid TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let { From 0d6938262c05a7f39eea2e3a20610131257f24ce Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 30 Nov 2022 15:22:13 +0800 Subject: [PATCH 09/16] [2.13.0] change the host location and fix bug of token problem --- .../mogo/launcher/stageone/HttpDnsStartUp.kt | 2 +- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 4 +- .../MoGoAdasMsgConnectStatusListenerImpl.kt | 52 ---------- .../entity/AutonomousDriveStatusBean.java | 41 -------- .../autopilot/entity/ReportSiteBean.java | 40 -------- .../autopilot/network/AdasServiceModel.java | 95 ------------------- .../autopilot/network/IAdasApiService.java | 31 ------ .../mogo/eagle/core/function/BindHostConst.kt | 26 ----- .../network/UpgradeAppNetWorkManager.java | 4 +- .../network/BindingcarNetWorkManager.java | 4 +- .../check/net/CheckApiServiceFactory.java | 2 +- .../funcconfig/network/FuncConfigHost.kt | 22 ----- .../network/FuncConfigNetWorkModel.kt | 3 +- .../network/UpgradeVersionNetWorkModel.kt | 2 +- .../dispatch/model/DispatchServiceModel.java | 2 +- .../core/function/overview/OverViewConst.kt | 7 -- .../function/overview/vm/OverViewModel.kt | 5 +- .../function/monitoring/CronTaskManager.kt | 2 +- .../events/network/V2XApiServiceFactory.java | 2 +- .../network/TrafficLightNetWorkModel.kt | 2 +- .../v2x/vip/network/VipNetWorkModel.kt | 2 +- .../data/autopilot/AutopilotStatusInfo.kt | 7 +- .../eagle/core/data/constants/HostConst.java | 28 ------ .../com/mogo/commons/constants/HostConst.kt | 36 +++++++ gradle.properties | 2 +- 25 files changed, 56 insertions(+), 367 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java delete mode 100644 core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java delete mode 100644 core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java delete mode 100644 core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java delete mode 100644 core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt delete mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt delete mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/OverViewConst.kt delete mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/HostConst.java create mode 100644 foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt diff --git a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt index bd03b1596e..5f10d0eb52 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -21,7 +21,7 @@ import com.mogo.commons.device.Devices import com.mogo.commons.network.NetConfigUtils import com.mogo.commons.network.Utils import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.constants.HostConst +import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_FAIL import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_SUCCESS diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index a06f425ef2..32ab95019c 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -204,7 +204,6 @@ class MoGoAdasListenerImpl : OnAdasListener { autopilotStatusInfo.camera = autopilotState.camera autopilotStatusInfo.rtk = autopilotState.rtk autopilotStatusInfo.radar = autopilotState.radar - autopilotStatusInfo.speed = autopilotState.speed.toFloat() autopilotStatusInfo.version = AdasManager.getInstance().adasVersion if (autopilotStatusInfo.connectIP == null) { autopilotStatusInfo.connectIP = AdasManager.getInstance().ipcConnectedIp @@ -214,7 +213,6 @@ class MoGoAdasListenerImpl : OnAdasListener { } AdasManager.getInstance().carConfig?.let { autopilotStatusInfo.dockVersion = it.dockVersion - AppConfigInfo.dockerVersion = it.dockVersion } CallerLogger.d("Upgrade", "origin = ${autopilotStatusInfo.connectStatus} -----now = ${AppConfigInfo.isConnectAutopilot} ") AppConfigInfo.isConnectAutopilot = autopilotStatusInfo.connectStatus @@ -320,9 +318,11 @@ class MoGoAdasListenerImpl : OnAdasListener { ) { if (carConfigResp != null) { //todo emArrow startUp时确认数据完整性 + AppConfigInfo.dockerVersion = carConfigResp.dockVersion AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 + AppConfigInfo.isConnectAutopilot = true invokeAutopilotCarConfigData(carConfigResp) } } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index bac4a75aaa..4b768c122d 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -1,13 +1,10 @@ package com.mogo.eagle.core.function.autopilot.adapter -import android.annotation.SuppressLint import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.debug.DebugConfig.* -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener -import com.mogo.eagle.core.function.autopilot.network.AdasServiceModel import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager @@ -22,9 +19,6 @@ import com.zhidao.support.adas.high.common.Constants import com.zhidao.support.adas.high.common.Constants.ENVIRONMENT.* import com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DRIVER import com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.PASSENGER -import mogo.telematics.pad.MessagePad -import java.util.* -import java.util.concurrent.atomic.AtomicBoolean /** * ADAS-SDK与工控机连接状态回调 @@ -33,18 +27,8 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, IMoGoAutopilotStatusListener, IMoGoCloudListener { private val TAG = "ConnectStatus" - //自动驾驶状态 - private var mCurrentAutopilotStatus = -1 - - //自动驾驶车速度 - private var mCurrentAutopilotSpeed = 0f - private var connectStatus = false - private val hasUploadTaskLaunched by lazy { AtomicBoolean(false) } - - private val timer = Timer() - init { CallerCloudListenerManager.registerCloudListener(TAG, this) } @@ -65,8 +49,6 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = true // 同步SN给工控机 syncBasicInfoToAutopilot() - // 开启轮询上传自动驾驶状态 - updateDriveStatusTask() //每次工控机连接成功后,需同步当前设置的美化模式状态 CallerAutoPilotManager.setDemoMode(FunctionBuildConfig.isDemoMode) //当连接状态是关闭美化模式时,同步给工控机 @@ -89,8 +71,6 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, AdasManager.getInstance().ipcConnectedPort CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = false //与工控机断开连接,需要重置自动驾驶状态(包括上传至云平台缓存信息),等待连接成功后同步状态信息 - mCurrentAutopilotStatus = 0 - mCurrentAutopilotSpeed = 0.0f CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state = 0 CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().pilotmode = 0 } else if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTING) { @@ -117,21 +97,6 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, syncBasicInfoToAutopilot() } - override fun onAutopilotArriveAtStation(arrivalNotification: MessagePad.ArrivalNotification?) { - if (arrivalNotification != null && arrivalNotification.endLocation != null) { - val lon = arrivalNotification.endLocation.longitude - val lat = arrivalNotification.endLocation.latitude - AdasServiceModel.getInstance().reportSite(lon, lat) - } - } - - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - val state = autoPilotStatusInfo.state - val speed = autoPilotStatusInfo.speed - mCurrentAutopilotStatus = state - mCurrentAutopilotSpeed = speed - } - /** * 同步SN信息给工控机 */ @@ -174,23 +139,6 @@ class MoGoAdasMsgConnectStatusListenerImpl : OnAdasConnectStatusListener, } } - /** - * 上传自动驾驶状态任务 - */ - @SuppressLint("CheckResult") - private fun updateDriveStatusTask() { - if (hasUploadTaskLaunched.compareAndSet(false, true)) { - timer.schedule(object : TimerTask() { - override fun run() { - CallerLogger.d("$M_ADAS_IMPL$TAG", "updateDriveStatusTask") - AdasServiceModel.getInstance() - .updateDriveStatus(mCurrentAutopilotStatus, mCurrentAutopilotSpeed) - } - }, 0, 5000) - } - - } - override fun tokenGot(token: String, sn: String) { syncBasicInfoToAutopilot(sn) } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java deleted file mode 100644 index ffbd292b4c..0000000000 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mogo.eagle.core.function.autopilot.entity; - -/** - * Created by SuYong on 2021/5/28 16:12 - */ -public class AutonomousDriveStatusBean { - - private String sn; - private int status; - private float vehicleSpeed; - - public AutonomousDriveStatusBean(String sn, int status, float vehicleSpeed) { - this.sn = sn; - this.status = status; - this.vehicleSpeed = vehicleSpeed; - } - - public String getSn() { - return sn; - } - - public void setSn(String sn) { - this.sn = sn; - } - - public int getStatus() { - return status; - } - - public void setStatus(int status) { - this.status = status; - } - - public float getVehicleSpeed() { - return vehicleSpeed; - } - - public void setVehicleSpeed(float vehicleSpeed) { - this.vehicleSpeed = vehicleSpeed; - } -} diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java deleted file mode 100644 index 1d12392d24..0000000000 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mogo.eagle.core.function.autopilot.entity; - -/** - * Created by SuYong on 2021/5/31 16:24 - */ -public class ReportSiteBean { - private String sn; - private double lon; - private double lat; - - public ReportSiteBean(String sn, double lon, double lat) { - this.sn = sn; - this.lon = lon; - this.lat = lat; - } - - public String getSn() { - return sn; - } - - public void setSn(String sn) { - this.sn = sn; - } - - public double getLon() { - return lon; - } - - public void setLon(double lon) { - this.lon = lon; - } - - public double getLat() { - return lat; - } - - public void setLat(double lat) { - this.lat = lat; - } -} diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java deleted file mode 100644 index a3b2c27275..0000000000 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.mogo.eagle.core.function.autopilot.network; - -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.commons.context.ContextHolderUtil; -import com.mogo.eagle.core.data.BaseData; -import com.mogo.eagle.core.function.autopilot.entity.AutonomousDriveStatusBean; -import com.mogo.eagle.core.function.autopilot.entity.ReportSiteBean; -import com.mogo.eagle.core.network.MoGoRetrofitFactory; -import com.mogo.eagle.core.network.RequestOptions; -import com.mogo.eagle.core.network.SubscribeImpl; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.data.constants.HostConst; - -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; -import okhttp3.MediaType; -import okhttp3.RequestBody; - -/** - * 将自动驾驶状态及站点信息上传给云平台,云平台会根据此数据做路线的绘制 - * - * @author dongghongyu - */ -public class AdasServiceModel { - - private static final String TAG = "AdasServiceModel"; - private static volatile AdasServiceModel instance; - private static final byte[] obj = new byte[0]; - - private final IAdasApiService mAdasApiService; - - private AdasServiceModel() { - this.mAdasApiService = MoGoRetrofitFactory.getInstance(HostConst.DATA_SERVICE_HOST).create(IAdasApiService.class); - } - - public static AdasServiceModel getInstance() { - if (instance == null) { - synchronized (obj) { - if (instance == null) { - instance = new AdasServiceModel(); - } - } - } - return instance; - } - - public void updateDriveStatus(int autoPilotStatus, float autoPilotSpeed) { - String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - AutonomousDriveStatusBean request = new AutonomousDriveStatusBean(sn, autoPilotStatus, autoPilotSpeed); - RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); - mAdasApiService.updateAutonomousDriveStatus(requestBody). - subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(new SubscribeImpl(RequestOptions.create(ContextHolderUtil.getContext())) { - @Override - public void onError(String message, int code) { - super.onError(message, code); - } - - @Override - public void onError(Throwable e) { - super.onError(e); - } - - @Override - public void onSuccess(BaseData o) { - super.onSuccess(o); - } - }); - } - - public void reportSite(double lon, double lat) { - String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - ReportSiteBean reportSiteBean = new ReportSiteBean(sn, lon, lat); - RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(reportSiteBean)); - mAdasApiService.updateReportSite(requestBody). - subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(new SubscribeImpl(RequestOptions.create(ContextHolderUtil.getContext())) { - @Override - public void onError(String message, int code) { - super.onError(message, code); - } - - @Override - public void onError(Throwable e) { - super.onError(e); - } - - @Override - public void onSuccess(BaseData o) { - super.onSuccess(o); - } - }); - } - -} diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java deleted file mode 100644 index b9565cf782..0000000000 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.mogo.eagle.core.function.autopilot.network; - -import com.mogo.eagle.core.data.BaseData; - -import io.reactivex.Observable; -import okhttp3.RequestBody; -import retrofit2.http.Body; -import retrofit2.http.Headers; -import retrofit2.http.POST; - -public interface IAdasApiService { - - /** - * 上传自动驾驶状态接口 - * @param requestBody - * @return - */ - @Headers({"Content-Type:application/json;charset=UTF-8"}) - @POST("/dataService/autonomousDrive/updateAutonomousDriveStatus") - Observable updateAutonomousDriveStatus(@Body RequestBody requestBody); - - /** - * 站点上报 用于网约车业务 云平台绘制路线使用 - * @param requestBody - * @return - */ - @Headers({"Content-Type:application/json;charset=UTF-8"}) - @POST("/dataService/autonomousDrive/reportSite") - Observable updateReportSite(@Body RequestBody requestBody); - -} diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt deleted file mode 100644 index 04bf67be17..0000000000 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/BindHostConst.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.mogo.eagle.core.function - -import com.mogo.commons.debug.DebugConfig - -/** - * cmdb 域名 - */ -class BindHostConst { - - companion object { - private const val UPGRADE_APP_HOST_DEV = "https://eagle-qa.zhidaozhixing.com/" - private const val UPGRADE_APP_HOST = "http://eagle-mis.zhidaozhixing.com/" - - @JvmStatic - fun getBaseUrl(): String { - return when (DebugConfig.getNetMode()) { - DebugConfig.NET_MODE_DEV -> UPGRADE_APP_HOST_DEV - DebugConfig.NET_MODE_QA -> UPGRADE_APP_HOST_DEV - DebugConfig.NET_MODE_DEMO -> UPGRADE_APP_HOST - DebugConfig.NET_MODE_RELEASE -> UPGRADE_APP_HOST - else -> UPGRADE_APP_HOST - } - } - } - -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java index 5103ef62c7..5bf1b0d44c 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java @@ -5,8 +5,8 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BIN import android.content.Context; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.constants.HostConst; import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo; -import com.mogo.eagle.core.function.BindHostConst; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.network.MoGoRetrofitFactory; import com.mogo.eagle.core.network.utils.GsonUtil; @@ -33,7 +33,7 @@ public class UpgradeAppNetWorkManager { private UpgradeAppNetWorkManager() { - mUpgradeApiService = MoGoRetrofitFactory.getInstance(BindHostConst.getBaseUrl()) + mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.Companion.getHost()) .create(UpgradeApiService.class); } diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java index d4b2287e7d..261e5498b2 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java @@ -3,10 +3,10 @@ package com.mogo.eagle.core.function.bindingcar.network; import android.content.Context; import android.util.Log; +import com.mogo.commons.constants.HostConst; import com.mogo.commons.constants.SharedPrefsConstants; import com.mogo.eagle.core.data.bindingcar.BindingcarInfo; import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo; -import com.mogo.eagle.core.function.BindHostConst; import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.network.MoGoRetrofitFactory; @@ -35,7 +35,7 @@ public class BindingcarNetWorkManager { private static final String TAG = "BindingcarNetManager"; private BindingcarNetWorkManager() { - mBindingcarApiService = MoGoRetrofitFactory.getInstance(BindHostConst.getBaseUrl()) + mBindingcarApiService = MoGoRetrofitFactory.getInstance(HostConst.Companion.getHost()) .create(BindingcarApiService.class); } diff --git a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java index f0093f5a1b..cdd018991a 100644 --- a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java +++ b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java @@ -1,7 +1,7 @@ package com.mogo.eagle.core.function.check.net; import com.mogo.eagle.core.network.MoGoRetrofitFactory; -import com.mogo.eagle.core.data.constants.HostConst; +import com.mogo.commons.constants.HostConst; /** * @author liujing diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt deleted file mode 100644 index 1d8648ec24..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.funcconfig.network - -import com.mogo.commons.debug.DebugConfig - -class FuncConfigHost { - - companion object{ - private const val HOST_DEV = "https://eagle-qa.zhidaozhixing.com" - private const val HOST_RELEASE = "https://eagle.zhidaozhixing.com" - - fun get(): String{ - return when (DebugConfig.getNetMode()) { - DebugConfig.NET_MODE_DEV -> HOST_DEV - DebugConfig.NET_MODE_QA -> HOST_DEV - DebugConfig.NET_MODE_DEMO -> HOST_RELEASE - DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE - else -> HOST_RELEASE - } - } - } - -} \ 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/funcconfig/network/FuncConfigNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt index 10540e4e12..21bbdf98ba 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt @@ -1,6 +1,7 @@ package com.zhjt.mogo_core_function_devatools.funcconfig.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiCall @@ -11,7 +12,7 @@ import com.zhjt.service_biz.FuncConfig class FuncConfigNetWorkModel { - private fun getNetWorkApi(baseUrl: String = FuncConfigHost.get()): FuncConfigApiService { + private fun getNetWorkApi(baseUrl: String = HostConst.getHost()): FuncConfigApiService { return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) .create(FuncConfigApiService::class.java) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt index 6170901949..2aad01f127 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt @@ -4,7 +4,7 @@ import com.mogo.eagle.core.data.Response import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiResponseCall import com.mogo.eagle.core.network.request -import com.mogo.eagle.core.data.constants.HostConst +import com.mogo.commons.constants.HostConst import com.zhjt.mogo_core_function_devatools.upgrade.network.HostConst.Companion.getBaseUrl class UpgradeVersionNetWorkModel { diff --git a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java index e214e9a3ab..64e488cf90 100644 --- a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java +++ b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java @@ -1,7 +1,7 @@ package com.zhjt.dispatch.model; import static com.mogo.commons.context.ContextHolderUtil.getContext; -import static com.mogo.eagle.core.data.constants.HostConst.DATA_SERVICE_HOST; +import static com.mogo.commons.constants.HostConst.DATA_SERVICE_HOST; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.eagle.core.data.BaseData; diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/OverViewConst.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/OverViewConst.kt deleted file mode 100644 index cefa2c5968..0000000000 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/OverViewConst.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mogo.eagle.core.function.overview - -class OverViewConst { - companion object { - const val CLOUD_HOST = "https://eagle-qa.zhidaozhixing.com" - } -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt index f6102fc24c..4cdff6fe9b 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt @@ -1,8 +1,8 @@ package com.mogo.eagle.core.function.overview.vm import androidx.lifecycle.* +import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.map.Infrastructure -import com.mogo.eagle.core.function.overview.OverViewConst import com.mogo.eagle.core.function.overview.OverviewDao import com.mogo.eagle.core.function.overview.remote.OverViewServiceApi import com.mogo.eagle.core.function.overview.remote.V2XEvent @@ -10,7 +10,6 @@ import com.mogo.eagle.core.network.MoGoRetrofitFactory import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable -import io.reactivex.functions.Consumer import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit @@ -79,7 +78,7 @@ class OverViewModel( // 1分钟查询一次 disposable = Observable.interval(0, 60000, TimeUnit.SECONDS) .flatMap { - MoGoRetrofitFactory.getInstance(OverViewConst.CLOUD_HOST) + MoGoRetrofitFactory.getInstance(HostConst.getHost()) .create(OverViewServiceApi::class.java) .queryAllV2XEventsByLineId(lineId, sn) .map { diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt index 6608dd9c18..93f95cdd3d 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt @@ -12,7 +12,7 @@ import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR import com.mogo.map.MogoLocationClient -import com.mogo.eagle.core.data.constants.HostConst +import com.mogo.commons.constants.HostConst import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XApiServiceFactory.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XApiServiceFactory.java index b20266d1f5..354cea4a28 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XApiServiceFactory.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XApiServiceFactory.java @@ -1,7 +1,7 @@ package com.mogo.eagle.core.function.v2x.events.network; import com.mogo.eagle.core.network.MoGoRetrofitFactory; -import com.mogo.eagle.core.data.constants.HostConst; +import com.mogo.commons.constants.HostConst; /** * 应对不同接口对应不同服务域名的工厂累 diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightNetWorkModel.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightNetWorkModel.kt index 880ecafd32..af653fec0b 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightNetWorkModel.kt @@ -8,7 +8,7 @@ import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiCall import com.mogo.eagle.core.network.cancel import com.mogo.eagle.core.network.request -import com.mogo.eagle.core.data.constants.HostConst.CITY_HOST +import com.mogo.commons.constants.HostConst.CITY_HOST class TrafficLightNetWorkModel { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/network/VipNetWorkModel.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/network/VipNetWorkModel.kt index 350a24dc78..20d2104864 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/network/VipNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/network/VipNetWorkModel.kt @@ -6,7 +6,7 @@ import com.mogo.eagle.core.data.v2x.VipRequest import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiCall import com.mogo.eagle.core.network.request -import com.mogo.eagle.core.data.constants.HostConst.DATA_SERVICE_HOST +import com.mogo.commons.constants.HostConst.DATA_SERVICE_HOST class VipNetWorkModel { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt index f0dd46a78b..e336af0e30 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt @@ -46,11 +46,6 @@ open class AutopilotStatusInfo : Serializable, Cloneable { @Volatile var satelliteTime = 0.0 - /** - * 车速 m/s - */ - var speed = 0f - /** * 自动驾驶状态 0是不可用 1是ready 2是自动驾驶start */ @@ -94,7 +89,7 @@ open class AutopilotStatusInfo : Serializable, Cloneable { return "connectIP=$connectIP, connectPort=$connectPort, " + "connectStatus=$connectStatus, connectDescribe=$connectStatusDescribe, version=$version, dockVersion=$dockVersion," + " locationStatus=$locationStatus), locationLat=$locationLat, locationLon=$locationLon," + - " satelliteTime=$satelliteTime, speed=$speed, state=$state, reason=$reason, camera=$camera," + + " satelliteTime=$satelliteTime, state=$state, reason=$reason, camera=$camera," + " radar=$radar, rtk=$rtk, pilotmode=$pilotmode, ipcConnStatus=$ipcConnStatus, autopilotControlParameters=$autopilotControlParameters" } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/HostConst.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/HostConst.java deleted file mode 100644 index b5ca4488e6..0000000000 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/HostConst.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.mogo.eagle.core.data.constants; - -/** - * 通用接口请求host - * - * @author tong - */ -public class HostConst { - public static final String DEVA_HOST = "http://dzt-deva.zhidaozhixing.com"; - public static final String LAUNCHER_SNAPSHOT_HOST = "http://dzt-launcherSnapshot.zhidaozhixing.com"; - public static final String DATA_SERVICE_HOST = "http://dzt-dataService.zhidaozhixing.com"; - public static final String REALTIME_LOCATION_HOST = "http://dzt-realtimeLocation.zhidaozhixing.com"; - public static final String GEOFENCE_HOST = "http://dzt-geoFenceCarService.zhidaozhixing.com"; - public static final String CARLIFE_HOST = "http://dzt-carlife.zhidaozhixing.com"; - public static final String STRATEGY_PUSH_HOST = "http://dzt-strategyPush.zhidaozhixing.com"; - public static final String CAMERA_STREAM_HOST = "http://dzt-smartTransportationAiCloud.zhidaozhixing.com"; - public static final String OPEN_CAMERA_STREAM_HOST = "http://10.0.16.6:18080"; - - public static final String CITY_HOST = "http://dzt-city.zhidaozhixing.com"; - public static final String SOCKET_CENTER_DOMAIN = "socketRegion"; - -// public static final String UPGRADE_APP_HOST_TEST = "http://10.0.200.12:32423?/"; - public static final String UPGRADE_APP_HOST = "http://eagle-mis.zhidaozhixing.com/"; - - public static final String CMDB_HOST = "http://eagle-mis.zhidaozhixing.com/eagleEye-mis/cmdbapi/"; - - -} diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt new file mode 100644 index 0000000000..d134c4ac51 --- /dev/null +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt @@ -0,0 +1,36 @@ +package com.mogo.commons.constants + +import com.mogo.commons.debug.DebugConfig + +/** + * 通用接口请求host + */ +class HostConst { + companion object{ + const val DEVA_HOST = "http://dzt-deva.zhidaozhixing.com" + const val DATA_SERVICE_HOST = "http://dzt-dataService.zhidaozhixing.com" + const val REALTIME_LOCATION_HOST = "http://dzt-realtimeLocation.zhidaozhixing.com" + const val GEOFENCE_HOST = "http://dzt-geoFenceCarService.zhidaozhixing.com" + const val STRATEGY_PUSH_HOST = "http://dzt-strategyPush.zhidaozhixing.com" + const val CAMERA_STREAM_HOST = "http://dzt-smartTransportationAiCloud.zhidaozhixing.com" + const val OPEN_CAMERA_STREAM_HOST = "http://10.0.16.6:18080" + const val CITY_HOST = "http://dzt-city.zhidaozhixing.com" + const val SOCKET_CENTER_DOMAIN = "socketRegion" + + // public static final String UPGRADE_APP_HOST_TEST = "http://10.0.200.12:32423?/"; + const val CMDB_HOST = "http://eagle-mis.zhidaozhixing.com/eagleEye-mis/cmdbapi/" + + private const val HOST_DEV = "https://eagle-qa.zhidaozhixing.com" + private const val HOST_RELEASE = "https://eagle-mis.zhidaozhixing.com" + + fun getHost():String{ + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV -> HOST_DEV + DebugConfig.NET_MODE_QA -> HOST_DEV + DebugConfig.NET_MODE_DEMO -> HOST_RELEASE + DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE + else -> HOST_RELEASE + } + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 91c4f15541..d9d4f30730 100644 --- a/gradle.properties +++ b/gradle.properties @@ -63,7 +63,7 @@ BIZCONFIG_VERSION=1.3.2 SERVICE_BIZ_VERSION=1.2.4 ################ 外部依赖引用 ################ # loglib -LOGLIB_VERSION=1.5.7 +LOGLIB_VERSION=1.5.8 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION MOGO_NETWORK_VERSION=1.4.3.26 From fbb15bcf47d2a7cfd9ba10da29be300bd4365d21 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 30 Nov 2022 16:23:32 +0800 Subject: [PATCH 10/16] [2.13.0] change the host const loc --- .../mogo/launcher/stageone/HttpDnsStartUp.kt | 2 +- .../network/UpgradeAppNetWorkManager.java | 2 +- .../network/BindingcarNetWorkManager.java | 2 +- .../check/net/CheckApiServiceFactory.java | 2 +- .../network/UpgradeVersionNetWorkModel.kt | 6 +-- .../mogo-core-function-dispatch/build.gradle | 2 +- .../dispatch/model/DispatchServiceModel.java | 4 +- .../build.gradle | 1 + .../function/monitoring/CronTaskManager.kt | 2 +- .../com/mogo/commons/constants/HostConst.java | 37 +++++++++++++++++++ .../com/mogo/commons/constants/HostConst.kt | 36 ------------------ 11 files changed, 48 insertions(+), 48 deletions(-) create mode 100644 foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java delete mode 100644 foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt diff --git a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt index 5f10d0eb52..a6ff98ac7e 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -15,13 +15,13 @@ import com.mogo.cloud.passport.IMoGoTokenCallback import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.constants.HostConst import com.mogo.commons.constants.SharedPrefsConstants import com.mogo.commons.debug.DebugConfig import com.mogo.commons.device.Devices import com.mogo.commons.network.NetConfigUtils import com.mogo.commons.network.Utils import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_FAIL import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_CONNECT_SUCCESS diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java index 5bf1b0d44c..6ee94ac086 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java @@ -33,7 +33,7 @@ public class UpgradeAppNetWorkManager { private UpgradeAppNetWorkManager() { - mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.Companion.getHost()) + mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.getHost()) .create(UpgradeApiService.class); } diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java index 261e5498b2..d9c1726171 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java @@ -35,7 +35,7 @@ public class BindingcarNetWorkManager { private static final String TAG = "BindingcarNetManager"; private BindingcarNetWorkManager() { - mBindingcarApiService = MoGoRetrofitFactory.getInstance(HostConst.Companion.getHost()) + mBindingcarApiService = MoGoRetrofitFactory.getInstance(HostConst.getHost()) .create(BindingcarApiService.class); } diff --git a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java index cdd018991a..b8cf015887 100644 --- a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java +++ b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/net/CheckApiServiceFactory.java @@ -1,7 +1,7 @@ package com.mogo.eagle.core.function.check.net; -import com.mogo.eagle.core.network.MoGoRetrofitFactory; import com.mogo.commons.constants.HostConst; +import com.mogo.eagle.core.network.MoGoRetrofitFactory; /** * @author liujing diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt index 2aad01f127..ae74252670 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/network/UpgradeVersionNetWorkModel.kt @@ -4,12 +4,10 @@ import com.mogo.eagle.core.data.Response import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiResponseCall import com.mogo.eagle.core.network.request -import com.mogo.commons.constants.HostConst -import com.zhjt.mogo_core_function_devatools.upgrade.network.HostConst.Companion.getBaseUrl class UpgradeVersionNetWorkModel { - private fun getNetWorkApi(baseUrl: String = HostConst.CITY_HOST): UpgradeVersionApiService { + private fun getNetWorkApi(baseUrl: String = HostConst.getBaseUrl()): UpgradeVersionApiService { return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) .create(UpgradeVersionApiService::class.java) } @@ -22,7 +20,7 @@ class UpgradeVersionNetWorkModel { request> { loader { apiResponseCall { - getNetWorkApi(getBaseUrl()).getUpgradeVersion( + getNetWorkApi().getUpgradeVersion( versionName ) } diff --git a/core/function-impl/mogo-core-function-dispatch/build.gradle b/core/function-impl/mogo-core-function-dispatch/build.gradle index f7168c62e7..b76080d0f6 100644 --- a/core/function-impl/mogo-core-function-dispatch/build.gradle +++ b/core/function-impl/mogo-core-function-dispatch/build.gradle @@ -62,7 +62,7 @@ dependencies { implementation rootProject.ext.dependencies.mogo_core_network implementation rootProject.ext.dependencies.mogo_core_function_call }else{ - + implementation project(":foudations:mogo-commons") implementation project(':modules:mogo-module-common') implementation project(':core:mogo-core-data') diff --git a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java index 64e488cf90..160825acee 100644 --- a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java +++ b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/model/DispatchServiceModel.java @@ -1,9 +1,9 @@ package com.zhjt.dispatch.model; import static com.mogo.commons.context.ContextHolderUtil.getContext; -import static com.mogo.commons.constants.HostConst.DATA_SERVICE_HOST; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.constants.HostConst; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; import com.mogo.eagle.core.data.autopilot.AutopilotStatus; @@ -34,7 +34,7 @@ public class DispatchServiceModel { private final IDispatchAdasApiService mAdasApiService; private DispatchServiceModel() { - mAdasApiService = MoGoRetrofitFactory.getInstance(DATA_SERVICE_HOST).create(IDispatchAdasApiService.class); + mAdasApiService = MoGoRetrofitFactory.getInstance(HostConst.DATA_SERVICE_HOST).create(IDispatchAdasApiService.class); } public static DispatchServiceModel getInstance() { diff --git a/core/function-impl/mogo-core-function-monitoring/build.gradle b/core/function-impl/mogo-core-function-monitoring/build.gradle index 9b0b62b968..6a91089dfd 100644 --- a/core/function-impl/mogo-core-function-monitoring/build.gradle +++ b/core/function-impl/mogo-core-function-monitoring/build.gradle @@ -65,6 +65,7 @@ dependencies { implementation project(':core:mogo-core-function-api') implementation project(':core:mogo-core-function-call') implementation project(':modules:mogo-module-common') + implementation project(":foudations:mogo-commons") } } diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt index 93f95cdd3d..8e310b7ab7 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt @@ -4,6 +4,7 @@ import android.content.Context import android.os.Handler import android.os.Looper import android.os.Message +import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.camera.CameraEntity import com.mogo.eagle.core.data.camera.ReqLiveCarBean import com.mogo.eagle.core.function.call.hmi.CallerHmiManager @@ -12,7 +13,6 @@ import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR import com.mogo.map.MogoLocationClient -import com.mogo.commons.constants.HostConst import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java new file mode 100644 index 0000000000..36eeae34d5 --- /dev/null +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java @@ -0,0 +1,37 @@ +package com.mogo.commons.constants; + +import com.mogo.commons.debug.DebugConfig; + +public class HostConst { + public static final String DEVA_HOST = "http://dzt-deva.zhidaozhixing.com"; + public static final String DATA_SERVICE_HOST = "http://dzt-dataService.zhidaozhixing.com"; + public static final String REALTIME_LOCATION_HOST = "http://dzt-realtimeLocation.zhidaozhixing.com"; + public static final String GEOFENCE_HOST = "http://dzt-geoFenceCarService.zhidaozhixing.com"; + public static final String CARLIFE_HOST = "http://dzt-carlife.zhidaozhixing.com"; + public static final String STRATEGY_PUSH_HOST = "http://dzt-strategyPush.zhidaozhixing.com"; + public static final String CAMERA_STREAM_HOST = "http://dzt-smartTransportationAiCloud.zhidaozhixing.com"; + public static final String OPEN_CAMERA_STREAM_HOST = "http://10.0.16.6:18080"; + + public static final String CITY_HOST = "http://dzt-city.zhidaozhixing.com"; + public static final String SOCKET_CENTER_DOMAIN = "socketRegion"; + + // public static final String UPGRADE_APP_HOST_TEST = "http://10.0.200.12:32423?/"; + public static final String UPGRADE_APP_HOST = "http://eagle-mis.zhidaozhixing.com/"; + + public static final String CMDB_HOST = "http://eagle-mis.zhidaozhixing.com/eagleEye-mis/cmdbapi/"; + + public static final String HOST_DEV = "https://eagle-qa.zhidaozhixing.com"; + public static final String HOST_RELEASE = "https://eagle-mis.zhidaozhixing.com"; + + public static String getHost() { + String host = HOST_RELEASE; + switch (DebugConfig.getNetMode()) { + case DebugConfig.NET_MODE_DEV: + case DebugConfig.NET_MODE_QA: + host = HOST_DEV; + break; + } + return host; + } + +} diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt deleted file mode 100644 index d134c4ac51..0000000000 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.mogo.commons.constants - -import com.mogo.commons.debug.DebugConfig - -/** - * 通用接口请求host - */ -class HostConst { - companion object{ - const val DEVA_HOST = "http://dzt-deva.zhidaozhixing.com" - const val DATA_SERVICE_HOST = "http://dzt-dataService.zhidaozhixing.com" - const val REALTIME_LOCATION_HOST = "http://dzt-realtimeLocation.zhidaozhixing.com" - const val GEOFENCE_HOST = "http://dzt-geoFenceCarService.zhidaozhixing.com" - const val STRATEGY_PUSH_HOST = "http://dzt-strategyPush.zhidaozhixing.com" - const val CAMERA_STREAM_HOST = "http://dzt-smartTransportationAiCloud.zhidaozhixing.com" - const val OPEN_CAMERA_STREAM_HOST = "http://10.0.16.6:18080" - const val CITY_HOST = "http://dzt-city.zhidaozhixing.com" - const val SOCKET_CENTER_DOMAIN = "socketRegion" - - // public static final String UPGRADE_APP_HOST_TEST = "http://10.0.200.12:32423?/"; - const val CMDB_HOST = "http://eagle-mis.zhidaozhixing.com/eagleEye-mis/cmdbapi/" - - private const val HOST_DEV = "https://eagle-qa.zhidaozhixing.com" - private const val HOST_RELEASE = "https://eagle-mis.zhidaozhixing.com" - - fun getHost():String{ - return when (DebugConfig.getNetMode()) { - DebugConfig.NET_MODE_DEV -> HOST_DEV - DebugConfig.NET_MODE_QA -> HOST_DEV - DebugConfig.NET_MODE_DEMO -> HOST_RELEASE - DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE - else -> HOST_RELEASE - } - } - } -} \ No newline at end of file From b186d67541c38e544eb4becdaf6cd1ca0226c7a6 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 30 Nov 2022 16:48:32 +0800 Subject: [PATCH 11/16] =?UTF-8?q?[2.13.0][fix]=E8=AE=A2=E5=8D=95=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E7=9A=84=E6=97=B6=E5=80=99=E5=85=A8=E8=A7=88=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E8=BD=AE=E8=AF=A2V2X=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/eagle/core/function/overview/vm/OverViewModel.kt | 3 +++ .../mogo/eagle/core/function/smp/OverviewMapFragment.java | 8 ++++++++ .../core/function/api/map/smp/IMogoSmallMapProvider.java | 2 ++ .../mogo/eagle/core/function/call/map/CallerSmpManager.kt | 5 +++++ 4 files changed, 18 insertions(+) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt index 4cdff6fe9b..74e24d0cac 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt @@ -75,6 +75,9 @@ class OverViewModel( } fun getAllV2XEventsByLineId(lineId: String, sn: String) { + if (disposable != null && !disposable!!.isDisposed) { + disposable!!.dispose() + } // 1分钟查询一次 disposable = Observable.interval(0, 60000, TimeUnit.SECONDS) .flatMap { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java index 3b626ed794..e9370d84dd 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java @@ -78,6 +78,14 @@ public class OverviewMapFragment extends BaseFragment } } + @Override + public void startQueryV2XEvents() { + long lineId = getLineId(); + if (lineId > 0) { + mViewModel.getAllV2XEventsByLineId("" + lineId, MoGoAiCloudClientConfig.getInstance().getSn()); + } + } + @Override public void clearV2XMarkers() { if (Thread.currentThread() != Looper.getMainLooper().getThread()) { diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/smp/IMogoSmallMapProvider.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/smp/IMogoSmallMapProvider.java index 9ff30c8670..0589535390 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/smp/IMogoSmallMapProvider.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/smp/IMogoSmallMapProvider.java @@ -30,5 +30,7 @@ public interface IMogoSmallMapProvider { */ void clearPolyline(); + default void startQueryV2XEvents() {} + default void clearV2XMarkers() {} } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt index 13e5153fa9..52e17b88aa 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt @@ -48,6 +48,11 @@ object CallerSmpManager : CallerBase() { mogoSmallMapProvider.hidePanel() } + @JvmStatic + fun startQueryV2XEvents() { + mogoSmallMapProvider.startQueryV2XEvents() + } + @JvmStatic fun clearV2XMarkers() { mogoSmallMapProvider.clearV2XMarkers() From 7cb685336250112a35736f9951eb31c4f0028f70 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 30 Nov 2022 17:34:14 +0800 Subject: [PATCH 12/16] =?UTF-8?q?[2.13.0]=20taxi=E4=B9=98=E5=AE=A2?= =?UTF-8?q?=E5=B1=8F=E5=85=A8=E8=A7=88=E6=A8=A1=E5=BC=8FV2X=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 8044606a9a..5478bbbe1a 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -198,6 +198,7 @@ public class BaseTaxiPassengerPresenter extends Presenter Date: Wed, 30 Nov 2022 18:13:09 +0800 Subject: [PATCH 13/16] =?UTF-8?q?[2.13.0][fix]=E5=85=A8=E8=A7=88=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E5=BC=80=E5=90=AF=E3=80=81=E7=BB=93=E6=9D=9FV2X?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=AE=9A=E6=97=B6=E8=BD=AE=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/smp/OverviewMapFragment.java | 23 ++++++++++--------- .../function/call/map/CallerSmpManager.kt | 22 ++++++++++++++++-- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java index e9370d84dd..12b07a5c10 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java @@ -33,7 +33,7 @@ import java.util.List; @Route(path = MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW) public class OverviewMapFragment extends BaseFragment implements IMogoSmallMapProvider { - private final String TAG = "SmallMapFragment"; + private final String TAG = "OverviewMapFragment"; protected AMapCustomView mAMapCustomView; private OverViewModel mViewModel; @@ -80,22 +80,24 @@ public class OverviewMapFragment extends BaseFragment @Override public void startQueryV2XEvents() { - long lineId = getLineId(); - if (lineId > 0) { - mViewModel.getAllV2XEventsByLineId("" + lineId, MoGoAiCloudClientConfig.getInstance().getSn()); + if (isAdded()) { + long lineId = getLineId(); + if (lineId > 0 && mViewModel != null) { + mViewModel.getAllV2XEventsByLineId("" + lineId, MoGoAiCloudClientConfig.getInstance().getSn()); + } } } @Override public void clearV2XMarkers() { - if (Thread.currentThread() != Looper.getMainLooper().getThread()) { - UiThreadHandler.post(() -> { + if (isAdded()) { + if (mAMapCustomView != null) { mAMapCustomView.clearV2XMarkers(); - }); - } else { - mAMapCustomView.clearV2XMarkers(); + } + if (mViewModel != null) { + mViewModel.stopQueryV2XEvents(); + } } - mViewModel.stopQueryV2XEvents(); } @Override @@ -136,7 +138,6 @@ public class OverviewMapFragment extends BaseFragment } /** - * * @return Taxi的下发的轨迹id */ private long getLineId() { diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt index 52e17b88aa..b910a61e25 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt @@ -1,10 +1,12 @@ package com.mogo.eagle.core.function.call.map +import android.os.Looper import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.constants.MoGoFragmentPaths import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.function.api.map.smp.IMogoSmallMapProvider import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.utilcode.util.UiThreadHandler /** * @author xiaoyuzhou @@ -16,6 +18,10 @@ object CallerSmpManager : CallerBase() { get() = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_SMP) .navigation() as IMogoSmallMapProvider + private val mogoOverViewMapProvider: IMogoSmallMapProvider + get() = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW) + .navigation() as IMogoSmallMapProvider + /** * 绘制路径线 */ @@ -50,11 +56,23 @@ object CallerSmpManager : CallerBase() { @JvmStatic fun startQueryV2XEvents() { - mogoSmallMapProvider.startQueryV2XEvents() + if (Thread.currentThread() !== Looper.getMainLooper().thread) { + UiThreadHandler.post { + mogoOverViewMapProvider.startQueryV2XEvents() + } + } else { + mogoOverViewMapProvider.startQueryV2XEvents() + } } @JvmStatic fun clearV2XMarkers() { - mogoSmallMapProvider.clearV2XMarkers() + if (Thread.currentThread() !== Looper.getMainLooper().thread) { + UiThreadHandler.post { + mogoOverViewMapProvider.clearV2XMarkers() + } + } else { + mogoOverViewMapProvider.clearV2XMarkers() + } } } \ No newline at end of file From 55a29607c9a796ec7765a37e61fceff8975dd162 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 30 Nov 2022 19:47:32 +0800 Subject: [PATCH 14/16] =?UTF-8?q?[2.13.0]=20=E6=82=AC=E6=B5=AE=E7=AA=97?= =?UTF-8?q?=E6=9D=83=E9=99=90=E9=97=AE=E9=A2=98=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/hmi/dialog/BaseFloatDialog.java | 14 ++++++++++---- .../mogo/eagle/core/utilcode/util/ToastUtils.java | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/dialog/BaseFloatDialog.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/dialog/BaseFloatDialog.java index 2622eb1baf..7435516b70 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/dialog/BaseFloatDialog.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/dialog/BaseFloatDialog.java @@ -9,10 +9,12 @@ import android.view.WindowManager; import android.widget.FrameLayout; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.PermissionUtils; /** * 浮在各种wm上面的dialog基类,调用了window.setType @@ -34,12 +36,16 @@ public class BaseFloatDialog extends Dialog { } } + @RequiresApi(api = Build.VERSION_CODES.M) private void addFlag() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); - } else { - getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + if(PermissionUtils.isGrantedDrawOverlays()){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); + } else { + getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + } } + getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE); diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java index ac78d030c6..dfa9844026 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java @@ -515,7 +515,7 @@ public final class ToastUtils { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return new SystemToast(toastUtils); } - if (!UtilsBridge.isGrantedDrawOverlays()) { + if (UtilsBridge.isGrantedDrawOverlays()) { return new SystemToast(toastUtils); } } From 576a0c6add7b124a37267feffba9a9f4501ae87c Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 30 Nov 2022 23:32:00 +0800 Subject: [PATCH 15/16] =?UTF-8?q?[2.13.0]=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevaToolsProvider.kt | 5 +- .../badcase/BadCaseManager.kt | 23 ++-- .../badcase/biz/PassiveBadCaseWindow.kt | 16 ++- .../core/function/hmi/ui/MoGoHmiFragment.kt | 18 +++- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 29 +++-- .../hmi/ui/msgbox/DriverMsgBoxListView.kt | 36 ++++++- .../ui/msgbox/PassengerMsgBoxBubbleView.kt | 77 +++++++++++++ .../adapter/DriverMsgBoxBubbleAdapter.kt | 69 ++++++++++-- .../msgbox/adapter/DriverMsgBoxListAdapter.kt | 48 +++++++-- .../adapter/PassengerMsgBoxBubbleAdapter.kt | 102 ++++++++++++++++++ .../res/drawable-xhdpi/icon_msg_close.png | Bin 0 -> 269 bytes .../main/res/drawable-xhdpi/icon_msg_open.png | Bin 0 -> 269 bytes .../drawable-xhdpi/icon_notice_default.png | Bin 0 -> 19079 bytes .../icon_passenger_operation.png | Bin 0 -> 19096 bytes .../res/drawable/bg_msg_status_select.xml | 5 + .../src/main/res/layout/fragment_hmi.xml | 40 +++++-- .../res/layout/item_msg_box_ipc_report.xml | 14 ++- .../main/res/layout/item_msg_box_notice.xml | 50 ++++++--- .../res/layout/item_msg_box_operation.xml | 7 ++ .../src/main/res/layout/item_msg_box_v2x.xml | 50 +++++++++ .../layout/item_passenger_msg_box_notice.xml | 46 ++++++++ .../item_passenger_msg_box_operation.xml | 84 +++++++++++++++ .../layout_passenger_msg_box_bubble.xml | 8 ++ .../eagle/core/data/enums/EventTypeEnum.kt | 4 +- .../api/devatools/IDevaToolsProvider.kt | 3 +- .../call/devatools/CallerDevaToolsManager.kt | 5 +- .../main/res/drawable-xhdpi/icon_default.png | Bin 0 -> 16208 bytes 27 files changed, 673 insertions(+), 66 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_close.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_open.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_notice_default.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_passenger_operation.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml create mode 100644 core/mogo-core-res/src/main/res/drawable-xhdpi/icon_default.png diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 51cba44a50..7e2d572880 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter @@ -97,8 +98,8 @@ class DevaToolsProvider : IDevaToolsProvider { BadCaseManager.initAiCollect(view) } - override fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { - BadCaseManager.onReceiveBadCaseRecord(recordKey, fileName, activity) + override fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) { + BadCaseManager.onReceiveBadCaseRecord(msgBoxBean, activity,countdown) } override fun showFeedbackWindow(ctx: Context) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 77f3c3672d..944cad91bc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -14,6 +14,8 @@ import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager import com.mogo.eagle.core.utilcode.kotlin.PX import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner @@ -23,10 +25,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.reminder.Reminder import com.mogo.eagle.core.utilcode.reminder.api.IReminder import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IGlobalStateChangeListener -import com.mogo.eagle.core.utilcode.util.ClickUtils -import com.mogo.eagle.core.utilcode.util.NetworkUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.badcase.biz.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord @@ -168,19 +167,29 @@ internal object BadCaseManager : LifecycleEventObserver { } } - fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { + fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) { CallerLogger.d("$M_DEVA$TAG", "收到录包结果回调${record}") CallerLogger.d("$M_DEVA$TAG", "开始创建被动录包弹窗,window num=${BadCaseConfig.windowNum}") - CallerLogger.d("$M_DEVA$TAG","key=${recordKey};filename${fileName}") ThreadUtils.runOnUiThread { val passiveBadCaseWindow = PassiveBadCaseWindow(activity) - passiveBadCaseWindow.setRecord(recordKey.toString(),fileName) + passiveBadCaseWindow.setRecord(msgBoxBean) passiveBadCaseWindow.setClickListener(object: PassiveBadCaseWindow.ClickListener{ override fun closeWindow() { passiveBadCaseWindow.hideFloatWindow() } }) passiveBadCaseWindow.showFloatWindow() + if(countdown){ + val countDownTimer = object: CountDownTimer(10000,1000){ + override fun onTick(p0: Long) { + } + + override fun onFinish() { + passiveBadCaseWindow.hideFloatWindow() + } + } + countDownTimer.start() + } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index f97420f379..1a4e463101 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -16,8 +16,11 @@ import android.widget.TextView import com.google.android.flexbox.FlexboxLayout import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.toast.TipToast @@ -59,6 +62,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var uploadReason: String = String() //上报原因,标签 private var recordKey: String?=null //录制bag包key private var recordFileName: String?=null //录制文件包名 + private var boxBean: MsgBoxBean ?= null private var longitude: Double?=null private var latitude: Double?=null @@ -132,11 +136,15 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene }else{ uploadAudio() } + //删除记录 + CallerMsgBoxManager.removeRecordInfo(mActivity, boxBean!!, recordKey!!) } tvPassiveCancel.setOnClickListener { BadCaseConfig.windowNum-- clickListener?.closeWindow() + //删除记录 + CallerMsgBoxManager.removeRecordInfo(mActivity, boxBean!!, recordKey!!) } mWindowParams = WindowManager.LayoutParams() @@ -343,9 +351,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) } - fun setRecord(key:String,fileName:String){ - recordKey = key - recordFileName = fileName + fun setRecord(msgBoxBean: MsgBoxBean){ + boxBean = msgBoxBean + val recordBagMsg = (msgBoxBean.bean as RecordBagMsg) + recordKey = recordBagMsg.key.toString() + recordFileName = recordBagMsg.fileName } fun setClickListener(clickListener: ClickListener) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index e86c041a40..9dd3593284 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -76,6 +76,7 @@ import com.mogo.eagle.core.function.hmi.ui.bindingcar.ToBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.bindingcar.UpgradeAppDialog import com.mogo.eagle.core.function.hmi.ui.camera.CameraListView import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog +import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.NoticeTrafficDialog import com.mogo.eagle.core.function.hmi.ui.setting.DebugSettingView @@ -171,6 +172,8 @@ class MoGoHmiFragment : MvpFragment(), private var reportListFloatWindow: ReportListFloatWindow? = null private var ipcReportWindow: IPCReportWindow? = null + private var passengerMsgBoxBubbleView: PassengerMsgBoxBubbleView ?= null + private var adUpgradeDialog: AdUpgradeDialog? = null private var lastSpeakJob: Job? = null @@ -297,7 +300,7 @@ class MoGoHmiFragment : MvpFragment(), } } - cbMsgBox.setOnCheckedChangeListener { _, isChecked -> + cbMsgBoxDriver.setOnCheckedChangeListener { _, isChecked -> if(isChecked){ viewDriverMsgBoxList.visibility = View.VISIBLE viewDriverMsgBoxBubble.visibility = View.GONE @@ -307,6 +310,19 @@ class MoGoHmiFragment : MvpFragment(), } } + cbMsgBoxPassenger.setOnCheckedChangeListener { _, isChecked -> + + } + + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + cbMsgBoxDriver.visibility = View.VISIBLE + viewDriverMsgBoxBubble.visibility = View.VISIBLE + } + if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + cbMsgBoxPassenger.visibility = View.VISIBLE + viewPassengerMsgBoxBubble.visibility = View.VISIBLE + } } @OptIn(ExperimentalCoroutinesApi::class) 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 e0b3932da4..860941333a 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 @@ -1,16 +1,20 @@ package com.mogo.eagle.core.function.hmi.ui.msgbox +import android.app.Activity import android.content.Context import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater +import android.widget.LinearLayout import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.marginTop import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.OperationMsg import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter @@ -35,19 +39,27 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( var driverMsgBoxBubbleAdapter: DriverMsgBoxBubbleAdapter ?=null private val TAG = "DriverMsgBoxBubbleView" + private val dataList :ArrayList = ArrayList() private fun initView() { val linearLayoutManager = LinearLayoutManager(context) linearLayoutManager.orientation = LinearLayoutManager.VERTICAL linearLayoutManager.stackFromEnd = true linearLayoutManager.reverseLayout = true - driverMsgBoxBubbleAdapter = DriverMsgBoxBubbleAdapter() + driverMsgBoxBubbleAdapter = DriverMsgBoxBubbleAdapter(context as Activity) rvBubbleList.adapter = driverMsgBoxBubbleAdapter rvBubbleList.layoutManager = linearLayoutManager } - override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + override fun onDataChanged(category: MsgCategory, msgBoxBean: MsgBoxBean) { + if(category == MsgCategory.RECORD_BAG){ + //弹出被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) + }else{ + dataList.add(msgBoxBean) + driverMsgBoxBubbleAdapter?.setData(dataList) + } } override fun onAttachedToWindow() { @@ -60,15 +72,12 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( CallerMsgBoxListenerManager.removeListener(TAG) } +// var i = 0 +// // fun setData(){ -// val list :ArrayList = ArrayList() -// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) -// val two = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) -// val three = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) -// list.add(one) -// list.add(two) -// list.add(three) -// driverMsgBoxBubbleAdapter?.setData(list) +// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试"+i++)) +// dataList.add(one) +// driverMsgBoxBubbleAdapter?.setData(dataList) // } } \ 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/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt index fb593778d9..7bb930d794 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt @@ -39,6 +39,16 @@ class DriverMsgBoxListView @JvmOverloads constructor( val driverMsgBoxListAdapter= DriverMsgBoxListAdapter(context as Activity) rvMsgBoxList.adapter = driverMsgBoxListAdapter rvMsgBoxList.layoutManager = LinearLayoutManager(context) + //获取通知消息列表 + val noticeList: List? = CallerMsgBoxManager.getCachedNotifyData() + if(noticeList==null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(noticeList) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } + //通知 tvMsgNotice.setOnClickListener { @@ -50,6 +60,13 @@ class DriverMsgBoxListView @JvmOverloads constructor( viewBadCaseDivider.visibility = View.GONE //获取通知消息列表 val noticeList: List? = CallerMsgBoxManager.getCachedNotifyData() + if(noticeList==null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(noticeList.reversed()) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } // val nList: ArrayList = ArrayList() // val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"通知1",2)) @@ -80,6 +97,13 @@ class DriverMsgBoxListView @JvmOverloads constructor( //获取车辆系统信息列表 val ipcReportList: List? = CallerMsgBoxManager.getCachedSysInfoData() + if(ipcReportList == null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(ipcReportList.reversed()) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } // val ipcList: ArrayList = ArrayList() // val resultList:ArrayList = ArrayList() @@ -123,10 +147,14 @@ class DriverMsgBoxListView @JvmOverloads constructor( viewBadCaseDivider.visibility = View.VISIBLE //获取录包信息列表 -// val badCaseList: List? = CallerMsgBoxManager.getCachedRecordBagData() -// badCaseList?.let { -// driverMsgBoxListAdapter.setData(it) -// } + val badCaseList: List? = CallerMsgBoxManager.getCachedRecordBagData() + if(badCaseList == null){ + rvMsgBoxList.visibility = View.GONE + }else{ + driverMsgBoxListAdapter.setData(badCaseList.reversed()) + rvMsgBoxList.visibility = View.VISIBLE + rvMsgBoxList.scrollToPosition(0) + } // val list : ArrayList = ArrayList() // val one = MsgBoxBean(MsgBoxType.RECORD, RecordBagMsg(3457774,1,235,2,"","")) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt new file mode 100644 index 0000000000..5f4404e3e7 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -0,0 +1,77 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.app.Activity +import android.content.Context +import android.graphics.PixelFormat +import android.util.AttributeSet +import android.util.DisplayMetrics +import android.view.* +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxBubbleAdapter +import com.mogo.eagle.core.utilcode.util.BarUtils +import kotlinx.android.synthetic.main.layout_passenger_msg_box_bubble.view.* + +/** + * @author XuXinChao + * @description 乘客端消息盒子气泡列表视图 + * @since: 2022/11/29 + */ +class PassengerMsgBoxBubbleView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener { + + private val TAG = "PassengerMsgBoxBubbleView" + var passengerMsgBoxBubbleAdapter: PassengerMsgBoxBubbleAdapter ?= null + init { + LayoutInflater.from(context).inflate(R.layout.layout_passenger_msg_box_bubble, this, true) + initView() + } + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + linearLayoutManager.stackFromEnd = true + linearLayoutManager.reverseLayout = true + passengerMsgBoxBubbleAdapter = PassengerMsgBoxBubbleAdapter() + rvPassengerBubbleList.adapter = passengerMsgBoxBubbleAdapter + rvPassengerBubbleList.layoutManager = linearLayoutManager + +// setData() + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + + } + +// fun setData(){ +// val list :ArrayList = ArrayList() +// val one = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// val two = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// val three = MsgBoxBean(MsgBoxType.OPERATION, OperationMsg(System.currentTimeMillis(),"测试")) +// list.add(one) +// list.add(two) +// list.add(three) +// passengerMsgBoxBubbleAdapter?.setData(list) +// } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerMsgBoxListenerManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerMsgBoxListenerManager.removeListener(TAG) + } + +} \ 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/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 9fb3bd89d2..ab1f579879 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 @@ -1,18 +1,26 @@ package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter +import android.app.Activity import android.os.CountDownTimer import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.enums.EventTypeEnum import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager 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.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat @@ -21,22 +29,22 @@ import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat * @description 司机端消息盒子气泡视图RecyclerView适配器 * @since: 2022/11/25 */ -class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter(){ +class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.Adapter(){ private var data: ArrayList ?= null private val operation: Int = 1 private val notice: Int = 2 private val v2x: Int = 3 - private val obu: Int = 4 - private val report: Int = 5 - private val record: Int = 6 - private val traffic: Int = 7 + private val report: Int = 4 var countDownTimer: CountDownTimer?=null fun setData(data: ArrayList){ this.data = data + if(data.size>4){ + data.removeAt(0) + } notifyDataSetChanged() } @@ -44,9 +52,15 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( if(viewType == operation){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_operation,parent,false) return BubbleOperationHolder(view) - }else{ + }else if(viewType == report){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_report,parent,false) return BubbleReportHolder(view) + }else if(viewType == notice){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_notice,parent,false) + return BubbleNoticeHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_v2x,parent,false) + return BubbleV2XHolder(view) } } @@ -68,6 +82,29 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( } holder.tvBubbleReportType.text = resultStr } + }else if(holder is BubbleNoticeHolder){ + data?.let { + val noticeNormalData = it[position].bean as NoticeNormalData + holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvNoticeContent.text = noticeNormalData.content + GlideApp.with(activity).load(noticeNormalData.imageUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivNoticeImage) + holder.tvNoticeCheck.setOnClickListener { + //云公告 + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(holder is BubbleV2XHolder){ + data?.let { + val v2XMsg = it[position].bean as V2XMsg + holder.tvV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvV2XContent.text = v2XMsg.content + holder.ivV2XImage.setImageDrawable(activity.resources.getDrawable(EventTypeEnum.getUpdateIconRes(v2XMsg.type))) + } } val msgBoxBean: MsgBoxBean = data!![position] @@ -93,8 +130,12 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( override fun getItemViewType(position: Int): Int { if(data!![position].type == MsgBoxType.OPERATION){ return operation - }else{ + }else if(data!![position].type == MsgBoxType.REPORT){ return report + }else if(data!![position].type == MsgBoxType.NOTICE){ + return notice + }else{ + return v2x } } @@ -111,6 +152,20 @@ class DriverMsgBoxBubbleAdapter : RecyclerView.Adapter( var tvBubbleOperationContent: TextView = itemView.findViewById(R.id.tvBubbleOperationContent) } + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivNoticeImage: ImageView = itemView.findViewById(R.id.ivNoticeImage) + var tvNoticeTitle: TextView = itemView.findViewById(R.id.tvNoticeTitle) + var tvNoticeTime: TextView = itemView.findViewById(R.id.tvNoticeTime) + var tvNoticeCheck: TextView = itemView.findViewById(R.id.tvNoticeCheck) + var tvNoticeContent: TextView = itemView.findViewById(R.id.tvNoticeContent) + } + //V2X + class BubbleV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivV2XImage: ImageView = itemView.findViewById(R.id.ivV2XImage) + var tvV2XTime: TextView = itemView.findViewById(R.id.tvV2XTime) + var tvV2XContent: TextView = itemView.findViewById(R.id.tvV2XContent) + } } \ 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/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 10068108a7..ac49088a0c 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 @@ -11,15 +11,16 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView -import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.OperationMsg -import com.mogo.eagle.core.data.msgbox.RecordBagMsg +import com.mogo.eagle.core.data.enums.EventTypeEnum +import com.mogo.eagle.core.data.msgbox.* import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager 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 @@ -62,9 +63,12 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada }else if(viewType == operation){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_operation,parent,false) return MsgBoxOperation(view) - }else{ + }else if(viewType == notice){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_notice,parent,false) return MsgBoxNotice(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_box_v2x,parent,false) + return MsgBoxV2X(view) } } @@ -74,10 +78,11 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada data?.let { holder.tvBagReceiveTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) holder.tvBagRecordTime.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" - val recordBagMsg = (it[position].bean as RecordBagMsg) + val msgBoxBean = it[position] +// val recordBagMsg = (it[position].bean as RecordBagMsg) holder.tvRecordCheck.setOnClickListener { //打开被动录包弹窗 - CallerDevaToolsManager.onReceiveBadCaseRecord(recordBagMsg.key,recordBagMsg.fileName,activity) + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,activity,false) } } }else if(holder is MsgBoxIpcReportHolder){ @@ -111,6 +116,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvReportReasonOpen.text = "原因:${reportEntity.msg}" holder.tvStatusSelect.setOnClickListener { if(holder.tvReportLevelNormal.isVisible){ + holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_close),null,null,null) holder.ivReportImageNormal.visibility = View.GONE holder.tvReportLevelNormal.visibility = View.GONE holder.tvReportTimeNormal.visibility = View.GONE @@ -122,6 +128,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvReportTypeOpen.visibility = View.VISIBLE holder.tvReportReasonOpen.visibility = View.VISIBLE }else{ + holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_open),null,null,null) holder.ivReportImageNormal.visibility = View.VISIBLE holder.tvReportLevelNormal.visibility = View.VISIBLE holder.tvReportTimeNormal.visibility = View.VISIBLE @@ -143,6 +150,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvOperationTime.text = TimeUtils.millis2String(operationMsg.timestamp,getHourMinFormat()) holder.tvOperationStatusSelect.setOnClickListener { if(holder.ivOperationImageNormal.isVisible){ + holder.tvOperationStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_close),null,null,null) holder.ivOperationImageNormal.visibility = View.GONE holder.tvOperationTitleNormal.visibility = View.GONE holder.tvOperationContentNormal.visibility = View.GONE @@ -151,6 +159,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada holder.tvOperationTitleOpen.visibility = View.VISIBLE holder.tvOperationContentOpen.visibility = View.VISIBLE }else{ + holder.tvOperationStatusSelect.setCompoundDrawablesWithIntrinsicBounds(getDrawable(R.drawable.icon_msg_open),null,null,null) holder.ivOperationImageNormal.visibility = View.VISIBLE holder.tvOperationTitleNormal.visibility = View.VISIBLE holder.tvOperationContentNormal.visibility = View.VISIBLE @@ -166,6 +175,23 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada val noticeNormalData = it[position].bean as NoticeNormalData holder.tvNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) holder.tvNoticeContent.text = noticeNormalData.content + GlideApp.with(activity).load(noticeNormalData.imageUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivNoticeImage) + holder.tvNoticeCheck.setOnClickListener { + //云公告 + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(holder is MsgBoxV2X){ + data?.let { + val v2XMsg = it[position].bean as V2XMsg + holder.tvV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvV2XContent.text = v2XMsg.content + holder.ivV2XImage.setImageDrawable(activity.resources.getDrawable(EventTypeEnum.getUpdateIconRes(v2XMsg.type))) } } } @@ -221,10 +247,18 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Ada //Notice class MsgBoxNotice(itemView: View): RecyclerView.ViewHolder(itemView){ var ivNoticeImage: ImageView = itemView.findViewById(R.id.ivNoticeImage) + var tvNoticeTitle: TextView = itemView.findViewById(R.id.tvNoticeTitle) var tvNoticeTime: TextView = itemView.findViewById(R.id.tvNoticeTime) + var tvNoticeCheck: TextView = itemView.findViewById(R.id.tvNoticeCheck) var tvNoticeContent: TextView = itemView.findViewById(R.id.tvNoticeContent) } + //V2X,OBU + class MsgBoxV2X(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivV2XImage: ImageView = itemView.findViewById(R.id.ivV2XImage) + var tvV2XTime: TextView = itemView.findViewById(R.id.tvV2XTime) + var tvV2XContent: TextView = itemView.findViewById(R.id.tvV2XContent) + } } \ 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/adapter/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt new file mode 100644 index 0000000000..3693ece7ce --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -0,0 +1,102 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter + +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat + +/** + * @author XuXinChao + * @description 乘客端消息盒子气泡视图RecyclerView适配器 + * @since: 2022/11/25 + */ +class PassengerMsgBoxBubbleAdapter: RecyclerView.Adapter() { + + private var data: ArrayList ?= null + + private val operation: Int = 1 + private val notice: Int = 2 + + var countDownTimer: CountDownTimer?=null + + fun setData(data: ArrayList){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if(viewType == operation){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_operation,parent,false) + return BubbleOperationHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_notice,parent,false) + return BubbleNoticeHolder(view) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if(holder is BubbleOperationHolder){ + data?.let { + val operationMsg = it[position].bean as OperationMsg + holder.tvPassengerOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvPassengerOperationContent.text = operationMsg.content + } + }else{ + data?.let { + + } + } + val msgBoxBean: MsgBoxBean = data!![position] + countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){ + override fun onTick(p0: Long) { + + } + + override fun onFinish() { + data?.remove(msgBoxBean) + notifyDataSetChanged() +// notifyItemRemoved(index) +// notifyItemRangeChanged(index,recordTypeEntity.size-index) + } + + } + countDownTimer?.start() + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + if(data!![position].type == MsgBoxType.OPERATION){ + return operation + }else{ + return notice + } + } + + //官方公告 + class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivPassengerOperationImage: ImageView = itemView.findViewById(R.id.ivPassengerOperationImage) + var tvPassengerOperationTitle: TextView = itemView.findViewById(R.id.tvPassengerOperationTitle) + var tvPassengerOperationContent: TextView = itemView.findViewById(R.id.tvPassengerOperationContent) + var tvPassengerOperationCheck: TextView = itemView.findViewById(R.id.tvPassengerOperationCheck) + var tvPassengerOperationTime: TextView = itemView.findViewById(R.id.tvPassengerOperationTime) + } + + //Notice + class BubbleNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivPassengerNoticeImage: ImageView = itemView.findViewById(R.id.ivPassengerNoticeImage) + var ivPassengerNoticeTime: TextView = itemView.findViewById(R.id.ivPassengerNoticeTime) + var ivPassengerNoticeContent: TextView = itemView.findViewById(R.id.ivPassengerNoticeContent) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_close.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_msg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c9982f5f645fd184b318147491afbff957cf31 GIT binary patch literal 269 zcmV+o0rLKdP)Px#$4Nv%R45gFjy(#(Koo>?919B@3oUHCLCRFA6pK_^=_ztRA&nvkf~cLkeiQb= zuGwVZ5TEW-5uhg-f)q{4XwcVo1wFGPx#$4Nv%R45gdjWG(sKomrC919B@3oUHCLCRFA6oph;=_ztRA&nvkf~cLkzFGc) zS(2y&!|b0w^EYwMm2d~A$)8Zix@E$ng2Ek6e!Zovbr4tSPzoQKz!i?Z9V0WgEaJPV z?=WQWDHmMeuA|BqOlyCq}QQ=-i*Oo#re*e);2UhbkkXCTXJ9t4{#3`Z8`aGcvvsT TojL}=00000NkvXXu0mjfUjb^| literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_notice_default.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_notice_default.png new file mode 100644 index 0000000000000000000000000000000000000000..269dfdd86fcff0dc301f39e4c3ee98bcd720b44f GIT binary patch literal 19079 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 KMNUMnLSTaO^KPR6 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_passenger_operation.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_passenger_operation.png new file mode 100644 index 0000000000000000000000000000000000000000..8ced8cb8af11f3c8ebd3d7f2e789fd4ea7ea1b64 GIT binary patch literal 19096 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 bR{#G4978l$)6rDg00000NkvXXu0mjfzqqx4 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml new file mode 100644 index 0000000000..21a5610625 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_status_select.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 566b59fc2e..5a2ea87992 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -102,6 +102,8 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + + + @@ -218,8 +234,20 @@ android:id="@+id/viewDriverMsgBoxBubble" android:layout_width="864px" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/cbMsgBox" - app:layout_constraintRight_toRightOf="@id/ivCameraIcon" + app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver" + app:layout_constraintRight_toRightOf="@id/viewLimitingVelocity" + android:visibility="gone" + /> + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml index a8eae24883..9d45f5fa4d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml @@ -68,12 +68,20 @@ android:id="@+id/tvStatusSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintRight_toRightOf="parent" - android:layout_margin="20px" android:text="折叠" android:textColor="#FFFFFFFF" android:textSize="24px" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toRightOf="parent" + android:layout_marginTop="25px" + android:layout_marginEnd="25px" + android:background="@drawable/bg_msg_status_select" + android:drawableStart="@drawable/icon_msg_open" + android:drawablePadding="10px" + android:paddingStart="15px" + android:paddingEnd="15px" + android:paddingTop="5px" + android:paddingBottom="5px" /> + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml index ff8a6fadab..8eb878c3d8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_operation.xml @@ -63,6 +63,13 @@ app:layout_constraintRight_toRightOf="parent" android:layout_marginTop="25px" android:layout_marginEnd="25px" + android:background="@drawable/bg_msg_status_select" + android:drawableStart="@drawable/icon_msg_open" + android:drawablePadding="10px" + android:paddingStart="15px" + android:paddingEnd="15px" + android:paddingTop="5px" + android:paddingBottom="5px" /> + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml new file mode 100644 index 0000000000..12439dc04e --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml new file mode 100644 index 0000000000..1218bd88b2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml new file mode 100644 index 0000000000..ac09584e77 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_bubble.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt index cb8155123f..d089573c31 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnum.kt @@ -707,7 +707,9 @@ enum class EventTypeEnum( ALERT_CAR_TROUBLE_WARNING.poiType -> { R.drawable.icon_car_red } - else -> 0 + else -> { + R.drawable.icon_default + } } } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index f5eb6bac20..a5a206c838 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -7,6 +7,7 @@ import com.alibaba.android.arouter.facade.template.IProvider import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import record_cache.RecordPanelOuterClass /** @@ -92,7 +93,7 @@ interface IDevaToolsProvider : IProvider { /** * 当工控机回调时调用 */ - fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) + fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) /** * 展示录包配置 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index 68e64f9cdb..aa24264cc5 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainLogParam import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.utilcode.mogo.* @@ -123,8 +124,8 @@ object CallerDevaToolsManager { /** * 收到工控机回调时触发 */ - fun onReceiveBadCaseRecord(recordKey: Long,fileName: String,activity: Activity) { - devaToolsProviderApi?.onReceiveBadCaseRecord(recordKey, fileName, activity) + fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) { + devaToolsProviderApi?.onReceiveBadCaseRecord(msgBoxBean, activity,countdown) } /** diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_default.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/icon_default.png new file mode 100644 index 0000000000000000000000000000000000000000..e2caabe693ddb6424f98db29b9aa19927ac048e2 GIT binary patch literal 16208 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 Date: Thu, 1 Dec 2022 10:15:02 +0800 Subject: [PATCH 16/16] =?UTF-8?q?[2.13.0]=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/function/hmi/ui/MoGoHmiFragment.kt | 8 +- .../ui/msgbox/PassengerMsgBoxBubbleView.kt | 11 +- .../hmi/ui/msgbox/PassengerMsgBoxListView.kt | 66 +++++++++++ .../adapter/PassengerMsgBoxBubbleAdapter.kt | 79 +++++++++----- .../adapter/PassengerMsgBoxListAdapter.kt | 103 ++++++++++++++++++ .../src/main/res/drawable/rv_divider_line.xml | 8 ++ .../src/main/res/layout/fragment_hmi.xml | 17 ++- .../layout/item_passenger_msg_box_notice.xml | 68 +++++++++--- .../res/layout/item_passenger_msg_box_v2x.xml | 46 ++++++++ ...xml => item_passenger_msg_list_notice.xml} | 49 ++++----- .../layout/item_passenger_msg_list_v2x.xml | 42 +++++++ .../layout/layout_passenger_msg_box_list.xml | 20 ++++ 12 files changed, 440 insertions(+), 77 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxListAdapter.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml rename core/function-impl/mogo-core-function-hmi/src/main/res/layout/{item_passenger_msg_box_operation.xml => item_passenger_msg_list_notice.xml} (53%) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_v2x.xml create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_list.xml diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 9dd3593284..a10995bcdf 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -311,7 +311,13 @@ class MoGoHmiFragment : MvpFragment(), } cbMsgBoxPassenger.setOnCheckedChangeListener { _, isChecked -> - + if(isChecked){ + viewPassengerMsgBoxList.visibility = View.VISIBLE + viewPassengerMsgBoxBubble.visibility = View.GONE + }else{ + viewPassengerMsgBoxList.visibility = View.GONE + viewPassengerMsgBoxBubble.visibility = View.VISIBLE + } } if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt index 5f4404e3e7..29ecb340f5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -31,6 +31,7 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener { private val TAG = "PassengerMsgBoxBubbleView" + private val dataList :ArrayList = ArrayList() var passengerMsgBoxBubbleAdapter: PassengerMsgBoxBubbleAdapter ?= null init { LayoutInflater.from(context).inflate(R.layout.layout_passenger_msg_box_bubble, this, true) @@ -42,7 +43,7 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( linearLayoutManager.orientation = LinearLayoutManager.VERTICAL linearLayoutManager.stackFromEnd = true linearLayoutManager.reverseLayout = true - passengerMsgBoxBubbleAdapter = PassengerMsgBoxBubbleAdapter() + passengerMsgBoxBubbleAdapter = PassengerMsgBoxBubbleAdapter(context as Activity) rvPassengerBubbleList.adapter = passengerMsgBoxBubbleAdapter rvPassengerBubbleList.layoutManager = linearLayoutManager @@ -50,7 +51,13 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( } override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { - + if(category == MsgCategory.NOTICE){ + if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X + || msgBoxList.type == MsgBoxType.OBU){ + dataList.add(msgBoxList) + passengerMsgBoxBubbleAdapter?.setData(dataList) + } + } } // fun setData(){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt new file mode 100644 index 0000000000..da5e6580b6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt @@ -0,0 +1,66 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxListAdapter +import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable +import kotlinx.android.synthetic.main.layout_passenger_msg_box_list.view.* + +/** + * @author XuXinChao + * @description 乘客端消息盒子列表视图 + * @since: 2022/11/29 + */ +class PassengerMsgBoxListView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr){ + + var passengerMsgBoxListAdapter: PassengerMsgBoxListAdapter ?= null + + init{ + LayoutInflater.from(context).inflate(R.layout.layout_passenger_msg_box_list, this, true) + initView() + } + + private fun initView(){ + val linearLayoutManager = LinearLayoutManager(context) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + val divider = DividerItemDecoration(context, linearLayoutManager.orientation) + getDrawable(R.drawable.rv_divider_line)?.let { divider.setDrawable(it) } + passengerMsgBoxListAdapter = PassengerMsgBoxListAdapter(context as Activity) + rvPassengerList.adapter = passengerMsgBoxListAdapter + rvPassengerList.layoutManager = linearLayoutManager + rvPassengerList.addItemDecoration(divider) + //获取通知消息列表 + val noticeList: List? = CallerMsgBoxManager.getCachedNotifyData() + noticeList?.let { + passengerMsgBoxListAdapter?.setData(it.reversed()) + } + +// setData() + } + + fun setData(){ + val list :ArrayList = ArrayList() + val one = MsgBoxBean(MsgBoxType.V2X, V2XMsg("","ceshiyixa")) + val two = MsgBoxBean(MsgBoxType.OPERATION, V2XMsg("","ceshiyixa1")) + val three = MsgBoxBean(MsgBoxType.OPERATION, V2XMsg("","ceshiyixa2")) + list.add(one) + list.add(two) + list.add(three) + passengerMsgBoxListAdapter?.setData(list) + } + +} \ 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/adapter/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt index 3693ece7ce..8a813a512e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter +import android.app.Activity import android.os.CountDownTimer import android.view.LayoutInflater import android.view.View @@ -7,11 +8,16 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.enums.EventTypeEnum import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType -import com.mogo.eagle.core.data.msgbox.OperationMsg +import com.mogo.eagle.core.data.msgbox.V2XMsg +import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp +import com.mogo.eagle.core.data.notice.NoticeNormalData +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager 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.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat @@ -20,40 +26,57 @@ import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat * @description 乘客端消息盒子气泡视图RecyclerView适配器 * @since: 2022/11/25 */ -class PassengerMsgBoxBubbleAdapter: RecyclerView.Adapter() { +class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView.Adapter() { private var data: ArrayList ?= null - private val operation: Int = 1 - private val notice: Int = 2 + private val notice: Int = 1 + private val v2x: Int = 2 var countDownTimer: CountDownTimer?=null fun setData(data: ArrayList){ this.data = data + if(data.size>3){ + data.removeAt(0) + } notifyDataSetChanged() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - if(viewType == operation){ - val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_operation,parent,false) - return BubbleOperationHolder(view) - }else{ + if(viewType == notice){ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_notice,parent,false) return BubbleNoticeHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_v2x,parent,false) + return BubbleV2XHolder(view) } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - if(holder is BubbleOperationHolder){ + if(holder is BubbleNoticeHolder){ data?.let { - val operationMsg = it[position].bean as OperationMsg - holder.tvPassengerOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) - holder.tvPassengerOperationContent.text = operationMsg.content + val noticeNormalData = it[position].bean as NoticeNormalData + holder.tvPassengerNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvPassengerNoticeContent.text = noticeNormalData.content + GlideApp.with(activity).load(noticeNormalData.imageUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivPassengerNoticeImage) + holder.tvPassengerNoticeCheck.setOnClickListener { + //云公告 + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } } - }else{ + }else if(holder is BubbleV2XHolder){ data?.let { - + val v2XMsg = it[position].bean as V2XMsg + holder.tvPassengerV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvPassengerV2XContent.text = v2XMsg.content + holder.ivPassengerV2XImage.setImageDrawable(activity.resources.getDrawable( + EventTypeEnum.getUpdateIconRes(v2XMsg.type))) } } val msgBoxBean: MsgBoxBean = data!![position] @@ -76,27 +99,27 @@ class PassengerMsgBoxBubbleAdapter: RecyclerView.Adapter(){ + + private var data: List ?= null + + private val notice: Int = 1 + private val v2x: Int = 2 + + fun setData(data: List){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if(viewType == notice){ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_list_notice,parent,false) + ListNoticeHolder(view) + }else{ + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_list_v2x,parent,false) + ListV2XHolder(view) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if(holder is ListNoticeHolder){ + data?.let { + val noticeNormalData = it[position].bean as NoticeNormalData + holder.tvPassengerNoticeTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvPassengerNoticeContent.text = noticeNormalData.content + GlideApp.with(activity).load(noticeNormalData.imageUrl).optionalTransform( + GlideRoundedCornersTransform( + 20f, + GlideRoundedCornersTransform.CornerType.ALL + ) + ).into(holder.ivPassengerNoticeImage) + holder.tvPassengerNoticeCheck.setOnClickListener { + //云公告 + CallerHmiManager.showNoticeNormalData(noticeNormalData) + } + } + }else if(holder is ListV2XHolder){ + data?.let { + val v2XMsg = it[position].bean as V2XMsg + holder.tvPassengerV2XTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) + holder.tvPassengerV2XContent.text = v2XMsg.content + holder.ivPassengerV2XImage.setImageDrawable(activity.resources.getDrawable( + EventTypeEnum.getUpdateIconRes(v2XMsg.type))) + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + if(data!![position].type == MsgBoxType.NOTICE){ + return notice + }else{ + return v2x + } + } + + //Notice + class ListNoticeHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivPassengerNoticeImage: ImageView = itemView.findViewById(R.id.ivPassengerNoticeImage) + var tvPassengerNoticeTitle: TextView = itemView.findViewById(R.id.tvPassengerNoticeTitle) + var tvPassengerNoticeContent: TextView = itemView.findViewById(R.id.tvPassengerNoticeContent) + var tvPassengerNoticeCheck: TextView = itemView.findViewById(R.id.tvPassengerNoticeCheck) + var tvPassengerNoticeTime: TextView = itemView.findViewById(R.id.tvPassengerNoticeTime) + } + + //OBU、V2X + class ListV2XHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var ivPassengerV2XImage: ImageView = itemView.findViewById(R.id.ivPassengerV2XImage) + var tvPassengerV2XTime: TextView = itemView.findViewById(R.id.tvPassengerV2XTime) + var tvPassengerV2XContent: TextView = itemView.findViewById(R.id.tvPassengerV2XContent) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line.xml new file mode 100644 index 0000000000..7ff979d888 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/rv_divider_line.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 5a2ea87992..c64df3ff3c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -201,7 +201,7 @@ android:layout_height="150dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginStart="220dp" + android:layout_marginStart="300dp" android:layout_marginBottom="30px" android:button="@null" android:background="@drawable/selector_msg_box" @@ -243,10 +243,19 @@ android:id="@+id/viewPassengerMsgBoxBubble" android:layout_width="864px" android:layout_height="wrap_content" - app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger" - android:layout_marginStart="40dp" - android:layout_marginBottom="40dp" + app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger" + app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger" + android:visibility="gone" + /> + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml index 12439dc04e..dadb719dc4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_notice.xml @@ -4,43 +4,81 @@ android:layout_height="160px" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="#465878" - app:roundLayoutRadius="24px"> + app:roundLayoutRadius="24px" + android:layout_marginTop="10px" + android:layout_marginBottom="10px" + > + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml new file mode 100644 index 0000000000..bc3c8901a2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml @@ -0,0 +1,46 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_notice.xml similarity index 53% rename from core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml rename to core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_notice.xml index 1218bd88b2..b56115e291 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_operation.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_notice.xml @@ -1,18 +1,13 @@ - + - \ No newline at end of file + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_v2x.xml new file mode 100644 index 0000000000..6dfe51625c --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_list_v2x.xml @@ -0,0 +1,42 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_list.xml new file mode 100644 index 0000000000..d85fde31aa --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/layout_passenger_msg_box_list.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file