From abdc3266b4fc83777002626db096c5878127d23b Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Tue, 13 Sep 2022 11:20:17 +0800 Subject: [PATCH 001/226] =?UTF-8?q?[change]=20pb=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=9A=9C=E7=A2=8D=E7=89=A9=E6=8E=A5=E5=8F=A3=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/proto/chassis.proto | 58 ++++++++++++++++++ .../src/main/proto/message_pad.proto | 6 +- .../main/proto/special_vehicle_task_cmd.proto | 11 ++-- .../src/main/proto/vehicle_state.proto | 60 +++++++++++++++++++ 4 files changed, 129 insertions(+), 6 deletions(-) diff --git a/libraries/mogo-adas-data/src/main/proto/chassis.proto b/libraries/mogo-adas-data/src/main/proto/chassis.proto index 52e3dfe9eb..be6cada7fb 100644 --- a/libraries/mogo-adas-data/src/main/proto/chassis.proto +++ b/libraries/mogo-adas-data/src/main/proto/chassis.proto @@ -39,3 +39,61 @@ enum EPSSteeringMode { ManualFromEPSFailure = 3; TemporaryInhibited = 4; } + +enum EPBWorkStatus { + EPBSTATUS_NONE = 0; + EPBSTATUS_LOCKED = 1; + EPBSTATUS_RELEASED = 2; + EPBSTATUS_LOCKED_FAIL = 3; + EPBSTATUS_RELEASE_FAIL = 4; + EPBSTATUS_FAULT = 5; +} + +enum VehicleTakeOverStatus { + None_TakeOver = 0; + Vehicle_TakeOver = 1; + Longitude_TakeOver = 2; + Latteral_TakeOver = 3; +} + +enum VehicleFaultLevel { + None_Fault = 0; + General_Fault = 1; + Serious_Fault = 2; + Critical_Fault = 3; +} + +enum VehicleControlMode { + VehicleControl_Manual = 0; + VehicleControl_Nonemanualdefault = 1; + VehicleControl_Autostandby = 2; + VehicleControl_Autoactive = 3; + VehicleControl_Remotestandby = 4; + VehicleControl_Remoteactive = 5; + VehicleControl_Telecontrolstandby = 6; + VehicleControl_Telecontrolactive = 7; + VehicleControl_Fault = 8; +} + +enum VehicleWireControlModeRequest { + NoneWireControl = 0; + WireControl = 1; +} + +enum CleanSystemControlMode { + Clean_Off_Line = 0; + Clean_Ready = 1; + Clean_Work_Standby = 2; + Clean_Sweeping_Standby = 3; + Clean_Sweeping_Both_Side_Work = 4; + Clean_Sweeping_Left_Work = 5; + Clean_Sweeping_Right_Work = 6; + Clean_WashSweep_Standby = 7; + Clean_WashSweep_Both_Side_Work = 8; + Clean_WashSweep_Left_Work = 9; + Clean_WashSweep_Right_Wrok = 10; + Clean_PureWash_Standby = 11; + Clean_PureWash_Both_Side_Work = 12; + Clean_PureWash_Left_Work = 13; + Clean_PureWash_Right_Work = 14; +} \ No newline at end of file diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index ac536c7c6b..3c16b7d91f 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -83,7 +83,7 @@ message Trajectory // message definition for MsgTypeTrackedObjects message SubSource { - uint32 source = 1; //[default = 0] v2v_bsm = 1(v2x他车自车信息) v2i_rsm = 2(v2x路侧感知交通参与者信息) v2v_ssm = 3(v2x他车感知信息) v2n_cloud = 4(v2x云端感知信息) + uint32 source = 1; //[default = 0] v2v_bsm = 1 v2i_rsm = 2 v2v_ssm = 3 v2n_rsm = 4 v2n_rsi = 5 string id = 2; //HEX_string } @@ -97,7 +97,8 @@ message TrackedObject { uint32 type = 1; //物体类型, 0:Background, 1:Person, 2:Bicycle, 3:Car, 4:MotorCycle, //5:TrafficSign, 6:Bus, 7:CellPhone, 8:Truck, 9:Bottle, 10:TrafficLight, - //11:Rider, 12:TriangleRoadblock, 13:WarningTriangle, 100:Unknown + //11:Rider, 12:TriangleRoadblock, 13:WarningTriangle, 100:Unknown, + //501:RoadWork_occupy_0501, 502:RoadWork_break_0502 double longitude = 2; //经度 double latitude = 3; //纬度 double altitude = 4; //海拔 @@ -111,6 +112,7 @@ message TrackedObject uint32 drawLevel = 12; //危险等级 1 绿,2 黄,3 红 double driverTime = 13; //驱动感知时间, abandoned repeated TrackedSource tracked_source = 14; + repeated Location polygon = 15; } message TrackedObjects diff --git a/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto b/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto index 69a2d6fc3d..87d2f9619f 100644 --- a/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto +++ b/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto @@ -1,10 +1,12 @@ syntax = "proto2"; package chassis; +import "header.proto"; + message RoboSweeperFuTianCleanCmd { optional uint32 clean_open_requirement = 1 [default = 0]; // 清扫作业开启需求 0--no req 1--Req_clean_work, 2--No_clean_work - optional uint32 clean_mode_requirement = 2 [default = 0]; // 清扫作业模式需求 0--no req, 1--Sweeping mode, 2--Wash sweeper mode, 3--Pure wash mode, 4--Pure draw mode - optional uint32 clean_direction_requirement = 3 [default = 0]; // 清扫方向需求指 0--no req, 1--both side work, 2--left side work, 3--right side work + optional uint32 clean_mode_requirement = 2 [default = 0]; // 清扫作业模式需求 0--no req, 1--Sweeping mode, 2--Wash sweeper mode, 3--Pure wash mode, 4--Pure draw mode, 5--close clean mode + optional uint32 clean_direction_requirement = 3 [default = 0]; // 清扫方向需求指 0--no req, 1--both side work, 2--left side work, 3--right side work, 4--close side work optional uint32 clean_intensity_requirement = 4 [default = 0]; // 作业强度需求 0--no req, 1--stand clean work, 2--strong clean work optional uint32 dusk_close_requirement = 5 [default = 0]; // 降尘关闭需求 0--no req, 1--close dusk, 2--open dusk optional uint32 suction_nozzlefle_open_requirement = 6 [default = 0]; // 吸嘴挡板需求 0--no req, 1--open, 2--close @@ -22,6 +24,7 @@ message RoboVanSkywellTaskCmd { } message SpecialVehicleTaskCmd { - optional RoboSweeperFuTianTaskCmd robo_sweeper_futian_task_cmd = 1; // 福田清扫车业务指令 - optional RoboVanSkywellTaskCmd robo_van_skywell_task_cmd = 2; // 开沃小巴业务指令 + optional common.Header header = 1; + optional RoboSweeperFuTianTaskCmd robo_sweeper_futian_task_cmd = 2; // 福田清扫车业务指令 + optional RoboVanSkywellTaskCmd robo_van_skywell_task_cmd = 3; // 开沃小巴业务指令 } diff --git a/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto b/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto index 8bce80eb61..b0046c2df6 100644 --- a/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto +++ b/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto @@ -4,6 +4,51 @@ package chassis; import "header.proto"; import "chassis.proto"; +message SweeperFuTianCleanSystemState { + optional bool secu_rem_ctrl_sts = 1 [default = false]; // 远程控制使能信号 + optional bool secu_mot_work_sts = 2 [default = false]; // 电机启停控制状态信号 + optional bool secu_dup_tail_door_open_sts = 3 [default = false]; // 垃圾箱尾门开状态信号 + optional bool secu_dup_tail_door_close_sts = 4 [default = false]; // 垃圾箱尾门关状态信号 + optional bool secu_auto_dup_tail_tip_sts = 5 [default = false]; // 垃圾箱倾翻状态信号 + optional bool secu_dup_tail_ret_sts = 6 [default = false]; // 垃圾箱回位状态信号 + optional bool secu_work_stand_sts = 7 [default = false]; // 标准作业状态信号 + optional bool secu_work_strong_sts = 8 [default = false]; // 强力作业状态信号 + optional bool secu_suctionnozzlebaffle_sts = 9 [default = false]; // 吸嘴挡板开状态信号 + optional bool secu_dusk_close_sts = 10 [default = false]; // 降尘关闭状态信号 + optional bool secu_work_left_sts = 11 [default = false]; // 左侧作业状态信号 + optional bool secu_work_on_bothsides_sts = 12 [default = false]; // 两侧作业状态信号 + optional bool secu_work_right_sts = 13 [default = false]; // 右侧作业状态信号 + optional bool secu_work_ton_sts = 14 [default = false]; // 纯吸作业状态信号 + optional bool secu_work_spray_gun_sts = 15 [default = false]; // 喷雾喷枪作业状态信号 + optional bool secu_work_enc_des_sts = 16 [default = false]; // 箱体清淤作业状态信号 + optional bool secu_mod_wash_sweep_sts = 17 [default = false]; // 洗扫模式状态信号 + optional bool secu_mod_wash_sts = 18 [default = false]; // 纯洗模式状态信号 + optional bool secu_sweepdisk_red_sts = 19 [default = false]; // 扫盘减速开关状态信号 + optional bool secu_sweepdisk_acc_sts = 20 [default = false]; // 扫盘加速开关状态信号 + optional bool secu_arrowlight_sts = 21 [default = false]; // 箭头灯开关状态信号 + optional bool secu_floodlight_sts = 22 [default = false]; // 照明灯开关状态信号 + optional bool secu_work_cleaning_sts = 23 [default = false]; // 保洁作业状态信号 + optional bool secu_clean_music_sts = 24 [default = false]; // 音乐开关状态信号 + + optional bool secu_motor_oil_com_fail = 25 [default = false]; // 油泵电机通讯失败报警 + optional bool secu_motor_water_com_fail = 26 [default = false]; // 水泵电机通讯失败报警 + optional bool secu_motor_air_com_fail = 27 [default = false]; // 风机电机通讯失败报警 + optional bool secu_fan_fault = 28 [default = false]; // 散热风扇故障报警 + optional bool secu_chassis_com_fail = 29 [default = false]; // 底盘通讯失败报警 + optional bool secu_panel_com_fail = 30 [default = false]; // 操作面板通讯失败报警 + optional bool secu_oillevel_check = 31 [default = false]; // 液压油位低请停机检查报警信号 + optional bool secu_oilstmjam_check = 32 [default = false]; // 液压油滤堵塞请停机检查报警信号 + optional bool secu_water_valve_close = 33 [default = false]; // 出水阀门关闭不能清洗作业报警信号 + optional bool secu_clean_water_tank_low = 34 [default = false]; // 清水箱水位低不能清洗作业报警信号 + optional bool secu_sewage_water_tank_full = 35 [default = false]; // 污水箱满请停止作业报警信号 + optional bool secu_coolwatertemp_high = 36 [default = false]; // 水温过高请停机检查报警信号 + optional bool secu_coolwater_less = 37 [default = false]; // 冷却液位低报警信号 + optional bool secu_tail_gate_open = 38 [default = false]; // 尾门打开接近开关 + optional bool secu_manual_intervention_sts = 39 [default = false]; // 提示是否有人为介入 + optional bool secu_ready_finish_sts = 40 [default = false]; // 上装ready完成 + optional float secu_sweepdisk_speed = 41 [default = 0]; // 扫盘转速 +} + message VehicleState { optional common.Header header = 1; optional chassis.PilotMode pilot_mode = 2 [default = MODE_MANUAL]; @@ -38,4 +83,19 @@ message VehicleState { optional bool chassis_status_missing = 29 [default = false]; //未收到车辆底盘反馈信息 optional bool brake_light_status = 30 [default = false]; //自驾模式下制动灯状态 optional bool pilot_mode_condition_met = 31 [default = false]; + + optional float steeringSpd = 32 [default = 0]; // steering angle speed in degrees/s + + optional float leftFrontWheelAngle = 33 [default = 0];//左前轮角度(deg),左负右正 + optional float rightFrontWheelAngle = 34 [default = 0]; //右前轮角度(deg),左负右正 + + optional chassis.EPBWorkStatus epb = 35 [default = EPBSTATUS_NONE]; // EPB工作状态 + + optional chassis.VehicleTakeOverStatus vehicletakeoverstatus = 36 [default = None_TakeOver]; // 车辆人工接管状态 + optional bool Emergency_Stop_Switch = 37 [default = false]; // 急停开关状态 + optional chassis.VehicleFaultLevel vehiclefaultlevel = 38 [default = None_Fault]; // 整车故障状态 + + reserved 39 to 199; + + optional SweeperFuTianCleanSystemState sweeper_futian_clean_system_state = 200; // 福田清扫车上装状态信息 } From 4717484c98d916a938dc20b49b9273686cd63d75 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 14 Sep 2022 11:38:39 +0800 Subject: [PATCH 002/226] =?UTF-8?q?[biz]=20=E4=B9=98=E5=AE=A2=E7=AB=AF?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/comment/TaxiPassengerArrivedView.kt | 4 ++-- .../res/layout/taxi_p_arrived_end_panel.xml | 23 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt index b3335b40ee..55a3ba0a59 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt @@ -177,7 +177,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { tvFeel.text = "" rvCommentList.visibility = View.INVISIBLE btnSubmit.visibility = View.INVISIBLE - clCommentContain.getLayoutParams().height = 657 + clCommentContain.getLayoutParams().height = 748 clCommentContain.requestLayout() super.onDetachedFromWindow() subscribe?.let { @@ -305,7 +305,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { private fun startChangeHeightAnimarion() { // 815 除了 点评的高度 - val resizeAnimation = ResizeAnimation(clCommentContain,832+rvCommentList.height, clCommentContain.height) + val resizeAnimation = ResizeAnimation(clCommentContain,923+rvCommentList.height, clCommentContain.height) resizeAnimation.duration = 300 resizeAnimation.setAnimationListener(object :Animation.AnimationListener{ override fun onAnimationStart(animation: Animation?) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml index f07f9b6bb4..2a5872ee2b 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_arrived_end_panel.xml @@ -44,7 +44,7 @@ @@ -57,6 +57,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + Date: Fri, 16 Sep 2022 15:50:12 +0800 Subject: [PATCH 003/226] =?UTF-8?q?[2.10.0]=20=E5=85=A8=E9=83=A8=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=88=97=E8=A1=A8page=E5=88=86=E9=A1=B5=E4=BB=8E1?= =?UTF-8?q?=E5=BC=80=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java index 1b2df283a0..0cbec4fdce 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java @@ -65,7 +65,7 @@ public class TaxiPersonalDialogFragment extends DialogFragment implements View.O private List orders = new ArrayList<>(); private String[] mTabTitles = {"在线时长","订单完成数"}; private List fragments = new ArrayList<>(); - private int mNextPage = 0; + private int mNextPage = 1;//订单列表分页从1开始 private int mPerPageSize = 10; private static TaxiFragment mTaxiFragment; private static boolean serverHadNoData = false; From 6394714d7e5adadbf0a64c9df74a12969f26b1f3 Mon Sep 17 00:00:00 2001 From: lianglihui Date: Fri, 16 Sep 2022 16:09:11 +0800 Subject: [PATCH 004/226] =?UTF-8?q?2.11.0=20APM=20=E5=A2=9E=E5=8A=A0dev?= =?UTF-8?q?=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/test/crashreport/apm/ApmCrashReportProvider.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java b/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java index c905cf456b..398ff821c7 100644 --- a/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java +++ b/test/crashreport-apmbyte/src/main/java/com/mogo/test/crashreport/apm/ApmCrashReportProvider.java @@ -12,6 +12,7 @@ import com.bytedance.apm.insight.ApmInsight; import com.bytedance.apm.insight.ApmInsightAgent; import com.bytedance.apm.insight.ApmInsightInitConfig; import com.mogo.commons.constants.SharedPrefsConstants; +import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.bindingcar.CarInfo; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; @@ -35,6 +36,7 @@ import java.util.Map; @Route(path = CrashReportConstants.PATH) public class ApmCrashReportProvider implements ITestCrashReportProvider { private static final String BYTEAMP_APPID = "302368"; + private static final String BYTEAMP_APPID_DEV = "379950"; private static final String TAG = "ApmCrashReportProvider"; private static final String MAP_SDK_VERSION = "MAP_SDK_VERSION"; @@ -50,8 +52,7 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { } private void initCrash(final Context context) { - - MonitorCrash crash = MonitorCrash.init(context, BYTEAMP_APPID, CommonUtils.getVersionCode(context), CommonUtils.getVersionName(context)) + MonitorCrash crash = MonitorCrash.init(context, DebugConfig.isDebug() ? BYTEAMP_APPID_DEV : BYTEAMP_APPID, CommonUtils.getVersionCode(context), CommonUtils.getVersionName(context)) .setCustomDataCallback(new AttachUserData() { @Override public Map getUserData(CrashType type) { From e94f0e941f79696c5bda981a3484357a971049a8 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 16 Sep 2022 20:17:12 +0800 Subject: [PATCH 005/226] =?UTF-8?q?[2110]=20=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-bus/build.gradle | 1 + OCH/mogo-och-bus/src/main/AndroidManifest.xml | 2 +- .../och/bus/bean/BusQueryLinesResponse.java | 4 + .../och/bus/callback/IBusLinesCallback.java | 1 + .../com/mogo/och/bus/model/BusLineModel.java | 30 + .../och/bus/presenter/BusLinePresenter.java | 10 + .../och/bus/ui/BusSwitchLineActivity.java | 142 +--- .../mogo/och/bus/ui/BusSwitchLineView.java | 2 + .../och/bus/ui/adapter/OpenItemAnimator.java | 655 ++++++++++++++++++ .../och/bus/ui/adapter/SwitchLineAdapter.kt | 142 ++++ .../bus/ui/adapter/SwitchLineTaskAdapter.java | 73 ++ .../drawable-xhdpi/bus_line_task_arrow.png | Bin 0 -> 491 bytes .../bus_shape_select_line_item_bg_normal.xml | 7 + ...bus_shape_select_line_item_bg_selected.xml | 7 + .../bus_shape_select_line_item_time_bg.xml | 7 + ...hape_select_line_item_time_bg_selected.xml | 6 + .../res/layout/activity_bus_switch_line.xml | 5 +- .../res/layout/bus_switch_line_list_item.xml | 129 ++-- .../layout/bus_switch_line_list_task_item.xml | 18 + .../src/main/res/values/colors.xml | 2 + .../src/main/res/values/strings.xml | 5 +- .../xml/bus_switch_line_list_item_scene.xml | 53 ++ .../mogo/och/common/module/ExampleUnitTest.kt | 10 +- .../network/TaxiPassengerServiceManager.java | 2 +- config.gradle | 5 +- 25 files changed, 1139 insertions(+), 179 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_normal.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml create mode 100644 OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml diff --git a/OCH/mogo-och-bus/build.gradle b/OCH/mogo-och-bus/build.gradle index eea68114f8..4de0719cb7 100644 --- a/OCH/mogo-och-bus/build.gradle +++ b/OCH/mogo-och-bus/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation rootProject.ext.dependencies.rxjava implementation rootProject.ext.dependencies.rxandroid + compileOnly rootProject.ext.dependencies.recyclerviewadapterhelper implementation project(":OCH:mogo-och-common-module") diff --git a/OCH/mogo-och-bus/src/main/AndroidManifest.xml b/OCH/mogo-och-bus/src/main/AndroidManifest.xml index 0e09e1a997..76856fd226 100644 --- a/OCH/mogo-och-bus/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-bus/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ /> + android:screenOrientation="landscape" /> \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java index 99ead6ee0e..21dd901fc8 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java @@ -19,5 +19,9 @@ public class BusQueryLinesResponse extends BaseData { public String startSiteName;//始发站名称 public String endSiteName;//终点名称 + public boolean open; + public boolean haveTask; + + public List taskList; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java index b181736278..805a359757 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java @@ -9,4 +9,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse; public interface IBusLinesCallback { void onBusLinesChange(BusQueryLinesResponse lines); void onChangeLineIdSuccess(); + void onBusLineTasks(BusQueryLinesResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 0d79156db8..54014f9f5a 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -63,6 +63,36 @@ public class BusLineModel { }); } + /** + * 通过线路id 查询线路排班表 + * @param lineId + * @param position 位置 + */ + public void queryBusLineTasksById(int lineId, int position){ + BusServiceManager.getInstance().queryBusLines(mContext, new IBusServiceCallback() { + @Override + public void onSuccess(BusQueryLinesResponse data) { + if (null == data && mBusLinesCallback != null) { + mBusLinesCallback.onBusLineTasks(null,position); + return; + } + + if (mBusLinesCallback != null){ + mBusLinesCallback.onBusLineTasks(data,position); + } + } + + @Override + public void onFail(String failMsg) { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else { + ToastUtils.showShort("查询所有绑定路线失败:"+failMsg); + } + } + }); + } + public void commitSwitchLineId(int lineId){ BusServiceManager.getInstance().switchLine(mContext,lineId, new IBusServiceCallback() { @Override diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index bafd9f298b..5fb1485874 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -61,6 +61,10 @@ public class BusLinePresenter extends Presenter implements IB BusLineModel.getInstance().queryBusLines(); } + public void queryBusLineTasks(int lineId, int position){ + BusLineModel.getInstance().queryBusLineTasksById(lineId,position); + } + public void commitSwitchLineId(int lineId){ BusLineModel.getInstance().commitSwitchLineId(lineId); } @@ -77,4 +81,10 @@ public class BusLinePresenter extends Presenter implements IB public void onDestroy(@NonNull LifecycleOwner owner) { super.onDestroy(owner); } + + + @Override + public void onBusLineTasks(BusQueryLinesResponse o, int position) { + mView.onBusLineTasks(o,position); + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java index 847071ba49..ded9038f14 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java @@ -3,9 +3,7 @@ package com.mogo.och.bus.ui; import android.content.Context; import android.graphics.Point; import android.os.Bundle; -import android.text.TextUtils; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -21,12 +19,19 @@ import androidx.recyclerview.widget.RecyclerView; import com.mogo.commons.mvp.MvpActivity; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.module.common.view.SpacesItemDecoration; import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.presenter.BusLinePresenter; +import com.mogo.och.bus.ui.adapter.OpenItemAnimator; +import com.mogo.och.bus.ui.adapter.SwitchLineAdapter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; /** * @author: wangmingjun @@ -43,6 +48,8 @@ public class BusSwitchLineActivity extends MvpActivity mData = new ArrayList<>(); private int mSelectLineId = -1; + private Disposable subscribe; + @Override protected int getLayoutId() { return R.layout.activity_bus_switch_line; @@ -79,19 +86,19 @@ public class BusSwitchLineActivity extends MvpActivity position && !TextUtils.isEmpty(mData.get(position).startSiteName ) - && !TextUtils.isEmpty(mData.get(position).endSiteName)){ - mSelectLineId = mData.get(position).lineId; - }else { - mSelectLineId = -1; - } + mAdapter.setOnLineItemClickListener((position) -> { + mPresenter.queryBusLineTasks(mData.get(position).lineId,position); + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); } + subscribe = Observable.timer(3, TimeUnit.MINUTES).subscribe(aLong -> { + mPresenter.queryBusLineTasks(mData.get(position).lineId,position); + }); }); } @@ -165,6 +172,24 @@ public class BusSwitchLineActivity extends MvpActivity(); + } + if(o.data.size()!=result.taskList.size()) {// 不相等有变动 重新赋值 + result.taskList.clear(); + if (position % 3 != 0) { + result.taskList.addAll(o.data); + result.haveTask = false; + } else { + result.haveTask = true; + } + } + mAdapter.notifyItemChanged(position); + } + /** * 有无数据UI显示 * @param b @@ -195,105 +220,14 @@ public class BusSwitchLineActivity extends MvpActivity{ - - private Context mContext; - private List mData; - // RecyclerView设置点击事件 - private LineItemClickListener mItemClickListener ; - private int clickPos = -1; - - public SwitchLineAdapter(Context context, List data){ - mContext = context; - mData = data; + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); } - - @NonNull - @Override - public SwitchLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_item - ,parent,false); - SwitchLineViewHolder viewHolder = new SwitchLineViewHolder(view); - return viewHolder; - } - - @Override - public void onBindViewHolder(@NonNull SwitchLineViewHolder holder, int position) { - BusQueryLinesResponse.Result line = mData.get(position); - holder.lineName.setText(mContext.getString(R.string.bus_switch_line_name)+" "+line.name); - holder.lineStartName.setText(mContext.getString(R.string.bus_line_start)+" "+line.startSiteName); - holder.lineEndName.setText(mContext.getString(R.string.bus_line_end)+" "+line.endSiteName); - - //设置item点击事件 - holder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mItemClickListener != null){ - mItemClickListener.onItemClick(position); - clickPos = position; - notifyDataSetChanged(); - } - } - }); - //选中绑定 - if (clickPos > -1){ - if (clickPos == position){ - holder.selectIv.setImageResource(R.drawable.bus_selected_btn); - }else { - holder.selectIv.setImageResource(R.drawable.bus_unselect_btn); - } - }else { - if (line.choose == 1){//1:绑定 2:未绑定 默认绑定 - if (mItemClickListener != null) { - mItemClickListener.onItemClick(position); - } - holder.selectIv.setImageResource(R.drawable.bus_selected_btn); - }else { - holder.selectIv.setImageResource(R.drawable.bus_unselect_btn); - } - } - - } - - @Override - public int getItemCount() { - return mData.size(); - } - public void setOnLineItemClickListener(LineItemClickListener itemClickListener){ - this.mItemClickListener = itemClickListener ; - - } - } - - static class SwitchLineViewHolder extends RecyclerView.ViewHolder{ - - private ImageView selectIv; - private TextView lineName; //线路名称 - private TextView lineStartName; //起点 - private TextView lineEndName; //终点 - - public SwitchLineViewHolder(@NonNull View itemView) { - super(itemView); - selectIv = itemView.findViewById(R.id.switch_line_item_select_iv); - lineName = itemView.findViewById(R.id.switch_line_name); - lineStartName = itemView.findViewById(R.id.switch_line_start_station); - lineEndName = itemView.findViewById(R.id.switch_line_end_station); - } - } - - public interface LineItemClickListener { - void onItemClick(int position) ; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java index febd6429b1..14309a101f 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -11,5 +11,7 @@ public interface BusSwitchLineView extends IView { void onBusLinesChange(BusQueryLinesResponse data); void onChangeLineIdSuccess(); + + void onBusLineTasks(BusQueryLinesResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java new file mode 100644 index 0000000000..1571739e3b --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/OpenItemAnimator.java @@ -0,0 +1,655 @@ +package com.mogo.och.bus.ui.adapter; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; +import android.animation.ValueAnimator; +import android.view.View; +import android.view.ViewPropertyAnimator; + +import androidx.annotation.NonNull; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import java.util.ArrayList; +import java.util.List; + +/** + * This implementation of {@link RecyclerView.ItemAnimator} provides basic + * animations on remove, add, and move events that happen to the items in + * a RecyclerView. RecyclerView uses a DefaultItemAnimator by default. + * + * @see RecyclerView#setItemAnimator(RecyclerView.ItemAnimator) + */ +public class OpenItemAnimator extends DefaultItemAnimator { + private static final boolean DEBUG = false; + + private static TimeInterpolator sDefaultInterpolator; + + private ArrayList mPendingRemovals = new ArrayList<>(); + private ArrayList mPendingAdditions = new ArrayList<>(); + private ArrayList mPendingMoves = new ArrayList<>(); + private ArrayList mPendingChanges = new ArrayList<>(); + + ArrayList> mAdditionsList = new ArrayList<>(); + ArrayList> mMovesList = new ArrayList<>(); + ArrayList> mChangesList = new ArrayList<>(); + + ArrayList mAddAnimations = new ArrayList<>(); + ArrayList mMoveAnimations = new ArrayList<>(); + ArrayList mRemoveAnimations = new ArrayList<>(); + ArrayList mChangeAnimations = new ArrayList<>(); + + private static class MoveInfo { + public RecyclerView.ViewHolder holder; + public int fromX, fromY, toX, toY; + + MoveInfo(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + this.holder = holder; + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + } + + private static class ChangeInfo { + public RecyclerView.ViewHolder oldHolder, newHolder; + public int fromX, fromY, toX, toY; + private ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder) { + this.oldHolder = oldHolder; + this.newHolder = newHolder; + } + + ChangeInfo(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + this(oldHolder, newHolder); + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + + @Override + public String toString() { + return "ChangeInfo{" + + "oldHolder=" + oldHolder + + ", newHolder=" + newHolder + + ", fromX=" + fromX + + ", fromY=" + fromY + + ", toX=" + toX + + ", toY=" + toY + + '}'; + } + } + + @Override + public void runPendingAnimations() { + boolean removalsPending = !mPendingRemovals.isEmpty(); + boolean movesPending = !mPendingMoves.isEmpty(); + boolean changesPending = !mPendingChanges.isEmpty(); + boolean additionsPending = !mPendingAdditions.isEmpty(); + if (!removalsPending && !movesPending && !additionsPending && !changesPending) { + // nothing to animate + return; + } + // First, remove stuff + for (RecyclerView.ViewHolder holder : mPendingRemovals) { + animateRemoveImpl(holder); + } + mPendingRemovals.clear(); + // Next, move stuff + if (movesPending) { + final ArrayList moves = new ArrayList<>(); + moves.addAll(mPendingMoves); + mMovesList.add(moves); + mPendingMoves.clear(); + Runnable mover = new Runnable() { + @Override + public void run() { + for (MoveInfo moveInfo : moves) { + animateMoveImpl(moveInfo.holder, moveInfo.fromX, moveInfo.fromY, + moveInfo.toX, moveInfo.toY); + } + moves.clear(); + mMovesList.remove(moves); + } + }; + if (removalsPending) { + View view = moves.get(0).holder.itemView; + ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration()); + } else { + mover.run(); + } + } + // Next, change stuff, to run in parallel with move animations + if (changesPending) { + final ArrayList changes = new ArrayList<>(); + changes.addAll(mPendingChanges); + mChangesList.add(changes); + mPendingChanges.clear(); + Runnable changer = new Runnable() { + @Override + public void run() { + for (ChangeInfo change : changes) { + animateChangeImpl(change); + } + changes.clear(); + mChangesList.remove(changes); + } + }; + if (removalsPending) { + RecyclerView.ViewHolder holder = changes.get(0).oldHolder; + ViewCompat.postOnAnimationDelayed(holder.itemView, changer, getRemoveDuration()); + } else { + changer.run(); + } + } + // Next, add stuff + if (additionsPending) { + final ArrayList additions = new ArrayList<>(); + additions.addAll(mPendingAdditions); + mAdditionsList.add(additions); + mPendingAdditions.clear(); + Runnable adder = new Runnable() { + @Override + public void run() { + for (RecyclerView.ViewHolder holder : additions) { + animateAddImpl(holder); + } + additions.clear(); + mAdditionsList.remove(additions); + } + }; + if (removalsPending || movesPending || changesPending) { + long removeDuration = removalsPending ? getRemoveDuration() : 0; + long moveDuration = movesPending ? getMoveDuration() : 0; + long changeDuration = changesPending ? getChangeDuration() : 0; + long totalDelay = removeDuration + Math.max(moveDuration, changeDuration); + View view = additions.get(0).itemView; + ViewCompat.postOnAnimationDelayed(view, adder, totalDelay); + } else { + adder.run(); + } + } + } + + @Override + public boolean animateRemove(final RecyclerView.ViewHolder holder) { + resetAnimation(holder); + mPendingRemovals.add(holder); + return true; + } + + private void animateRemoveImpl(final RecyclerView.ViewHolder holder) { + final View view = holder.itemView; + final ViewPropertyAnimator animation = view.animate(); + mRemoveAnimations.add(holder); + animation.setDuration(getRemoveDuration()).alpha(0).setListener( + new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchRemoveStarting(holder); + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + view.setAlpha(1); + dispatchRemoveFinished(holder); + mRemoveAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateAdd(final RecyclerView.ViewHolder holder) { + resetAnimation(holder); + holder.itemView.setAlpha(0); + mPendingAdditions.add(holder); + return true; + } + + void animateAddImpl(final RecyclerView.ViewHolder holder) { + final View view = holder.itemView; + final ViewPropertyAnimator animation = view.animate(); + mAddAnimations.add(holder); + animation.alpha(1).setDuration(getAddDuration()) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchAddStarting(holder); + } + + @Override + public void onAnimationCancel(Animator animator) { + view.setAlpha(1); + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + dispatchAddFinished(holder); + mAddAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateMove(final RecyclerView.ViewHolder holder, int fromX, int fromY, + int toX, int toY) { + final View view = holder.itemView; + fromX += (int) holder.itemView.getTranslationX(); + fromY += (int) holder.itemView.getTranslationY(); + resetAnimation(holder); + int deltaX = toX - fromX; + int deltaY = toY - fromY; + if (deltaX == 0 && deltaY == 0) { + dispatchMoveFinished(holder); + return false; + } + if (deltaX != 0) { + view.setTranslationX(-deltaX); + } + if (deltaY != 0) { + view.setTranslationY(-deltaY); + } + mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY)); + return true; + } + + void animateMoveImpl(final RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) { + final View view = holder.itemView; + final int deltaX = toX - fromX; + final int deltaY = toY - fromY; + if (deltaX != 0) { + view.animate().translationX(0); + } + if (deltaY != 0) { + view.animate().translationY(0); + } + // TODO: make EndActions end listeners instead, since end actions aren't called when + // vpas are canceled (and can't end them. why?) + // need listener functionality in VPACompat for this. Ick. + final ViewPropertyAnimator animation = view.animate(); + mMoveAnimations.add(holder); + animation.setDuration(getMoveDuration()).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchMoveStarting(holder); + } + + @Override + public void onAnimationCancel(Animator animator) { + if (deltaX != 0) { + view.setTranslationX(0); + } + if (deltaY != 0) { + view.setTranslationY(0); + } + } + + @Override + public void onAnimationEnd(Animator animator) { + animation.setListener(null); + dispatchMoveFinished(holder); + mMoveAnimations.remove(holder); + dispatchFinishedWhenDone(); + } + }).start(); + } + + @Override + public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, + int fromX, int fromY, int toX, int toY) { + if (oldHolder == newHolder) { + // Don't know how to run change animations when the same view holder is re-used. + // run a move animation to handle position changes. + return animateMove(oldHolder, fromX, fromY, toX, toY); + } + final float prevTranslationX = oldHolder.itemView.getTranslationX(); + final float prevTranslationY = oldHolder.itemView.getTranslationY(); + final float prevAlpha = oldHolder.itemView.getAlpha(); + resetAnimation(oldHolder); + int deltaX = (int) (toX - fromX - prevTranslationX); + int deltaY = (int) (toY - fromY - prevTranslationY); + // recover prev translation state after ending animation + oldHolder.itemView.setTranslationX(prevTranslationX); + oldHolder.itemView.setTranslationY(prevTranslationY); + oldHolder.itemView.setAlpha(prevAlpha); + if (newHolder != null) { + // carry over translation values + resetAnimation(newHolder); + newHolder.itemView.setTranslationX(-deltaX); + newHolder.itemView.setTranslationY(-deltaY); + newHolder.itemView.setAlpha(0); + } + mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY)); + return true; + } + + void animateChangeImpl(final ChangeInfo changeInfo) { + final RecyclerView.ViewHolder holder = changeInfo.oldHolder; + final View view = holder == null ? null : holder.itemView; + final RecyclerView.ViewHolder newHolder = changeInfo.newHolder; + final View newView = newHolder != null ? newHolder.itemView : null; + if (view != null) { + final ViewPropertyAnimator oldViewAnim = view.animate().setDuration( + getChangeDuration()); + mChangeAnimations.add(changeInfo.oldHolder); + oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX); + oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY); + oldViewAnim.alpha(0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.oldHolder, true); + } + + @Override + public void onAnimationEnd(Animator animator) { + oldViewAnim.setListener(null); + view.setAlpha(1); + view.setTranslationX(0); + view.setTranslationY(0); + dispatchChangeFinished(changeInfo.oldHolder, true); + mChangeAnimations.remove(changeInfo.oldHolder); + dispatchFinishedWhenDone(); + } + }).start(); + } + if (newView != null) { + final ViewPropertyAnimator newViewAnimation = newView.animate(); + mChangeAnimations.add(changeInfo.newHolder); + newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()) + .alpha(1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animator) { + dispatchChangeStarting(changeInfo.newHolder, false); + } + @Override + public void onAnimationEnd(Animator animator) { + newViewAnimation.setListener(null); + newView.setAlpha(1); + newView.setTranslationX(0); + newView.setTranslationY(0); + dispatchChangeFinished(changeInfo.newHolder, false); + mChangeAnimations.remove(changeInfo.newHolder); + dispatchFinishedWhenDone(); + } + }).start(); + } + } + + private void endChangeAnimation(List infoList, RecyclerView.ViewHolder item) { + for (int i = infoList.size() - 1; i >= 0; i--) { + ChangeInfo changeInfo = infoList.get(i); + if (endChangeAnimationIfNecessary(changeInfo, item)) { + if (changeInfo.oldHolder == null && changeInfo.newHolder == null) { + infoList.remove(changeInfo); + } + } + } + } + + private void endChangeAnimationIfNecessary(ChangeInfo changeInfo) { + if (changeInfo.oldHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.oldHolder); + } + if (changeInfo.newHolder != null) { + endChangeAnimationIfNecessary(changeInfo, changeInfo.newHolder); + } + } + private boolean endChangeAnimationIfNecessary(ChangeInfo changeInfo, RecyclerView.ViewHolder item) { + boolean oldItem = false; + if (changeInfo.newHolder == item) { + changeInfo.newHolder = null; + } else if (changeInfo.oldHolder == item) { + changeInfo.oldHolder = null; + oldItem = true; + } else { + return false; + } + item.itemView.setAlpha(1); + item.itemView.setTranslationX(0); + item.itemView.setTranslationY(0); + dispatchChangeFinished(item, oldItem); + return true; + } + + @Override + public void endAnimation(RecyclerView.ViewHolder item) { + final View view = item.itemView; + // this will trigger end callback which should set properties to their target values. + view.animate().cancel(); + // TODO if some other animations are chained to end, how do we cancel them as well? + for (int i = mPendingMoves.size() - 1; i >= 0; i--) { + MoveInfo moveInfo = mPendingMoves.get(i); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + mPendingMoves.remove(i); + } + } + endChangeAnimation(mPendingChanges, item); + if (mPendingRemovals.remove(item)) { + view.setAlpha(1); + dispatchRemoveFinished(item); + } + if (mPendingAdditions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + } + + for (int i = mChangesList.size() - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + endChangeAnimation(changes, item); + if (changes.isEmpty()) { + mChangesList.remove(i); + } + } + for (int i = mMovesList.size() - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + for (int j = moves.size() - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + if (moveInfo.holder == item) { + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(i); + } + break; + } + } + } + for (int i = mAdditionsList.size() - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + if (additions.remove(item)) { + view.setAlpha(1); + dispatchAddFinished(item); + if (additions.isEmpty()) { + mAdditionsList.remove(i); + } + } + } + + // animations should be ended by the cancel above. + //noinspection PointlessBooleanExpression,ConstantConditions + if (mRemoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mRemoveAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mAddAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mAddAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mChangeAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mChangeAnimations list"); + } + + //noinspection PointlessBooleanExpression,ConstantConditions + if (mMoveAnimations.remove(item) && DEBUG) { + throw new IllegalStateException("after animation is cancelled, item should not be in " + + "mMoveAnimations list"); + } + dispatchFinishedWhenDone(); + } + + private void resetAnimation(RecyclerView.ViewHolder holder) { + if (sDefaultInterpolator == null) { + sDefaultInterpolator = new ValueAnimator().getInterpolator(); + } + holder.itemView.animate().setInterpolator(sDefaultInterpolator); + endAnimation(holder); + } + + @Override + public boolean isRunning() { + return (!mPendingAdditions.isEmpty() + || !mPendingChanges.isEmpty() + || !mPendingMoves.isEmpty() + || !mPendingRemovals.isEmpty() + || !mMoveAnimations.isEmpty() + || !mRemoveAnimations.isEmpty() + || !mAddAnimations.isEmpty() + || !mChangeAnimations.isEmpty() + || !mMovesList.isEmpty() + || !mAdditionsList.isEmpty() + || !mChangesList.isEmpty()); + } + + /** + * Check the state of currently pending and running animations. If there are none + * pending/running, call {@link #dispatchAnimationsFinished()} to notify any + * listeners. + */ + void dispatchFinishedWhenDone() { + if (!isRunning()) { + dispatchAnimationsFinished(); + } + } + + @Override + public void endAnimations() { + int count = mPendingMoves.size(); + for (int i = count - 1; i >= 0; i--) { + MoveInfo item = mPendingMoves.get(i); + View view = item.holder.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(item.holder); + mPendingMoves.remove(i); + } + count = mPendingRemovals.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingRemovals.get(i); + dispatchRemoveFinished(item); + mPendingRemovals.remove(i); + } + count = mPendingAdditions.size(); + for (int i = count - 1; i >= 0; i--) { + RecyclerView.ViewHolder item = mPendingAdditions.get(i); + item.itemView.setAlpha(1); + dispatchAddFinished(item); + mPendingAdditions.remove(i); + } + count = mPendingChanges.size(); + for (int i = count - 1; i >= 0; i--) { + endChangeAnimationIfNecessary(mPendingChanges.get(i)); + } + mPendingChanges.clear(); + if (!isRunning()) { + return; + } + + int listCount = mMovesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList moves = mMovesList.get(i); + count = moves.size(); + for (int j = count - 1; j >= 0; j--) { + MoveInfo moveInfo = moves.get(j); + RecyclerView.ViewHolder item = moveInfo.holder; + View view = item.itemView; + view.setTranslationY(0); + view.setTranslationX(0); + dispatchMoveFinished(moveInfo.holder); + moves.remove(j); + if (moves.isEmpty()) { + mMovesList.remove(moves); + } + } + } + listCount = mAdditionsList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList additions = mAdditionsList.get(i); + count = additions.size(); + for (int j = count - 1; j >= 0; j--) { + RecyclerView.ViewHolder item = additions.get(j); + View view = item.itemView; + view.setAlpha(1); + dispatchAddFinished(item); + additions.remove(j); + if (additions.isEmpty()) { + mAdditionsList.remove(additions); + } + } + } + listCount = mChangesList.size(); + for (int i = listCount - 1; i >= 0; i--) { + ArrayList changes = mChangesList.get(i); + count = changes.size(); + for (int j = count - 1; j >= 0; j--) { + endChangeAnimationIfNecessary(changes.get(j)); + if (changes.isEmpty()) { + mChangesList.remove(changes); + } + } + } + + cancelAll(mRemoveAnimations); + cancelAll(mMoveAnimations); + cancelAll(mAddAnimations); + cancelAll(mChangeAnimations); + + dispatchAnimationsFinished(); + } + + void cancelAll(List viewHolders) { + for (int i = viewHolders.size() - 1; i >= 0; i--) { + viewHolders.get(i).itemView.animate().cancel(); + } + } + + /** + * {@inheritDoc} + *

+ * If the payload list is not empty, DefaultItemAnimator returns true. + * When this is the case: + *

    + *
  • If you override {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, both + * ViewHolder arguments will be the same instance. + *
  • + *
  • + * If you are not overriding {@link #animateChange(RecyclerView.ViewHolder, RecyclerView.ViewHolder, int, int, int, int)}, + * then DefaultItemAnimator will call {@link #animateMove(RecyclerView.ViewHolder, int, int, int, int)} and + * run a move animation instead. + *
  • + *
+ */ + @Override + public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, + @NonNull List payloads) { + return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads); + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt new file mode 100644 index 0000000000..45f0d1b1fb --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -0,0 +1,142 @@ +package com.mogo.och.bus.ui.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.och.bus.R +import com.mogo.och.bus.bean.BusQueryLinesResponse +import com.mogo.och.bus.ui.adapter.SwitchLineAdapter.SwitchLineViewHolder + +/** + * 路线列表adapter + */ +class SwitchLineAdapter( + private val mContext: Context, + private val mData: List +) : RecyclerView.Adapter() { + companion object{ + const val TAG = "SwitchLineAdapter" + } + // RecyclerView设置点击事件 + private var mItemClickListener: LineItemClickListener? = null + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): SwitchLineViewHolder { + val view = LayoutInflater.from(mContext).inflate( + R.layout.bus_switch_line_list_item, parent, false + ) + return SwitchLineViewHolder(view) + } + + override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { + val currentPosition = holder.bindingAdapterPosition + val line = mData[currentPosition] + holder.lineName.text = line.name + holder.lineEndName.text = mContext.getString(R.string.bus_line_goto_end, line.endSiteName) + holder.rvLineTask.layoutManager = GridLayoutManager(mContext, 3) + val switchLineTaskAdapter = + SwitchLineTaskAdapter( + mContext, + line.taskList + ) + holder.rvLineTask.adapter = switchLineTaskAdapter + holder.rvLineTask.isFocusableInTouchMode = false + holder.actvShowMore.visibility = View.VISIBLE + + if(line.open){ + if(line.taskList==null||line.taskList.isEmpty()){ + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_no_task) + holder.vLineTask.visibility = View.GONE + holder.rvLineTask.visibility = View.GONE + holder.selectIv.visibility = View.INVISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal) + }else { + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_select_task) + holder.vLineTask.visibility = View.VISIBLE + holder.rvLineTask.visibility = View.VISIBLE + holder.selectIv.visibility = View.VISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_selected) + holder.selectIv.apply { + pivotX = 9.5f + pivotY = 17f + rotation = 90f + } + } + }else{ + if(line.haveTask){ + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_no_task) + holder.vLineTask.visibility = View.GONE + holder.rvLineTask.visibility = View.GONE + holder.selectIv.visibility = View.INVISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal) + }else { + holder.actvShowMore.text = mContext.getString(R.string.bus_switch_line_select_task) + holder.vLineTask.visibility = View.GONE + holder.rvLineTask.visibility = View.GONE + holder.selectIv.visibility = View.VISIBLE + holder.itemView.setBackgroundResource(R.drawable.bus_shape_select_line_item_bg_normal) + holder.selectIv.apply { + pivotX = 9.5f + pivotY = 17f + rotation = 0f + } + } + } + + + //设置item点击事件 + holder.itemView.setOnClickListener { + if(holder.actvShowMore.text==mContext.getString(R.string.bus_switch_line_no_task)){ + return@setOnClickListener + } + closeOther() + mItemClickListener?.onItemClick(currentPosition) + line.open = holder.rvLineTask.visibility == View.GONE + } + } + + private fun closeOther() { + mData.forEachIndexed { index, result -> + if(result.open){ + result.open = false; + notifyItemChanged(index) + } + } + } + + override fun getItemCount(): Int { + return mData.size + } + + fun setOnLineItemClickListener(itemClickListener: LineItemClickListener?) { + mItemClickListener = itemClickListener + } + + class SwitchLineViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val selectIv: ImageView + val lineName: AppCompatTextView//线路名称 + val lineEndName: AppCompatTextView //终点 + val actvShowMore: AppCompatTextView //选择时间 + val rvLineTask: RecyclerView// 排班时间 + val vLineTask: View// 白色分割线 + + init { + selectIv = itemView.findViewById(R.id.switch_line_item_select_iv) + lineName = itemView.findViewById(R.id.switch_line_name) + lineEndName = itemView.findViewById(R.id.switch_line_end_station) + rvLineTask = itemView.findViewById(R.id.rv_line_task_list) + vLineTask = itemView.findViewById(R.id.v_line_task) + actvShowMore = itemView.findViewById(R.id.actv_show_more) + } + } + + interface LineItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java new file mode 100644 index 0000000000..9920b88d1a --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java @@ -0,0 +1,73 @@ +package com.mogo.och.bus.ui.adapter; + + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.och.bus.R; +import com.mogo.och.bus.bean.BusQueryLinesResponse; + +import java.util.List; + +/** + * 路线列表adapter + */ +public class SwitchLineTaskAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mData; + + public SwitchLineTaskAdapter(Context context, List data) { + mContext = context; + mData = data; + } + + @NonNull + @Override + public SwitchLineTaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_task_item + , parent, false); + return new SwitchLineTaskViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull SwitchLineTaskViewHolder holder, int position) { + int currentPosition = holder.getBindingAdapterPosition(); + BusQueryLinesResponse.Result line = mData.get(currentPosition); + holder.lineTask.setText(line.name); + holder.lineTask.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + } + + @Override + public int getItemCount() { + return mData==null?0:mData.size(); + } + + static class SwitchLineTaskViewHolder extends RecyclerView.ViewHolder { + + private TextView lineTask; // 时间 + + public SwitchLineTaskViewHolder(@NonNull View itemView) { + super(itemView); + lineTask = itemView.findViewById(R.id.actv_line_task); + } + } + + public interface LineItemClickListener { + void onItemClick(int position) ; + } + +} + + diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_line_task_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b32f0693a6bd437f6e1c5e6039e9f9ef092dcaa3 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^!a%IV!3HGvmOVNGq!^2X+?^QKos)S9xJU2c1fa4|PZ!4! z58k!YZhJX7inQtOUB6p{=W{@cUAzAS=}KLeMwW#gi(Icr|4^Bzv9xm6`=D+2oAgo) zCv8p>`?KNttCez^+OPBCOQV(s$U*6*hMs&A9%+1V6SKe zcg{lwvo!~dHcVxX*v_PV;2PHsMf>mbuP)QG@cHvgmP=ku;3tFklEd$rAM_cUGQ=+a z;K}VW?K02H57B-*xHW1PGIwrfWjwWz^U}pd1wZ249$VZtTTsjHHNCujy@=Ft%U29< zty|_-J}>7;exV?{UgVF%rfG&RyH87-UOwuY5GwNA>+AL1!VL$f@71j;wf^om OKzq9SxvX + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml new file mode 100644 index 0000000000..e5faafb27b --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_bg_selected.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml new file mode 100644 index 0000000000..ee8088637c --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml new file mode 100644 index 0000000000..e2b482ee5f --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_shape_select_line_item_time_bg_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml index 91d2b5134d..95482563ea 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" android:background="@color/bus_switch_line_bg"> + android:background="@drawable/bus_shape_select_line_item_bg_normal"> + + + android:layout_marginEnd="@dimen/dp_80" + android:background="@drawable/bus_line_task_arrow" + app:layout_constraintBottom_toTopOf="@+id/v_line_task" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:textSize="@dimen/dp_46" + android:textStyle="bold" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/bus_switch_line_name" /> - - - - - - - - - + app:layout_constraintBottom_toTopOf="@+id/v_line_task" + app:layout_constraintStart_toStartOf="@+id/switch_line_name" + app:layout_constraintTop_toBottomOf="@+id/switch_line_name" + tools:text="@string/bus_switch_line_end" /> + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml new file mode 100644 index 0000000000..07cb6d0eec --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_task_item.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml index 96338fac55..388f2f67d1 100644 --- a/OCH/mogo-och-bus/src/main/res/values/colors.xml +++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml @@ -45,4 +45,6 @@ #FFFFE198 #FFFF9B00 #59FFFFFF + + #B9C3E9 \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/strings.xml b/OCH/mogo-och-bus/src/main/res/values/strings.xml index 992ab6c19c..ec3fa24cce 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -5,7 +5,9 @@ 启动成功 启动失败 自动驾驶 - 路线列表 + 任务列表 + 暂无任务 + 选择时间 路线: 起点: 终点: @@ -17,6 +19,7 @@ 当前车辆无路线\n请联系运营人员绑定 起点: 终点: + 往%1$s方向 更换路线成功 更换路线失败 diff --git a/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml b/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml new file mode 100644 index 0000000000..76ec386d95 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/xml/bus_switch_line_list_item_scene.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt b/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt index 76f5f67a00..b10afe9aa9 100644 --- a/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt +++ b/OCH/mogo-och-common-module/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt @@ -1,8 +1,8 @@ package com.mogo.och.common.module -import org.junit.Test - +import com.zhidao.thirdlogin.utils.Aes import org.junit.Assert.* +import org.junit.Test /** * Example local unit test, which will execute on the development machine (host). @@ -13,5 +13,11 @@ class ExampleUnitTest { @Test fun addition_isCorrect() { assertEquals(4, 2 + 2) + + val json = "{\"device\":\"03cdfec225781de0\",\"time\":" + System.currentTimeMillis() + "}" + val IVS = "tqXMOa6g2w3S4sso+DqCfKAHRNA5jg3Mzp45e33zHFA=" + val KEY = "y5VajBH+sTHonJP2a5Uh6uDZcK0fxNB5ORHmbg9B3V0=" + val encrypt: String = Aes.encrypt(json, KEY, IVS, "UTF-8") + println(encrypt) } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java index f052794c40..5af7ed7006 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java @@ -54,7 +54,7 @@ public class TaxiPassengerServiceManager { * @return */ private String getDriverAppSn(){ - return CallerTelematicManager.INSTANCE.getServerToken(); + return "X20202206092431156"; } /** diff --git a/config.gradle b/config.gradle index 0341f9f4a2..38964cc4ed 100644 --- a/config.gradle +++ b/config.gradle @@ -248,7 +248,10 @@ ext { //========================= Koom ====================== koomnative : "com.kuaishou.koom:koom-native-leak-static:2.2.0", - koomxhook : "com.kuaishou.koom:xhook-static:2.2.0" + koomxhook : "com.kuaishou.koom:xhook-static:2.2.0", + + //========================= Koom ====================== + recyclerviewadapterhelper : "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.4" ] } From f50cea4c07d5a9e6732db94554f9dc36e305726c Mon Sep 17 00:00:00 2001 From: lianglihui Date: Mon, 19 Sep 2022 18:02:52 +0800 Subject: [PATCH 006/226] =?UTF-8?q?2.10.0=20=E9=AB=98=E7=B2=BE=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E9=87=87=E9=9B=86tool=20=20update=20to=20=201.1.2.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a0f811cf43..349da26c0a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -83,7 +83,7 @@ MOGO_TELEMATIC_VERSION=1.4.3.26 ######## MogoAiCloudSDK Version ######## # 自研地图 MAP_SDK_VERSION=2.4.2.3 -MAP_SDK_OPERATION_VERSION=1.1.2 +MAP_SDK_OPERATION_VERSION=1.1.2.4 # websocket WEBSOCKET_VERSION=1.1.7 ## 产品库必备配置,产品库自动对versionCode和versionName版本进行升级 From 8648a9e5334c5cf992cc730fe20b30e5d3a5de1c Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 20 Sep 2022 11:37:20 +0800 Subject: [PATCH 007/226] =?UTF-8?q?[2110]=20=E6=8A=BD=E5=8F=96taxi?= =?UTF-8?q?=E5=88=B0common?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OCH/mogo-och-common-module/build.gradle | 22 +++ .../biz}/bean/DriverStatusQueryRespBean.java | 2 +- .../module/biz}/bean/TaxiLoginReqBean.java | 6 +- .../module/biz}/bean/TaxiLoginRespBean.java | 8 +- .../module/biz}/bean/TaxiLoginSmsReqBean.java | 6 +- .../module/biz}/bean/TaxiLogoutReqBean.java | 6 +- .../module/biz/callback/ILoginCallback.java | 9 ++ .../module/biz/callback/ILoginViewCallback.kt | 13 ++ .../biz}/callback/ITaxiLoginCallback.java | 9 +- .../module/biz/constant/LoginStatusManager.kt | 38 +++++ .../module/biz/constant/OchCommonConst.kt | 28 ++++ .../biz}/constant/TaxiLoginStatusEnum.kt | 2 +- .../module/biz/model/OchCommonLoginModel.kt} | 40 +++-- .../model/OchCommonLoginStatusDefaultModel.kt | 41 +++++ .../biz/model/OchCommonLoginStatusModel.java | 128 ++++++++++++++++ .../biz/network/OchCommonServiceApiNew.java | 63 ++++++++ .../biz/network/OchCommonServiceCallback.java | 18 +++ .../biz/network/OchCommonServiceManager.java | 143 ++++++++++++++++++ .../biz/presenter/OchCommonLoginPresenter.kt} | 28 ++-- .../OchCommonLoginStatusDefaultPresenter.kt | 48 ++++++ .../module/biz/provider/LoginService.kt | 29 ++++ .../module/biz/provider/LoginServiceImpl.kt | 109 +++++++++++++ .../module/biz}/ui/TaxiLoginDialogFragment.kt | 14 +- .../color/taxi_login_get_code_text_color.xml | 0 .../res/drawable-xhdpi}/taxi_ic_login_bg.webp | Bin .../res/drawable/taxi_login_bg_selector.xml | 0 .../main/res/drawable/taxi_login_enable.xml | 0 .../taxi_login_get_code_text_color.xml | 0 .../res/drawable/taxi_login_phone_error.xml | 0 .../res/drawable/taxi_login_phone_normal.xml | 0 .../main/res/drawable/taxi_login_unenable.xml | 0 .../src/main/res/layout/taxi_login_view.xml | 0 .../src/main/res/values/colors.xml | 13 ++ .../src/main/res/values/strings.xml | 17 +++ .../src/main/res/values/styles.xml | 21 +++ .../taxi/callback/ITaxiCarStatusCallback.java | 2 - .../com/mogo/och/taxi/constant/TaxiConst.kt | 1 - .../taxi/constant/TaxtServingStatusManager.kt | 38 +++++ .../com/mogo/och/taxi/model/TaxiModel.java | 124 ++------------- .../och/taxi/network/TaxiServiceApiNew.java | 45 ------ .../och/taxi/network/TaxiServiceManager.java | 72 --------- .../och/taxi/presenter/TaxiPresenter.java | 64 ++++---- .../com/mogo/och/taxi/ui/TaxiFragment.java | 73 +++------ .../com/mogo/och/taxi/utils/StatusManager.kt | 73 --------- .../taxi_ic_login_bg.webp | Bin 44568 -> 0 bytes .../res/drawable-xhdpi/taxi_ic_login_bg.webp | Bin 44568 -> 0 bytes .../src/main/res/values/colors.xml | 10 -- .../src/main/res/values/strings.xml | 11 -- .../src/main/res/values/styles.xml | 18 --- 49 files changed, 896 insertions(+), 496 deletions(-) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/DriverStatusQueryRespBean.java (90%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginReqBean.java (81%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginRespBean.java (54%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLoginSmsReqBean.java (54%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/bean/TaxiLogoutReqBean.java (77%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/callback/ITaxiLoginCallback.java (58%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/constant/TaxiLoginStatusEnum.kt (90%) rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt} (78%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt} (79%) create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt rename OCH/{mogo-och-taxi/src/main/java/com/mogo/och/taxi => mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz}/ui/TaxiLoginDialogFragment.kt (96%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/color/taxi_login_get_code_text_color.xml (100%) rename OCH/{mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440 => mogo-och-common-module/src/main/res/drawable-xhdpi}/taxi_ic_login_bg.webp (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_bg_selector.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_enable.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_get_code_text_color.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_phone_error.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_phone_normal.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/drawable/taxi_login_unenable.xml (100%) rename OCH/{mogo-och-taxi => mogo-och-common-module}/src/main/res/layout/taxi_login_view.xml (100%) create mode 100644 OCH/mogo-och-common-module/src/main/res/values/colors.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/strings.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/styles.xml create mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt delete mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/StatusManager.kt delete mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp delete mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index 1f74335527..927d871c22 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +apply plugin: 'com.alibaba.arouter' android { compileSdkVersion 31 @@ -14,6 +16,22 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + //ARouter apt 参数 + kapt { + useBuildCache = false + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = "1.8" } buildTypes { @@ -34,6 +52,10 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation rootProject.ext.dependencies.amapnavi3dmap + implementation rootProject.ext.dependencies.rxandroid + + implementation rootProject.ext.dependencies.arouter + kapt rootProject.ext.dependencies.aroutercompiler if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogoutils diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java index ac630c9ecf..903fece224 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; import com.mogo.eagle.core.data.BaseData; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java similarity index 81% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java index 0591d3f878..ebe1fa2731 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yangyakun on 2021/8/19 + * 通过手机号验证码登录 */ public class TaxiLoginReqBean { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java index c1265a9be3..9cda2a96c6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginRespBean.java @@ -1,14 +1,14 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; import com.mogo.eagle.core.data.BaseData; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yangyakun on 2021/8/19 + * 通过验证码登录 */ public class TaxiLoginRespBean extends BaseData { - public TaxiLoginRespBean.Result data; + public Result data; public static class Result { public Double lat; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java similarity index 54% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java index 3a4d4d7a4f..3c246bc153 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLoginSmsReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLoginSmsReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yyk on 2021/8/19 + * 获取验证码 */ public class TaxiLoginSmsReqBean { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java similarity index 77% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java index ced9b2eddb..22e63dd838 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiLogoutReqBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/TaxiLogoutReqBean.java @@ -1,8 +1,8 @@ -package com.mogo.och.taxi.bean; +package com.mogo.och.common.module.biz.bean; /** - * Created by pangfan on 2021/8/19 - * 司机端准备好或者乘客已验证上车请求参数 + * Created by yyk on 2021/8/19 + * 登出请求参数 */ public class TaxiLogoutReqBean { public String sn; diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java new file mode 100644 index 0000000000..481a2cd75b --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginCallback.java @@ -0,0 +1,9 @@ +package com.mogo.och.common.module.biz.callback; + +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; + +public interface ILoginCallback { + void loginSuccess(DriverStatusQueryRespBean data); + + void loginFail(boolean isLogin); +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt new file mode 100644 index 0000000000..033e900e77 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ILoginViewCallback.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.callback + +interface ILoginViewCallback { + /** + * 展示登录页面 + */ + fun showLoginDialogFragment() + + /** + * 隐藏登录页面 + */ + fun hideLoginDialogFragment() +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java similarity index 58% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java index a8f35171cb..5cbca0d853 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiLoginCallback.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/callback/ITaxiLoginCallback.java @@ -1,11 +1,4 @@ -package com.mogo.och.taxi.callback; - -import androidx.annotation.NonNull; - -import com.mogo.och.taxi.bean.OrderQueryRespBean; -import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; - -import java.util.List; +package com.mogo.och.common.module.biz.callback; /** * Created on 2021/9/8 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt new file mode 100644 index 0000000000..8f290529b7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/LoginStatusManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.common.module.biz.constant + +object LoginStatusManager { + /** + * 登录状态 + */ + private var loginStatus: TaxiLoginStatusEnum = TaxiLoginStatusEnum.None + + @JvmStatic + fun setLoginStatus(status: Int) { + when (status) { + 0 -> { + this.loginStatus = TaxiLoginStatusEnum.Logout + } + 1 -> { + this.loginStatus = TaxiLoginStatusEnum.Login + } + else -> { + this.loginStatus = TaxiLoginStatusEnum.None + } + } + } + @JvmStatic + fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) { + this.loginStatus = loginStatus + } + @JvmStatic + fun getLoginStatus(): TaxiLoginStatusEnum { + return loginStatus + } + @JvmStatic + fun isLogin():Boolean { + if(loginStatus== TaxiLoginStatusEnum.Login){ + return true + } + return false + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt new file mode 100644 index 0000000000..55a0b5cc2a --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt @@ -0,0 +1,28 @@ +package com.mogo.och.common.module.biz.constant + +import com.mogo.commons.debug.DebugConfig + +/** + * Created on 2021/12/6 + */ +class OchCommonConst { + companion object { + + private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com" + private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com" + private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com" + + @JvmStatic + fun getBaseUrl(): String { + return when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV + DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA + DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE + else -> BASE_URL_OCH_RELEASE + } + } + // token 失效 重新获取token + const val WAIT_TAKEN = 100046 + + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt similarity index 90% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt index 5e19782f5e..451196d777 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiLoginStatusEnum.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/TaxiLoginStatusEnum.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.constant +package com.mogo.och.common.module.biz.constant /** * Created on 2022/08/19 diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt similarity index 78% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt index bdef0b53fd..08f1acc43f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiLoginModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -1,21 +1,20 @@ -package com.mogo.och.taxi.model +package com.mogo.och.common.module.biz.model import android.annotation.SuppressLint import android.content.Context import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.utilcode.util.NetworkUtils -import com.mogo.och.taxi.model.TaxiLoginModel -import com.mogo.och.taxi.callback.ITaxiLoginCallback -import com.mogo.module.common.MogoApisHandler -import com.mogo.map.navi.IMogoCarLocationChangedListener2 -import com.mogo.och.taxi.network.TaxiServiceManager -import com.mogo.och.taxi.network.TaxiServiceCallback import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.bean.TaxiLoginReqBean -import com.mogo.och.taxi.bean.TaxiLoginRespBean -import com.mogo.och.taxi.constant.TaxiLoginStatusEnum -import com.mogo.och.taxi.utils.StatusManager +import com.mogo.map.navi.IMogoCarLocationChangedListener2 +import com.mogo.module.common.MogoApisHandler +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean +import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback +import com.mogo.och.common.module.biz.constant.TaxiLoginStatusEnum +import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.biz.network.OchCommonServiceManager /** * Created by pangfan on 2021/8/19 @@ -24,7 +23,7 @@ import com.mogo.och.taxi.utils.StatusManager * 网约车 - 出租车业务逻辑处理 */ @SuppressLint("StaticFieldLeak") -object TaxiLoginModel{ +object OchCommonLoginModel{ private val TAG = "TaxiLoginModel" private var mContext: Context? = null @@ -34,10 +33,7 @@ object TaxiLoginModel{ fun init(context: Context) { mContext = context.applicationContext // 达到起始站围栏监听 - MogoApisHandler.getInstance() - .apis - .registerCenterApi - .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) + MogoApisHandler.getInstance().apis.registerCenterApi.registerCarLocationChangedListener(TAG, mCarLocationChangedListener2) } fun hasInit():Boolean{ @@ -73,8 +69,8 @@ object TaxiLoginModel{ * 获取手机验证码 */ fun getPhoneCode(phone: String?) { - TaxiServiceManager.getInstance().getPhoneCode(mContext, phone, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().getPhoneCode(mContext, phone, + object : OchCommonServiceCallback { override fun onSuccess(data: BaseData?) { if (null != data && 0 == data.code) { // 获取验证码成功 @@ -103,13 +99,13 @@ object TaxiLoginModel{ fun gotoLogin(phone: String, code: String) { val location4Login = TaxiLoginReqBean.Location4Login(mLatitude, mLongitude) - TaxiServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, - object : TaxiServiceCallback { + OchCommonServiceManager.getInstance().gotoLoginBycode(mContext, phone, code, location4Login, + object : OchCommonServiceCallback { override fun onSuccess(data: TaxiLoginRespBean?) { if (null != data && 0 == data.code) { // 获取验证码成功 ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_login_success)) - StatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) iTaxiLoginCallback?.loginSuccess() } else { if (data != null) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt new file mode 100644 index 0000000000..c935981982 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt @@ -0,0 +1,41 @@ +package com.mogo.och.common.module.biz.model + +import android.annotation.SuppressLint +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.constant.LoginStatusManager + +@SuppressLint("StaticFieldLeak") +object OchCommonLoginStatusDefaultModel : OchCommonLoginStatusModel() { + + + const val TAG = "OchCommonLoginStatusDefaultModel" + + + var loginCallback: ILoginCallback? = null + var loginViewCallback: ILoginViewCallback? = null + + override fun loginSuccess(data: DriverStatusQueryRespBean?) { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginSuccess:${LoginStatusManager.isLogin()}") + if (LoginStatusManager.isLogin()) { + loginViewCallback?.hideLoginDialogFragment() + } else { + loginViewCallback?.showLoginDialogFragment() + } + loginCallback?.loginSuccess(data) + } + + override fun loginFail(isLogin: Boolean) { + CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginFail:$isLogin") + if (isLogin) { + loginViewCallback?.hideLoginDialogFragment() + } else { + loginViewCallback?.showLoginDialogFragment() + } + loginCallback?.loginFail(isLogin) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java new file mode 100644 index 0000000000..0b1e9f0bfb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusModel.java @@ -0,0 +1,128 @@ +package com.mogo.och.common.module.biz.model; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +import android.content.Context; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.och.common.module.R; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; +import com.mogo.och.common.module.biz.network.OchCommonServiceManager; +import com.mogo.och.common.module.utils.ToastUtilsOch; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; + +public abstract class OchCommonLoginStatusModel { + + private static final String TAG = "OchCommonLoginStatusModel"; + + protected Context mContext; + + private Disposable subscribe; + + + public void init() { + mContext = AbsMogoApplication.getApp(); + queryCarStatus(); + } + + protected abstract void loginSuccess(DriverStatusQueryRespBean data); + + protected abstract void loginFail(boolean isLogin); + + /** + * 接单状态和登录状态查询 + * 1、初始化查询 + * 2、错误重试 + * 3、错误重试 + * 4、登出后重试 + * 5、变更出车状态查下 + * 6、变更出车状态查下 + * 7、网络状态变更后查询 + * 8、登录页面关闭后查下状态 + */ + public void queryCarStatus() { + OchCommonServiceManager.getInstance().queryDriverServiceStatus(mContext, + new OchCommonServiceCallback() { + @Override + public void onSuccess(DriverStatusQueryRespBean data) { + if (null != data && 0 == data.code) { + LoginStatusManager.setLoginStatus(data.data.driverStatus); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + LoginStatusManager.getLoginStatus()); + loginSuccess(data); + } + } + + @Override + public void onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); + } else { + ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); + } + subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> { + queryCarStatus(); + }); + } + + @Override + public void onFail(int code, String msg) { + ToastUtilsOch.showWithCodeMessage(code,msg); + if(code== OchCommonConst.WAIT_TAKEN){ + subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> { + queryCarStatus(); + }); + }else { + loginFail(LoginStatusManager.isLogin()); + } + } + }); + } + + // 登出 + public void logout(double mLatitude,double mLongitude) { + TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); + OchCommonServiceManager.getInstance().logout(mContext,location4Login, + new OchCommonServiceCallback() { + @Override + public void onSuccess(BaseData data) { + if (null != data && 0 == data.code) { + loginFail(false); + queryCarStatus(); + } + } + + @Override + public void onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); + } else { + ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); + } + } + + @Override + public void onFail(int code, String msg) { + ToastUtilsOch.showWithCodeMessage(code,msg); + } + }); + } + + public void release() { + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } + } + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java new file mode 100644 index 0000000000..da32fc85be --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java @@ -0,0 +1,63 @@ +package com.mogo.och.common.module.biz.network; +import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; + +import io.reactivex.Observable; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * Created by pangfan on 2021/8/19 + * + * 网约车-出租车接口定义 + */ +interface OchCommonServiceApiNew { + /** + * 获取手机验证码 + * + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) + @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" ) + Observable getPhoneCode(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data); + /** + * 通过验证码登录 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) + Observable gotoLoginBycode(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); + /** + * 登出接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation") + Observable logout(@Header("appId") String appId, @Header("ticket") String ticket, + @Body TaxiLogoutReqBean data); + + /** + * 接单状态和登录状态查询 + * @param sn + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) + @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) + Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId + ,@Header("ticket") String ticket,@Query("sn") String sn); + +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java new file mode 100644 index 0000000000..8433def5f0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceCallback.java @@ -0,0 +1,18 @@ +package com.mogo.och.common.module.biz.network; + +/** + * @author congtaowang + * @since 2021/1/15 + * + * 修改订单状态回调接口 + */ +public interface OchCommonServiceCallback< T > { + + void onSuccess(T data); + + void onFail(int code, String msg); + + default void onError() { + + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java new file mode 100644 index 0000000000..668f781253 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java @@ -0,0 +1,143 @@ +package com.mogo.och.common.module.biz.network; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +import android.content.Context; + +import com.mogo.cloud.passport.MoGoAiCloudClient; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.eagle.core.data.BaseData; +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.utilcode.mogo.logger.CallerLogger; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean; +import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; +import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; +import com.mogo.och.common.module.biz.constant.OchCommonConst; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by pangfan on 2021/8/19 + */ +public class OchCommonServiceManager { + private static final String TAG = OchCommonServiceManager.class.getSimpleName(); + + private static final class SingletonHolder { + private static final OchCommonServiceManager INSTANCE = new OchCommonServiceManager(); + } + + public static OchCommonServiceManager getInstance() { + return SingletonHolder.INSTANCE; + } + + private OchCommonServiceApiNew mOCHTaxiServiceApi; + + private OchCommonServiceManager() { + if (mOCHTaxiServiceApi == null){ + mOCHTaxiServiceApi = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(OchCommonServiceApiNew.class); + } + } + + /** + * 获取手机验证码 + * @param context + * @param callback + */ + public void getPhoneCode(Context context,String phone, + OchCommonServiceCallback callback) { + mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginSmsReqBean(phone)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "getPhoneCode")); + } + /** + * 通过验证码登录 + * @param context + * @param callback + */ + public void gotoLoginBycode(Context context, String phone, String code, + TaxiLoginReqBean.Location4Login location4Login, + OchCommonServiceCallback callback) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginReqBean(phone, code, sn, location4Login)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); + } + + /** + * 登出 + */ + public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, OchCommonServiceCallback callback) { + mOCHTaxiServiceApi.logout( + MoGoAiCloudClientConfig.getInstance().getServiceAppId(), + MoGoAiCloudClientConfig.getInstance().getToken(), + new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "logout")); + } + + /** + * 接单状态和登录状态查询 + * @param context + * @param callback + */ + public void queryDriverServiceStatus(Context context, + OchCommonServiceCallback callback) { + if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ + callback.onFail(OchCommonConst.WAIT_TAKEN,"等待令牌中请稍等"); + MoGoAiCloudClient.getInstance().refreshToken(); + return; + } + mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,MoGoAiCloudClientConfig.getInstance().getSn()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); + } + + + + private SubscribeImpl getSubscribeImpl( + Context context, OchCommonServiceCallback callback, String apiName) { + return new SubscribeImpl(RequestOptions.create(context)) { + @Override + public void onSuccess(T o) { + super.onSuccess(o); + CallerLogger.INSTANCE.d(M_TAXI + TAG,apiName + ": onSuccess() " + o.msg); + if (callback != null) { + callback.onSuccess(o); + } + } + + @Override + public void onError(Throwable e) { + super.onError(e); + CallerLogger.INSTANCE.e(M_TAXI + TAG,apiName + ": onError() " + e.getMessage()); + if (callback != null) { + callback.onError(); + } + } + + @Override + public void onError(String message, int code) { + super.onError(message, code); + CallerLogger.INSTANCE.e(M_TAXI + TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message)); + if (callback != null) { + callback.onFail(code, message); + } + } + }; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt similarity index 79% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt index 1497683ddc..49b8446a77 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiLoginPresenter.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginPresenter.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.presenter +package com.mogo.och.common.module.biz.presenter import androidx.lifecycle.LifecycleOwner import com.mogo.commons.AbsMogoApplication @@ -7,10 +7,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.RegexUtils import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.callback.ITaxiLoginCallback -import com.mogo.och.taxi.model.TaxiLoginModel -import com.mogo.och.taxi.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.biz.callback.ITaxiLoginCallback +import com.mogo.och.common.module.biz.model.OchCommonLoginModel import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -23,7 +23,7 @@ import java.util.concurrent.TimeUnit * * 描述 */ -class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : +class OchCommonLoginPresenter(view: TaxiLoginDialogFragment?) : Presenter(view), ITaxiLoginCallback { private var countDownDisposable: Disposable? = null @@ -33,12 +33,12 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } private fun initListeners() { - TaxiLoginModel.init(AbsMogoApplication.getApp()) - TaxiLoginModel.setiTaxiLoginCallback(this) + OchCommonLoginModel.init(AbsMogoApplication.getApp()) + OchCommonLoginModel.setiTaxiLoginCallback(this) } fun getPhoneCode(phone:String){ - if(!TaxiLoginModel.hasInit()){ + if(!OchCommonLoginModel.hasInit()){ initListeners() } if (!RegexUtils.isMobileExact(phone)) { @@ -46,7 +46,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : mView?.inputPhoneError() return } - TaxiLoginModel.getPhoneCode(phone) + OchCommonLoginModel.getPhoneCode(phone) } override fun onCreate(owner: LifecycleOwner) { @@ -58,7 +58,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - TaxiLoginModel.release() + OchCommonLoginModel.release() countDownDisposable?.let { if (!it.isDisposed) { it.dispose() @@ -67,7 +67,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } companion object { - private val TAG = TaxiLoginPresenter::class.java.simpleName + private val TAG = OchCommonLoginPresenter::class.java.simpleName } override fun getPhoneCodeSuccess() { @@ -94,7 +94,7 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : } fun gotoLogin(phone: String, code: String) { - if(!TaxiLoginModel.hasInit()){ + if(!OchCommonLoginModel.hasInit()){ initListeners() } if (!RegexUtils.isMobileExact(phone)) { @@ -107,6 +107,6 @@ class TaxiLoginPresenter(view: TaxiLoginDialogFragment?) : return } mView?.closeSoftInput() - TaxiLoginModel.gotoLogin(phone,code) + OchCommonLoginModel.gotoLogin(phone,code) } } \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt new file mode 100644 index 0000000000..a4c77ec190 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/presenter/OchCommonLoginStatusDefaultPresenter.kt @@ -0,0 +1,48 @@ +package com.mogo.och.common.module.biz.presenter + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.OnLifecycleEvent +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.model.OchCommonLoginStatusDefaultModel + +/** + * @author yangyakun + * @since 2020-09-19 + */ +class OchCommonLoginStatusDefaultPresenter : LifecycleObserver { + private var isFirstShow = true + + @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) + fun onCreate(owner: LifecycleOwner) { + OchCommonLoginStatusDefaultModel.init() + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + fun onResume(owner: LifecycleOwner) { + if (isFirstShow) { + isFirstShow = false + } else { + queryLoginStatus() + } + } + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + fun onDestory(owner: LifecycleOwner) { + OchCommonLoginStatusDefaultModel.release() + } + + fun queryLoginStatus() { + OchCommonLoginStatusDefaultModel.queryCarStatus() + } + + fun logOut(mLatitude:Double,mLongitude:Double){ + OchCommonLoginStatusDefaultModel.logout(mLatitude, mLongitude) + } + + fun setLoginCallback(loginCallback: ILoginCallback?,loginViewCallback: ILoginViewCallback?){ + OchCommonLoginStatusDefaultModel.loginCallback = loginCallback + OchCommonLoginStatusDefaultModel.loginViewCallback = loginViewCallback + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt new file mode 100644 index 0000000000..a311da107f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt @@ -0,0 +1,29 @@ +package com.mogo.och.common.module.biz.provider + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.template.IProvider +import com.mogo.och.common.module.biz.callback.ILoginCallback + +interface LoginService : IProvider { + /** + * 注册页面 + * @param fragment 主页面 + * @param callback 回调 + */ + fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) + + fun unRegisterFragment() + + /** + * 查询登录状态 + */ + fun queryLoginStatus():Boolean + + fun queryLoginStatusByNet() + + /** + * 登出 + */ + fun loginOut(mLatitude:Double,mLongitude:Double) + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt new file mode 100644 index 0000000000..dcbe881200 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -0,0 +1,109 @@ +package com.mogo.och.common.module.biz.provider + +import android.content.Context +import android.content.DialogInterface +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.AppStateManager.currentActivity +import com.mogo.och.common.module.biz.callback.ILoginCallback +import com.mogo.och.common.module.biz.callback.ILoginViewCallback +import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.presenter.OchCommonLoginStatusDefaultPresenter +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment +import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment.Companion.newInstance +import java.lang.ref.WeakReference + +@Route(path = "/ochbiz/common/login") +class LoginServiceImpl : LoginService,ILoginViewCallback { + + companion object{ + const val TAG = "LoginServiceImpl" + } + + private var fragment: Fragment?=null + private var taxiLoginDialogFragment: WeakReference? = null + private var presenter: OchCommonLoginStatusDefaultPresenter?=null + + override fun init(context: Context) { + + } + + override fun registerFragment(fragment: Fragment?,loginCallback: ILoginCallback?) { + presenter = OchCommonLoginStatusDefaultPresenter() + this.fragment = fragment + presenter?.let { + it.setLoginCallback(loginCallback, this) + this.fragment?.lifecycle?.addObserver(it) + } + + } + + override fun unRegisterFragment() { + this.presenter?.let { + it.setLoginCallback(null,null) + this.fragment?.lifecycle?.removeObserver(it) + } + this.fragment = null + } + + + override fun showLoginDialogFragment() { + fragment?.let { + CallerHmiManager.hideToolsView() + val parentFragmentManager = it.parentFragmentManager + val fragmentByTag: Fragment? = parentFragmentManager.findFragmentByTag(TAG) + if (fragmentByTag is DialogFragment) { + if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { + return + } + if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { + if (currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 + d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 权限验证") + return + } + } + } + + if (taxiLoginDialogFragment?.get() == null) { + taxiLoginDialogFragment = WeakReference(newInstance()) + } + val taxiLoginDialog = taxiLoginDialogFragment?.get() + if (taxiLoginDialog != null) { + if (taxiLoginDialog.dialog != null && taxiLoginDialog.dialog!!.isShowing) { + return + } + if (taxiLoginDialog.isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + parentFragmentManager.beginTransaction().remove(taxiLoginDialog) + .commitAllowingStateLoss() + } + d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面") + taxiLoginDialog.show(parentFragmentManager, TAG) + taxiLoginDialog.setOnDismissListener(DialogInterface.OnDismissListener { dialog: DialogInterface? -> + taxiLoginDialogFragment?.clear() + presenter?.queryLoginStatus() + }) + } + } + } + override fun hideLoginDialogFragment() { + d(SceneConstant.M_TAXI + TAG, "hideLoginDialogFragment 隐藏登录界面") + if (taxiLoginDialogFragment?.get() != null) { + taxiLoginDialogFragment?.get()?.dismissAllowingStateLoss() + } + } + override fun queryLoginStatus():Boolean { + return LoginStatusManager.isLogin() + } + + override fun queryLoginStatusByNet() { + presenter?.queryLoginStatus() + } + + override fun loginOut(mLatitude:Double,mLongitude:Double) { + presenter?.logOut(mLatitude,mLongitude) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt similarity index 96% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt index 19da74fbae..b08e15472d 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiLoginDialogFragment.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -1,4 +1,4 @@ -package com.mogo.och.taxi.ui +package com.mogo.och.common.module.biz.ui import android.content.DialogInterface import android.graphics.Rect @@ -15,7 +15,6 @@ import androidx.core.widget.addTextChangedListener import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction -import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.mvp.MvpDialogFragment import com.mogo.eagle.core.utilcode.kotlin.onClick @@ -23,16 +22,15 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.KeyboardUtils -import com.mogo.och.taxi.R -import com.mogo.och.taxi.constant.TaxiConst -import com.mogo.och.taxi.presenter.TaxiLoginPresenter +import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.presenter.OchCommonLoginPresenter /** * @author: yangyakun * @date: 2022/8/15 */ -class TaxiLoginDialogFragment : MvpDialogFragment(), +class TaxiLoginDialogFragment : MvpDialogFragment(), DialogInterface.OnKeyListener { lateinit var clMain: ConstraintLayout @@ -169,8 +167,8 @@ class TaxiLoginDialogFragment : MvpDialogFragment + + #2961F2 + #14FF0000 + #FF0000 + #666666 + #86A5F7 + #111533 + #878890 + #EF262C + #4D000000 + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/strings.xml b/OCH/mogo-och-common-module/src/main/res/values/strings.xml new file mode 100644 index 0000000000..f2d52ad1eb --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/strings.xml @@ -0,0 +1,17 @@ + + + + 欢迎您登录 + 登录 + 获取验证码 + 请输入验证码 + 获取验证码成功 + 登录成功 + 请输入正确的手机号 + 请输入正确的验证码 + 请输入手机号 + 请输入手机号 + + 网络异常,请稍后重试 + 请求出现异常,请稍后重试 + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/styles.xml b/OCH/mogo-och-common-module/src/main/res/values/styles.xml new file mode 100644 index 0000000000..b205c0fd04 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/styles.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java index ac0eddc08a..b51f44ec35 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiCarStatusCallback.java @@ -6,9 +6,7 @@ package com.mogo.och.taxi.callback; * Model->Presenter回调:接单车状态变更 登录状态变更 */ public interface ITaxiCarStatusCallback { - void onCarStatusChanged(boolean inOperation,String role); void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum); - void onCarLoginStatusChange(boolean isLogin); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt index 41a1280592..2a399bb339 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt @@ -81,6 +81,5 @@ class TaxiConst { const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L - const val WAIT_TAKEN = 100046 } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt new file mode 100644 index 0000000000..7a42236e8b --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt @@ -0,0 +1,38 @@ +package com.mogo.och.taxi.constant + +object TaxtServingStatusManager { + + /** + * 接单状态 + */ + private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None + + // region 是否可用接单 + @JvmStatic + fun isOpeningOrderStatus():Boolean{ + if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ + return true + } + return false + } + @JvmStatic + fun setOpenOrderStatus(status: Int) { + when (status) { + 0 -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering + } + 1 -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering + } + else -> { + this.openOrderStatus = TaxiOpenOrderStatusEnum.None + } + } + } + @JvmStatic + fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { + return openOrderStatus + } + + //endregion +} \ No newline at end of file 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 06b77b0491..dc0f367ad6 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 @@ -13,6 +13,7 @@ import android.net.ConnectivityManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; @@ -34,12 +35,13 @@ import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.common.module.utils.ToastUtilsOch; import com.mogo.och.taxi.R; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderGrabRespBean; import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRespBean; @@ -50,19 +52,17 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; -import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiConst; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.constant.TaxiOrderTypeEnum; +import com.mogo.och.taxi.constant.TaxtServingStatusManager; import com.mogo.och.taxi.network.TaxiServiceCallback; import com.mogo.och.taxi.network.TaxiServiceManager; -import com.mogo.och.taxi.utils.StatusManager; import com.mogo.och.taxi.utils.TaxiAnalyticsManager; import com.mogo.och.taxi.utils.OrderUtil; import com.mogo.aicloud.services.socket.IMogoLifecycleListener; @@ -79,10 +79,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.TimeUnit; -import io.reactivex.Observable; -import io.reactivex.disposables.Disposable; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; @@ -119,7 +116,6 @@ public class TaxiModel { private ITaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:接单状态、登录状态和司机今日接单状态 private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更 - private Disposable subscribe; private volatile boolean isRestartAutopilot = false; @@ -127,6 +123,8 @@ public class TaxiModel { private double mLongitude, mLatitude; + private LoginService loginService; + private TaxiModel() { } @@ -149,6 +147,7 @@ public class TaxiModel { public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); + loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); // IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); @@ -193,16 +192,13 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception"); } }); - queryCarStatus(); } public void release() { startOrStopOrderLoop(false); startOrStopCalculateRouteInfo(false); releaseListeners(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } + loginService = null; } private void initListeners() { @@ -248,7 +244,7 @@ public class TaxiModel { CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); } - private void startOrStopOrderLoop(boolean start) { + public void startOrStopOrderLoop(boolean start) { CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + start); if (start) { TaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop(); @@ -261,82 +257,18 @@ public class TaxiModel { } } - /** - * 接单状态和登录状态查询 - * 1、初始化查下状态 - * 2、点击更新接单状态 如果是初始化状态就查下状态 - * 3、点击更新接单状态后 查询状态 - * 4、网络状态波动时 查询状态 - * 5、登出后更新状态 - */ - public void queryCarStatus() { - TaxiServiceManager.getInstance().queryDriverServiceStatus(mContext, - new TaxiServiceCallback() { - @Override - public void onSuccess(DriverStatusQueryRespBean data) { - if (null != data && 0 == data.code) { - StatusManager.setLoginStatus(data.data.driverStatus); - StatusManager.setOpenOrderStatus(data.data.servingStatus); - //更新view - CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + StatusManager.getLoginStatus()); - startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus()); - if(mCarStatusCallback!=null) { - mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin()); - } - String role = ""; - if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { - role = TaxiConst.DEMO_USER; - } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { - role = TaxiConst.TEST_USER; - } - if (mCarStatusCallback != null) { - mCarStatusCallback.onCarStatusChanged(StatusManager.isOpeningOrderStatus(), role); - } - - } - } - - @Override - public void onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); - } - subscribe = Observable.timer(5, TimeUnit.SECONDS).subscribe(aLong -> { - queryCarStatus(); - }); - } - - @Override - public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); - if(code==TaxiConst.WAIT_TAKEN){ - subscribe = Observable.timer(3, TimeUnit.SECONDS).subscribe(aLong -> { - queryCarStatus(); - }); - }else { - if (mCarStatusCallback != null) { - mCarStatusCallback.onCarLoginStatusChange(StatusManager.isLogin()); - } - } - } - }); - } - //更新接单状态 public void updateCarStatus() { - if(!StatusManager.isLogin()){ - queryCarStatus(); + if(!LoginStatusManager.isLogin()){ + loginService.queryLoginStatusByNet(); return; } - TaxiServiceManager.getInstance().changeOrderServing(mContext,StatusManager.isOpeningOrderStatus(), + TaxiServiceManager.getInstance().changeOrderServing(mContext,TaxtServingStatusManager.isOpeningOrderStatus(), new TaxiServiceCallback() { @Override public void onSuccess(BaseData data) { if (null != data && 0 == data.code) { - //StatusManager.changeOrderStatus(); - queryCarStatus(); + loginService.queryLoginStatusByNet(); } } @@ -1002,8 +934,8 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) { if (NetworkUtils.isConnected(mContext)) { - startOrStopOrderLoop(StatusManager.isLogin()&&StatusManager.isOpeningOrderStatus()); - queryCarStatus(); + startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + loginService.queryLoginStatusByNet(); } } } @@ -1580,30 +1512,6 @@ public class TaxiModel { // 登出 public void logout() { - TaxiLogoutReqBean.Location4Login location4Login = new TaxiLogoutReqBean.Location4Login(mLatitude, mLongitude); - TaxiServiceManager.getInstance().logout(mContext,location4Login, - new TaxiServiceCallback() { - @Override - public void onSuccess(BaseData data) { - if (null != data && 0 == data.code) { - mCarStatusCallback.onCarLoginStatusChange(false); - queryCarStatus(); - } - } - - @Override - public void onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); - } - } - - @Override - public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); - } - }); + loginService.loginOut(mLatitude,mLongitude); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java index 8b29d4039d..cbb3885cf6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java @@ -2,7 +2,6 @@ package com.mogo.och.taxi.network; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.taxi.bean.CarHeartbeatReqBean; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrderCancelReqBean; import com.mogo.och.taxi.bean.OrderGrabReqBean; @@ -20,10 +19,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLoginReqBean; -import com.mogo.och.taxi.bean.TaxiLoginRespBean; -import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; @@ -290,35 +285,6 @@ interface TaxiServiceApiNew { Observable orderCompleted(@Header ("appId") String appId , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); - - /** - * 获取手机验证码 - * - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" ) - Observable getPhoneCode(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Body TaxiLoginSmsReqBean data); - /** - * 通过验证码登录 - * @param appId - * @param ticket - * @param data - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) - Observable gotoLoginBycode(@Header ("appId") String appId - , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); - /** - * 登出接口 - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation") - Observable logout(@Header ("appId") String appId,@Header("ticket") String ticket, - @Body TaxiLogoutReqBean data); /** * 暂停接单 * @param data @@ -339,15 +305,4 @@ interface TaxiServiceApiNew { @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" ) Observable resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket ,@Body DriverStatusUpdateReqBean data); - /** - * 接单状态和登录状态查询 - * @param sn - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) - Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Query("sn") String sn); - } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java index 333ca64fd9..5c209c7b87 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java @@ -4,7 +4,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAX import android.content.Context; -import com.mogo.cloud.passport.MoGoAiCloudClient; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.network.MoGoRetrofitFactory; @@ -13,7 +12,6 @@ import com.mogo.eagle.core.network.SubscribeImpl; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.taxi.bean.CarHeartbeatReqBean; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; -import com.mogo.och.taxi.bean.DriverStatusQueryRespBean; import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean; import com.mogo.och.taxi.bean.OrderCancelReqBean; import com.mogo.och.taxi.bean.OrderGrabReqBean; @@ -31,10 +29,6 @@ import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; -import com.mogo.och.taxi.bean.TaxiLoginReqBean; -import com.mogo.och.taxi.bean.TaxiLoginRespBean; -import com.mogo.och.taxi.bean.TaxiLoginSmsReqBean; -import com.mogo.och.taxi.bean.TaxiLogoutReqBean; import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import com.mogo.och.taxi.constant.TaxiConst; @@ -263,26 +257,6 @@ public class TaxiServiceManager { .subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus")); } - /** - * 接单状态和登录状态查询 - * @param context - * @param callback - */ - public void queryDriverServiceStatus(Context context, - TaxiServiceCallback callback) { - if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ - callback.onFail(TaxiConst.WAIT_TAKEN,"等待令牌中请稍等"); - MoGoAiCloudClient.getInstance().refreshToken(); - return; - } - mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); - } - /** * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 * @param context @@ -455,52 +429,6 @@ public class TaxiServiceManager { } - /** - * 获取手机验证码 - * @param context - * @param callback - */ - public void getPhoneCode(Context context,String phone, - TaxiServiceCallback callback) { - mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginSmsReqBean(phone)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "getPhoneCode")); - } - /** - * 通过验证码登录 - * @param context - * @param callback - */ - public void gotoLoginBycode(Context context, String phone, String code, - TaxiLoginReqBean.Location4Login location4Login, - TaxiServiceCallback callback) { - String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginReqBean(phone, code, sn, location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); - } - - /** - * 登出 - */ - public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, TaxiServiceCallback callback) { - mOCHTaxiServiceApi.logout( - MoGoAiCloudClientConfig.getInstance().getServiceAppId(), - MoGoAiCloudClientConfig.getInstance().getToken(), - new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "logout")); - } - - - private SubscribeImpl getSubscribeImpl( Context context, TaxiServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { 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 5bd2c9cb2f..cd1d701673 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 @@ -15,7 +15,11 @@ import com.mogo.commons.mvp.Presenter; 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; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.callback.ILoginCallback; +import com.mogo.och.common.module.biz.constant.LoginStatusManager; import com.mogo.och.taxi.constant.TaxiConst; +import com.mogo.och.taxi.constant.TaxiDriverRoleEnum; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; @@ -23,6 +27,7 @@ import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback; +import com.mogo.och.taxi.constant.TaxtServingStatusManager; import com.mogo.och.taxi.model.TaxiModel; import com.mogo.och.taxi.ui.TaxiFragment; @@ -37,11 +42,10 @@ import java.util.List; * 描述 */ public class TaxiPresenter extends Presenter implements ITaxiADASStatusCallback, - ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback { + ITaxiCarStatusCallback, ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback { private static final String TAG = TaxiPresenter.class.getSimpleName(); - private boolean isFirstShow = true; private int preAutopilotStatus = 0; public TaxiPresenter(TaxiFragment view) { @@ -64,16 +68,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().release(); } - @Override - public void onResume(@NonNull LifecycleOwner owner) { - super.onResume(owner); - if(isFirstShow){ - isFirstShow = false; - }else { - TaxiModel.getInstance().queryCarStatus(); - } - } - private void initListeners() { TaxiModel.getInstance().setADASStatusCallback(this); TaxiModel.getInstance().setCarStatusCallback(this); @@ -113,13 +107,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().jumpPassengerCheckDone(); } - /** - * 登录成功后查询登录状态 - */ - public void queryLoginStatus() { - TaxiModel.getInstance().queryCarStatus(); - } - /** * 司机确认车辆环境可开启自动驾驶 */ @@ -218,25 +205,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING; } - @Override - public void onCarStatusChanged(boolean inOperation, String role) { - runOnUIThread(() -> mView.updateOperationStatus(inOperation,role)); - } - @Override public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) { runOnUIThread(() -> mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum)); } - @Override - public void onCarLoginStatusChange(boolean isLogin) { - if(isLogin){ - mView.hideLoginDialogFragment(); - }else { - mView.showLoginDialogFragment(); - } - } - @Override public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) { @@ -337,4 +310,29 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS }); } } + + @Override + public void loginSuccess(DriverStatusQueryRespBean data) { + //设置 接单状态 + TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus); + //设置 是否启动订单轮训 + TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + + // 设置当前用户角色 + String role = ""; + if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { + role = TaxiConst.DEMO_USER; + } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { + role = TaxiConst.TEST_USER; + } + String finalRole = role; + runOnUIThread(() -> { + mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole); + }); + } + + @Override + public void loginFail(boolean isLogin) { + + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index 955e7d221b..e35ca7e733 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -13,16 +13,13 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; -import com.mogo.commons.debug.DebugConfig; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.eagle.core.data.temp.EventLogout; -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.util.AppStateManager; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.taxi.R; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; @@ -59,10 +56,19 @@ public class TaxiFragment extends BaseTaxiTabFragment taxiLoginDialogFragment = null; private WeakReference personalDialogFragment = null; protected double mCurLatitude = 0.0; protected double mCurLongitude = 0.0; + private LoginService loginService; + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); + if(loginService!=null){ + loginService.registerFragment(this, getPresenter()); + } + } @Nullable @Override @@ -164,6 +170,8 @@ public class TaxiFragment extends BaseTaxiTabFragment(TaxiLoginDialogFragment.newInstance()); - } - TaxiLoginDialogFragment taxiLoginDialog = taxiLoginDialogFragment.get(); - if(taxiLoginDialog!=null) { - if (taxiLoginDialog.getDialog() != null && taxiLoginDialog.getDialog().isShowing()) { - return; - } - if (taxiLoginDialog.isAdded()) {//解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 - getParentFragmentManager().beginTransaction().remove(taxiLoginDialog).commitAllowingStateLoss(); - } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"showLoginDialogFragment 展示登录界面"); - taxiLoginDialog.show(getParentFragmentManager(), TaxiLoginDialogFragment.Companion.getTAG()); - taxiLoginDialog.setOnDismissListener(dialog -> { - taxiLoginDialogFragment.clear(); - mPresenter.queryLoginStatus(); - }); - } - } - public void hideLoginDialogFragment(){ - CallerLogger.INSTANCE.d(M_TAXI + TAG,"hideLoginDialogFragment 隐藏登录界面"); - if(taxiLoginDialogFragment!=null&&taxiLoginDialogFragment.get()!=null){ - taxiLoginDialogFragment.get().dismissAllowingStateLoss(); - } - } - private void testRouteInfoUpload() { TPRouteDataTestUtils.converToRouteData(); } - /** - * Taxi调试信息:订单、线路、轨迹等信息 - * - * START - */ + //region Taxi调试信息:订单、线路、轨迹等信息 private View testBar; private TextView testCurOrderId; private TextView testCurLineId; @@ -474,7 +436,6 @@ public class TaxiFragment extends BaseTaxiTabFragment { - this.loginStatus = TaxiLoginStatusEnum.Logout - } - 1 -> { - this.loginStatus = TaxiLoginStatusEnum.Login - } - else -> { - this.loginStatus = TaxiLoginStatusEnum.None - } - } - } - @JvmStatic - fun setLoginStatus(loginStatus: TaxiLoginStatusEnum) { - this.loginStatus = loginStatus - } - @JvmStatic - fun getLoginStatus(): TaxiLoginStatusEnum { - return loginStatus - } - @JvmStatic - fun isLogin():Boolean { - if(loginStatus==TaxiLoginStatusEnum.Login){ - return true - } - return false - } - // region 是否可用接单 - @JvmStatic - fun isOpeningOrderStatus():Boolean{ - if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){ - return true - } - return false - } - @JvmStatic - fun setOpenOrderStatus(status: Int) { - when (status) { - 0 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering - } - 1 -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering - } - else -> { - this.openOrderStatus = TaxiOpenOrderStatusEnum.None - } - } - } - @JvmStatic - fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum { - return openOrderStatus - } - - //endregion -} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551edf42ec320de1a5643e49b5d4dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44568 zcmdSA1$10V(k@tHW@cuzSQbkbgT>6u%*@QpY%yER%oa0)1r{?|uyXfwPyaL1@63C< zXU}exZe^aES*n|vkr7{f5h*V&B7#^20H_EH$|}op5Q4tfYv>`efT#h`{NTKCV!2Xe zIbw|ZlzZ*Q~LnHQaq zjuMaf3CvNgT0W~seLv6Tp4iFn3A5u z^Y7qZjNVdSDb^-my9~Ovyr5tAycd5?xCg(H9YMXMyo6}p=cS~CoTc;^pXHpnG=#jp zSmczr4LxpJbS@qqN4@2)ov&--ip&1oxC}0cad?{y741V$}br6eF<;9!BJ&F@vFOg!vO*F514ZQKlzFh`@sBH+MlOiuuL|s zD93nznu)00uSzgYcCN@Jd)>`Mem!qYG|KU+FZkc@L}5St|Ijp9d4MAv?M3wgsw}I| zuocQWm1E3=n}HDgPbhp<*i`P}sOEKOMCVIs#;$P>5EjnK0FY;;McB;T~swKYI)CKDA07KJ|n)ysGb$Ns%VlqKIa1! z5`5~z#clR$ooWsq{l9<7Th%yt`k8)g{6CpYdQOt>3+f+D`b&5ic&jVQev-cx4YyI5 z3B@);Yda{za)9zWf?IphujTzL#;i;@cbmnpfP*%H9h~$-3GsLPujLg?fWm?JHq4J8 zRX$=cvqqR%LpHtTL=!tw*Ju~Wc?@h$0*x6`CaVW=xHJX4aQioB|mBK5AfHKT%3ef?I%^>Zv13z|P2S(`dli4?IZem{36 zb?m_FrBHAXs`lo@LE5pn4TMOA??q_#Z&f5wuDmLC8WCOM1gVJX5@_?%{dVFHsTW)#^mJb`npCa zPT}ZXtmz_GFp4m#lH5gnPujEoqM`D(Ma%wsT}IQ|8hSU%WotK_3BYEG9Wr{YUmLN6T5YT0c-@ruWTxy@)PA65gWm^n)d~s)JUOSwtWt z=^ai|^QX7H96!8QdO(C7kU8FFk3 zp$;jfo4}BS!IyVfL)mhPc2~Gl|tR1Sc z`R|J~&^dv_67k!BP#*0hw(;pyesBUIMVfzFC#a@!T=c`=4H-(>bvhI5k#!|a41GGS zy{ll~&_T#b9k~m?YRi`E;>S$9r9sfhA2FXZbV#m0Y1aKkX#ZTU_u*FnUM$p+n;Cx1 za@ZM%mVA7w^*?^$x5=S3F=pLs{mqc7Cs*ox)_e8|lagCENav7J$73!FMHz>Tnoj>Y z&BZZ>3$#w0U8)m4-4NTh2M*GLGJJL{jzR1HpY7`-h{?W%4#4La004kMX$+OAS&HYJ z5$sO>(_(vE7RX=?eGGZGc(t0k?p@01J{Ys6iy6;nem1#q6Ql%irk~$TySA6xjhMaF z(*-lXbBm0NmRL}GE28EP;rDd@r=lx#u3P}c%1#)F%6IwHqL^Z(6e z;z7fqvWz6B8=>@osWi`B>o&>6d)tj5Ivwh}Lc|(jdGgo60c;-WWjuI6w!wZEt1qR< zspGRK@jpV}XW`s!t_!u$ZiljXLKfJY4)N>%glJHq#zIR*;Y<&vfQo{gkI`2D5Mm{71eom|!aZ_No@2&K>X(ekN{o=f*P7)wG)ZyEpT_srKYINE4|G?yo!lj+ zA;}wfyx{V?Db|Ozuok&EqC$lWFGT4O85Kw(G^ZgD#&yoSI4g(+Cdw8==m?+vR(a+) z%&Ywqz2s%AV8Ofpfj?#MSM1|nbw4yLJkOU80`IJU0vY@RvO;qxrv^IfS}yY^&eNS0z`Xz{*A}LgUh|;@nc><<<{LxZ5 zc!eT(s$Dq>>>^tH$Rzz0_H_J}hUxO_l8y~wl#+ooE$6d2may$=VOzctEw-fJ@KEjH+S-W_{@HK9kbRKYPHw20#5(&%G~rhKDN#tGCdPtiX*QuKsi}c23d| z<)<8!9hu%p&DGqwxx)F3+(}?WfnmBZY9s={)X-1x8k5?$aBnzu8P3yVMM-ZxW7qRT z_8gJN;f8{?z85>ml=29b!dq@8g<@Ttd4d;f)Xg??jtSsr%VB$lDaev$z_F)_z_hJy z#kR%rT%dHgR`tCpAD@TWhtd*}KYt@a=6S<$ntzQE>o|NY!U-gp;ROE|uY@m6O3cn5 z4>3~?LaB&fj#RU1dSnNT|H2>QW{ugEyy<*y*@(x!ynP6qcbgq|I@T*#qW0iz&F-wM zE)UpKujCPUm*INnc-nu2l^#5dtV=W31bal$_M?Z-(D4K-gEDrD+2F9paS+aE<&!;A z`WGo6x~y-R1nn9nJ-p+v0?6IC_GWwL`4x@M!rOp=Zdg+G{Wu-+4HNXa$wyA1`P>_0 z>E`qM&f~^oSC&QTQUqtQ7VUo-0zX14p3wXQy4ZKZb&<5@N@4#VMt{=D)-aOQ>~4+8 zZ1C=WA%;+4AxFK}Mf4C%<)W{AlCK?&#pOg%MO{-C9scVKT5mJ&U@$#@t+cB}q{=e) z5_+*^FM1>K3*+Oo0RB8$SFOc_bZc$%p-P>HySENE7?G~D(j?t9KjOBt1Bag=Z^Y^6SxrX@a_X@?890#z^mpkCYTdm1+fz6g_In9eOD8J#~?YcsnDThQko!O zV)Nk$npq4(kOS|-mVDvRMF6pW!~H8IZTG3Qs0HCqO%6a4#PytxW>@%VJlaOhlGp@RgGk`ev(s=D)*77%NH%LTDOWf`> zMSH5!idYZGa|2;phe0W;FlB{T*xy}ZAN7x>dLA2bA#&+?{9J&TkMo@lGAVwwl7G~jBMEm#IfBM*>=5Osrgb*QJez2>RSfX zK(G2D(PyF_NM-IeFn>#)Ll=}imxUybgdC3cRvZAmwLx@+(=PXHUZ1_jBlIo5nSX+F zwp?P0NKoarpyr~t|K#6&T(HP>l^JYByWoC9((Gf_MqClA8vadcXgPxz-Oajagb1aZ zz^i_rO;_$zDY_M$sx~D1ALiL!-AF;GfS(zONd;G(M!`@bve+9D1xH2k;w(44Wk*fv zC|tcRIud;agO>GyX#~x@Bg*^t77;p4WZ} z!N0K;8SbgeVub#XMC}N|u*D!DUV{nP?I$UlUiW|eUElv;2LVx;gG?1e*UHG>QLd$H z6%T1Wiut_@SHeJ>yKKQ-+CZye6zj`+W$K7!NcbrW|L1To@7Z++6qFqx(a-pe#1rz@ zNdJhz^W^VBKAhV1$nGKU~KyQw(ET^_L;llml;&4`Ut7cF(51| zvVJ=?mfrgX{b>SY3pG2+vIn$`&;WPv(`$wJr5vpy_3}`R{2(Rb*6YNDwb8dEXzc8! zk>}4x2@(4gpoShokis+7@4gKzwqU_ukmMhR^!IH~;AmVg3kvp`-TTZ+a;#-Tx`gjO zlf{5|FZMTR1l%fZHJsK`v;U<^vG+&j90AWc?X|nWyE7X!H^KF< zD(Fuhs{3gbddyDMZ#U?a@dPor?793^H}Ad*e9Nbrc>bnq&G4J7eC8^$&mXjwa)FAB zmo#68flHqR(Cp$BaIC;9RW&e1sgABU5LU!H%$n=dJ4vKFQN%|6f!evT149?#nE#1M z1_7~m%4csjRU2WP|JXT)4E_*y+hX6gNGG&gJ{OhSp9>Xr;?xH5RsUlzK~k=7BaBlV zdybUurvZ!qOq}tB>U{0!9ZroAlK2i%)Y!9c8>(l|UzAH80UHh?O9I{fdh_!MjTW06 zNIUJ+lm!BOt6sUvl2Q#zb4hk!RHusA)2#*{Lr-JvK)ml^D`$@R#h}%sz~=sRFHGP= ze5C?#l&LtVXO{&uL)5#K6y~54U?ujd5Mok1RO&UJt2L=sWhRTDVr3@KUbC1TfDn_1 z2%TNhSQQP>J!CHN@mQn#6#hYUfKP1O4({3B2|u%0;i}aH!2>QKm7B&(WJrm_EU3X^YiIk`7tKj|i$&F=7-%DYX7!lUu3CB@^N@xfKI^fga$GvhoqQ z|G5CGSV)9Aj3SCJJJ@v3L2U>uu3ib+#@-v<<+U)B^8?i;96 z^Kod|W2hN|N0F-~yA)vG-d!2Hqe_D8L<4pf`77yqln&jGwjN>dOo_%%QvsW+UZOGV z^6Zfa5V^Dcyiu+3?mygV_1`xZXKzCm+}As^+bH>irB87`ygwZLiNXH|4u0Q)X5I{G<$QMiAx0Y@i+V;hp!nypjD@Af=?010KPz zLCd%^_*VlHQ{g{ph;R3~D;*y0jOi^G{A}(}rMOZrqd8A6^6S zQbBh*^_~+K(ODqLzZ-DsmE%=b~_vTuvOh$if!jMOc%)D01j z4!VVlqkEh7#$-J|h~ts>KW)lB9fl8wEB%Rsc?Y+FlPG+ahiR$&>qFTVR-I0%xg8`pqBrc7jcA*}r1y(@4fh7-taj|? zRTyVi7KJ%nJY3jnQb}t?44QUgP;+-Hqh$Yh+^EMyYg1!1?@vmBl;DUxOEvi27|?Zb z;jOHQacm*(b|n64sr&Ctxu_yf!4;K73mJp-2K5Qn6$ch~Zu%Z4p(NtL(la0vhS0Ox zZmqH2Dq_oyc4c;Ry#eS%lNDeNrWS_PIt6H1c&(EF%i5*H8iIDR@p8LU_{jEGy5xUE z7HTB>N}NjSgLawpQgJrH9?dCFh%;?2&%df$AO!S=T?L@Ymfa2KD4zpP(OI0W6uVrVzP z6-Y+gK@F|ZJNl42ofPLlVftOGTP)qgw&4R14kPBasaOO8Rnolr5>Q#yz1fW;0=$Im zqj^CxV5l{IhJ_tZ(C@pYPC!|?zUxol`(MK&2kE03tU?%S*k$(zrUW#hiL#z)>mycM z)BqZcbyQ=vtA{hIc@{}`P%pDdMa|+y!I(+T4-H(tU=#qtc^`o~ww-se(+$5zOQWP- zAv3lCgumE-shDXWHfXy|Vk*?jl!{V(B@;sONsXsTQV4qLZy;> z(BpQbj2U&>YlIr@!^AgLMO3<0d8qC zX-?YB2T8uI225Zlt6l+ifn8Zp8VhisU0HBHH1kM7zN~or9#rjCBw=9U1^~6*`*Vie zQNlJn!!jNpB0JLIL;8$^f-W@#i7VW&1rl_z*{O|i2I;1Ox2m1Er2j6)3K-TaVG?$B zyxX8o$}<`;=;6FTRLL~8x*C=RgTS*UER&hX_-?E#s%4H@`$*S?{p=T>v>D6&=ki&I zF>0yi6FaMrp9UP)a zlUHZtXw4$4Xvs?B!l8iG@iP)=U1&f8g_V@ zM*Bc6-jEvmSIKvy$%h$WdQ-^D>@w#}xKH+=%a{ioOFrP#jUJRPevDvtHT&rrzQV)V zG#4eTJ1|br2a|vn<&=i`=8b@%(I7j1W)O~9JGcS#V{#|O${DdJt`&E1PG_}Hto}pC!1(}40xC}*6b#o+& zxU$}{Zefycn_M3!mP(6y>r`oMptWC%wpg5S1=RJT@@jI&8|jGh^ai=X`~&w|Ea;KR zoG5kYBOGkc1{WhsHs{POjxdHFwRuy>x0Rn_9us5qw_KPdq!BM(R=5_sB5{@#r2dW3 ztd|91jmpRZ!er=WD)7?vkv=&pT#H}1H7161HEPMeGrFJZDOYN_&cuh5eA>U0cL+19 zF*NVt*3w|)Et|JP_Zq!P>83Me>FN+^MJK%I=E~;G^H#{fG;Y{ot9IMJEd+z3Ne0dl zSr}=1AlVn2%$B(+GK#zHl0Da8Io+_JEGSjjpBZ@&`kZiYW|`$bN+3c7TMhd6umPP3 zHoFk=Xp)B-fR)v<)l+U3_hoI`x<%>U z?Djn4D&lBG&2?a0ob0tNHJW20*&D1KJ25TI@ZhY@Xp*Ho8VsHVCYA}?M}J7^VOYLh z{DS4_YH_GeawdTf=`v zWA0tR;}zq=WDUt@2a^IyxxA`UE-p+0pi@cgpO+e6v2As}!1XVtVlLP!>|heSrZPnP}#q@LV$VBwr#^C~|vva;_A3nueL`Ludp zh^70(raR|k0%GLXq}$Kz-EY&IgS;SSrk`emZ*G2z`R#O7Bb3qFo#4C^A%9aGfm`g6 zHt9GQTcEEqcSj{jSlqk@PPD(}bVgm!2yrASM1Bhv%gaBzGOc<&*_O#BuD8nQB z;fJ}2DqCh`GjH|A_+IKd=zh=+H1>Yn);c=s`3rGUjmdQ<=nw>c^M_#0*G_U z2OYua#}-*ASg8H=FL#wqjWz)TQu*X+4HUV)l`jeeo|5}Qp9_*Y72>hoa|1o*KawtX zt>mMgGivav~LmgN;2}{9b#8&LG8-xLnpIL z(U4t7SN7;MnSDT8Iw(>i^K=tKDtd@$J`%X?(4(z!IYk`bw#PYiG&K z!%rOdsJK5_urYCs@n%JnpI_1(TuBIV)Z=K#ew5(N!l@HTvztqV1PB>ZpJ2#PoDiX) z{pU23Pp^hR<$yrOq%np)P^!&^rXb{W`sqpP0z(~8#hKK|NDk}l+qdzu(54<2$(#)@ zkIhatA`L0}w7y)y8(aT~GPsx<9i?NWtjHrrMv(76Jm*VCzB*E6%Kei)eB_13OaviQ?qU9 z0EI}$Ic^MsFsAYtid@i*Q|f@q{+o<$71B@`#OH1?0nGPgX` zvJxuRvYIq1jh<2Z%rwAxXTzmqV19F6CL64LIg&6}L&vY|3eBXjuyH|i{l4a=Y34jC zyOMlgsGY%)(KBcPyOyux^&w1-BB1fGwi>WKRS%5qVEVWDKb{Y34#i^Y>2(Uw>o7Tz zNg$4fI=0Fy_(rWOd=te|hwjUD00fNHW^DeQk%9m0cr@(px1hYGHdV&N4fD9k^7@VOsA?I+?-x3-@Y zrzrj{uRyO=s#=+_V6WIQ_ZRj3pEIER&U4LmvF_Fqz-6rug77QAlhff=wyOn%0kWb4 zwT?)aP6kuYZ6lO#WbUL7Ilglz!2x@L+j@Egn4MH?3KO0=I~<2K&)5<&2S?1eOHKN? ztwXkib^Sd{fz8!U?Ve(Ey)mXVdgQSwG>kZL9XOrm|* z6mpE;tj51PKC6LGl0kUCQ`!(cUu>XXYijoVq;?xJFNH=_x+oTIh5*n^IHCP@B&GL(smv?oj|tfr!px7BnDdFBZOT+B$kA69<3g5t2o6p1x;PuH$Jg_>0QgKq zwgdyXr&ScN;jFAXO6Vz@4aY7Qc~Vjg=lxdWEASr**T7&5W)*7tq;D$K3h3T`jt&|s zqdr6=zfbtT5xwvE2Um}oqNz1*d6niAp8Cmqxp#hps0%PtHf)pB8fWVqv*id%9jAdF}sxbtgk;lM9Pq52ve@Q3vdG3Yr{PaKz z6_UHV08_8Jzb_O=BF(3!@P=`N7FRt6;ifHtQf5r*z>75UM)%Z;Tcpy681ec+Zu67I zChu|5m=p21K1oYB45&PZZj|ouR0@LtGSbi{ZN_UJ;8dmX?*>KS_z{QX(hX3H{LS_std zFl?H}wMykZBHvl4UF7pef#M>pV~|@h(`IptLFrL*Z*ys$qw1sx4lcdSdzw)v`N^l{GqkwUOCc6+k_*|8f2L6BDh%XDlFN@lc-#M2 z#@=fwQ}Q380el9(O+D8T3^8OV7Mi2T{?8WmecZX89yPv*Rq+^_WFji0pQATR!S!Va zxcQ{f@e{vNGSuSqS(Gb<)c1lLWv;=XuYC3q^w1~1HDn*@2X-86pT}nQd#2R()N}}t zh}b{`Xr>Z6D{x{iyDJCWp?Y3Cq7_6ew)VTDz56)#Um*6Tbp1=E}~5XOdqK(o$zMzEI)8YEQE$KJV`KQk}>BqV-Cs6oOfdoC$6{&J<}cYZHbfE$C0*lYz(HA@f*Z+!x5DVocd%@`u&Kw8F%l?EIv2K)|1T(EescJ zwIOg(IX~OYyQc&djK)nUN^O1Qj&t1sDOfC!ONMx0axG&!WUz%Awp`>ZTy&la2@xLc z+o0u7=LpTyrwVGf(Q})6ErogX#q9CJ&IRO$SWraiqZ1({$RIRz-NIOc|GYjk*9 z7Sle$FWS_?Zl_Yh(r_7v7}PKZ9xZ)W0mC2cstzaem2Nob>G?V0b6QG%x@N`&rx?N zw#0T;#Zo#GySFJsY8G=E??dKP9rtj>lSDf9tQ=6CxMzZWNOaB2n1gZceN1Gnz{6)s z79$}X8xE#zYlm{abn1*=Ssgh{kuw?eTqIYrUngAGM5Y{cJD9PT&`y=bYMbN=v6U5I zQg7Si{K}rPb^#WwQC5TDvluuV|mvwq*X1m-a{6-=85+@cKAVvTg@D z;4hX;@5zh#5oBO=kRkMK2}+JsN7^c{STkp)m|Z!AHeY!oP-gwmN?uz}lIL(44ZyVJ zj6~}h#z9{KzZHfUm)O~^CgjBi1(9@JxA~?m6gz#VHP%0Z*~LOb-Opf#?M!w#Rw;%A z2TsITlw(M0NC)0qu0owI@7W!*8SHVIVYmUk!+MzOKjOXoBA2IiLY{Bg663IKCUpuW z(Tg0?4x;o8gSCV+*#XD&<*RYj?D5E$+(x(9cBVs#gQu3pd;0SyRe8iZ%|b>5?0;o1 z|FQ9a2c5c&!UF0OCrVw&VP`Ay4Rg@$l{?uycTmzk|J$kvOyjQSNM3}c)wB`;RQ1R6X zU-XMXn!P{dprI7Hpz}bKv7H619S!U4RxjUHRJpywQ*boUG&IRsr7n~HIn#h>h>6jM zh^o0|>ky`fGG$C}NwYOf{4AU%55kmqt?Q}(jNyJooeRXj9j(VtCMNWspiLF$C|V-X zD2-NkkX~ngosk1A;)}QIq1+rID&=Zsw14qCV}n7KZjA!wRu?RPU7h&?4YRMBM!m{t zd@=pC(FLHAlpcH#9N)0XXDbz81h!aEl~vH?^rGLMG#FQd#L17+=5KQ!R@5SdG`G?a z;*Xjo9@N?aD}Jlz0dx{@eeu0bAcd`@sL$01?&UE~Qk?HS7u_$ydtcSdDxf{Ey#$x% z$lAP+=fh2b2+}e0-#9~TH?VULt<8f!Y{ov8n@S33-}Q5@U@<6b68frSci2t3$*%^qTh>4lPX#Da{Z|Xl|cNbi65}k z{HXc;y}4^we-?u5)qcyuK2;fw)UItHFnf>2%W-fz@ta6vUt_QR+r=d!;}fb+j=1Le z*H}K#p^55@+YxDAitsp-jjXZ#|CI(GKMNJk`etUpz0wNTtb?Jc&VHm)noXcaKEair z(l^~k_5mv6!kk+vr$9;Gn!DD!k&6`y_R+0S3AO39@hY#?9VN_Oz`!tAu78*T|Y>x_%Spk#(V6@E(`#psvT`3oJTapb*2$>HJ_?u3*@Xi8vFq+e?& zJt5bwMVc!6IP1VnoUI!qns8Z<+68lVmYR&a7h~bs<*sM}C?eMwc;TsKV0UUW*5tO} z{@CECGWkPp#s5eX{r3!p(}=qP2O~0Mq%xZFV@u`_w9DbyZQG^m_w5G6H=|e+kI*hJ1I1{krtU?^Bz$EhZ!YIxJ_YQOMIu7@EtW#IOz2V`yg>> zcR%e&g;-_ePWpR-&%e(~Z%7v!L0ayS7_+EH^WoU126b?-Z>^}em_N|#{BhD7js47w zHE>qBQgN3*IuZ(RM%85$mhJ5=`G1zoc~%HLzvyX1IykG|-#VRlF<`ltH5*X21`-gX zYxOj}@HP7I&%EdV`O_e0QDk$@#iMQyDst9018G&MEKmI$c~bDkQ`5~dnVArXD~2Nc z%*uPn>ygbcjkGc~0uGcO1M^El@vQ?XlDeYUvgR=B$z!b|`Zh-v+kPkliGLS+f6uLA zS;|w`Ii6#t&8DB$!3-jLTMyUn?jLOC0>A}T-c1Zd(xM!ju;hG1JDdEFyvqA&SSYFu z3^69I>MBKW4cI1gIkiSe7JX&^#!a27+TxNPIvqbkZ1RLD?eB6te(JweOYJ1dqp!Ja zJ@)0lzFAMV)^pn?WRjJP=<1JQj!5U;(ku!MI~OE#a(PTvwFq&F`-K=q2ZxH2WRd%& z9`S^O{E@`)Z%)u8R|ZyDv}ar$&Pdy<^Q@yG%3xSpiI#17ANQfgL$LiDcy2J`!piI4MOqZAX1;)M>@6LVO3=7UY<6sHuXKKv=h=SarH3 zJ3cW*rh~=NZL(TiFf|?JBNx=yM5pgXgbnNdp2*|#it{TnQ~8&J3trO=F?7>{_XZr@ z1Cz)td!Fahn7!jp%$33MHx=+A8K#68J4eeFU(_FezDkyw7q4rY6X$eZ!B%mtWGAs2 zK;Fr0ixAZG)d`3UUlBOS{EhcjTxedLeZP{Q^|GfyjmsgKgA@#lo7o;N6bx+I}f2g&dHK~jzA zzLX%q(>10q#`7A_pq2Y+Io1h8x$m5A(#=#HJBY&zEW)78u`8~ zP`(5L-|KDNyXfB2g(xT)@@lZ?;5OgM8R9mF&vs%9LsaR?41*0jIN$OrOCw!Z{B(Ir z@UYaTEb;I@nK;x?5MOM2Fl`sA8w#`YUP&~F8o?uG;$Byf#&j_gofcLefx~Hv(S~LH z@&dx%5q&#lGpilp``Lpa4Dc#a^iLBP`R{a=|8Uv{swQ@GtlE1XTtt8hG7PbatDLR* zj)1b}&o@m|1JQi_hPx?eB3!MiFfD-N>x~)=IC>PE>H1}G_>f?}4EvsNx#20_@em&XOy zuL|2?aU!5J7mbWGHw)Ot{W|lRQyqb{Yi>l5+w?k9l1cr+F6H+_c=-_5(Mf`td&wM7 z@7gl>d-O__<<|%#lP~-@Sv%#+DCy|wX+%V1}%G=psZ6q|dlfdh7NzEpH*2AM~ z%-v0fM%Gwc8g)!fuora8SQ`I7{DS$~m~Od_ih~d*REgWp@MqOehj+LOXW4_Jo9g{j|;mp8dx<*e8-UNXEf2I-3P@sVD@rGU{hH+#b ze_~({6S;HQr28endFG8N^f48EB>1fj+l-yjaW}Y@9X>pv-v~D3EY)#cO^vYK(FJjI zqTL=ZRXLx9(YW3wsJu7@o3COyj1~ZZ7V{b}Of=O$wXPhUP>fYP*AzjJkzaq}7G>7t zVsCm(x0Zo()BL9x=EXvdMPJ0G`zWCPxLOM^!gdJK*lXA(xft|wFW=4Xr{!mliE0_{ zRN6d(Xp){pki-)>2ddjS+{?0)rL5#fzn7K5v?gNajQu!_pv~@Cn%D1~mXOFP^y`mN zXOx9PiZF3R^(KbdK=O1pE%THqP?~{W3UzM&7-ra$Vt;lsgn7dH#>5AT>z~g=BFX?7 z#dGp?X3g#^{9CZty-c*1Q!9w@Fd}>y&c)bG8J0K$=rd*MIC*jv zUuV|kwqa+3rjL9!rl8KifnvNY)?(<-XA}g|jqIFsetZ(qZ{?@dr#MfYGgZ@F|F2fN zrzcgCf2f$iSQM29!C99wJi}Ki8lmHBWThQF?_XU{;iDh~%(Vpd5p@5W31lIyW!ZmD z$vg+E+yAHlsV;yj#B&UArD6gG?LKa0?HnxfTB(~fP51mc%)8am7go$jx|Sj9FA?L71rb&-^^8BKE7 ziQyHzw(ddzwwtKCIQjsv$SmcI06?cq+8tnI3v_TP0~FF_ zTw7l?ICdebqm?S(5*rF7^n+Qke-ASX3v%jPLcH`d1u{6EMoJGSEdCVIKiNJ+K3Ap~2k>Bs9X!RFVS=;G^PJ4Q@X5 z<8#fSSV-H|n4l!Ulsg8`W5X~5!ZBnUYU z|39AfU25$fR^ixXLAOmXY8veNoq?z02>}3jeD);(tO1+mX@F_&K)$4qNxmD6dvD0? za`0yF3Yo1Syv@=HI3D!RAd}=IIwVpD8T)S@?83-nD_z?=xg{cMSfc_59fSZN-TED*_?@rQGpSN1nkU`Fl5@Cw|<@pB_2$wFX+?R|w;R^?rlk@E?Diju}^<0r(nKA0jnX)`3HevH$?fZ{SM2JIjcH75W`9wlx^c z6I4+R=pu@$TcrvimKw;6620u!>zd7MrduCdY%QldsHmT|&Jv5?m|rnvW++A?MtG+Y z6H>&RFxXWn;<64%VDO3MB05S_xmisrkTl0x#5lC(Pkr5_y@WitiMpNax0Z|e==FHO z6e+pr+;~4Lj8VRgbC-ldm=7+FRF0Z6%OmQIi41`IE}Y4(d5kIW z5L&|AV{fOH5~R%llF}dY>N^Yo0Kj?UeUYp?Rplx~7$;ACcvN~2T1Pw4J6zBd7Dk}b zyllFko%Or}cDd)ksvNvAfRjk--r`}2~Ov`_S}Z#?;9aUxtvuztBx6_svu(b=)((|bQdFG5<_y3QqL1|YenVs( zZsK4UjE3-2eB@--lGr&%$?A0_ddiRTH#_o;O}RDUQ~t!+P}Z*-&UCz6gsJBg{HDx$<@3gPWiCTp}axtm~X>y<9;>H zCRwKa@Uec?Zw`LT4!2Ls508I9kOeEFoYIP%$b!ip+o?MO5ItEC6&d1bJIIty`lF&; zVati5xDTV1J)LuCRN;LJ07&hUh`{@y#HW5gzD>#z1zU7zp%uw##eaiI{DzliBsSrA zhv?oikC8Z*4FEuj%Mt)+Q8utWKLDX|UQ%uZ?}wMoL#LH*3u8@6*G5RVbK?h9%Dx0X za*lt0mR?Hged(kXq7fc!=X-##rY~YrAm8WQsMn!Z`z|<8%S5o~;Ma^@CkmwY9o_%p z^(GCs^9%W4z6t4Gu`-@qACzlG`Z1md`Kszc<(Y3`QMiV^4*A2@+C^fk;w)61@Co8xv%xrF{8??=YD7|LN0s=;(=EZw(Te>!(JF2KnPzZ29!KcqrrRxXEln=<9!ULM+uu0&i z9_!eVXws>tT2acb9e^SUsSPM614k-R?}+1vaz)B=rm%t6fy=m^EO6BemgIcq&n46) z=ivl9D4+Up8xpNQ*er?OwK*I@`XI*QtdE9RDgriAUAy{o=kvQ>cZ03C|^RW}ZgPQy1rLO;b zoi1eCkACukG!zV_%uyKL;j6;D(>G+f=&wIDXD!DHbFhX(gqQT8n9_Z4S~nq=kzdmG zLBGZEo=JzbRSs^sR`@sEBG0GbQaMHf3W=3pBTf@C^Ms=;kEEO>eoQ%;+(>_M4wUQY z(@$m>zfS#2Enbiu(;We?R>G^UO7}tkBb~&GLg>O_jMjrlS>t8r z2(Sb|(T%{LarGcz6i0F1noryIb|<1xr99|P)5<&hp+G_OMB-~MDs>dD3|R@3aJU*h zV?=*#LLn(ZV_;VB44?KXPi}(Q=Eq5d%-GXiru1SZqX%=j)dRC7!fn<}=Fj9mws&f5 zqLV(l8;cBpBoidx)>G)Y=Nwf!5IRQB5 zSA2}5e6rM7v0%4B;S}(UA)ATV)P+R6mk$73qOyyCtRcWlbE5XG80WbF^t=I2REOXO zqE)QLr#hYXY6tS04T2803Km=^msvYWkWI{GG-R(K1JC;X0uB&C@sBX_Wko9)w9k=% zn7E6_XN?Xzy$44QbgSFdL%e59?uC3)&DKI8G4&s4y5FuVzXP=}vBR>&i7R24`Uu9M z7$1>73#MwCV$8!W&a=`^Qq8wCoTaJotR*XMKT|!25+sVC5PR#S823udo6hDTuU3vrS&4Hh;V%!A0q4i9cs8(GazOMDW4T>y9 zRJNaL6L_z6<8$b|AH3SEBB^Cht@UM%0u190WiU^odYO4H zJ-x4s+Z`XfXb;)|b_ob_El&%p5GTaWgFLHnSP;uP7bx>8qJj+L-!Q1p3ar*2-7X%14nWgLY4vZDHZRe%asB0T!a7=OIC9*P@${h|DuT8gTxjgb$Gd>>*- z-x5geJp3358F^tbSK7U=J|CsJ27f$PZH4>V66Sm!o*c8E-Y}-5!u%Sg<(;(#B#pr@ zv;v0JU32%T9#X3JE`CfbYZ>MNu$Ysg&=p!z9c*J8#p>+8u>sa*9CR6h>dSRcDgpsV zveae^oQ!(N>@Nmj!<^9M9jp5Uc|CZ5oDsG}*wwFDbOB0H8@q#~w;&mfE#eCknB>}- zlwGzZQb2L^R-r^m;G&eM7j0YuN;7DBVZrFmF{o&$(}XGYf6?{LL7pr@x4*G=%pKdd zZQHhO+qSJ8d&k(ZZQHir-h1DR_s17sbVNr-MR!G2o|D~CotdWu>r{1Le@3RtMW9$B zoqi&GKHDtiMcRr^%?Xkr!!SrAD$u2s3Ey7JlDs$&$njIB>;r%&53bxk z{`ww3RL;vE%7E0PFi9FgF#(dg);6IkVeD%25A0;)$|{mQet5X}k1Cj~K&w|uxC0)I z4ZQcF{bB>$b#qyxZ|QTC*1uKf4I>&oQr`>~d`HdWygLOP7@PSTSEN3Gme*Lu8AaK zHz8nDi68)a#exhG3Pxl<;lkR?D9!il&w?gSu9ne7q`!dgV+U0x&COr?f&hVW?;-Hi zRY>D+d-6DdHFcWTno#b4I~+Mi>$S`Q`~DjL;S1CU{}#ru<9|ROS9!pyp`G{LSBAJ) zSBW_-{$qux?5Go5>M5=VoI0~pm|1)-&Fg8|gUM-fZ$)|Zg@JqMrOY7nwy*%3fUx9h zb)7nTllm^@p{vFuX(s-OLjPvx?QUJ7__iU*DOoT4$e5+rH~RNSxP7nIir#LKZ#qL> zBWngcyYI2^_^H~?3bDWy0r0aXLPC5w6>j(sWSzB(@9QNI8e6B2+s9b~d%h-S-<2=z z_$g`rhF0xML1d$Cem!Qg1#M0ucatX$*59ks#QV1R*Tx0NF7$t* zHK@mbXX`1y1wZ`A}NYG=&eQjeVKY=e@b`6y@eXQ`3k;=V13pw8r`W>fs+ z<1OkRqnQGtNGhAN{X_0m6a7n!vMDXan3DUQMB4?ci4uwk`s6tA!VD?U*R>ihb zShwt7mDBd#UXMR?B>w9x30%c3y=-91NeIkcG{0YQacH4({6dH89ama_88`3YnP}>n zdNThgW-ZH_ls+9llCuwXFNQu?4XA-qT1jXwS<|>Kw(h#mzmsIg>j%sh*nT#GS%tSS ziI9V0>s9gZtkV~&**EjqeD$L%tBc7}l4I@H4Ca%9F75LT74NC}Q64LR?)jq1ev_j( zLCGauuzsR6`DDlAS?OUrg5(Pm>W|Gx*(an1ZG?Ypsxa^a2*1?x&-b?m=-U9NcH@ZP z5)SE=?!eE0x8L4L9u_Hz=zfEDFPx*{%c3t|G)y^Eyn^`o000@^GZ5Qz#Ynh4+@jL7 z#szgkRmfqHs~f=C42NKz7s|<08*l*Xp_Zsc0Zajzm%Vc%R!eWEWFkqnTrUAI9nP+q zDvvkeC4{pt=;d;cN6eEBAqdGp3?&BNgB5aFVlMVcb9c)eWc&fQ`8_?4a#p-j{PO&# za7xWZ%`eV%eHF#{D`As{%$Hlgi*d!*)|Vq>-sn2c926{~KW-jh&eA zAMOCi0mwg?fG1`syE)^R>bXU)2&QDs@b0Wkh7E$~*0{qe?{lvhyz-65hW_3R+{3@Q z2=VadSJe)X2*5g^P?FHfwlWe&7Ld(bs%3_P7KgOg4R(+OsAf4LI~7#w*#=X-X@|fZ*s65Ad#XqT*B>1Xo(kE5DYNZj>Jk4Y86@{d?mtk-+kLW(_?ou ziqx}-xa)!5kVv_`aqD~!OkX1HIhpD~1BfK;nCL#(F%AHP>l6C2biXx_Rt2|$M-strSM0urzecJ$ z#(n#4!HleNx&(3kK&weC!Yrpm6c}78Jj_6qui7Ja8YqJrc zw@-Qnyl{}|Aso^8S-p1dPB{_Y4!14QoL~j>&(hx}(=O~wBwdG-UKo52iq4?#ht6YH z6iYCSvhsurWAhwlxh~-{#zoQvs_l);q{0A!di$IJw^a-}>R_ihH3P`UcrD;^2X-jC zw@^j;QmfTicr%PH?zzS1+S|D|}osvAW z^Ne>axWn#eOPZzndcpsB|Ad+xEF|3`VVL@=k+IC(jQmsSnHJE`Usc+Bz_@KfwRfm_ zsQaTO=CSQr>NAyAs zP`>Y?$g)1zFh%wVDn{9|bcD#Op#l%3l28wYmN>4HHilu)+K9edSu}ydITS)6nxg^} z4i!TMc-_YM=jd`Hc$AG5czF#dmXntI1LfmEQtuk6b(Af+5=unSK!0lffsn+UEZiVeMTG2g<( z8A!M5o1oYl_~}@j{lORtOa9=75U?0&<(nnfU_h%g4y%XONr3lV8tQ8NW!*)l3vUJG z*TA9%sRs^KCQK6lyRv}o1B$S2ftxEYjwvIXy1=(2+s)LJe?i305>+PrD6gC_>fn_p zl>_x5V5Wz=zMJbno!1qRvX%vVZ3tbXOtsog3D*h}j^Up;Z|v`P;=MR3BYB!xF-bSs zf#C;iw`FdK9DqlGk5Nzr_shHd%ep_Qh>uQ{7J@A?I#CRThJi9Fmg_%XDL zCH)b`8cCymCf=&&PrG~U2Qk66Aif59{oaI#{J&_x=*P>@pa>VsObX|V@l#+8>eoY5 zI-EuyIOK_5x?mE^7}|p`J};o7juo^Pbv9keq7wdHZ;ACkXHxZyprA7lMZU=XYW%p9 z8+^BpchiOveDbvm_(PxNjOKg(G9Rhfw_ln-cIFg;pB{RSs$PpD$(ALUqM4p&i1izoRQ*YV}04`c) zq;WHafx-Mp?Kgpj$=w(yuHKos8GuI;{Nm|p-e4Ri%SiJH!9Q_Lq=?W>swrf~N|bn; zsGPP|$8!M*-_%dV9ObGq(slQ<5X60UvMt&OyVeW-^Xk;ZKoAO!Fk29fmXm~ebQy{5 zcq9^o>jhBQWM=i(?^JGe#d5etlw05$ckatdSGCebyO}?U<_DiuhWJK^_hi-$TZv_a z6Y&T|&5_&&!?=m(qbvMfB^3G?cktQ2py^IX>EE3_F{gE|9;lM5KKy*@5~xo)3(5)k z!=I;G$J{3}9KEec3Q^!!0~CdnZPN~5>^$0*$UXp2x_!&pg6gfeJCu&inD7cmu9Sbb zkPK94bg|{XUDaUR8frPJ9^7zmslgP7mtKTU8-G6w3}nsQ)_pYq5X|Qf-J!CX2M)9m zPE90<7tJKS4qtaa*S2o=%!upMYscX)1@~?$X zk=M2J;9Pw1pW9aXeuT?C3o3w)-!<(A-}Up`v=s0XmlgK`r3M zhptQyV`ZEZ*Yc^~yDaSxf`q6d*L2ZzX@|=FIQAa3Wr;D-8Q#4~fgFdu!#|BM;CU9A z>^qHErvWkD=oWdnLm3MmF~Zox4-6&kV&5G}IG}*mTcZz>fhhe;Pc}YNF_4 z9EYb7x^dm}&{ElmlH5rlcI>w?jA=6#S3NL)-wn z&1#3g?WwGSEaYoFbjJ(D>S?l2ef@D68`w7Y9^UufxVR0btu!#SNjtI54@*lE!}$7?4C1^tdWe$Ery%7xL@$}H8%F?CVDt++-Qsf z)tc57(8+WlyndrJeiTc>jVhQ<#GD{^kHEeCt3)Snm=-7l3--FZq{I#5#Xr!AX;fyT#nZ`@$?Q^`|s(JH-0yg4tA07&f`RU z2DJQee2jFuRMA!6{tn{SEO_6(<2ytnzh62(-~|6R-0q!n_kt`jiGGzwqzc$(-0lGU zi$A;Y7~E^>=L+BnQF0u7Jlj1z`#g5F?$?3Jq(!3X%Wl4$yh>kVz!qsOd~$YKJ>R=} zaXk*+ZCntM*Y``$}E#5^h-d_LWULMNs#R%!l*O}w!0+Hi+#_py~Yp*Mh=wqcP zTIV@Q4Bwz%b(rKd`nM7StMUUzvcF_s7EXFF(~QJaiPCHA*#J=0&(u+ylYhWVWpXAA z7RN4{p?Pnv;R#l3=n+Il_zyVx7ghCD81UWb(Dt3^-c{bS|Cs$Z_}QLqM~RRY&7b-{ zQfvTGEShHOppDMytzhEm$IoJIDknWR)*PK`xX_`Ma^C~KpayH6cgYa1AS>L;Sg|QM zl8=?;PE|aZA4{^YsJ7o}X`&Ok=rS8RwveaW^JxY~ZM>A|wiTKBbgkrd`7~>2M~g2< ztJ3p^N4aS8^y9wEPjK(!_JfJoNG&Lp1O-5og=&;6Vt=EcQ&=L3#Igyekp4VbTUja7 zJGUgj*qCTEPi%z`h=TF=D~=OWWbT0fuJ_j5q!R3zVF}QG8;L2;{u)h;Es^ynSC$;- z)kKw>3Ty#wgzGAsUla5Iu(jQqqBXR46oUZc&%O@vgb$uk&^hlpb5-=a150%?#Ih}$HGW#)l;gKQf+ltL5KJ@)+mEn_ z({@W2Ph;nLbaTTN@Uz#l&LJQd3`|3KqCs)HJE;dg(c#xXK|r!r>=$jX^;g78vX}Co zRj?=GP3uez{8v~tA0vLoCft|!&4w@N4}JnZ$CpTY&12?2EmT}lBOAMz^eIS#6?B^zM8$~71I&&Tl-!Wf>}kQPESHo?cg#od3ku7 zZE}cy)8}hfss0_$Yh*Jb$l+;ItEar4vPSHSz%;MS=@;OmH3DUp*=btPs*JdVMH5{l zrVHzpQ%fM}=U0Q98kg3^uhEK7-Mtb_)YbXTcGgMN<5|trWE6WSOt@%!X@`3}U47IlA z{)T>D22nP8#gDt+_`Y!NSHb~H(`w7BcnsQDhr~n2)~kOad6L|F=n0%GCjW&r%wQj* z^(-NXl}!HP%GWe3Sg*I!i83Sdk{KCIBRQI|hXl1`yxuHIwU`IXwvLiI3n`c_C6@b~ z1OXqre00T)P>BcBgT&iPLMU-^K&((xMQ2O5A+sAbTHnR&_N(-O#G!LOoi^+_>lOJTyhD)R<&W8rFc>2Xv4;KJg7#y3@zeV=nYQDc z%qKL%@QOwh0(w*p0|Vj{RH+F3^(z!e6op>tL;}Z;0{n2xM&du_ZLQFznI!j=Zm37D zzj8i5fpDV&zqT^jL3kRyaCuD+(fJ8S7r<;Qfo1Q7*TyAtltL*OTc&1yCa$1y%3}i(>wvdC=_57Q z@$0-^*Y5zF8LWk4BEWKarQyP6Gp2J3!>@Z|ydSo_PRT%RWbS=^pLI+wN!S5TK++#P zV$4zMiTX0M!v?e2)+s8mLw55L4T}X#Wv;-NQ*rw42;4PzqZk|N95E2ZOF!96gZN9<(ga2ov#AfMX>;O^t-w; zrpIL9QvNA7mwUI{MgEha2um)RNwA?I`|x=`SPm}vk-oS>@$k>tN{{>!BPAhgu{I&K zbc8;)Z@PRBTrv5Q(nK2r_UZr!CT{aPXe7hp*H?=6(kkRe?{5YoPHB_jzmCi!N1IOO zejv1>zb#d<=Grm=ad*4|urju0W%Os>WY-&P4KJV4R@ID@-$~Qe+oyNX5~}liZEUTm z;r0|py##8wmU)tKb9FkvYFGS^N?S1n%&KaG5i&^1sudtJvaKy-s8hg1+AaJ<^)<&Ql)ekR4U zQp}3OO+ya-%^|Y@>j`>HvxE#qC# z??bLq1_J&C<5*MFMwIQ-7b-slA~oZZzu|C0nREVlnP|TmgcQyYfaImDZ|_*c4s>b|Ths-A8yjxR=B0;FycWBqj9l5G+O8EnB zISFxbKPcy#wIXDBG(MGaw%nB11mJe1F)JOJ5bXNYyFS%?c9pY|Z;EugHpF>T+(}CN z`|>n@=S@m}-KQ5Hw75VmY^Tl*sf7(HhI=Hrxjg4g zMRbPwXiHq68SR?dZMm_+dyOZuE8rOsMY9jnS2Kg82Wk?njlAYQ)e#_B=tBUsV2D3q zOKJ98Jiu`sW>Y%ntAC6{Hw7HJ;}4oqwq*A(3545u<`YUUgD3gX3MlI^#h=h=g#GUs z8{nUB><4L-^RR`V%c<5Cz5uDcEPa51sK{vj7k)Ykc@bAr;}eRkMK=PL8lh#T=L+L} zp=G=7BNZ7Y+epr|UlJq$l<>+!@3c8~9%x5i7lw&Rnbm_*q`8(DD&&udCN&LONgtjr z>5^asFirK%uCjL4uwNP*3ZCS9$zxiledY&Kc2i8eFB%5I{!b^Xv0XB9ukq;3rvPP9 zahRA+N3|3Pp-3Nz)Yp7NB%DK;yM8eSWjN4Q|k!o?Hj4ZBGQ~_5gZp0fFOP2B^OwOZFC7o1U@nz15XW$$o_wPn4il(cz6!K^F2FOvJ$>Qbc zq8?Foc65ij#4pEnAKw5jARV+2JkHQ5R_fI^?_19V=w#fm2%?f-WVgQ~1Q)|U>-7ls z+{m`c{Zgy&I6~A8Sbh4R&%RcdI8j~cJ4!Kv$7&`@&_zAf%mye-K#)9RLH6X|~6{4o6 z{H+Ea&My$C_=|GelI$a-67x-py$}>8p(d;&{*;JA!LD1?>c*}$?873YO@?8O zx-6Os+`q`fd;tc3IT1-+b>vKniRtREN6j(p;1>^KkMaqG07tnnYeui*qpxpi1zZRt|LOkqHFXCPK&Hb@!nL-^dCx_R#$rm8 z9Pl%XE6~NVsv@PwoF65H2jo~cJh2>|=25L|*HLi*JkYetW!YGFKjG=@u_B0fB$J>U zwquPltfh^&hEwsT5Hl<$mr+>UTM*3ejJI%R)BFVoV*e_lmF$Z{fl~+s$D4wm2w`=m z!kA3*7Lkm0ZwB5$p*VVARRTpU;Jrq#(oFjH9IdA_peJ}qq9hLG{{OuWNA76LAQd=+ zKkxbPU6obs3d(pDb3mLgX3}@urWZoTEJrs8(6=gL6=fJGmTQKon?lJ+rf_}>UDh7Y z*bmL|OcEdLCp~OHxN(H%Qr^3|;)^XE50gChw-Bp`!F~G++yJ(&<)+#a3?+ssw&A%z ztR-rqMUpMPm#^=(+OQf#n_MR3I9)bw@(3k%S@MB_p~>(I%VCDMh98!_PWLy&uoJD5 z4wRb0Y&F4RVet&4M#<|0a#OUX#UNpp)c}{CHqXd6KHdi3gu1KR#}~pjC3U zmw!cN8ZZ8-w-lpn>VCkQR9dYF3EKbNjK02Zbkg!Ww&bF!6KKOn)BKEHi|){H0$>nz@vO>5iT)>! z_ctf|iV7Yt(a>)?)1?sMz7D?__vX^@`;PK(*5hO04%6455;DZ&a7yX(QGp-wjGa=C zJTHM+w zv1=~!YvY{i_sh(MUqJjf?1UREXqkRboZ?n3;ZmSKXmeo7vM(;iZVZ~Uj<;doUY*!+ zl%HWqaSBARvLsy9Q9<3{OrD$YJ2jS^xH7V#1a%BNnn*7qC?IzzgKYC+@z&mOx0cgK z>I=dYnI=5Km>7nHDP`fP4zr<3xc;`?Jfp-fC z75C@XrQpkc7rNlISaB{mX{!$tHh~P{%p*q3@A`+qINi|)b~g*16763Ku%u{r`3-wE zG}jQ(e$IUXE(r5I_1AiArxYZDigLYj32h6YFPYk0e1P(#a{hlgM7Z{0@Kqx|C&VFc#I}kjTMUdJW&#`JD-41pb13Tj315 zE8@^%xxw`tDsM`NK2iEB+$Xm1YyCYJWv=`aV)8K@3pK+R&vGp3vDJwHh58w;Vn)ai z8v*?-i{~t3zq>vj$)bo0xKi4n;SaCT_sT0qo8voa^abYOG>A#C_wctBrWxwJs4FR9<3p)C zsZb_fL?X(Ep4k^Te1y$uuy;dxVt(IIt@FMd5!~uCiq9L2yOIJ9jj8Qaf$A(*rG3uD z=5(Y>3qw>pa&~{NzqLGx6%|??x`Awf04vqS+BEGjw>-e*Fa(WHPyqBC`bUCU_N`s^ zNR{P!o)22Izqo}NQ;c}3+z?qRLR);)2Ty9<&e>I0DqkRe-isy@O4lf&*80h3>E4jD zqtY4}6elTs6hjWd)3aA^5i{8{-AL8H&;yilu=-p94FX#Awtit=OLm|EayGp8w|dHd z_{rx=DOaEnXrtmS&LlN$E3-66tvf(`e5{?*&s12F7XmFk>`?hgk8z2A!!fAEegDoE zxtdSOU$qU8ql7(=TIi2-J|3~>vMVlklsSIw-doUEMhUarp(0dUUDFnZKR1gR^sz`y z+H(aimmLJwRa)@4m4!BQ8i>w6vqvQ;HplHze^jF`Om^lT7#$Vx>yo2gN>qQV`#9yZ zI#R^67MTQ1*BlPD$f@)+4AVfuojJEPjY+1`#$8#j<0*!LF_u{uU59Kqk(qDvNNVLkj z%$%Z+<4^?NzLy@Z01Ay%x+VClU)GZnP9{|J8G>%wLy$wdCs{yjv%Ta29QYD}3EcoW z^n&lo{x};7|FbPCJ!<}7-2HkFcJwWD3L!^FUPw3A898aT)W&Am?^vjvirr;RJ(Bk; zv8_j$vQus=MC$~F?cBFz)SNDYbI1w*Rie|blRI~Lwj{_MB>e8k5@!%Azg!RF!S`Rl zfyCqE0SRNzmMA$u{P9Ue!68ivW~pL3c-f+MsiVex*W!R7QVHjAz4Izu5?bcJG_l19FbG|-s;B} z4%}Dsg=DCiRn;W)0^hApK?-K{Hg>(3L<+$ka78K&!>SkE?o(d-@17gke={~w^TIiJ zsR@lM+|gYPp5HmADK4Z%SSeVd=Zrk&kN=G2JWSm9#eq1Jt?@z9(8VmjpK_yC8cDpv z=D!89fgh^E$*KokAGdQ&smhj+mYpb`X5U4bIbR}jh%*~+sVWW&n(n;(P*TVQ=jjM&!@cvC^_;F7o0{FP zZ!@OA0O@*~R3f5oueMIFWRXM_85i7K_iOnYI%cm}8_jwWzK#ZfCcF+s!SaWUGm1LL zGIyGR$^|0pZ&AOme;@|i?`PmLzP%c8#LX3|6WEFnY|S{H``rXzRCxg+qrblIT%)rH{D!y~t5Ke~0Y@bZ3 zlhC9Yh4Bc};m+r@6f>x@;fh>B#I(3(24p|Q2QP88P`m+%F*Oltt6eMe8B^W!AbMAh zO}EiZYD7ur`gtd-^0>Y1)$A|L;?xj5fw5EbjJon{JjmAPo7T;)JbKUnNW9jw_qAlmq-Th7? z!{6~DoKUL=&CTSf)U$ZZNC-C3mln6Db}MWqed+@?juOS?2Mm)HMkbJdfvRngEdW_P zakz~|FQk6chg6n)y;nm=<3&LE1eOC`<^ZCT9O$2f*qr-ru?3&=1-cBHa>ZWf9RWk| zm2Nril8bwMPnppj$A()Q;^Zeb#^d19z&@UVZM(%Z5w(iu0Fd+9YBBAb;6otNrkOHl zivvRypWXOhh`b3uafHCFe1A%n=y;2d8bi&1f7z*UP;C5X@PE$0L%A&2fuT`|hs-+& zjKLwxrd#H<j zGz(}aMe=qpikuMOPQZ4Rq91dA|5X*SiJ&!8khuAG2ANoXxx1?Qo|O{O+uVN^c%P<^ zNxzi@uB%l_;|J>BLGtvXd!aeNQcJrg+_zp}YX7)DjCs(cwT9d0Ww+iAj{WZ06X70c z+AZ+@UFTW%HKUC$|K~PP75e~oP0xT|&FoGKD>Qri#frc8l)p9+B6O8&P*bzW(0>2H z8G0#2jo`>TttNfIDU!Fk2hybfotwO*G`UGv^|l)_xyz@pyk~8Na)T>gXr57pwSr|= zOze=P+v1#m{Cw_xA?;loxd}e+|Nlb*-qDoT2$|`lHKXbNkv+CMs=h%!p?YV#ea3%@OElHu zgk+LTCfxpN-9-|Qu`mmGB3-3t3HT-G4#Y9k<@d~vW9CVxH-kr#s80UYm{&LiQizqP zd7VC(9i23sA6T*mgwU1zd%>RV&&v&3cC)PTMoq4C`Cyyaz1X+)f^z7*5j+1T*;d!G zP_-wZQ1yz+2alN9L~(Vi4e`h|Vj}y6`f-7`8OAq01zd1$O|Ngpa>#$Gh4 z9}m6v%W07krR)Oabrh;TKPVsDM0rhnRMgS}gSBQ)s-d8*dndNm`w!ENM@CADAXeX^ z9-DtRBdSU$CE`H3KAkiCl1i^{iCn5ywlpx~)~A^phV^>(X9Lkg!-3@AM2L#r@qHH| zVj$1?SIHOyI&y!1Rvqu*_;^r_;wCBH%LI}~0;HsNKEr_hBkI_evk@egR1zA)PV}Ac zELCXTeY`GAqFmHq!^C?D3<@$KDM;?<;JL;H$ZI%;?NPV72J`&2{nRnBrco7n^}|Ni zfnIAvv51}J5!&pqO{fhRggLQj05@>H5+n;v_*zHC&c}=c74lC6lNKX$jn-^T(4(sa zy=R&k4-A9j!4$|vZ{J!_PQ5!DSMpDVCw(Q{mVdKbmwL>n(P}vs3BDDdVJTG?&5KFFj9IAG@;u2nj^rox1k{ z?^I6OL7(2pRp`sHqRkIknJs;7dPy3t6wh#1DP2_ucw4@Kv*VCeWl^J!Lqa%c4PWlj z;W9Mtxi{W@+8;XD2i=56M5ScM>9Fw5ම{4EGY^_h6bs7t5vjtr`t_) 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 BRHFa@ diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_login_bg.webp deleted file mode 100644 index 7af7432551edf42ec320de1a5643e49b5d4dc543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44568 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ම{4EGY^_h6bs7t5vjtr`t_) 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 BRHFa@ diff --git a/OCH/mogo-och-taxi/src/main/res/values/colors.xml b/OCH/mogo-och-taxi/src/main/res/values/colors.xml index 743794b7f8..3aa7cfc710 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/colors.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/colors.xml @@ -25,14 +25,4 @@ #657EE2 - #2961F2 - #14FF0000 - #FF0000 - #666666 - #86A5F7 - #111533 - #878890 - #EF262C - #4D000000 - \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/strings.xml b/OCH/mogo-och-taxi/src/main/res/values/strings.xml index b24bdb28d8..1c2e79dfea 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/strings.xml @@ -30,17 +30,6 @@ 自动驾驶状态为0不可用 司机端未确认可以开启自动驾驶 - 欢迎您登录 - 登录 - 获取验证码 - 请输入验证码 - 获取验证码成功 - 登录成功 - 请输入正确的手机号 - 请输入正确的验证码 - 请输入手机号 - 请输入手机号 - 网络异常,请稍后重试 请求出现异常,请稍后重试 \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/values/styles.xml b/OCH/mogo-och-taxi/src/main/res/values/styles.xml index ec73feaae9..bd2964b922 100644 --- a/OCH/mogo-och-taxi/src/main/res/values/styles.xml +++ b/OCH/mogo-och-taxi/src/main/res/values/styles.xml @@ -23,22 +23,4 @@ - - \ No newline at end of file From 513df2b96a285715d8e64d0c0fde70bfee9e880f Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 20 Sep 2022 14:26:53 +0800 Subject: [PATCH 008/226] =?UTF-8?q?[2110]=20=E4=BB=BB=E5=8A=A1=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/ui/BusSwitchLineActivity.java | 2 +- .../bus/ui/adapter/SwitchLineTaskAdapter.java | 2 +- .../drawable/bus_switch_line_btn_commit.xml | 24 +++++++------------ .../bus_switch_line_btn_un_commit.xml | 16 ------------- .../res/layout/activity_bus_switch_line.xml | 11 +++++---- 5 files changed, 17 insertions(+), 38 deletions(-) delete mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java index ded9038f14..0b5e58c53c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java @@ -155,7 +155,7 @@ public class BusSwitchLineActivity extends MvpActivity - - - - - - - - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml deleted file mode 100644 index d0ea7fa041..0000000000 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml index 95482563ea..e5d7b2d7f5 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml @@ -50,18 +50,19 @@ + android:background="@drawable/bus_switch_line_btn_commit"/> Date: Tue, 20 Sep 2022 15:13:01 +0800 Subject: [PATCH 009/226] =?UTF-8?q?[change]=20=E6=B7=BB=E5=8A=A0=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E5=8F=AF=E4=BB=A5=E5=90=AF=E5=8A=A8=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=A9=BE=E9=A9=B6=E5=9B=9E=E8=B0=83=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhidao/adas/client/ui/MainActivity.java | 48 +++++++++++ .../autopilot/adapter/MoGoAdasListenerImpl.kt | 8 ++ .../zhidao/support/adas/high/AdasChannel.java | 5 +- .../support/adas/high/OnAdasListener.java | 7 ++ .../adas/high/bean/AutopilotAbility.java | 39 +++++++++ .../high/common/AutopilotAbilityManager.java | 82 +++++++++++++++++++ .../high/common/ReceiveTimeoutManager.java | 2 +- .../adas/high/msg/StatusQueryRespMessage.java | 2 + .../adas/high/msg/VehicleStateMessage.java | 2 + 9 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index b62e568141..8f52510cf2 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -84,6 +84,7 @@ import com.zhidao.support.adas.high.AdasOptions; import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; import com.zhidao.support.adas.high.OnMultiDeviceListener; +import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.ByteUtil; import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; @@ -110,6 +111,7 @@ import java.util.Locale; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; +import chassis.Chassis; import chassis.VehicleStateOuterClass; import io.netty.channel.Channel; import mogo.telematics.pad.MessagePad; @@ -164,6 +166,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private ListPopupWindow listPopupWindow; private FloatWindow floatWindow; private View include_title; + private boolean isAutopilotAbility = true; + private String autopilotAbilityReason; // @Override // protected void onStart() { // super.onStart(); @@ -796,6 +800,50 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas DataDistribution.getInstance().addData(base); } + @Override + public void onAutopilotAbility(AutopilotAbility ability) { + isAutopilotAbility = true; + autopilotAbilityReason = null; + if (ability.gear == null || ability.gear == Chassis.GearPosition.GEAR_P || ability.gear == Chassis.GearPosition.GEAR_R) { + isAutopilotAbility = false; + autopilotAbilityReason = "挡位不正常"; + } + if (isAutopilotAbility) + if (ability.brake > 0) { + isAutopilotAbility = false; + autopilotAbilityReason = "制动踏板被踩下"; + } + if (isAutopilotAbility) + if (ability.statusInfo == null) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统Topic不正常"; + } + if (isAutopilotAbility) + if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_STARTING) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统正在启动"; + } + if (isAutopilotAbility) + if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_EXITING) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统正在关闭"; + } + if (isAutopilotAbility) + if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_FAULT) { + isAutopilotAbility = false; + autopilotAbilityReason = "系统异常"; + } + if (isAutopilotAbility) + for (SystemStatusInfo.HealthInfo healthInfo : ability.statusInfo.getHealthInfoList()) { + if (healthInfo.getState() == SystemStatusInfo.HealthState.FAULT) { + isAutopilotAbility = false; + autopilotAbilityReason = healthInfo.getName() + " Topic异常"; + break; + } + } + Log.i(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason); + } + @Override public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { Trajectory base = new Trajectory(header, trajectory, sdf); 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 1a1d52ec09..27bcb9b9e5 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 @@ -50,6 +50,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateLi import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasListener +import com.zhidao.support.adas.high.bean.AutopilotAbility import com.zhidao.support.adas.high.common.ProtocolStatus import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD @@ -427,4 +428,11 @@ class MoGoAdasListenerImpl : OnAdasListener { override fun onError(status: ProtocolStatus, bytes: ByteArray) { } + + /** + * 是否可以启动自动驾驶 + * 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility + */ + override fun onAutopilotAbility(ability: AutopilotAbility?) { + } } \ No newline at end of file diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 606496ab5e..aa1125bae1 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -19,6 +19,7 @@ import androidx.annotation.Nullable; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.bean.VersionCompatibility; +import com.zhidao.support.adas.high.common.AutopilotAbilityManager; import com.zhidao.support.adas.high.common.ByteUtil; import com.zhidao.support.adas.high.common.Constants; import com.zhidao.support.adas.high.common.CupidLogUtils; @@ -506,9 +507,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec private void updateConnectStatus(@Define.IPCConnectionStatus int status, @Nullable String reason) { ipcConnectionStatus.set(status); if (status == Constants.IPC_CONNECTION_STATUS.CONNECTED) { - + AutopilotAbilityManager.getInstance().start(); startCheckCompatibility(); } else { + AutopilotAbilityManager.getInstance().stop(); stopCheckCompatibility(); } if (status == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { @@ -596,6 +598,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec void setOnAdasListener(OnAdasListener adasListener) { mAdasListener = adasListener; + AutopilotAbilityManager.getInstance().setOnAdasListener(adasListener); } @Override diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index b40ce186dc..6f9d7f09ba 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -1,5 +1,6 @@ package com.zhidao.support.adas.high; +import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.common.ProtocolStatus; import chassis.VehicleStateOuterClass; @@ -186,4 +187,10 @@ public interface OnAdasListener { */ void onError(ProtocolStatus status, byte[] bytes); + /** + * 是否有能力启动自动驾驶 + * + * @param ability 是否可以启动自动驾驶 + */ + void onAutopilotAbility(AutopilotAbility ability); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java new file mode 100644 index 0000000000..7ecbfe6bb5 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java @@ -0,0 +1,39 @@ +package com.zhidao.support.adas.high.bean; + +import chassis.Chassis; +import system_master.SystemStatusInfo; + +/** + * 自动驾驶能力 能否启动自动驾驶 + * 未赋值表示接口通讯异常或者工控机相关节点异常 如果回调持续都是未赋值的状态表示此问题是持久性的 + */ +public class AutopilotAbility { + /** + * 刹车踏板开度 0~100 + * -1表示未赋值 + */ + public final float brake; + /** + * 挡位 + * null表示未赋值 + */ + public final Chassis.GearPosition gear; + /** + * 状态查询结果 + * null表示未赋值 + * 不能启动自动驾驶的判断 + * statusInfo.getHealthInfoList().get().getState()== SystemStatusInfo.HealthState.FAULT + * statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_STARTING + * statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_EXITING + * statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_FAULT + */ + public final SystemStatusInfo.StatusInfo statusInfo; + + public AutopilotAbility(float brake, Chassis.GearPosition gear, SystemStatusInfo.StatusInfo statusInfo) { + this.brake = brake; + this.gear = gear; + this.statusInfo = statusInfo; + + + } +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java new file mode 100644 index 0000000000..889616b91b --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java @@ -0,0 +1,82 @@ +package com.zhidao.support.adas.high.common; + +import com.zhidao.support.adas.high.AdasManager; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.bean.AutopilotAbility; + +import java.util.Timer; +import java.util.TimerTask; + +import chassis.Chassis; +import chassis.VehicleStateOuterClass; +import system_master.SystemStatusInfo; + +/** + * 是否可以启动自动驾驶能力检测 + */ +public class AutopilotAbilityManager { + private static final String TAG = AutopilotAbilityManager.class.getSimpleName(); + private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间 + private static volatile AutopilotAbilityManager INSTANCE; + + private OnAdasListener listener; + private volatile Timer timer; + + private VehicleStateOuterClass.VehicleState vehicleState; + + public void setOnAdasListener(OnAdasListener listener) { + this.listener = listener; + } + + private AutopilotAbilityManager() { + } + + public static AutopilotAbilityManager getInstance() { + if (INSTANCE == null) { + synchronized (AutopilotAbilityManager.class) { + if (INSTANCE == null) { + INSTANCE = new AutopilotAbilityManager(); + } + } + } + return INSTANCE; + } + + public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) { + if (listener != null) { + float brake = -1; + Chassis.GearPosition gear = null; + if (vehicleState != null) { + brake = vehicleState.getBrake(); + gear = vehicleState.getGear(); + } + listener.onAutopilotAbility(new AutopilotAbility(brake, gear, statusInfo)); + } + } + + public void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) { + this.vehicleState = vehicleState; + } + + public synchronized void start() { + if (timer == null) { + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + AdasManager.getInstance().sendStatusQueryReq(); + } + }, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步 + } + } + + public synchronized void stop() { + if (timer != null) { + timer.cancel(); + timer = null; + } + this.vehicleState = null; + } + + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java index 8238010917..6bfdc5931e 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java @@ -5,7 +5,7 @@ import java.util.TimerTask; import java.util.concurrent.atomic.AtomicBoolean; /** - * 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中,目前放在AutopilotStateMessage 数据接口中,此接口数据刷新不是太频繁 + * 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中 * 与工控机链接成功后,工控机断开连接超时监测管理器 * 由于没有心跳机制,如果服务器端断网或其他非正常断开,客户端是无感知的,所以需要根据最后一次接收数据的时间进行超时检测 */ diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java index ddf101b865..48b22ceae7 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java @@ -2,6 +2,7 @@ package com.zhidao.support.adas.high.msg; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.AutopilotAbilityManager; import com.zhidao.support.adas.high.protocol.RawData; import mogo.telematics.pad.MessagePad; @@ -15,6 +16,7 @@ public class StatusQueryRespMessage extends MyAbstractMessageHandler { @Override public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { SystemStatusInfo.StatusInfo statusInfo= SystemStatusInfo.StatusInfo.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AutopilotAbilityManager.getInstance().setStatusInfo(statusInfo); if (adasListener != null) { adasListener.onStatusQueryResp(raw.getHeader(), statusInfo); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java index ba8d1acdc8..90255446a6 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java @@ -2,6 +2,7 @@ package com.zhidao.support.adas.high.msg; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.AutopilotAbilityManager; import com.zhidao.support.adas.high.protocol.RawData; import chassis.VehicleStateOuterClass; @@ -14,6 +15,7 @@ public class VehicleStateMessage extends MyAbstractMessageHandler { @Override public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { VehicleStateOuterClass.VehicleState vehicleState = VehicleStateOuterClass.VehicleState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AutopilotAbilityManager.getInstance().setVehicleState(vehicleState); if (adasListener != null) { adasListener.onVehicleState(raw.getHeader(), vehicleState); } From ab64327b6c1da2b70814954b28cfe75fc02207ab Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 5 Sep 2022 15:46:47 +0800 Subject: [PATCH 010/226] wait to finish --- .../DevaToolsProvider.kt | 2 ++ .../funcconfig/BizConfigCenter.kt | 20 +++++++++++++++++++ .../funcconfig/FuncConfigConst.kt | 9 +++++++++ 3 files changed, 31 insertions(+) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.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 39cd282e7b..e41ecf8891 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 @@ -11,6 +11,7 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG 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.BizConfigCenter.Companion.bizConfigCenter import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager @@ -30,6 +31,7 @@ class DevaToolsProvider : IDevaToolsProvider { override fun init(context: Context) { mContext = context + bizConfigCenter.init(context) traceManager.init(context) MogoLogCatchManager.init(context) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt new file mode 100644 index 0000000000..2bc659b312 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt @@ -0,0 +1,20 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +import android.content.Context + +class BizConfigCenter { + + companion object { + val bizConfigCenter by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + BizConfigCenter() + } + } + + private var mContext: Context? = null + + fun init(context: Context) { + mContext = context + } + + +} \ 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/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt new file mode 100644 index 0000000000..2849c42fb6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -0,0 +1,9 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +class FuncConfigConst { + + companion object{ + + const val FUNC_CONFIG_TYPE = 500001 + } +} \ No newline at end of file From 23a648483a3660be2f8df144a0b158a24a32d808 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 9 Sep 2022 09:41:28 +0800 Subject: [PATCH 011/226] add func of configbiz and wait to finish --- build.gradle | 1 + config.gradle | 34 ++++--- .../DevaToolsProvider.kt | 2 +- .../funcconfig/BizConfigCenter.kt | 20 ---- .../funcconfig/FuncConfigCenter.kt | 79 +++++++++++++++ .../funcconfig/FuncConfigConst.kt | 99 +++++++++++++++++++ .../network/FuncConfigApiService.kt | 16 +++ .../funcconfig/network/FuncConfigHost.kt | 22 +++++ .../network/FuncConfigNetWorkModel.kt | 52 ++++++++++ .../core/function/hmi/ui/MoGoHmiFragment.kt | 23 +++-- .../collect/MoGoMapDataCollectProvider.kt | 2 +- .../redlightwarning/RedLightWarningManager.kt | 6 ++ .../core/function/v2x/vip/VipCarManager.kt | 10 +- core/mogo-core-data/build.gradle | 1 + .../core/data/deva/bizconfig/FuncBizConfig.kt | 46 +++++++++ .../core/data/deva/chain/ChainConstant.kt | 1 + .../core/data/enums/WarningDirectionEnum.kt | 13 +++ .../IMoGoDevaToolsFuncConfigListener.kt | 14 +++ ...allerDevaToolsFuncConfigListenerManager.kt | 70 +++++++++++++ core/mogo-core-utils/build.gradle | 1 + gradle.properties | 3 + libraries/mogo-adas/build.gradle | 1 + .../module/common/enums/EventTypeHelper.kt | 45 +++++++++ 23 files changed, 512 insertions(+), 49 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt create mode 100644 core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt diff --git a/build.gradle b/build.gradle index 2d52e63827..786ea8b61e 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,7 @@ buildscript { classpath 'com.tencent.bugly:symtabfileuploader:2.2.1' classpath "com.bytedance.android.byteX:base-plugin:0.3.0" classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}" + classpath "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}" classpath 'com.volcengine:apm_insight_plugin:1.4.1' classpath 'com.mogo.thread.opt:plg:2.2.12' classpath 'com.mogo.cloud:systrace:1.0.1' diff --git a/config.gradle b/config.gradle index 0341f9f4a2..b2b2ca68d5 100644 --- a/config.gradle +++ b/config.gradle @@ -1,22 +1,6 @@ ext { time = "" kotlin_version = "1.4.31" - android = [ - launcherApplicationId : "com.mogo.launcher", - independentApplicationId : "com.mogo.launcher.app", - fLauncherApplicationId : "com.mogo.launcher.f", - bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto", - fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125", - bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a", - commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3", - commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", - compileSdkVersion : 29, - buildToolsVersion : "29.0.2", - minSdkVersion : 21, - targetSdkVersion : 21, - minSdkVersionPadLenovo : 23, - targetSdkVersionPadLenovo : 23, - ] dependencies = [ // androidx androidxappcompat : "androidx.appcompat:appcompat:1.3.1", @@ -134,6 +118,8 @@ ext { //plugin mogochainbase : "com.mogo.cloud:service-chain:${SERVICE_CHAIN_VERSION}", mogochainplugin : "com.mogo.cloud:hook:${HOOK_LOG_VERSION}", + mogoservicebiz : "com.mogo.cloud:service-biz:${SERVICE_BIZ_VERSION}", + mogobizconfig : "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}", //========================= 旧版本架构 Maven 版本管理 ========================= // modules @@ -250,6 +236,22 @@ ext { koomnative : "com.kuaishou.koom:koom-native-leak-static:2.2.0", koomxhook : "com.kuaishou.koom:xhook-static:2.2.0" ] + android = [ + launcherApplicationId : "com.mogo.launcher", + independentApplicationId : "com.mogo.launcher.app", + fLauncherApplicationId : "com.mogo.launcher.f", + bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto", + fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125", + bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a", + commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3", + commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", + compileSdkVersion : 29, + buildToolsVersion : "29.0.2", + minSdkVersion : 21, + targetSdkVersion : 21, + minSdkVersionPadLenovo : 23, + targetSdkVersionPadLenovo : 23, + ] } boolean isM1Chip() { 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 e41ecf8891..72fb167642 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 @@ -11,7 +11,7 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneTAG 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.BizConfigCenter.Companion.bizConfigCenter +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt deleted file mode 100644 index 2bc659b312..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/BizConfigCenter.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.funcconfig - -import android.content.Context - -class BizConfigCenter { - - companion object { - val bizConfigCenter by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { - BizConfigCenter() - } - } - - private var mContext: Context? = null - - fun init(context: Context) { - mContext = context - } - - -} \ 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/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt new file mode 100644 index 0000000000..537098d1c0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -0,0 +1,79 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +import android.content.Context +import com.mogo.aicloud.services.socket.IMogoOnMessageListener +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD_SHOW +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.FUNC_CONFIG_TYPE +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.defaultFuncConfig +import com.zhjt.mogo_core_function_devatools.funcconfig.network.FuncConfigNetWorkModel +import com.zhjt.service.chain.ChainLog +import com.zhjt.service.chain.TracingConstants +import com.zhjt.service_biz.BizManager +import com.zhjt.service_biz.FuncConfig + +class FuncConfigCenter : IMogoOnMessageListener { + + companion object { + val bizConfigCenter by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + FuncConfigCenter() + } + } + + private var mContext: Context? = null + private val funcConfigNetWorkModel = FuncConfigNetWorkModel() + + fun init(context: Context) { + mContext = context + MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext) + .registerOnMessageListener(FUNC_CONFIG_TYPE, this) + UiThreadHandler.postDelayed({ + funcConfigNetWorkModel.requestFuncConfig({ + refreshConfig(it) + }, { + refreshConfig(defaultFuncConfig()) + }) + }, 2000L) + + } + + override fun target(): Class { + return FuncConfig::class.java + } + + override fun onMsgReceived(obj: FuncConfig?) { + obj?.let { + refreshConfig(it) + } + } + + @ChainLog( + linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, + linkCode = CHAIN_LINK_CLOUD_SHOW, + endpoint = TracingConstants.Endpoint.PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED, + paramIndexes = [0], + clientPkFileName = "sn" + ) + private fun refreshConfig(funcConfig: FuncConfig) { + BizManager.updateBizConfigData(funcConfig) + funcConfig.business.forEach { business -> + CallerDevaToolsFuncConfigListenerManager.invokeDevaToolsFuncConfigBizUpdate( + business.biz, + business.data + ) + } + } + + fun onDestroy() { + MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext) + .unregisterLifecycleListener(FUNC_CONFIG_TYPE) + mContext = null + } + +} \ 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/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt index 2849c42fb6..9737fed782 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -1,9 +1,108 @@ package com.zhjt.mogo_core_function_devatools.funcconfig +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AUTOPILOT_LANE_SELECTION +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AVW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BSW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BYPASS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_CLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_DNPW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_EBW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FCW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_HLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP_GREEN +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LCW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LIMIT_SPEED_SET +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LTA +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_OPT_LINE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_SLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_TJW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_TRACE_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VIP +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU_RI +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2V +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.AppUtils +import com.zhjt.service_biz.Business +import com.zhjt.service_biz.FuncConfig +import com.zhjt.service_biz.SubBiz + class FuncConfigConst { companion object{ const val FUNC_CONFIG_TYPE = 500001 + + fun defaultFuncConfig(): FuncConfig { + val businessList = mutableListOf() + + val v2nSubList = mutableListOf() + v2nSubList.add(SubBiz(BIZ_VIP, lock = false, state = true, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_OPT_LINE, lock = false, state = false, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_VRU, lock = false, state = true, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_VRU_RI, lock = false, state = true, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_HLW, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(V2N, v2nSubList)) + + val v2iSubList = mutableListOf() + v2iSubList.add(SubBiz(BIZ_IVP_GREEN, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_IVP, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_RTS, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_SLW, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_IVS, lock = false, state = true, dependNode = "", data = "")) + v2iSubList.add(SubBiz(BIZ_TJW, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(V2I,v2iSubList)) + + val v2vSubList = mutableListOf() + v2vSubList.add(SubBiz(BIZ_AVW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_LCW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_BSW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_EBW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_FCW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_LTA, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_CLW, lock = false, state = true, dependNode = "", data = "")) + v2vSubList.add(SubBiz(BIZ_DNPW, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(V2V,v2vSubList)) + + val foundationSubList = mutableListOf() + foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_TRACE_LOG, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_LIMIT_SPEED_SET, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BYPASS, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_AUTOPILOT_LANE_SELECTION, lock = false, state = true, dependNode = "", data = "")) + businessList.add(Business(FOUNDATION,foundationSubList)) + + return FuncConfig(0, AppUtils.getAppVersionCode(), getChannel(), AppUtils.getAppVersionCode(), businessList) + } + + private fun getChannel(): Int{ + return when{ + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 1 + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> 2 + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 3 + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> 4 + else -> 0 + } + } } } \ 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/FuncConfigApiService.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt new file mode 100644 index 0000000000..84fa0cb69c --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt @@ -0,0 +1,16 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig.network + +import com.mogo.eagle.core.data.BaseResponse +import com.zhjt.service_biz.FuncConfig +import retrofit2.http.Body +import retrofit2.http.Headers +import retrofit2.http.POST + +interface FuncConfigApiService { + + //FuncConfig + @Headers("Content-Type:application/json;charset=UTF-8") + @POST("/test") + suspend fun funcConfig(@Body map: MutableMap): BaseResponse + +} \ 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/FuncConfigHost.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt new file mode 100644 index 0000000000..fde2a2a3d1 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt @@ -0,0 +1,22 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig.network + +import com.mogo.commons.debug.DebugConfig + +class FuncConfigHost { + + companion object{ + private const val HOST_DEV = "http://dzt-test.zhidaozhixing.com/" + private const val HOST_RELEASE = "http://dzt.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 new file mode 100644 index 0000000000..e34bd791f4 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt @@ -0,0 +1,52 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig.network + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.debug.DebugConfig +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.request +import com.zhjt.service_biz.FuncConfig + +class FuncConfigNetWorkModel { + + private fun getNetWorkApi(baseUrl: String = FuncConfigHost.get()): FuncConfigApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(FuncConfigApiService::class.java) + } + + private var retryTime = 0 + + fun requestFuncConfig(onSuccess: ((FuncConfig) -> Unit), onError: ((String) -> Unit)) { + request> { + loader { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["env"] = DebugConfig.getNetMode() + map["appVersionCode"] = AppConfigInfo.appVersionCode + getNetWorkApi().funcConfig(map) + } + onSuccess { + if (it.result != null) { + onSuccess.invoke(it.result) + } else { + if (retryTime <= 3) { + retryTime += 1 + requestFuncConfig(onSuccess, onError) + } else { + onError.invoke("manualControl result is null") + } + } + } + onError { + if (retryTime <= 3) { + retryTime += 1 + requestFuncConfig(onSuccess, onError) + } else if (it.message != null) { + onError.invoke(it.message!!) + } + } + + } + } +} \ 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/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 4bdb0a6522..266a44f367 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 @@ -29,6 +29,9 @@ import com.mogo.eagle.core.data.camera.CameraEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.constants.MoGoFragmentPaths +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.data.enums.SidePattern.* import com.mogo.eagle.core.data.enums.WarningDirectionEnum @@ -88,6 +91,7 @@ import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.module.common.enums.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import com.zhjt.service_biz.BizConfig import kotlinx.android.synthetic.main.fragment_hmi.* import kotlinx.android.synthetic.main.view_auto_pilot_check.view.* import kotlinx.android.synthetic.main.view_och_bus_operation.view.* @@ -328,14 +332,6 @@ import java.util.* mViewNotificationProvider = provider } - override fun showVideoDialog(infList: List) { - context?.let { - if (roadVideoDialog == null) { - roadVideoDialog = RoadVideoDialog(it) - } - roadVideoDialog?.show(infList) - } - } override fun changeBusOperationStatus(isOut: Boolean) { busOperationStatus?.changerOperationStatus(isOut) @@ -1034,6 +1030,17 @@ import java.util.* dismissToolsFloatView() } + @BizConfig(V2I,"",BIZ_RTS) + override fun showVideoDialog(infList: List) { + context?.let { + if (roadVideoDialog == null) { + roadVideoDialog = RoadVideoDialog(it) + } + roadVideoDialog?.show(infList) + } + } + + @BizConfig(V2I,"", BIZ_RTS) private fun showCameraList(cameraList: List?) { context?.let { if (cameraViewFloat == null) { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/collect/MoGoMapDataCollectProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/collect/MoGoMapDataCollectProvider.kt index 6deeeabac3..71daa8d2d2 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/collect/MoGoMapDataCollectProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/collect/MoGoMapDataCollectProvider.kt @@ -153,7 +153,7 @@ class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener, executor.get()?.updateLocation( location.longitude, location.latitude, - location.altitude, + location.altitude, location.bearing, location.speed, location.provider == "GPS_RTK") diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt index feb8c877d3..66acaf96d6 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt @@ -1,6 +1,9 @@ package com.mogo.eagle.core.function.v2x.redlightwarning import android.location.Location +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP_GREEN +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.data.trafficlight.* @@ -16,6 +19,7 @@ import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.map.navi.IMogoCarLocationChangedListener2 import com.mogo.module.common.MogoApisHandler import com.mogo.module.common.enums.EventTypeEnum +import com.zhjt.service_biz.BizConfig import kotlin.math.abs import kotlin.math.ceil import kotlin.math.floor @@ -162,6 +166,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, /** * 闯红灯预警 */ + @BizConfig(V2I,"",BIZ_IVP) private fun redLightWarning() { CallerLogger.d("$M_V2X$TAG", "=====闯红灯预警=====") ThreadUtils.runOnUiThread { @@ -172,6 +177,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, /** * 绿灯通行提示 */ + @BizConfig(V2I,"",BIZ_IVP_GREEN) private fun greenLightWarning(speed: String = "50") { CallerLogger.d("$M_V2X$TAG", "=====绿灯通行预警=====") ThreadUtils.runOnUiThread { 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 7b8c2410c1..c08f0490ba 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 @@ -5,23 +5,26 @@ import android.location.Location import android.os.Handler import android.os.Looper import android.os.Message +import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.cloud.commons.utils.CoordinateUtils -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X +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.trafficlight.* 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.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager 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 import com.mogo.eagle.core.function.v2x.vip.network.VipNetWorkModel +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.UiThreadHandler import com.mogo.module.common.enums.EventTypeEnum -import com.mogo.aicloud.services.socket.IMogoOnMessageListener +import com.zhjt.service_biz.BizConfig import kotlin.math.abs class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListener, @@ -78,6 +81,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe return VipMessage::class.java } + @BizConfig(V2N, "", BIZ_VIP) override fun onMsgReceived(vipMessage: VipMessage?) { CallerLogger.d("$M_V2X$TAG", "onMsgReceived vipMessage : ${vipMessage.toString()}") vipMessage?.let { diff --git a/core/mogo-core-data/build.gradle b/core/mogo-core-data/build.gradle index 8405737a50..d401bf83d2 100644 --- a/core/mogo-core-data/build.gradle +++ b/core/mogo-core-data/build.gradle @@ -65,6 +65,7 @@ dependencies { implementation rootProject.ext.dependencies.mogo_core_res } else { implementation project(':core:mogo-core-res') + implementation project(':core:mogo-core-data') api project(":libraries:mogo-adas-data") } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt new file mode 100644 index 0000000000..36f6ec63a2 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt @@ -0,0 +1,46 @@ +package com.mogo.eagle.core.data.deva.bizconfig + +class FuncBizConfig { + + companion object{ + const val V2N = "V2N" + const val V2I = "V2I" + const val V2V = "V2V" + const val FOUNDATION = "FOUNDATION" + + // V2N + const val BIZ_VIP = "BIZ_VIP" // vip变灯 + const val BIZ_OPT_LINE = "BIZ_OPT_LINE" // 最优车道 todo + const val BIZ_VRU = "BIZ_VRU" // 弱势交通 todo + const val BIZ_VRU_RI = "BIZ_VRU_RI" // 弱势交通逆行 todo + const val BIZ_HLW = "BIZ_HLW" // 道路提示 todo + // V2I + const val BIZ_IVP_GREEN = "BIZ_IVP_GREEN" // 绿波通行 + const val BIZ_IVP = "BIZ_IVP" // 闯红灯预警 + const val BIZ_RTS = "BIZ_RTS" // 查看视频流 + const val BIZ_SLW = "BIZ_SLW" // 限速提醒 todo + const val BIZ_IVS = "BIZ_IVS" // 车内标识 todo + const val BIZ_TJW = "BIZ_TJW" // 道路拥堵 todo + // V2V + const val BIZ_AVW = "BIZ_AVW" // 异常车辆提醒 + const val BIZ_LCW = "BIZ_LCW" // 变道碰撞预警 + const val BIZ_BSW = "BIZ_BSW" // 盲区碰撞预警 + const val BIZ_EBW = "BIZ_EBW" // 前车急刹预警 + const val BIZ_FCW = "BIZ_FCW" // 前向碰撞预警 + const val BIZ_LTA = "BIZ_LTA" // 左转辅助预警 + const val BIZ_CLW = "BIZ_CLW" // 车辆失控预警 + const val BIZ_DNPW = "BIZ_DNPW" // 逆向超车预警 + // Foundation + const val BIZ_BEAUTY_MODE = "BIZ_BEAUTY_MODE" // 美化模式 + const val BIZ_RAIN_MODE = "BIZ_RAIN_MODE" // 雨天模式 + const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 + const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 + const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 + const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 + const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 + const val BIZ_BYPASS = "BIZ_BYPASS" // 绕障 + const val BIZ_AUTOPILOT_LANE_SELECTION = "BIZ_AUTOPILOT_LANE_SELECTION" // 择机变道 + + + } +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index bf710b77f2..f5fb8b59b9 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -59,6 +59,7 @@ class ChainConstant { const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST" const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_ERROR = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_ERROR" const val CHAIN_ALIAS_CODE_HTTP_DNS_CHANGED = "CHAIN_ALIAS_CODE_HTTP_DNS_CHANGED" + const val CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED = "CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED" const val CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED = "CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED" const val CHAIN_ALIAS_CODE_INIT_ON_MAP_INIT = "CHAIN_ALIAS_CODE_INIT_ON_MAP_INIT" diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/WarningDirectionEnum.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/WarningDirectionEnum.kt index c1b1229f40..a492e75343 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/WarningDirectionEnum.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/WarningDirectionEnum.kt @@ -1,5 +1,18 @@ package com.mogo.eagle.core.data.enums + +fun WarningDirectionEnum.isLeft():Boolean{ + return this.direction == WarningDirectionEnum.ALERT_WARNING_LEFT.direction + || this.direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT.direction + || this.direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT.direction +} + +fun WarningDirectionEnum.isRight():Boolean{ + return this.direction == WarningDirectionEnum.ALERT_WARNING_RIGHT.direction + || this.direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT.direction + || this.direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT.direction +} + /** *@author xiaoyuzhou *@date 2021/9/10 8:48 下午 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt new file mode 100644 index 0000000000..f600e1b437 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt @@ -0,0 +1,14 @@ +package com.mogo.eagle.core.function.api.devatools + +/** + * FuncConfig 功能配置业务回调 + */ +interface IMoGoDevaToolsFuncConfigListener { + + /** + * 更新业务数据,注意⚠️:需要由业务方判断具体type,业务聚合 + * type : biz类型 (FuncBizConfig) + * data : json + */ + fun updateBizData(type: String, data: String?) +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt new file mode 100644 index 0000000000..56915703c9 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt @@ -0,0 +1,70 @@ +package com.mogo.eagle.core.function.call.devatools + +import androidx.annotation.Nullable +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener +import com.zhjt.service_biz.SubBiz +import java.util.concurrent.ConcurrentHashMap + +object CallerDevaToolsFuncConfigListenerManager { + + private val M_DEVA_TOOLS_FUNC_CONFIG_LISTENER: ConcurrentHashMap = + ConcurrentHashMap() + + /** + * 添加监听 + * @param tag 标记,用来注销监听使用 + * @param listener 监听回调 + */ + fun registerDevaToolsFuncConfigListener( + @Nullable biz: String, + @Nullable tag: String, + @Nullable listener: IMoGoDevaToolsFuncConfigListener + ) { + if (M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.containsKey("$biz'_'$tag")) { + return + } + M_DEVA_TOOLS_FUNC_CONFIG_LISTENER["$biz'_'$tag"] = listener + } + + /** + * 删除监听 + * @param tag 标记,用来注销监听使用 + */ + fun unRegisterDevaToolsFuncConfigListener(@Nullable biz: String, @Nullable tag: String) { + if (!M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.containsKey("$biz'_'$tag")) { + return + } + M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.remove("$biz'_'$tag") + } + + /** + * 删除监听 + * @param listener 要删除的监听对象 + */ + fun unRegisterDevaToolsFuncConfigListener(@Nullable listener: IMoGoDevaToolsFuncConfigListener) { + if (!M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.containsValue(listener)) { + return + } + M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.forEach { + if (it.value == listener) { + M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.remove(it.key) + } + } + } + + /** + * 由订阅方判断Type类型,聚合一些 + */ + fun invokeDevaToolsFuncConfigBizUpdate(biz: String, list: MutableList) { + M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.forEach { + val key = it.key + if (key.contains(biz)) { + list.forEach { subBiz -> + val listener = it.value + listener.updateBizData(subBiz.type, subBiz.data) + } + } + } + } + +} \ No newline at end of file diff --git a/core/mogo-core-utils/build.gradle b/core/mogo-core-utils/build.gradle index 45d9d9af7e..692a87bf80 100644 --- a/core/mogo-core-utils/build.gradle +++ b/core/mogo-core-utils/build.gradle @@ -78,6 +78,7 @@ dependencies { api rootProject.ext.dependencies.life_cycle_java8 api rootProject.ext.dependencies.mogochainbase + api rootProject.ext.dependencies.mogoservicebiz } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/gradle.properties b/gradle.properties index 349da26c0a..ab9b6e8ea8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -58,6 +58,9 @@ bytex.ASM_API=ASM7 HOOK_LOG_VERSION=1.6.1 SERVICE_CHAIN_VERSION=1.1.0 + +BIZCONFIG_VERSION=1.1.4 +SERVICE_BIZ_VERSION=1.1.12 ################ 外部依赖引用 ################ # loglib LOGLIB_VERSION=1.3.38 diff --git a/libraries/mogo-adas/build.gradle b/libraries/mogo-adas/build.gradle index 153ecfbe94..d862918df2 100644 --- a/libraries/mogo-adas/build.gradle +++ b/libraries/mogo-adas/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.mogochainbase + implementation rootProject.ext.dependencies.mogoservicebiz //okhttp3的依赖 implementation 'com.squareup.okhttp3:okhttp:3.12.3' // parser diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt new file mode 100644 index 0000000000..69ea587db8 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt @@ -0,0 +1,45 @@ +package com.mogo.module.common.enums + +import com.mogo.eagle.core.data.enums.WarningDirectionEnum +import com.mogo.eagle.core.data.enums.isLeft +import com.mogo.eagle.core.data.enums.isRight + +class EventTypeHelper { + + companion object { + + fun getLCW( + direction: WarningDirectionEnum, + data: ((alertContent: String, ttsContent: String) -> Unit) + ) { + when { + direction.isLeft() -> { + data.invoke( + EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "左"), + EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "左") + ) + } + direction.isRight() -> { + data.invoke( + EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "右"), + EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "右") + ) + } + else -> { + data.invoke( + EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType), + EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType) + ) + } + } + } + + fun getCLW( + direction: WarningDirectionEnum, + data: ((alertContent: String, ttsContent: String) -> Unit) + ){ + data.invoke(EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_CLW.poiType + direction.desc) + ,EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_CLW.poiType + direction.desc)) + } + } +} \ No newline at end of file From 501e82ea45b0b06b5d3226b8221deaa7c1826526 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 13 Sep 2022 16:36:14 +0800 Subject: [PATCH 012/226] wait to finiah --- .../eagle/core/function/obu/mogo/MogoPrivateObuManager.kt | 6 ++++++ .../java/com/mogo/module/common/enums/EventTypeHelper.kt | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt index e7cfcaa6dd..5381c2bbf8 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt @@ -21,6 +21,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.module.common.drawer.TrafficMarkerDrawer import com.mogo.module.common.enums.EventTypeEnum +import com.mogo.module.common.enums.EventTypeHelper import com.mogo.service.IMogoServiceApis import com.zhidao.support.obu.MogoObuManager import com.zhidao.support.obu.OnMogoObuListener @@ -771,7 +772,12 @@ class MogoPrivateObuManager private constructor() { var changeVisualAngle = false when (appId.toString()) { // 变道预警,注意左后车辆/注意右后车辆 + EventTypeEnum.TYPE_USECASE_ID_LCW.poiType -> { + EventTypeHelper.getLCW(direction){ alert, tts -> + alertContent = alert + ttsContent = tts + } alertContent = EventTypeEnum.getWarningContent(appId.toString()) ttsContent = EventTypeEnum.getWarningTts(appId.toString()) if ( diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt index 69ea587db8..9422202082 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt @@ -10,7 +10,7 @@ class EventTypeHelper { fun getLCW( direction: WarningDirectionEnum, - data: ((alertContent: String, ttsContent: String) -> Unit) + data: ((alert: String, tts: String) -> Unit) ) { when { direction.isLeft() -> { @@ -36,7 +36,7 @@ class EventTypeHelper { fun getCLW( direction: WarningDirectionEnum, - data: ((alertContent: String, ttsContent: String) -> Unit) + data: ((alert: String, tts: String) -> Unit) ){ data.invoke(EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_CLW.poiType + direction.desc) ,EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_CLW.poiType + direction.desc)) From 699389a794cc5d59fdc95702e3761d9a19da5696 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 14 Sep 2022 11:58:43 +0800 Subject: [PATCH 013/226] .. --- .../obu/mogo/MogoPrivateObuManager.kt | 339 +++++++++--------- .../function/v2x/events/V2XEventManager.kt | 71 ++-- .../core/data/deva/bizconfig/FuncBizConfig.kt | 18 +- .../module/common/enums/EventTypeHelper.kt | 103 +++++- 4 files changed, 308 insertions(+), 223 deletions(-) diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt index 5381c2bbf8..4bd7552eaf 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt @@ -54,7 +54,8 @@ class MogoPrivateObuManager private constructor() { mContext = context connectObu(context, ipAddress) //控制日志输出 - MogoObuManager.getInstance().init(MoGoAiCloudClientConfig.getInstance().getSn(), AppConfigInfo.toString()) + MogoObuManager.getInstance() + .init(MoGoAiCloudClientConfig.getInstance().getSn(), AppConfigInfo.toString()) MogoObuManager.getInstance().registerListener(mogoObuListener) } @@ -112,7 +113,10 @@ class MogoPrivateObuManager private constructor() { // 接收到的原始数据 override fun onReceiveOriginData(data: String) { super.onReceiveOriginData(data) - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onReceiveOriginData ------> data = $data") + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onReceiveOriginData ------> data = $data" + ) } @@ -125,7 +129,10 @@ class MogoPrivateObuManager private constructor() { // CV2X系统信息 override fun onCvxAppInitIndInfo(info: CvxAppInitIndInfo) { super.onCvxAppInitIndInfo(info) - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxAppInitIndInfo ------> $info") + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxAppInitIndInfo ------> $info" + ) if (info != null) { if (!info.stack_info.isNullOrEmpty()) { mObuStatusInfo.stackInfo = info.stack_info @@ -177,7 +184,11 @@ class MogoPrivateObuManager private constructor() { // 同步给MAP地图 CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(data) // 同步更新经纬度和系统时间至 AutoPilotStatusListener - CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon(System.currentTimeMillis()/1000.0,position.longitude, position.latitude) + CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( + System.currentTimeMillis() / 1000.0, + position.longitude, + position.latitude + ) } } catch (e: Exception) { @@ -201,7 +212,10 @@ class MogoPrivateObuManager private constructor() { // (3) 道路事件预警信息:CVX_RTI_THREAT_IND override fun onCvxRtiThreatIndInfo(info: CvxRtiThreatIndInfo?) { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxRtiThreatIndInfo ------> $info") + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxRtiThreatIndInfo ------> $info" + ) if (info != null && info.threat_info != null && info.ext_info != null) { var alertContent = "" @@ -212,12 +226,12 @@ class MogoPrivateObuManager private constructor() { val direction = getMessageDirection(if (info.ext_info != null) info.ext_info.pos_classification else -1) CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxRtiThreatIndInfo direction = $direction -- pos_classification = ${info.ext_info.pos_classification}" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxRtiThreatIndInfo direction = $direction -- pos_classification = ${info.ext_info.pos_classification}" ) CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- handleDirection = $direction --rtiType = ${info.ext_info.rti_type} --direction = $direction -- pos_classification = ${info.ext_info.pos_classification} " + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- handleDirection = $direction --rtiType = ${info.ext_info.rti_type} --direction = $direction -- pos_classification = ${info.ext_info.pos_classification} " ) when (appId) { // 道路危险情况预警 @@ -233,13 +247,13 @@ class MogoPrivateObuManager private constructor() { WarningDirectionEnum.ALERT_WARNING_TOP_LEFT, WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT -> { appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_LEFT_SHARP.poiType + EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_LEFT_SHARP.poiType } WarningDirectionEnum.ALERT_WARNING_RIGHT, WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT, WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT -> { appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_RIGHT_SHARP.poiType + EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_RIGHT_SHARP.poiType } } } @@ -254,7 +268,7 @@ class MogoPrivateObuManager private constructor() { //事故 0xC -> { appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType + EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType } //拥堵 0xD -> { @@ -263,7 +277,7 @@ class MogoPrivateObuManager private constructor() { //行人 0xF -> { appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType + EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType } //禁止停车 0x13 -> { @@ -272,7 +286,7 @@ class MogoPrivateObuManager private constructor() { //学校 0x14 -> { appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType + EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType } //桥梁 0x17 -> { @@ -285,7 +299,7 @@ class MogoPrivateObuManager private constructor() { //人行横道 0x19 -> { appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType + EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType } //减速慢行 0x1A -> { @@ -316,13 +330,13 @@ class MogoPrivateObuManager private constructor() { ttsContent = EventTypeEnum.getWarningTts(appId) if (info.threat_info != null) { CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "ttsContent = $ttsContent --alertContent = $alertContent ---info.threat_info.distance = ${info.threat_info.distance} " + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "ttsContent = $ttsContent --alertContent = $alertContent ---info.threat_info.distance = ${info.threat_info.distance} " ) if (info.threat_info.distance.toInt() != 0) { alertContent = String.format( - EventTypeEnum.getWarningContent(appId), - info.threat_info.distance.toInt() + EventTypeEnum.getWarningContent(appId), + info.threat_info.distance.toInt() ) } else { alertContent = "前方拥堵,减速慢行" @@ -330,8 +344,8 @@ class MogoPrivateObuManager private constructor() { } CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "ttsContent = $ttsContent --alertContent = $alertContent" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "ttsContent = $ttsContent --alertContent = $alertContent" ) } } @@ -345,18 +359,19 @@ class MogoPrivateObuManager private constructor() { // CallerHmiManager.showWarning(direction) //显示弹框,语音提示 - CallerHmiManager.showWarningV2X(appId, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } - }, - true, - 5000L + CallerHmiManager.showWarningV2X( + appId, + alertContent, + ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + object : IMoGoWarningStatusListener { + override fun onDismiss() { + // 关闭警告红边 + CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) + } + }, + true, + 5000L ) // 更新数据 TrafficDataConvertUtils.cvxRtiThreatIndInfo2TrafficData(info)?.let { @@ -385,7 +400,10 @@ class MogoPrivateObuManager private constructor() { // (4) V2I预警信息:CVX_IVP_THREAT_IND,红绿灯 override fun onCvxIvpThreatIndInfo(info: CvxIvpThreatIndInfo?) { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "CvxIvpThreatIndInfo ------> $info") + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "CvxIvpThreatIndInfo ------> $info" + ) if (info != null && info.ext_info != null && info.threat_info != null && info.ext_info.lights != null @@ -405,17 +423,20 @@ class MogoPrivateObuManager private constructor() { // ) handlerTrafficLight( - info.threat_info.app_id, - info.status, - info.ext_info.lights, - info.ext_info.index + info.threat_info.app_id, + info.status, + info.ext_info.lights, + info.ext_info.index ) } } // (2) 弱势交通参与者预警信息:CVX_PTC_THREAT_IND override fun onCvxPtcThreatIndInfo(info: CvxPtcThreatIndInfo?) { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxPtcInfoIndInfo ------> $info") + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxPtcInfoIndInfo ------> $info" + ) // 交通参与者类型 0x0:未知 UNKNOWN | 0x1:非机动车 NON_MOTOR | 0x2:行人 PEDESTRIAN 0x3:RSU if (info != null && (info.ptc_type == 1 || info.ptc_type == 2)) { //v2i数据传输延迟 @@ -432,8 +453,8 @@ class MogoPrivateObuManager private constructor() { // ) CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxPtcInfoIndInfo ---status---> ${info.status}" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxPtcInfoIndInfo ---status---> ${info.status}" ) var v2xType = "" if (info.ptc_type == 1) { //摩托车 @@ -455,18 +476,19 @@ class MogoPrivateObuManager private constructor() { // if (level == 2 || level == 3) { //不考虑level //显示警告红边 CallerHmiManager.showWarning(direction) - CallerHmiManager.showWarningV2X(v2xType, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } - }, - true, - 5000L + CallerHmiManager.showWarningV2X( + v2xType, + alertContent, + ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + (v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + object : IMoGoWarningStatusListener { + override fun onDismiss() { + // 关闭警告红边 + CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) + } + }, + true, + 5000L ) // } // 更新数据 @@ -524,22 +546,26 @@ class MogoPrivateObuManager private constructor() { // (1) V2V预警信息:CVX_V2V_THREAT_IND override fun onCvxV2vThreatIndInfo(info: CvxV2vThreatIndInfo?) { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxV2vThreatIndInfo ------> $info") + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxV2vThreatIndInfo ------> $info" + ) info?.let { //预警信息,预警类型 threat_level 2、3 info.threat_info?.let { //预警方位 - val direction = getMessageDirection(if (info.ext_info != null) info.ext_info.target_classification else -1) + val direction = + getMessageDirection(if (info.ext_info != null) info.ext_info.target_classification else -1) //处理预警类型 val appId = info.threat_info.app_id val level = info.threat_info.threat_level val status = info.status if (info.ext_info != null) { CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxV2vThreatIndInfo target_classification = ${ - getMessageDirection(info.ext_info.target_classification) - } --- direction = $direction --- appId = $appId ---level = $level -- status = $status" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "onCvxV2vThreatIndInfo target_classification = ${ + getMessageDirection(info.ext_info.target_classification) + } --- direction = $direction --- appId = $appId ---level = $level -- status = $status" ) } @@ -605,8 +631,8 @@ class MogoPrivateObuManager private constructor() { */ private fun handlerTrafficLight(appId: Int, status: Int, lights: List, index: Int) { CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "handlerTrafficLight appId = $appId --- status = $status ---index = $index ---lights.size = ${lights.size} ---lights = $lights " + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "handlerTrafficLight appId = $appId --- status = $status ---index = $index ---lights.size = ${lights.size} ---lights = $lights " ) when (status) { // 添加 @@ -632,9 +658,9 @@ class MogoPrivateObuManager private constructor() { */ @Synchronized private fun changeTrafficLightStatus( - appId: Int, - lights: List, - index: Int + appId: Int, + lights: List, + index: Int ) { var ttsContent = "" var alertContent = "" @@ -642,8 +668,8 @@ class MogoPrivateObuManager private constructor() { if (index != -1 && lights.size >= index) { val currentLight = lights[index] CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "currentLight = $currentLight ---currentLight.phase = ${currentLight.phase} ---rlvw_violation_type = ${currentLight.rlvw_violation_type} --- index = $index ---appId = $appId ---appId = $appId" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "currentLight = $currentLight ---currentLight.phase = ${currentLight.phase} ---rlvw_violation_type = ${currentLight.rlvw_violation_type} --- index = $index ---appId = $appId ---appId = $appId" ) // 闯红灯预警 when (currentLight.rlvw_violation_type) { @@ -656,8 +682,8 @@ class MogoPrivateObuManager private constructor() { ttsContent = EventTypeEnum.getWarningTts(appId.toString()) alertContent = EventTypeEnum.getWarningContent(appId.toString()) CallerHmiManager.showWarningV2X( - appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), null, true, 5000L + appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + appId.toString(), null, true, 5000L ) } 0x3 -> {//闯黄灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_YELLOW_LIGHT @@ -667,7 +693,7 @@ class MogoPrivateObuManager private constructor() { when (currentLight.phase) { // 灯光不可用 0x0 -> { - CallerHmiManager.showWarningTrafficLight(0,2) + CallerHmiManager.showWarningTrafficLight(0, 2) } // 红灯 0x1 -> { @@ -676,7 +702,7 @@ class MogoPrivateObuManager private constructor() { isRedLight = true } isGreenLight = false - CallerHmiManager.showWarningTrafficLight(1,2) + CallerHmiManager.showWarningTrafficLight(1, 2) val red = currentLight.count_down.toInt() CallerHmiManager.changeCountdownRed(red) @@ -691,7 +717,7 @@ class MogoPrivateObuManager private constructor() { isGreenLight = true } isRedLight = false - CallerHmiManager.showWarningTrafficLight(3,2) + CallerHmiManager.showWarningTrafficLight(3, 2) val green = currentLight.count_down.toInt() CallerHmiManager.changeCountdownGreen(green) //防止数据出现问题的容错 @@ -699,44 +725,44 @@ class MogoPrivateObuManager private constructor() { CallerHmiManager.changeCountdownYellow(0) // 拼接建议速度 CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "speed_min = ${currentLight.glosa_suggested_speed_min} --speed_max = ${currentLight.glosa_suggested_speed_max.toInt()}" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "speed_min = ${currentLight.glosa_suggested_speed_min} --speed_max = ${currentLight.glosa_suggested_speed_max.toInt()}" ) val adviceSpeed = - "${currentLight.glosa_suggested_speed_min.toInt()} - ${currentLight.glosa_suggested_speed_max.toInt()}" + "${currentLight.glosa_suggested_speed_min.toInt()} - ${currentLight.glosa_suggested_speed_max.toInt()}" val adviceSpeedTts = - "${currentLight.glosa_suggested_speed_min.toInt()}到${currentLight.glosa_suggested_speed_max.toInt()}" + "${currentLight.glosa_suggested_speed_min.toInt()}到${currentLight.glosa_suggested_speed_max.toInt()}" ttsContent = - String.format( - EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), - adviceSpeedTts - ) + String.format( + EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), + adviceSpeedTts + ) alertContent = - String.format( - EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), - adviceSpeed - ) + String.format( + EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), + adviceSpeed + ) val maxSpeed = currentLight.glosa_suggested_speed_max.toInt() if (maxSpeed > 0) { CallerHmiManager.showWarningV2X( - EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), - null, - true, - 5000L + EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType, + alertContent, + ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + appId.toString(), + null, + true, + 5000L ) } } // 黄灯 0x3 -> { CallerHmiManager.disableWarningV2X(appId.toString()) - CallerHmiManager.showWarningTrafficLight(2,2) + CallerHmiManager.showWarningTrafficLight(2, 2) val yellow = currentLight.count_down.toInt() CallerHmiManager.changeCountdownYellow(yellow) CallerHmiManager.changeCountdownGreen(0) @@ -756,91 +782,55 @@ class MogoPrivateObuManager private constructor() { * @see com.mogo.module.common.enums.EventTypeEnum */ private fun handleSdkObu( - appId: Int, - direction: WarningDirectionEnum, - status: Int, - level: Int, - info: CvxV2vThreatIndInfo + appId: Int, + direction: WarningDirectionEnum, + status: Int, + level: Int, + info: CvxV2vThreatIndInfo ) { // 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnum 提供的 CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status" ) - var alertContent: String - var ttsContent: String + var alertContent: String? = null + var ttsContent: String? = null var changeVisualAngle = false when (appId.toString()) { // 变道预警,注意左后车辆/注意右后车辆 - EventTypeEnum.TYPE_USECASE_ID_LCW.poiType -> { - EventTypeHelper.getLCW(direction){ alert, tts -> + EventTypeHelper.getLCW(appId, direction) { alert, tts -> alertContent = alert ttsContent = tts } - alertContent = EventTypeEnum.getWarningContent(appId.toString()) - ttsContent = EventTypeEnum.getWarningTts(appId.toString()) - if ( - direction == WarningDirectionEnum.ALERT_WARNING_LEFT || - direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT || - direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT - ) { - ttsContent = String.format(ttsContent, "左") - alertContent = String.format(alertContent, "左") - } else if ( - direction == WarningDirectionEnum.ALERT_WARNING_RIGHT || - direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT || - direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT - ) { - ttsContent = String.format(ttsContent, "右") - alertContent = String.format(alertContent, "右") - } } - //车辆失控预警 EventTypeEnum.TYPE_USECASE_ID_CLW.poiType -> { - alertContent = EventTypeEnum.getWarningContent(appId.toString()) - ttsContent = EventTypeEnum.getWarningTts(appId.toString()) - - alertContent = String.format(alertContent, direction.desc) - ttsContent = String.format(ttsContent, direction.desc) + EventTypeHelper.getCLW(appId, direction) { alert, tts -> + alertContent = alert + ttsContent = tts + } } - //左转辅助 EventTypeEnum.TYPE_USECASE_ID_LTA.poiType -> { - alertContent = EventTypeEnum.getWarningContent(appId.toString()) - ttsContent = EventTypeEnum.getWarningTts(appId.toString()) + EventTypeHelper.getLTA(appId) { alert, tts -> + alertContent = alert + ttsContent = tts + } } - //异常车辆提醒 EventTypeEnum.TYPE_USECASE_ID_AVW.poiType -> { - alertContent = EventTypeEnum.getWarningContent(appId.toString()) - ttsContent = EventTypeEnum.getWarningTts(appId.toString()) - alertContent = String.format(alertContent, direction.desc) - ttsContent = String.format(ttsContent, direction.desc) + EventTypeHelper.getAVW(appId, direction) { alert, tts -> + alertContent = alert + ttsContent = tts + } } - //盲区预警 EventTypeEnum.TYPE_USECASE_ID_BSW.poiType -> { - ttsContent = EventTypeEnum.getWarningTts(appId.toString()) - alertContent = EventTypeEnum.getWarningContent(appId.toString()) - - if ( - direction == WarningDirectionEnum.ALERT_WARNING_LEFT || - direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT || - direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT - ) { //左后 - changeVisualAngle = true - ttsContent = String.format(ttsContent, "左") - alertContent = String.format(alertContent, "左") - } else if ( - direction == WarningDirectionEnum.ALERT_WARNING_RIGHT || - direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT || - direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT - ) { //右后 - changeVisualAngle = true - ttsContent = String.format(ttsContent, "右") - alertContent = String.format(alertContent, "右") + EventTypeHelper.getBSW(appId, direction) { alert, tts, visualAngle -> + alertContent = alert + ttsContent = tts + changeVisualAngle = visualAngle } } @@ -856,34 +846,35 @@ class MogoPrivateObuManager private constructor() { ObuConstants.STATUS.ADD, ObuConstants.STATUS.UPDATE -> { CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" + "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", + "appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" ) if (level == 2 || level == 3) { //显示弹框,语音提示 - CallerHmiManager.showWarningV2X(appId.toString(), - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { + CallerHmiManager.showWarningV2X( + appId.toString(), + alertContent, + ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + object : IMoGoWarningStatusListener { - override fun onShow() { - super.onShow() - if (changeVisualAngle) { - CallerVisualAngleManager.changeVisualAngle(TooClose) - } + override fun onShow() { + super.onShow() + if (changeVisualAngle) { + CallerVisualAngleManager.changeVisualAngle(TooClose) } + } - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - if (changeVisualAngle) { - CallerVisualAngleManager.changeVisualAngle(Default()) - } + override fun onDismiss() { + // 关闭警告红边 + CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) + if (changeVisualAngle) { + CallerVisualAngleManager.changeVisualAngle(Default()) } - }, - true, - 5000L + } + }, + true, + 5000L ) //显示警告红边 CallerHmiManager.showWarning(direction) diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index ae8c70fe1e..a01193f381 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt @@ -59,6 +59,7 @@ import com.mogo.module.common.entity.* import com.mogo.module.common.entity.V2XMessageEntity.V2XTypeEnum import com.mogo.module.common.enums.EventTypeEnum import com.mogo.module.common.enums.EventTypeEnum.FOURS_BLOCK_UP +import com.mogo.module.common.enums.EventTypeHelper import com.mogo.service.statusmanager.IMogoStatusChangedListener import com.mogo.service.statusmanager.StatusDescriptor import com.mogo.service.statusmanager.StatusDescriptor.ACC_STATUS @@ -525,70 +526,78 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb var changeVisualAngle = false when (message.status) { 1 -> { - var tts = "" - var content = "" - var appId = 0 + var tempAppId = 0 + var tempTts = "" + var tempContent = "" when (message.typeId) { 1001 -> { // 弱势交通碰撞预警 - appId = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt() - tts = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.tts - content = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.content + EventTypeHelper.getVRU{ appId, tts, content -> + tempAppId = appId + tempTts = tts + tempContent = content + } } 1002 -> { // 弱势交通逆行预警 - appId = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt() - tts = "行人逆行预警" - content = "行人逆行预警" + EventTypeHelper.getVRURI { appId, tts, content -> + tempAppId = appId + tempTts = tts + tempContent = content + } } 1003 -> { // 交叉路口碰撞预警 changeVisualAngle = true - appId = EventTypeEnum.TYPE_USECASE_ID_ICW.poiType.toInt() - tts = EventTypeEnum.TYPE_USECASE_ID_ICW.tts - content = EventTypeEnum.TYPE_USECASE_ID_ICW.content + tempAppId = EventTypeEnum.TYPE_USECASE_ID_ICW.poiType.toInt() + tempTts = EventTypeEnum.TYPE_USECASE_ID_ICW.tts + tempContent = EventTypeEnum.TYPE_USECASE_ID_ICW.content } 1004 -> { // 交叉路口碰撞预警 changeVisualAngle = true - appId = EventTypeEnum.TYPE_USECASE_ID_BSW.poiType.toInt() - tts = String.format( + tempAppId = EventTypeEnum.TYPE_USECASE_ID_BSW.poiType.toInt() + tempTts = String.format( EventTypeEnum.TYPE_USECASE_ID_BSW.tts, getWarningDirection() ) - content = EventTypeEnum.TYPE_USECASE_ID_BSW.content + tempContent = EventTypeEnum.TYPE_USECASE_ID_BSW.content } 1006 -> { // 逆向超车预警 - appId = EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType.toInt() - tts = EventTypeEnum.TYPE_USECASE_ID_DNPW.tts - content = EventTypeEnum.TYPE_USECASE_ID_DNPW.content + tempAppId = EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType.toInt() + tempTts = EventTypeEnum.TYPE_USECASE_ID_DNPW.tts + tempContent = EventTypeEnum.TYPE_USECASE_ID_DNPW.content } 1005 -> { // 闯红灯预警 - appId = EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt() - tts = EventTypeEnum.TYPE_USECASE_ID_IVP.tts - content = EventTypeEnum.TYPE_USECASE_ID_IVP.content + tempAppId = EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt() + tempTts = EventTypeEnum.TYPE_USECASE_ID_IVP.tts + tempContent = EventTypeEnum.TYPE_USECASE_ID_IVP.content } 2001 -> { // 最优车道 - appId = EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.poiType.toInt() - tts = EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.tts - content = EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.content + EventTypeHelper.getOptLine{ appId, tts, content -> + tempAppId = appId + tempTts = tts + tempContent = content + } } 3001 -> { // 前方道路拥堵预警 - appId = FOURS_BLOCK_UP.poiType.toInt() - tts = FOURS_BLOCK_UP.tts - content = FOURS_BLOCK_UP.content + EventTypeHelper.getTJW{ appId, tts, content -> + tempAppId = appId + tempTts = tts + tempContent = content + } } } // 显示弹框,语音提示 CallerHmiManager.showWarningV2X( - appId.toString(), - content, - tts, - "$appId", + tempAppId.toString(), + tempContent, + tempTts, + "$tempAppId", object : IMoGoWarningStatusListener { val change = changeVisualAngle override fun onShow() { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt index 36f6ec63a2..8767fb5a51 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt @@ -10,21 +10,21 @@ class FuncBizConfig { // V2N const val BIZ_VIP = "BIZ_VIP" // vip变灯 - const val BIZ_OPT_LINE = "BIZ_OPT_LINE" // 最优车道 todo - const val BIZ_VRU = "BIZ_VRU" // 弱势交通 todo - const val BIZ_VRU_RI = "BIZ_VRU_RI" // 弱势交通逆行 todo + const val BIZ_OPT_LINE = "BIZ_OPT_LINE" // 最优车道 todo @Biz + const val BIZ_VRU = "BIZ_VRU" // 弱势交通 todo @Biz + const val BIZ_VRU_RI = "BIZ_VRU_RI" // 弱势交通逆行 todo @Biz const val BIZ_HLW = "BIZ_HLW" // 道路提示 todo // V2I const val BIZ_IVP_GREEN = "BIZ_IVP_GREEN" // 绿波通行 const val BIZ_IVP = "BIZ_IVP" // 闯红灯预警 const val BIZ_RTS = "BIZ_RTS" // 查看视频流 - const val BIZ_SLW = "BIZ_SLW" // 限速提醒 todo - const val BIZ_IVS = "BIZ_IVS" // 车内标识 todo - const val BIZ_TJW = "BIZ_TJW" // 道路拥堵 todo + const val BIZ_SLW = "BIZ_SLW" // 限速提醒 todo @Biz + const val BIZ_IVS = "BIZ_IVS" // 车内标识 todo 暂未实现 + const val BIZ_TJW = "BIZ_TJW" // 道路拥堵 todo @Biz // V2V - const val BIZ_AVW = "BIZ_AVW" // 异常车辆提醒 - const val BIZ_LCW = "BIZ_LCW" // 变道碰撞预警 - const val BIZ_BSW = "BIZ_BSW" // 盲区碰撞预警 + const val BIZ_AVW = "BIZ_AVW" // 异常车辆提醒 todo @Biz + const val BIZ_LCW = "BIZ_LCW" // 变道碰撞预警 todo @Biz + const val BIZ_BSW = "BIZ_BSW" // 盲区碰撞预警 todo @Biz const val BIZ_EBW = "BIZ_EBW" // 前车急刹预警 const val BIZ_FCW = "BIZ_FCW" // 前向碰撞预警 const val BIZ_LTA = "BIZ_LTA" // 左转辅助预警 diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt index 9422202082..303ce3ff7d 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt @@ -9,37 +9,122 @@ class EventTypeHelper { companion object { fun getLCW( + appId: Int, direction: WarningDirectionEnum, data: ((alert: String, tts: String) -> Unit) ) { when { direction.isLeft() -> { data.invoke( - EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "左"), - EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "左") + EventTypeEnum.getWarningContent(appId.toString() + "左"), + EventTypeEnum.getWarningTts(appId.toString() + "左") ) } direction.isRight() -> { data.invoke( - EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "右"), - EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType + "右") + EventTypeEnum.getWarningContent(appId.toString() + "右"), + EventTypeEnum.getWarningTts(appId.toString() + "右") ) } else -> { data.invoke( - EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType), - EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_LCW.poiType) + EventTypeEnum.getWarningContent(appId.toString()), + EventTypeEnum.getWarningTts(appId.toString()) ) } } } fun getCLW( + appId: Int, direction: WarningDirectionEnum, data: ((alert: String, tts: String) -> Unit) - ){ - data.invoke(EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_CLW.poiType + direction.desc) - ,EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_CLW.poiType + direction.desc)) + ) { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString() + direction.desc), + EventTypeEnum.getWarningContent(appId.toString() + direction.desc) + ) + } + + fun getLTA(appId: Int, data: ((alert: String, tts: String) -> Unit)) { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString()), + EventTypeEnum.getWarningTts(appId.toString()) + ) + } + + fun getAVW( + appId: Int, + direction: WarningDirectionEnum, + data: ((alert: String, tts: String) -> Unit) + ) { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString() + direction.desc), + EventTypeEnum.getWarningTts(appId.toString() + direction.desc) + ) + } + + fun getBSW( + appId: Int, + direction: WarningDirectionEnum, + data: ((alert: String, tts: String, visualAngle: Boolean) -> Unit) + ) { + when { + direction.isLeft() -> { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString() + "左"), + EventTypeEnum.getWarningTts(appId.toString() + "左"), + true + ) + } + direction.isRight() -> { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString() + "右"), + EventTypeEnum.getWarningTts(appId.toString() + "右"), + true + ) + } + else -> { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString()), + EventTypeEnum.getWarningTts(appId.toString()), + false + ) + } + } + } + + fun getVRU(data: ((appId: Int, tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt(), + EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.tts, + EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.content + ) + } + + fun getVRURI(data: ((appId: Int, tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt(), + "行人逆行预警", + "行人逆行预警" + ) + } + + fun getOptLine(data: ((appId: Int, tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.poiType.toInt(), + EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.tts, + EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.content + ) + } + + fun getTJW(data: ((appId: Int, tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.FOURS_BLOCK_UP.poiType.toInt(), + EventTypeEnum.FOURS_BLOCK_UP.tts, + EventTypeEnum.FOURS_BLOCK_UP.content + ) } } + } \ No newline at end of file From 19e252334aa27e3d227c6775c89b7399f14ace10 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Wed, 14 Sep 2022 19:44:20 +0800 Subject: [PATCH 014/226] add func of func biz config --- .../hmi/ui/setting/DebugSettingView.kt | 28 ++++++++- .../obu/mogo/MogoPrivateObuManager.kt | 22 +++++++ core/mogo-core-data/build.gradle | 1 - .../core/data/deva/bizconfig/FuncBizConfig.kt | 33 +++++------ .../IMoGoDevaToolsFuncConfigListener.kt | 4 +- ...allerDevaToolsFuncConfigListenerManager.kt | 2 +- .../function/call/hmi/CallerHmiManager.kt | 53 ++++++++++++----- .../module/common/enums/EventTypeHelper.kt | 59 +++++++++++++++++++ 8 files changed, 165 insertions(+), 37 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 8777d24345..1872f9613f 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 @@ -27,6 +27,8 @@ import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.* import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.enums.TrafficTypeEnum @@ -36,10 +38,12 @@ import com.mogo.eagle.core.data.obu.ObuStatusInfo import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.data.upgrade.UpgradeVersionEntity import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener import com.mogo.eagle.core.function.api.obu.IMoGoObuStatusListener import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager @@ -94,7 +98,7 @@ class DebugSettingView @JvmOverloads constructor( IMoGoAutopilotStatusListener, IMoGoAutopilotCarStateListener, IMoGoMapLocationListener, IMoGoAutopilotIdentifyListener, IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener, - IMoGoAutopilotVehicleStateListener { + IMoGoAutopilotVehicleStateListener, IMoGoDevaToolsFuncConfigListener { private val TAG = "DebugSettingView" @@ -189,6 +193,11 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotCarConfigListenerManager.addListener(TAG, this) //添加 车辆底盘数据回调 监听 CallerAutopilotVehicleStateListenerManager.addListener(TAG, this) + + //添加 业务配置监听 + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(BIZ_BEAUTY_MODE,TAG,this) + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(BIZ_RAIN_MODE,TAG,this) + if (logInfoView != null) { logInfoView!!.onEnterForeground() } @@ -216,9 +225,12 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotPlanningListenerManager.removeListener(TAG) // 移除 工控机基础信息回调 监听 CallerAutopilotCarConfigListenerManager.removeListener(TAG) - //移除 车辆底盘数据回调 监听 + // 移除 车辆底盘数据回调 监听 CallerAutopilotVehicleStateListenerManager.removeListener(TAG) + // 移除 业务配置监听 + CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(this) + if (logInfoView != null) { logInfoView!!.onEnterBackground() } @@ -1880,6 +1892,17 @@ class DebugSettingView @JvmOverloads constructor( } } + override fun updateBizData(type: String,state: Boolean, lock: Boolean, data: String?) { + when(type){ + BIZ_BEAUTY_MODE -> { + + } + BIZ_RAIN_MODE -> { + + } + } + } + override fun onAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) { mGnssInfo = gnssInfo //实时加速度列表 @@ -2135,4 +2158,5 @@ class DebugSettingView @JvmOverloads constructor( fun showReportListWindow(show: Boolean) } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt index 4bd7552eaf..08e3bebcb4 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt @@ -774,6 +774,7 @@ class MogoPrivateObuManager private constructor() { } + //todo 二期优化此处内容,注解参数 /** * 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示 * @@ -833,6 +834,27 @@ class MogoPrivateObuManager private constructor() { changeVisualAngle = visualAngle } } + //前车急刹预警 + EventTypeEnum.TYPE_USECASE_ID_EBW.poiType -> { + EventTypeHelper.getEBW(appId){ alert ,tts -> + alertContent = alert + ttsContent = tts + } + } + //前向碰撞预警 + EventTypeEnum.TYPE_USECASE_ID_FCW.poiType -> { + EventTypeHelper.getFCW(appId){ alert ,tts -> + alertContent = alert + ttsContent = tts + } + } + //逆向超车预警 + EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType -> { + EventTypeHelper.getDNPW(appId){ alert ,tts -> + alertContent = alert + ttsContent = tts + } + } // 这里处理固定的提示信息,包括了<紧急车辆提醒> else -> { diff --git a/core/mogo-core-data/build.gradle b/core/mogo-core-data/build.gradle index d401bf83d2..8405737a50 100644 --- a/core/mogo-core-data/build.gradle +++ b/core/mogo-core-data/build.gradle @@ -65,7 +65,6 @@ dependencies { implementation rootProject.ext.dependencies.mogo_core_res } else { implementation project(':core:mogo-core-res') - implementation project(':core:mogo-core-data') api project(":libraries:mogo-adas-data") } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt index 8767fb5a51..05d5f8a61c 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt @@ -10,21 +10,21 @@ class FuncBizConfig { // V2N const val BIZ_VIP = "BIZ_VIP" // vip变灯 - const val BIZ_OPT_LINE = "BIZ_OPT_LINE" // 最优车道 todo @Biz - const val BIZ_VRU = "BIZ_VRU" // 弱势交通 todo @Biz - const val BIZ_VRU_RI = "BIZ_VRU_RI" // 弱势交通逆行 todo @Biz - const val BIZ_HLW = "BIZ_HLW" // 道路提示 todo + const val BIZ_OPT_LINE = "BIZ_OPT_LINE" // 最优车道 + const val BIZ_VRU = "BIZ_VRU" // 弱势交通 + const val BIZ_VRU_RI = "BIZ_VRU_RI" // 弱势交通逆行 + const val BIZ_HLW = "BIZ_HLW" // 道路提示 todo 需求不明确是施工还是所有 // V2I const val BIZ_IVP_GREEN = "BIZ_IVP_GREEN" // 绿波通行 const val BIZ_IVP = "BIZ_IVP" // 闯红灯预警 const val BIZ_RTS = "BIZ_RTS" // 查看视频流 - const val BIZ_SLW = "BIZ_SLW" // 限速提醒 todo @Biz + const val BIZ_SLW = "BIZ_SLW" // 限速提醒 const val BIZ_IVS = "BIZ_IVS" // 车内标识 todo 暂未实现 - const val BIZ_TJW = "BIZ_TJW" // 道路拥堵 todo @Biz + const val BIZ_TJW = "BIZ_TJW" // 道路拥堵 todo 需求来源 是从云还是从OBU过来 // V2V - const val BIZ_AVW = "BIZ_AVW" // 异常车辆提醒 todo @Biz - const val BIZ_LCW = "BIZ_LCW" // 变道碰撞预警 todo @Biz - const val BIZ_BSW = "BIZ_BSW" // 盲区碰撞预警 todo @Biz + const val BIZ_AVW = "BIZ_AVW" // 异常车辆提醒 + const val BIZ_LCW = "BIZ_LCW" // 变道碰撞预警 + const val BIZ_BSW = "BIZ_BSW" // 盲区碰撞预警 const val BIZ_EBW = "BIZ_EBW" // 前车急刹预警 const val BIZ_FCW = "BIZ_FCW" // 前向碰撞预警 const val BIZ_LTA = "BIZ_LTA" // 左转辅助预警 @@ -33,14 +33,13 @@ class FuncBizConfig { // Foundation const val BIZ_BEAUTY_MODE = "BIZ_BEAUTY_MODE" // 美化模式 const val BIZ_RAIN_MODE = "BIZ_RAIN_MODE" // 雨天模式 - const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 - const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 - const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 - const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 - const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 - const val BIZ_BYPASS = "BIZ_BYPASS" // 绕障 - const val BIZ_AUTOPILOT_LANE_SELECTION = "BIZ_AUTOPILOT_LANE_SELECTION" // 择机变道 - + const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 todo + const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo + const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 todo + const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 todo + const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 todo + const val BIZ_BYPASS = "BIZ_BYPASS" // 绕障 todo 暂未实现 + const val BIZ_AUTOPILOT_LANE_SELECTION = "BIZ_AUTOPILOT_LANE_SELECTION" // 择机变道 todo 暂未实现 } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt index f600e1b437..099964a0af 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsFuncConfigListener.kt @@ -8,7 +8,9 @@ interface IMoGoDevaToolsFuncConfigListener { /** * 更新业务数据,注意⚠️:需要由业务方判断具体type,业务聚合 * type : biz类型 (FuncBizConfig) + * state: 开启状态 + * lock : 锁定状态 * data : json */ - fun updateBizData(type: String, data: String?) + fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt index 56915703c9..7c5de4c3f3 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt @@ -61,7 +61,7 @@ object CallerDevaToolsFuncConfigListenerManager { if (key.contains(biz)) { list.forEach { subBiz -> val listener = it.value - listener.updateBizData(subBiz.type, subBiz.data) + listener.updateBizData(subBiz.type, subBiz.state, subBiz.lock, subBiz.data) } } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 2bd70f548c..2f8411528c 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -4,6 +4,8 @@ import android.view.View import com.alibaba.android.arouter.launcher.ARouter import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.constants.MoGoFragmentPaths +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_SLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.map.Infrastructure import com.mogo.eagle.core.data.notice.NoticeNormalData @@ -12,11 +14,11 @@ import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy.IViewNotificationProvider import com.mogo.eagle.core.function.api.hmi.view.IOchBusView import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity -import com.mogo.eagle.core.function.api.hmi.view.IViewNotification import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.base.CallerBase +import com.zhjt.service_biz.BizConfig /** * @author xiaoyuzhou @@ -75,7 +77,7 @@ object CallerHmiManager : CallerBase() { /** * 控制刹车功能 */ - fun setBrakeLightFunction (isOpen: Boolean) { + fun setBrakeLightFunction(isOpen: Boolean) { waringProviderApi?.setBrakeLightFunction(isOpen) } @@ -89,7 +91,7 @@ object CallerHmiManager : CallerBase() { /** * 开关DebugView */ - fun toggleDebugView(){ + fun toggleDebugView() { waringProviderApi?.toggleDebugView() } @@ -101,8 +103,24 @@ object CallerHmiManager : CallerBase() { * @param ttsContent tts语音播报消息 * @param tag tag绑定弹窗的标志 */ - fun showWarningV2X(v2xType: String, alertContent: CharSequence?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long = 5000L) { - waringProviderApi?.showWarningV2X(v2xType, alertContent, ttsContent, tag, listenerIMoGo, playTts, expireTime) + fun showWarningV2X( + v2xType: String, + alertContent: CharSequence?, + ttsContent: String?, + tag: String?, + listenerIMoGo: IMoGoWarningStatusListener?, + playTts: Boolean, + expireTime: Long = 5000L + ) { + waringProviderApi?.showWarningV2X( + v2xType, + alertContent, + ttsContent, + tag, + listenerIMoGo, + playTts, + expireTime + ) } /** @@ -119,8 +137,8 @@ object CallerHmiManager : CallerBase() { * @param checkLightId 0-都是默认,1-红,2-黄,3-绿 * @param lightSource 1:云端下发;2:自车感知 */ - fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) { - waringProviderApi?.showWarningTrafficLight(checkLightId,lightSource) + fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) { + waringProviderApi?.showWarningTrafficLight(checkLightId, lightSource) } /** @@ -140,7 +158,7 @@ object CallerHmiManager : CallerBase() { /** * 关闭红绿灯倒计时 */ - fun disableWarningTrafficLightCountDown(){ + fun disableWarningTrafficLightCountDown() { waringProviderApi?.disableWarningTrafficLightCountDown() } @@ -179,6 +197,7 @@ object CallerHmiManager : CallerBase() { * * @param limitingSpeed 限速速度 */ + @BizConfig(V2I, "", BIZ_SLW) fun showLimitingVelocity(limitingSpeed: Int) { waringProviderApi?.showLimitingVelocity(limitingSpeed) } @@ -280,14 +299,14 @@ object CallerHmiManager : CallerBase() { /** * 呈现工控机升级确认框 */ - fun showAdUpgradeDialog(images: List,padSn: String,releaseId: String){ + fun showAdUpgradeDialog(images: List, padSn: String, releaseId: String) { waringProviderApi?.showAdUpgradeDialog(images, padSn, releaseId) } /** * 更新工控机下载、升级状态 */ - fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo){ + fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) { waringProviderApi?.showAdUpgradeStatus(ipcUpgradeStateInfo) } @@ -323,7 +342,7 @@ object CallerHmiManager : CallerBase() { *注册工控机升级提示圆点View的回调 * @param 提示圆点View */ - fun registerUpgradeTipsCallback(tipsView:() -> View){ + fun registerUpgradeTipsCallback(tipsView: () -> View) { waringProviderApi?.registerUpgradeTipsCallback(tipsView) } @@ -332,7 +351,7 @@ object CallerHmiManager : CallerBase() { * @param code * @param msg */ - fun showDockerRebootResult(code: Int,msg: String){ + fun showDockerRebootResult(code: Int, msg: String) { waringProviderApi?.showDockerRebootResult(code, msg) } @@ -366,8 +385,12 @@ object CallerHmiManager : CallerBase() { * @param warningReportList 提醒级别上报数据列表 * @param reportLevel 1:error级别 2:warning级别 */ - fun showIPCReportWindow(errorReportList: ArrayList,warningReportList: ArrayList,reportLevel: Int){ - waringProviderApi?.showIPCReportWindow(errorReportList,warningReportList,reportLevel) + fun showIPCReportWindow( + errorReportList: ArrayList, + warningReportList: ArrayList, + reportLevel: Int + ) { + waringProviderApi?.showIPCReportWindow(errorReportList, warningReportList, reportLevel) } fun showVideoDialog(infList: List) { @@ -378,7 +401,7 @@ object CallerHmiManager : CallerBase() { * bus出车/收车状态设置 * true : 显示收车; false:显示出车 */ - fun changeBusOperationStatus(isOut:Boolean){ + fun changeBusOperationStatus(isOut: Boolean) { waringProviderApi?.changeBusOperationStatus(isOut) } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt index 303ce3ff7d..59d0db1c9f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeHelper.kt @@ -1,13 +1,29 @@ package com.mogo.module.common.enums +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AVW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BSW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_CLW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_DNPW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_EBW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FCW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LCW +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LTA +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_OPT_LINE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU_RI +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2V import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.enums.isLeft import com.mogo.eagle.core.data.enums.isRight +import com.zhjt.service_biz.BizConfig class EventTypeHelper { companion object { + //变道预警 + @BizConfig(V2V, "", BIZ_LCW) fun getLCW( appId: Int, direction: WarningDirectionEnum, @@ -35,6 +51,8 @@ class EventTypeHelper { } } + //车辆失控预警 + @BizConfig(V2V, "", BIZ_CLW) fun getCLW( appId: Int, direction: WarningDirectionEnum, @@ -46,6 +64,8 @@ class EventTypeHelper { ) } + //左转辅助 + @BizConfig(V2V, "", BIZ_LTA) fun getLTA(appId: Int, data: ((alert: String, tts: String) -> Unit)) { data.invoke( EventTypeEnum.getWarningContent(appId.toString()), @@ -53,6 +73,8 @@ class EventTypeHelper { ) } + //异常车辆提醒 + @BizConfig(V2V, "", BIZ_AVW) fun getAVW( appId: Int, direction: WarningDirectionEnum, @@ -64,6 +86,8 @@ class EventTypeHelper { ) } + //盲区预警 + @BizConfig(V2V, "", BIZ_BSW) fun getBSW( appId: Int, direction: WarningDirectionEnum, @@ -94,6 +118,8 @@ class EventTypeHelper { } } + //弱势交通碰撞预警 + @BizConfig(V2N, "", BIZ_VRU) fun getVRU(data: ((appId: Int, tts: String, content: String) -> Unit)) { data.invoke( EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt(), @@ -102,6 +128,8 @@ class EventTypeHelper { ) } + //弱势交通逆行预警 + @BizConfig(V2N, "", BIZ_VRU_RI) fun getVRURI(data: ((appId: Int, tts: String, content: String) -> Unit)) { data.invoke( EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt(), @@ -110,6 +138,8 @@ class EventTypeHelper { ) } + //最优车道 + @BizConfig(V2N, "", BIZ_OPT_LINE) fun getOptLine(data: ((appId: Int, tts: String, content: String) -> Unit)) { data.invoke( EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.poiType.toInt(), @@ -118,6 +148,7 @@ class EventTypeHelper { ) } + //前方道路拥堵预警 fun getTJW(data: ((appId: Int, tts: String, content: String) -> Unit)) { data.invoke( EventTypeEnum.FOURS_BLOCK_UP.poiType.toInt(), @@ -125,6 +156,34 @@ class EventTypeHelper { EventTypeEnum.FOURS_BLOCK_UP.content ) } + + //前车急刹 + @BizConfig(V2V, "", BIZ_EBW) + fun getEBW(appId: Int, data: ((tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString()), + EventTypeEnum.getWarningTts(appId.toString()) + ) + } + + //前向碰撞预警 + @BizConfig(V2V, "", BIZ_FCW) + fun getFCW(appId: Int, data: ((tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString()), + EventTypeEnum.getWarningTts(appId.toString()) + ) + } + + //逆向超车预警 + @BizConfig(V2V, "", BIZ_DNPW) + fun getDNPW(appId: Int, data: ((tts: String, content: String) -> Unit)) { + data.invoke( + EventTypeEnum.getWarningContent(appId.toString()), + EventTypeEnum.getWarningTts(appId.toString()) + ) + } + } } \ No newline at end of file From 60354ae73e3e342b37128b0edbe3f57509e61e42 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 15 Sep 2022 15:31:02 +0800 Subject: [PATCH 015/226] wait test --- .../funcconfig/FuncConfigCenter.kt | 7 ++++++- .../funcconfig/FuncConfigConst.kt | 5 +++-- .../funcconfig/network/FuncConfigApiService.kt | 2 +- .../funcconfig/network/FuncConfigHost.kt | 4 ++-- .../funcconfig/network/FuncConfigNetWorkModel.kt | 11 +++++++---- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index 537098d1c0..615505cd9d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -8,6 +8,8 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_C import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD_SHOW import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.SPUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.FUNC_CONFIG_TYPE import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.defaultFuncConfig @@ -34,9 +36,12 @@ class FuncConfigCenter : IMogoOnMessageListener { .registerOnMessageListener(FUNC_CONFIG_TYPE, this) UiThreadHandler.postDelayed({ funcConfigNetWorkModel.requestFuncConfig({ + SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) refreshConfig(it) }, { - refreshConfig(defaultFuncConfig()) + val bizJson = SPUtils.getInstance("biz_config") + .getString("config", GsonUtils.toJson(defaultFuncConfig())) + refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java)) }) }, 2000L) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt index 9737fed782..ce91130545 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -88,10 +88,11 @@ class FuncConfigConst { foundationSubList.add(SubBiz(BIZ_AUTOPILOT_LANE_SELECTION, lock = false, state = true, dependNode = "", data = "")) businessList.add(Business(FOUNDATION,foundationSubList)) - return FuncConfig(0, AppUtils.getAppVersionCode(), getChannel(), AppUtils.getAppVersionCode(), businessList) + return FuncConfig(0, AppUtils.getAppVersionCode(), getChannelCode(), AppUtils.getAppVersionCode(), businessList) } - private fun getChannel(): Int{ + // todo 新增车型需要更新(清扫车) + fun getChannelCode(): Int{ return when{ AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 1 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt index 84fa0cb69c..2ef42eb569 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigApiService.kt @@ -10,7 +10,7 @@ interface FuncConfigApiService { //FuncConfig @Headers("Content-Type:application/json;charset=UTF-8") - @POST("/test") + @POST("eagleEye-mis/config/abilityInfo") suspend fun funcConfig(@Body map: MutableMap): BaseResponse } \ 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/FuncConfigHost.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigHost.kt index fde2a2a3d1..1d8648ec24 100644 --- 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 @@ -5,8 +5,8 @@ import com.mogo.commons.debug.DebugConfig class FuncConfigHost { companion object{ - private const val HOST_DEV = "http://dzt-test.zhidaozhixing.com/" - private const val HOST_RELEASE = "http://dzt.zhidaozhixing.com/" + 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()) { 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 e34bd791f4..39206a151d 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,11 +1,13 @@ package com.zhjt.mogo_core_function_devatools.funcconfig.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.BaseResponse -import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.request +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.DeviceUtils +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst import com.zhjt.service_biz.FuncConfig class FuncConfigNetWorkModel { @@ -22,8 +24,8 @@ class FuncConfigNetWorkModel { loader { val map = mutableMapOf() map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["env"] = DebugConfig.getNetMode() - map["appVersionCode"] = AppConfigInfo.appVersionCode + map["mac"] = DeviceUtils.getMacAddress() + map["channelVersion"] = FuncConfigConst.getChannelCode() getNetWorkApi().funcConfig(map) } onSuccess { @@ -49,4 +51,5 @@ class FuncConfigNetWorkModel { } } + } \ No newline at end of file From e17a31a0a2dfbc8ee7c24df53e42e0523420caa8 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 15 Sep 2022 19:58:27 +0800 Subject: [PATCH 016/226] fic bug of appconfiginfo --- .../autopilot/MoGoAutopilotProvider.kt | 1 - .../autopilot/adapter/MoGoAdasListenerImpl.kt | 5 ++ .../core/function/hmi/ui/MoGoHmiFragment.kt | 55 ++++++++++++++-- .../hmi/ui/setting/DebugSettingView.kt | 64 +------------------ .../hmi/ui/tools/AutoPilotAndCheckView.kt | 3 - 5 files changed, 57 insertions(+), 71 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index ec53f2ee68..5260ae11df 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -570,7 +570,6 @@ class MoGoAutopilotProvider : override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { // 乘客屏才监听 - AppConfigInfo.plateNumber = carConfigResp.plateNumber CallerBindingcarManager.getBindingcarProvider() .getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn) invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为:${carConfigResp.macAddress}") 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 27bcb9b9e5..9174f7da53 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 @@ -207,6 +207,8 @@ class MoGoAdasListenerImpl : OnAdasListener { autopilotStatusInfo.dockVersion = it.dockVersion AppConfigInfo.dockerVersion = it.dockVersion } + AppConfigInfo.isConnectAutopilot = autopilotStatusInfo.connectStatus + AppConfigInfo.connectStatusDescribe = autopilotStatusInfo.connectStatusDescribe invokeAutoPilotStatus() } } @@ -307,6 +309,9 @@ class MoGoAdasListenerImpl : OnAdasListener { carConfigResp: MessagePad.CarConfigResp? ) { if (HdMapBuildConfig.isMapLoaded && carConfigResp != null) { + AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 + AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 + AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 invokeAutopilotCarConfigData(carConfigResp) } } 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 266a44f367..eeb63da694 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 @@ -20,9 +20,13 @@ import androidx.core.view.* import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.cloud.passport.MoGoAiCloudClient +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.mvp.BaseFragment import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.voice.* +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.camera.CameraEntity @@ -49,6 +53,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewNotification import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +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.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager @@ -57,6 +62,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.WaringConst import com.mogo.eagle.core.function.hmi.notification.WarningFloat @@ -84,11 +90,9 @@ import com.mogo.eagle.core.utilcode.reminder.* import com.mogo.eagle.core.utilcode.reminder.api.* import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IStateChangeListener import com.mogo.eagle.core.utilcode.reminder.api.impl.* -import com.mogo.eagle.core.utilcode.util.SoundUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String -import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.map.MogoMap import com.mogo.module.common.enums.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.service_biz.BizConfig @@ -202,7 +206,50 @@ import java.util.* true } + // init appConfigInfo + AppConfigInfo.appName = AppUtils.getAppName() + if (AppConfigInfo.appVersionCode == 0) { + AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode() + } + if (AppConfigInfo.appVersionName.isNullOrEmpty()) { + AppConfigInfo.appVersionName = AppUtils.getAppVersionName() + } + if (AppConfigInfo.appPackageName.isNullOrEmpty()) { + AppConfigInfo.appPackageName = AppUtils.getAppPackageName() + } + if (AppConfigInfo.uniqueDeviceId.isNullOrEmpty()) { + AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp()) + } + if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) { + AppConfigInfo.widevineIDMd5 = + DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) + } + if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) { + AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn + AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token + } + AppConfigInfo.netMode = DebugConfig.getNetMode() + if (MogoMap.getInstance().mogoMap != null) { + AppConfigInfo.mapSdkVersion = MogoMap.getInstance().mogoMap.mapVersion + } + AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context) + AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot() + + when { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端 + AppConfigInfo.isDriver = true + AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted() + } + AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> { + AppConfigInfo.isDriver = false + AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus() + AppConfigInfo.serverSn = CallerTelematicManager.getServerToken() + } + else -> { + } + } + AppConfigInfo.teleTimeStamp = CallerAutoPilotManager.getTeleTimeStamp() } @OptIn(ExperimentalCoroutinesApi::class) 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 1872f9613f..c76a2008e8 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 @@ -97,7 +97,7 @@ class DebugSettingView @JvmOverloads constructor( ) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoObuStatusListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarStateListener, IMoGoMapLocationListener, IMoGoAutopilotIdentifyListener, - IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener, + IMoGoAutopilotPlanningListener, IMoGoAutopilotVehicleStateListener, IMoGoDevaToolsFuncConfigListener { private val TAG = "DebugSettingView" @@ -189,8 +189,6 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotIdentifyListenerManager.addListener(TAG, this) // 添加 规划路径相关回调 监听 CallerAutopilotPlanningListenerManager.addListener(TAG, this) - // 添加 工控机基础信息回调 监听 - CallerAutopilotCarConfigListenerManager.addListener(TAG, this) //添加 车辆底盘数据回调 监听 CallerAutopilotVehicleStateListenerManager.addListener(TAG, this) @@ -223,8 +221,6 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotIdentifyListenerManager.removeListener(TAG) // 移除 规划路径相关回调 监听 CallerAutopilotPlanningListenerManager.removeListener(TAG) - // 移除 工控机基础信息回调 监听 - CallerAutopilotCarConfigListenerManager.removeListener(TAG) // 移除 车辆底盘数据回调 监听 CallerAutopilotVehicleStateListenerManager.removeListener(TAG) @@ -1598,50 +1594,6 @@ class DebugSettingView @JvmOverloads constructor( */ @SuppressLint("SetTextI18n") private fun drawAppInfo() { - AppConfigInfo.appName = AppUtils.getAppName() - if (AppConfigInfo.appVersionCode == 0) { - AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode() - } - if (AppConfigInfo.appVersionName.isNullOrEmpty()) { - AppConfigInfo.appVersionName = AppUtils.getAppVersionName() - } - if (AppConfigInfo.appPackageName.isNullOrEmpty()) { - AppConfigInfo.appPackageName = AppUtils.getAppPackageName() - } - if (AppConfigInfo.uniqueDeviceId.isNullOrEmpty()) { - AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp()) - } - if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) { - AppConfigInfo.widevineIDMd5 = - DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) - } - if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) { - AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn - AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token - } - - AppConfigInfo.netMode = DebugConfig.getNetMode() - if (MogoMap.getInstance().mogoMap != null) { - AppConfigInfo.mapSdkVersion = MogoMap.getInstance().mogoMap.mapVersion - } - AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context) - AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot() - - when { - AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端 - AppConfigInfo.isDriver = true - AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted() - } - AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> { - AppConfigInfo.isDriver = false - AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus() - AppConfigInfo.serverSn = CallerTelematicManager.getServerToken() - } - else -> { - } - } - AppConfigInfo.teleTimeStamp = CallerAutoPilotManager.getTeleTimeStamp() - /** * 设备绑定关系 */ @@ -1837,8 +1789,6 @@ class DebugSettingView @JvmOverloads constructor( */ override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { mAutoPilotStatusInfo = autoPilotStatusInfo - AppConfigInfo.isConnectAutopilot = autoPilotStatusInfo.connectStatus - AppConfigInfo.connectStatusDescribe = autoPilotStatusInfo.connectStatusDescribe setAutopilotConnectStatus() } @@ -1968,18 +1918,6 @@ class DebugSettingView @JvmOverloads constructor( mRouteInfoSize = globalPathResp?.wayPointsList?.size ?: 0 } - /** - * 工控机基础信息回调 - */ - override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { - carConfigResp.let { - AppConfigInfo.plateNumber = it.plateNumber//车牌号 - AppConfigInfo.iPCMacAddress = it.macAddress//工控机MAC地址 - AppConfigInfo.protocolVersionNumber = it.protocolVersionValue//工控机协议版本 - } - - } - /** * 工控机异常回调 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 2dc8c466e2..141becc292 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -229,9 +229,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor( speedLimit = carConfigResp.speedLimit tvAcceleration.text = "加速度 ${carConfigResp.maxAcceleration} m/s²" etInputSpeed.setText((carConfigResp.speedLimit * 3.6).toInt().toString()) - AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 - AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 - AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本 } } } From 74c7bc3fe2776ea0f016cb72ea5206bc2175b3ac Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 15 Sep 2022 21:20:57 +0800 Subject: [PATCH 017/226] .. --- .../funcconfig/FuncConfigCenter.kt | 6 ++-- .../network/FuncConfigNetWorkModel.kt | 34 ++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index 615505cd9d..45df9bcc4f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -1,6 +1,7 @@ package com.zhjt.mogo_core_function_devatools.funcconfig import android.content.Context +import android.util.Log import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.commons.AbsMogoApplication @@ -36,6 +37,7 @@ class FuncConfigCenter : IMogoOnMessageListener { .registerOnMessageListener(FUNC_CONFIG_TYPE, this) UiThreadHandler.postDelayed({ funcConfigNetWorkModel.requestFuncConfig({ + Log.i("emArrow-0915","config : $it") SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) refreshConfig(it) }, { @@ -43,7 +45,7 @@ class FuncConfigCenter : IMogoOnMessageListener { .getString("config", GsonUtils.toJson(defaultFuncConfig())) refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java)) }) - }, 2000L) + }, 1000L * 30) } @@ -53,7 +55,7 @@ class FuncConfigCenter : IMogoOnMessageListener { override fun onMsgReceived(obj: FuncConfig?) { obj?.let { - refreshConfig(it) +// refreshConfig(it) } } 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 39206a151d..01263b49ab 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,14 +1,20 @@ package com.zhjt.mogo_core_function_devatools.funcconfig.network +import android.util.Log import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.request import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.DeviceUtils +import com.mogo.module.common.constants.HostConst import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst import com.zhjt.service_biz.FuncConfig +import io.reactivex.Observable +import io.reactivex.schedulers.Schedulers class FuncConfigNetWorkModel { @@ -18,9 +24,19 @@ class FuncConfigNetWorkModel { } private var retryTime = 0 + private var success: ((FuncConfig) -> Unit)? = null + private var error: ((String) -> Unit)? = null - fun requestFuncConfig(onSuccess: ((FuncConfig) -> Unit), onError: ((String) -> Unit)) { + fun requestFuncConfig(onSuccess: ((FuncConfig) -> Unit)? = null, onError: ((String) -> Unit)? = null) { request> { + start { + if(success == null){ + success = onSuccess + } + if(error == null){ + error = onError + } + } loader { val map = mutableMapOf() map["sn"] = MoGoAiCloudClientConfig.getInstance().sn @@ -30,23 +46,25 @@ class FuncConfigNetWorkModel { } onSuccess { if (it.result != null) { - onSuccess.invoke(it.result) + success?.invoke(it.result) } else { - if (retryTime <= 3) { + if (retryTime < 3) { retryTime += 1 - requestFuncConfig(onSuccess, onError) + requestFuncConfig() } else { - onError.invoke("manualControl result is null") + error?.invoke("FuncConfig error msg is null") } } } onError { - if (retryTime <= 3) { + if (retryTime < 3) { retryTime += 1 - requestFuncConfig(onSuccess, onError) + requestFuncConfig() } else if (it.message != null) { - onError.invoke(it.message!!) + Log.i("emArrow-0915"," onError : $retryTime") + error?.invoke(it.message?:"FuncConfig error msg is null") } + } } From f26bd7aea5e285e83f169fb54ea726cd53c6f0f4 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 15 Sep 2022 22:16:41 +0800 Subject: [PATCH 018/226] fix bug of init twice --- .../DevaToolsProvider.kt | 9 ++++++--- .../funcconfig/FuncConfigCenter.kt | 4 +--- .../network/FuncConfigNetWorkModel.kt | 19 +++++++------------ .../function/main/MainMoGoApplication.java | 2 +- .../api/devatools/IDevaToolsProvider.kt | 5 +++++ .../call/devatools/CallerDevaToolsManager.kt | 4 ++-- 6 files changed, 22 insertions(+), 21 deletions(-) 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 72fb167642..595a145733 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 @@ -31,9 +31,12 @@ class DevaToolsProvider : IDevaToolsProvider { override fun init(context: Context) { mContext = context - bizConfigCenter.init(context) - traceManager.init(context) - MogoLogCatchManager.init(context) + } + + override fun initBiz() { + bizConfigCenter.init(mContext!!) + traceManager.init(mContext!!) + MogoLogCatchManager.init(mContext!!) } override fun startLogCatch() { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index 45df9bcc4f..f98df12c09 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -1,7 +1,6 @@ package com.zhjt.mogo_core_function_devatools.funcconfig import android.content.Context -import android.util.Log import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.commons.AbsMogoApplication @@ -37,7 +36,6 @@ class FuncConfigCenter : IMogoOnMessageListener { .registerOnMessageListener(FUNC_CONFIG_TYPE, this) UiThreadHandler.postDelayed({ funcConfigNetWorkModel.requestFuncConfig({ - Log.i("emArrow-0915","config : $it") SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) refreshConfig(it) }, { @@ -55,7 +53,7 @@ class FuncConfigCenter : IMogoOnMessageListener { override fun onMsgReceived(obj: FuncConfig?) { obj?.let { -// refreshConfig(it) + refreshConfig(it) } } 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 01263b49ab..2adfada34e 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 @@ -3,18 +3,11 @@ package com.zhjt.mogo_core_function_devatools.funcconfig.network import android.util.Log import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.BaseResponse -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.request -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.DeviceUtils -import com.mogo.module.common.constants.HostConst import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst import com.zhjt.service_biz.FuncConfig -import io.reactivex.Observable -import io.reactivex.schedulers.Schedulers class FuncConfigNetWorkModel { @@ -27,13 +20,16 @@ class FuncConfigNetWorkModel { private var success: ((FuncConfig) -> Unit)? = null private var error: ((String) -> Unit)? = null - fun requestFuncConfig(onSuccess: ((FuncConfig) -> Unit)? = null, onError: ((String) -> Unit)? = null) { + fun requestFuncConfig( + onSuccess: ((FuncConfig) -> Unit)? = null, + onError: ((String) -> Unit)? = null + ) { request> { start { - if(success == null){ + if (success == null) { success = onSuccess } - if(error == null){ + if (error == null) { error = onError } } @@ -61,8 +57,7 @@ class FuncConfigNetWorkModel { retryTime += 1 requestFuncConfig() } else if (it.message != null) { - Log.i("emArrow-0915"," onError : $retryTime") - error?.invoke(it.message?:"FuncConfig error msg is null") + error?.invoke(it.message ?: "FuncConfig error msg is null") } } 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 abe6e87ea1..530b2b9c3f 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 @@ -114,7 +114,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { } SocketBuildConfig.isPrintLog = false; // 初始化DevaTools,开始链路记录 - CallerDevaToolsManager.INSTANCE.init(this); + CallerDevaToolsManager.INSTANCE.init(); } private void initOverviewDb() { 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 4f4bd4b9da..872f4f8b9b 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 @@ -14,6 +14,11 @@ import record_cache.RecordPanelOuterClass */ interface IDevaToolsProvider : IProvider { + /** + * 初始化业务 + */ + fun initBiz() + /** * 开始抓取日志,默认10min */ 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 ddf0921a3d..8dfb23cd0f 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 @@ -21,8 +21,8 @@ object CallerDevaToolsManager { MogoServicePaths.PATH_DEVA_TOOLS ) - fun init(context: Context) { - devaToolsProviderApi?.init(context) + fun init() { + devaToolsProviderApi?.initBiz() } /** From 53e22c7f6656d03c9a3f317d2818e4d594221f64 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 16 Sep 2022 10:54:18 +0800 Subject: [PATCH 019/226] add test code --- .../funcconfig/network/FuncConfigNetWorkModel.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 2adfada34e..e3918ec71d 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 @@ -35,9 +35,12 @@ class FuncConfigNetWorkModel { } loader { val map = mutableMapOf() - map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["mac"] = DeviceUtils.getMacAddress() - map["channelVersion"] = FuncConfigConst.getChannelCode() +// map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["sn"] = "X20202203105S688HZ" +// map["mac"] = DeviceUtils.getMacAddress() + map["mac"] = "48:b0:2d:3a:bc:78" +// map["channelVersion"] = FuncConfigConst.getChannelCode() + map["channelVersion"] = 1 getNetWorkApi().funcConfig(map) } onSuccess { From b3b7286a3a1fc0a479ff3f086ad46cae509e0eae Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 16 Sep 2022 18:16:06 +0800 Subject: [PATCH 020/226] add func biz --- .../DevaToolsProvider.kt | 2 + .../funcconfig/FuncConfigCenter.kt | 9 ++- .../funcconfig/FuncConfigConst.kt | 20 +++++-- .../funcconfig/FuncConfigImpl.kt | 30 ++++++++++ .../hmi/ui/setting/DebugSettingView.kt | 59 ++++++++++++------- .../core/data/deva/bizconfig/FuncBizConfig.kt | 2 +- ...allerDevaToolsFuncConfigListenerManager.kt | 8 +++ gradle.properties | 4 +- 8 files changed, 103 insertions(+), 31 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.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 595a145733..4229be3ef9 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 @@ -12,6 +12,7 @@ import com.mogo.eagle.core.data.deva.scene.SceneTAG 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 +import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager @@ -35,6 +36,7 @@ class DevaToolsProvider : IDevaToolsProvider { override fun initBiz() { bizConfigCenter.init(mContext!!) + FuncConfigImpl.init() traceManager.init(mContext!!) MogoLogCatchManager.init(mContext!!) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index f98df12c09..2f8e8fdc5f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -36,8 +36,13 @@ class FuncConfigCenter : IMogoOnMessageListener { .registerOnMessageListener(FUNC_CONFIG_TYPE, this) UiThreadHandler.postDelayed({ funcConfigNetWorkModel.requestFuncConfig({ - SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) - refreshConfig(it) +// SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) +// refreshConfig(it) + + //todo test + val bizJson = SPUtils.getInstance("biz_config") + .getString("config", GsonUtils.toJson(defaultFuncConfig())) + refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java)) }, { val bizJson = SPUtils.getInstance("biz_config") .getString("config", GsonUtils.toJson(defaultFuncConfig())) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt index ce91130545..b071595ab0 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -35,6 +35,8 @@ import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2V import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.AppUtils +import com.zhjt.mogo_core_function_devatools.BuildConfig +import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.service_biz.Business import com.zhjt.service_biz.FuncConfig import com.zhjt.service_biz.SubBiz @@ -77,18 +79,26 @@ class FuncConfigConst { businessList.add(Business(V2V,v2vSubList)) val foundationSubList = mutableListOf() - foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = false, state = false, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = true, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = true, state = false, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = false, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_TRACE_LOG, lock = false, state = true, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = false, state = true, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = true, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = true, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_LIMIT_SPEED_SET, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_BYPASS, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_AUTOPILOT_LANE_SELECTION, lock = false, state = true, dependNode = "", data = "")) businessList.add(Business(FOUNDATION,foundationSubList)) - return FuncConfig(0, AppUtils.getAppVersionCode(), getChannelCode(), AppUtils.getAppVersionCode(), businessList) + return FuncConfig(0, AppUtils.getAppVersionCode(), getChannelCode(), getEnv(), businessList) + } + + private fun getEnv():Int{ + return if(EnvChangeManager.getEnvConfig()!= null){ + EnvChangeManager.getEnvConfig()!!.netMode + }else { + 0 + } } // todo 新增车型需要更新(清扫车) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt new file mode 100644 index 0000000000..6f3d0524bd --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt @@ -0,0 +1,30 @@ +package com.zhjt.mogo_core_function_devatools.funcconfig + +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager + +object FuncConfigImpl : IMoGoDevaToolsFuncConfigListener { + + private const val TAG = "FuncConfigImpl" + + fun init() { + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( + FOUNDATION, + TAG, + this + ) + } + + override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) { + when (type) { + BIZ_BEAUTY_MODE -> FunctionBuildConfig.isDemoMode = state + BIZ_RAIN_MODE -> FunctionBuildConfig.isRainMode = state + BIZ_WARNING_UPLOAD -> FunctionBuildConfig.isReportWarning = state + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index c76a2008e8..69c8390db5 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 @@ -27,8 +27,11 @@ import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.* import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.enums.TrafficTypeEnum @@ -193,8 +196,11 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotVehicleStateListenerManager.addListener(TAG, this) //添加 业务配置监听 - CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(BIZ_BEAUTY_MODE,TAG,this) - CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(BIZ_RAIN_MODE,TAG,this) + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( + FuncBizConfig.FOUNDATION, + TAG, + this + ) if (logInfoView != null) { logInfoView!!.onEnterForeground() @@ -569,7 +575,7 @@ class DebugSettingView @JvmOverloads constructor( // 演示模式 tbIsDemoMode.setOnCheckedChangeListener { _, isChecked -> CallerAutoPilotManager.setDemoMode(isChecked) - if(!isChecked){ + if (!isChecked) { //关闭美化模式时,通知工控机 CallerAutoPilotManager.setIPCDemoMode(isChecked) } @@ -582,7 +588,7 @@ class DebugSettingView @JvmOverloads constructor( } //只在司机端设置美化模式开关功能 - if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tbIsDemoMode.visibility = View.GONE } @@ -818,20 +824,21 @@ class DebugSettingView @JvmOverloads constructor( } //状态中心-后台优化状态 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val backgroundStatus = "后台运行:" + if (BackgrounderPermission.getInstance() .isPermissionLongBackgroundRunning(context) ) "已优化" else "未优化" tvBackgroundOperation.text = Html.fromHtml(backgroundStatus, Html.FROM_HTML_MODE_LEGACY) tvBackgroundOperation.setOnClickListener { - BackgrounderPermission.getInstance().showPermissionLongBackgroundRunningDialog(context) + BackgrounderPermission.getInstance() + .showPermissionLongBackgroundRunningDialog(context) } BackgrounderPermission.getInstance().setListener { val str = "后台运行:" + if (it) "已优化" else "未优化" tvBackgroundOperation.text = Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) } - }else { + } else { tvBackgroundOperation.visibility = GONE } //设置工控机连接状态 @@ -841,7 +848,8 @@ class DebugSettingView @JvmOverloads constructor( /** * 设置鹰眼本地参数配置监听 */ - @SuppressLint("SetTextI18n") private fun setEagleEyeConfigListener() { + @SuppressLint("SetTextI18n") + private fun setEagleEyeConfigListener() { //初始化刹车加速度阈值信息 val brakeThreshold = SharedPrefsMgr.getInstance(context) .getFloat(MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, -2.5F) @@ -893,7 +901,7 @@ class DebugSettingView @JvmOverloads constructor( FunctionBuildConfig.isReportWarning = isChecked } //异常上报开关只在司机端展示 - if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){ + if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tbReportWarning.visibility = GONE } @@ -904,7 +912,7 @@ class DebugSettingView @JvmOverloads constructor( p.menuInflater.inflate(R.menu.menu_env_pop, p.menu) MenuCompat.setGroupDividerEnabled(p.menu, true) p.setOnMenuItemClickListener { item -> - when(item.itemId) { + when (item.itemId) { R.id.group_hy -> { return@setOnMenuItemClickListener false } @@ -1112,7 +1120,10 @@ class DebugSettingView @JvmOverloads constructor( accelerationIsShow = isChecked } - tbRouteDynamicEffect.isChecked = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + tbRouteDynamicEffect.isChecked = + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus( + FunctionBuildConfig.appIdentityMode + ) tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { @@ -1795,8 +1806,8 @@ class DebugSettingView @JvmOverloads constructor( /** * 设置工控机连接状态 */ - private fun setAutopilotConnectStatus(){ - ThreadUtils.runOnUiThread{ + private fun setAutopilotConnectStatus() { + ThreadUtils.runOnUiThread { tvAutopilotConnectStatus.text = Html.fromHtml( "工控机连接状态:${ if (AppConfigInfo.isConnectAutopilot) { @@ -1842,13 +1853,18 @@ class DebugSettingView @JvmOverloads constructor( } } - override fun updateBizData(type: String,state: Boolean, lock: Boolean, data: String?) { - when(type){ - BIZ_BEAUTY_MODE -> { - - } - BIZ_RAIN_MODE -> { - + override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) { + when (type) { + BIZ_BEAUTY_MODE -> tbIsDemoMode.isClickable = !lock + BIZ_RAIN_MODE -> tbIsRainMode.isClickable = !lock + BIZ_WARNING_UPLOAD -> tbReportWarning.isClickable = !lock + BIZ_BAG_RECORD -> { + if(lock){ + btnRecordBag.isClickable = false + }else{ + btnRecordBag.isClickable = true + btnRecordBag.requestFocus() + } } } } @@ -2038,7 +2054,8 @@ class DebugSettingView @JvmOverloads constructor( private fun toastMsg(msg: String) { //当司机屏处于美化(演示)模式、msg为空时不弹吐司 if (!FunctionBuildConfig.isDemoMode && msg.isNotEmpty() - && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) + ) { ToastUtils.showLong(msg) } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt index 05d5f8a61c..13a79e48b7 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt @@ -35,7 +35,7 @@ class FuncBizConfig { const val BIZ_RAIN_MODE = "BIZ_RAIN_MODE" // 雨天模式 const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 todo const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo - const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 todo + const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 todo const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 todo const val BIZ_BYPASS = "BIZ_BYPASS" // 绕障 todo 暂未实现 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt index 7c5de4c3f3..d847a8f288 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.devatools +import android.util.Log import androidx.annotation.Nullable import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener import com.zhjt.service_biz.SubBiz @@ -10,6 +11,8 @@ object CallerDevaToolsFuncConfigListenerManager { private val M_DEVA_TOOLS_FUNC_CONFIG_LISTENER: ConcurrentHashMap = ConcurrentHashMap() + private val cacheMap = mutableMapOf>() + /** * 添加监听 * @param tag 标记,用来注销监听使用 @@ -24,6 +27,10 @@ object CallerDevaToolsFuncConfigListenerManager { return } M_DEVA_TOOLS_FUNC_CONFIG_LISTENER["$biz'_'$tag"] = listener + + cacheMap[biz]?.let { + invokeDevaToolsFuncConfigBizUpdate(biz,it) + } } /** @@ -56,6 +63,7 @@ object CallerDevaToolsFuncConfigListenerManager { * 由订阅方判断Type类型,聚合一些 */ fun invokeDevaToolsFuncConfigBizUpdate(biz: String, list: MutableList) { + cacheMap[biz] = list M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.forEach { val key = it.key if (key.contains(biz)) { diff --git a/gradle.properties b/gradle.properties index ab9b6e8ea8..e160b93985 100644 --- a/gradle.properties +++ b/gradle.properties @@ -59,8 +59,8 @@ bytex.ASM_API=ASM7 HOOK_LOG_VERSION=1.6.1 SERVICE_CHAIN_VERSION=1.1.0 -BIZCONFIG_VERSION=1.1.4 -SERVICE_BIZ_VERSION=1.1.12 +BIZCONFIG_VERSION=1.2.7 +SERVICE_BIZ_VERSION=1.2.0 ################ 外部依赖引用 ################ # loglib LOGLIB_VERSION=1.3.38 From e3e7ba505031baaa5a2da2a4df6f42dca52e8845 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 16 Sep 2022 18:16:40 +0800 Subject: [PATCH 021/226] note --- .../com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt index 13a79e48b7..d371af2c24 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt @@ -36,7 +36,7 @@ class FuncBizConfig { const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 todo const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 - const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 todo + const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 todo const val BIZ_BYPASS = "BIZ_BYPASS" // 绕障 todo 暂未实现 const val BIZ_AUTOPILOT_LANE_SELECTION = "BIZ_AUTOPILOT_LANE_SELECTION" // 择机变道 todo 暂未实现 From 53031036466b0bfedbc7f5f061c196a5b92c495e Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 19 Sep 2022 19:01:13 +0800 Subject: [PATCH 022/226] fix the logger add add func of vip check and take over --- .../com/mogo/och/bus/model/BusOrderModel.java | 2 +- .../com/mogo/och/taxi/model/TaxiModel.java | 9 +- .../badcase/record/RecordHelper.java | 21 +- .../funcconfig/FuncConfigCenter.kt | 11 +- .../network/FuncConfigNetWorkModel.kt | 12 +- .../scene/SceneManager.kt | 2 - .../status/StatusManager.kt | 5 +- .../status/flow/rtk/RTKImpl.kt | 9 +- .../status/ui/adapter/StatusAdapter.kt | 5 +- .../mogo-core-function-hmi/build.gradle | 1 + .../core/function/hmi/ui/MoGoHmiFragment.kt | 663 ++++++++++-------- .../function/map/MapPointCloudSubscriber.kt | 11 +- .../scene/road/V2XRoadEventScenario.java | 4 +- .../v2x/trafficlight/TrafficLightProvider.kt | 3 +- .../core/MogoTrafficLightManager.kt | 7 +- .../network/TrafficLightApiService.kt | 3 +- .../network/TrafficLightNetWorkModel.kt | 6 +- .../core/function/v2x/vip/VipCarManager.kt | 119 ++-- .../data/trafficlight/TrafficLightControl.kt | 6 + .../api/trafficlight/ITrafficLightProvider.kt | 3 +- .../CallerAutoPilotStatusListenerManager.kt | 4 - .../core/utilcode/mogo/logger/scene/Scene.kt | 2 - .../mogo/module/common/enums/EventTypeEnum.kt | 1 + 23 files changed, 482 insertions(+), 427 deletions(-) create mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/trafficlight/TrafficLightControl.kt 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 f8e5b3bd17..c076db620a 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 @@ -403,7 +403,7 @@ public class BusOrderModel { startLon, startLat, location.getLongitude(), location.getLatitude() ); - Logger.i(TAG, "judgeStartStation() distance = " + distance); + CallerLogger.INSTANCE.d(M_BUS + TAG,"judgeStartStation() distance = " + distance); if ( distance > BusConst.ARRIVE_AT_END_STATION_DISTANCE ) { distance = CoordinateUtils.calculateLineDistance(startLon, startLat, 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 06b77b0491..5431beaf87 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 @@ -28,7 +28,6 @@ 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.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; 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; @@ -1312,7 +1311,7 @@ public class TaxiModel { public void updateOrderRouteInfo(List models) { if (null == models || models.size() == 0) return; if (mCurrentOCHOrder == null) return; - Logger.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); //转换成高德坐标系 if (mRoutePoints.size() > 0){ @@ -1323,12 +1322,12 @@ public class TaxiModel { } public void startDynamicCalculateRouteInfo() { - Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder); if (mCurrentOCHOrder != null && mRoutePoints.size() == 0) {//根据orderNo去查询 queryOrderRouteList(mCurrentOCHOrder.orderNo); } - Logger.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size()); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size()); if (mRoutePoints.size() > 0){ reportTotalDisAndTime(); @@ -1368,7 +1367,7 @@ public class TaxiModel { } double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 - Logger.d(M_TAXI + "dynamicCalculateRouteInfo" + CallerLogger.INSTANCE.d(M_TAXI + "dynamicCalculateRouteInfo" , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime + " thread = "+ Thread.currentThread().getName()); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java index bea8b5f739..bcd74d8efe 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/RecordHelper.java @@ -6,7 +6,6 @@ import android.os.Environment; import android.util.Log; 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.FileUtils; import com.zhjt.mogo_core_function_devatools.badcase.record.fft.FftFactory; import com.zhjt.mogo_core_function_devatools.badcase.record.listener.RecordListener; @@ -177,14 +176,14 @@ public class RecordHelper { AudioRecordThread() { bufferSize = AudioRecord.getMinBufferSize(currentConfig.getSampleRate(), currentConfig.getChannelConfig(), currentConfig.getEncodingConfig()) * RECORD_AUDIO_BUFFER_TIMES; - Logger.d(TAG, "record buffer size = %s", bufferSize); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "record buffer size = %s", bufferSize); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, currentConfig.getSampleRate(), currentConfig.getChannelConfig(), currentConfig.getEncodingConfig(), bufferSize); if (currentConfig.getFormat() == RecordConfig.RecordFormat.MP3) { if (mp3EncodeThread == null) { initMp3EncoderThread(bufferSize); } else { - Logger.e(TAG, "mp3EncodeThread != null, 请检查代码"); + CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread != null, 请检查代码"); } } } @@ -206,7 +205,7 @@ public class RecordHelper { private void startPcmRecorder() { state = RecordState.RECORDING; notifyState(); - Logger.d(TAG, "开始录制 Pcm"); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "开始录制 Pcm"); FileOutputStream fos = null; try { fos = new FileOutputStream(tmpFile); @@ -224,7 +223,7 @@ public class RecordHelper { if (state == RecordState.STOP) { makeFile(); } else { - Logger.i(TAG, "暂停!"); + CallerLogger.INSTANCE.i("$M_DEVA$TAG", "暂停!"); } } catch (Exception e) { notifyError("录音失败"); @@ -240,7 +239,7 @@ public class RecordHelper { if (state != RecordState.PAUSE) { state = RecordState.IDLE; notifyState(); - Logger.d(TAG, "录音结束"); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "录音结束"); } } @@ -268,7 +267,7 @@ public class RecordHelper { notifyState(); stopMp3Encoded(); } else { - Logger.d(TAG, "暂停"); + CallerLogger.INSTANCE.d("$M_DEVA$TAG", "暂停"); } } } @@ -283,7 +282,7 @@ public class RecordHelper { } }); } else { - Logger.e(TAG, "mp3EncodeThread is null, 代码业务流程有误,请检查!! "); + CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread is null, 代码业务流程有误,请检查!! "); } } @@ -302,7 +301,7 @@ public class RecordHelper { break; } notifyFinish(); - Logger.i(TAG, "录音完成! path: %s ; 大小:%s", resultFile.getAbsoluteFile(), resultFile.length()); + CallerLogger.INSTANCE.i("$M_DEVA$TAG", "录音完成! path: %s ; 大小:%s", resultFile.getAbsoluteFile(), resultFile.length()); } /** @@ -377,7 +376,7 @@ public class RecordHelper { private String getFilePath(String fileName) { if (!FileUtils.createOrExistsDir(ROOT_PATH)) { - Logger.w(TAG, "文件夹创建失败:%s", ROOT_PATH); + CallerLogger.INSTANCE.w("$M_DEVA$TAG", "文件夹创建失败:%s", ROOT_PATH); return null; } @@ -388,7 +387,7 @@ public class RecordHelper { private String getTempFilePath() { if (!FileUtils.createOrExistsDir(TEMP_PATH)) { - Logger.e(TAG, "文件夹创建失败:%s", TEMP_PATH); + CallerLogger.INSTANCE.e("$M_DEVA$TAG", "文件夹创建失败:%s", TEMP_PATH); } String fileName = String.format(Locale.getDefault(), "tmp_%s", FileUtils.getNowString(new SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.SIMPLIFIED_CHINESE))); return String.format(Locale.getDefault(), "%s%s.pcm", TEMP_PATH, fileName); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index 2f8e8fdc5f..3b7572cea9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -36,19 +36,14 @@ class FuncConfigCenter : IMogoOnMessageListener { .registerOnMessageListener(FUNC_CONFIG_TYPE, this) UiThreadHandler.postDelayed({ funcConfigNetWorkModel.requestFuncConfig({ -// SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) -// refreshConfig(it) - - //todo test - val bizJson = SPUtils.getInstance("biz_config") - .getString("config", GsonUtils.toJson(defaultFuncConfig())) - refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java)) + SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it)) + refreshConfig(it) }, { val bizJson = SPUtils.getInstance("biz_config") .getString("config", GsonUtils.toJson(defaultFuncConfig())) refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java)) }) - }, 1000L * 30) + }, 1000L * 5) } 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 e3918ec71d..d80756e1f8 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 @@ -4,6 +4,7 @@ import android.util.Log import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.BaseResponse 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.utilcode.util.DeviceUtils import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst @@ -25,6 +26,7 @@ class FuncConfigNetWorkModel { onError: ((String) -> Unit)? = null ) { request> { + val map = mutableMapOf() start { if (success == null) { success = onSuccess @@ -32,16 +34,18 @@ class FuncConfigNetWorkModel { if (error == null) { error = onError } - } - loader { - val map = mutableMapOf() + //todo test // map["sn"] = MoGoAiCloudClientConfig.getInstance().sn map["sn"] = "X20202203105S688HZ" // map["mac"] = DeviceUtils.getMacAddress() map["mac"] = "48:b0:2d:3a:bc:78" // map["channelVersion"] = FuncConfigConst.getChannelCode() map["channelVersion"] = 1 - getNetWorkApi().funcConfig(map) + } + loader { + apiCall { + getNetWorkApi().funcConfig(map) + } } onSuccess { if (it.result != null) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt index 14f87bb3e6..329b2ff2ab 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt @@ -5,7 +5,6 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule import com.mogo.eagle.core.data.deva.scene.SceneModuleTAG import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.Scene.Companion.scene import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS @@ -71,7 +70,6 @@ class SceneManager { //默认未创建的,符合scene tag,首次初始化logger=true scene.addChangeListener { change -> - Logger.i("emArrow","scene change : $change") sceneModuleTAG.map.iterator().forEach { map -> val sceneModule = map.value sceneModule.name?.let { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index 42d8590c53..7ce7f46979 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus @@ -50,10 +51,10 @@ object StatusManager { override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) guardianInfo?.code?.takeIf { - Logger.d(TAG, "-- onAutopilotGuardian ---: code: $it") + CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian ---: code: $it") it.contains("RTK_STATUS", true) || it.contains("CAN", true) || it == "ILCT_RTK_OR_SLAM_CHANGE" }?.run { - Logger.d(TAG, "-- onAutopilotGuardian trigger req ---: code: $this") + CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian trigger req ---: code: $this") req() } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt index c5663854b5..69f1b8f199 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt @@ -4,7 +4,8 @@ import android.content.* import android.util.* import com.mogo.eagle.core.function.api.autopilot.* import com.mogo.eagle.core.function.call.autopilot.* -import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus import com.zhjt.mogo_core_function_devatools.status.flow.IFlow import kotlinx.coroutines.* @@ -31,7 +32,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu override fun onCreate() { send(RTKStatus(getDesc(), getCode())) - Logger.d(TAG, "-- onCreate --") + CallerLogger.d("$M_DEVA$TAG", "-- onCreate --") CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerAutopilotCarStatusListenerManager.addListener(TAG, this) if (CallerAutoPilotManager.isConnected()) { @@ -67,7 +68,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { super.onAutopilotIpcConnectStatusChanged(status, reason) if (!CallerAutoPilotManager.isConnected()) { - Logger.d(TAG, "工控机断开了....") + CallerLogger.d("$M_DEVA$TAG", "工控机断开了....") healthInfo.set(null) send(RTKStatus("", -1)) } @@ -114,7 +115,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu override fun onDestroy() { super.onDestroy() isOldVersion.set(false) - Logger.d(TAG, "-- onDestroy --") + CallerLogger.d("$M_DEVA$TAG", "-- onDestroy --") CallerAutoPilotStatusListenerManager.removeListener(TAG) CallerAutopilotCarStatusListenerManager.removeListener(TAG) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 7e9d4fded7..040e8a70c2 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -7,8 +7,8 @@ import androidx.core.content.* import androidx.recyclerview.widget.* import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.* -import com.zhjt.mogo_core_function_devatools.* import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.R.drawable import com.zhjt.mogo_core_function_devatools.status.entity.* @@ -16,7 +16,6 @@ import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.* import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter.StatusViewHolder -import kotlinx.coroutines.* internal class StatusAdapter(val ctx: Context, var data: ArrayList): RecyclerView.Adapter() { @@ -124,7 +123,7 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec is TracingStatus -> { val extra = status.state.extra val extraDesc = if (extra != null && extra.isNotEmpty()) extra.values.joinToString(",") else "" - Logger.d(TAG, "traceing_state: $status -> extra: $extraDesc :: extra: $extra") + CallerLogger.d("$M_DEVA$TAG", "traceing_state: $status -> extra: $extraDesc :: extra: $extra") when(status.state) { //"轨迹类型:${ if (status.state == TRACK_LOADED) "循迹" else if (status.state == ROUTE_LOADED) "自主算路" else "暂无轨迹" }" MAP_TRA_TYPE -> { diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 9f40e36205..ccccc40f85 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -139,6 +139,7 @@ dependencies { api project(':core:mogo-core-function-call') api project(':core:mogo-core-function-api') + api project(':libraries:mogo-adas') api project(':libraries:map-usbcamera') api project(':libraries:mogo-adas-other') } 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 eeb63da694..a69bb3b50e 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 @@ -33,7 +33,6 @@ import com.mogo.eagle.core.data.camera.CameraEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.constants.MoGoFragmentPaths -import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I import com.mogo.eagle.core.data.enums.SidePattern @@ -94,6 +93,10 @@ import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.mogo.map.MogoMap import com.mogo.module.common.enums.* +import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EAGENT.FATAL +import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EMAP.* +import com.zhidao.support.adas.high.common.MogoReport.Code.Error.ESYS.TOPIC_FREQ_DROPED +import com.zhidao.support.adas.high.common.MogoReport.Code.Error.ETELEMATICS.AICLOUD_AUTH_ERROR import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.service_biz.BizConfig import kotlinx.android.synthetic.main.fragment_hmi.* @@ -112,12 +115,12 @@ import java.util.* * 预警图层 */ @Route(path = MoGoFragmentPaths.PATH_FRAGMENT_HMI) - class MoGoHmiFragment : MvpFragment(), - IMoGoWaringProvider, - IMoGoHmiViewProxy, - MoGoHmiContract.View, - IMoGoAutopilotRecordListener, - IMoGoAutopilotStatusListener, IViewNotificationProvider { +class MoGoHmiFragment : MvpFragment(), + IMoGoWaringProvider, + IMoGoHmiViewProxy, + MoGoHmiContract.View, + IMoGoAutopilotRecordListener, + IMoGoAutopilotStatusListener, IViewNotificationProvider { private val TAG = "MoGoHmiFragment" // DebugSettingView @@ -153,11 +156,12 @@ import java.util.* //工控机节点上报列表 private var reportList = arrayListOf() - //工控机上报列表悬浮窗 - private var reportListFloatWindow: ReportListFloatWindow?=null - private var ipcReportWindow: IPCReportWindow?=null - private var adUpgradeDialog: AdUpgradeDialog?=null + //工控机上报列表悬浮窗 + private var reportListFloatWindow: ReportListFloatWindow? = null + private var ipcReportWindow: IPCReportWindow? = null + + private var adUpgradeDialog: AdUpgradeDialog? = null private var lastSpeakJob: Job? = null @@ -191,8 +195,8 @@ import java.util.* } /**ivCameraIcon?.setOnLongClickListener { - activity?.let { it1 -> CarcorderPreviewView.show(it1) } - true + activity?.let { it1 -> CarcorderPreviewView.show(it1) } + true }*/ ivToolsIcon?.setOnClickListener { @@ -272,45 +276,62 @@ import java.util.* } } - override fun getNotificationView(): IViewNotification? = context?.let { V2XNotificationView(it) } + override fun getNotificationView(): IViewNotification? = + context?.let { V2XNotificationView(it) } override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("$M_HMI$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}") - if(BadCaseConfig.recordKeyList.contains(recordPanel.key)){ - if(recordPanel.stat == 100 || recordPanel.stat == 101){ + if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) { + if (recordPanel.stat == 100 || recordPanel.stat == 101) { //成功结束录制 - TipToast.shortTip("${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())} bag录制成功") + TipToast.shortTip( + "${ + millis2String( + System.currentTimeMillis(), + TimeUtils.getHourMinSecondFormat() + ) + } bag录制成功" + ) } - if(recordPanel.stat == 200){ + if (recordPanel.stat == 200) { //录制失败 - TipToast.shortTip("${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())} bag录制失败") + TipToast.shortTip( + "${ + millis2String( + System.currentTimeMillis(), + TimeUtils.getHourMinSecondFormat() + ) + } bag录制失败" + ) } return } //在工控机taxi2.3.0版本和Bus2.4.0版本上不支持被动录包,不进行被动录包的弹窗 BadCaseConfig.dockerVersion?.let { - if(it.contains("taxi") && it.contains("2.3.0")){ + if (it.contains("taxi") && it.contains("2.3.0")) { return } - if(it.contains("bus") && it.contains("2.4.0")){ + if (it.contains("bus") && it.contains("2.4.0")) { return } } //处于非美化模式下弹窗;是地图数据采集任务时即type=2时,不弹窗 - if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type!=2) { + if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) { //只在司机屏生效,乘客屏不生效 - if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { activity?.let { CallerDevaToolsManager.onReceiveBadCaseRecord(recordPanel, it) } } } if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && ( - recordPanel.stat == 101 || //工控机采集完成-被动完成 - recordPanel.stat == 100 || //工控机采集完成-主动完成 - recordPanel.stat == 102 || //工控机达到最大采集时长 - recordPanel.stat == 103) //工控机磁盘满了 + recordPanel.stat == 101 || //工控机采集完成-被动完成 + recordPanel.stat == 100 || //工控机采集完成-主动完成 + recordPanel.stat == 102 || //工控机达到最大采集时长 + recordPanel.stat == 103) //工控机磁盘满了 ) { - CallerMapDataCollectorManager.finish(recordPanel.id, recordPanel.stat, "", recordPanel.filename - ?: "", recordPanel.note ?: "") + CallerMapDataCollectorManager.finish( + recordPanel.id, recordPanel.stat, "", recordPanel.filename + ?: "", recordPanel.note ?: "" + ) } } @@ -354,15 +375,19 @@ import java.util.* * @param warningReportList 提醒级别上报数据列表 * @param reportLevel 1:error级别 2:warning级别 */ - override fun showIPCReportWindow(errorReportList: ArrayList,warningReportList: ArrayList,reportLevel: Int) { - ThreadUtils.runOnUiThread{ - if(reportLevel == 1){ - if(ipcReportWindow==null){ - ipcReportWindow= activity?.let { IPCReportWindow(it) } - ipcReportWindow?.setClickListener(object: IPCReportWindow.ClickListener{ + override fun showIPCReportWindow( + errorReportList: ArrayList, + warningReportList: ArrayList, + reportLevel: Int + ) { + ThreadUtils.runOnUiThread { + if (reportLevel == 1) { + if (ipcReportWindow == null) { + ipcReportWindow = activity?.let { IPCReportWindow(it) } + ipcReportWindow?.setClickListener(object : IPCReportWindow.ClickListener { override fun closeWindow() { ipcReportWindow?.hideFloatWindow() - ipcReportWindow =null + ipcReportWindow = null } }) ipcReportWindow?.let { @@ -371,7 +396,7 @@ import java.util.* } ipcReportWindow?.showFloatWindow() } - ipcReportWindow?.refreshData(errorReportList,warningReportList,reportLevel) + ipcReportWindow?.refreshData(errorReportList, warningReportList, reportLevel) } } @@ -430,41 +455,41 @@ import java.util.* }) } toolsViewFloat = WarningFloat.with(it) - .setTag("ToolsViewFloat") - .setLayout(toolsView!!) - .setSidePattern(SidePattern.LEFT) - .setGravity(Gravity.LEFT) - .setImmersionStatusBar(true) - .setWindowHeight(LayoutParams.MATCH_PARENT) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag("ToolsViewFloat") + .setLayout(toolsView!!) + .setSidePattern(SidePattern.LEFT) + .setGravity(Gravity.LEFT) + .setImmersionStatusBar(true) + .setWindowHeight(LayoutParams.MATCH_PARENT) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onDismiss() { - toolsViewFloat = null - toolsView = null - // TODO:("") - } - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onDismiss() { + toolsViewFloat = null + toolsView = null + // TODO:("") + } + }) + .show() } else { toolsViewFloat?.show() } @@ -509,7 +534,7 @@ import java.util.* ivAiCollectTools.visibility = View.VISIBLE CallerDevaToolsManager.initBadCase(ivBadCaseTools) CallerDevaToolsManager.initAiCollect(ivAiCollectTools) - }else{ + } else { ivBadCaseTools.visibility = View.GONE ivAiCollectTools.visibility = View.GONE } @@ -586,20 +611,20 @@ import java.util.* mDebugSettingView = DebugSettingView(it) Log.i("DebugViewSwitchLog", "new DebugSettingView") mDebugSettingView?.reportInit(reportList) - mDebugSettingView?.setClickListener(object: DebugSettingView.ClickListener{ + mDebugSettingView?.setClickListener(object : DebugSettingView.ClickListener { override fun showReportListWindow(show: Boolean) { - if(show){ + if (show) { //打开工控机上报列表 reportListFloatWindow = ReportListFloatWindow(it) reportListFloatWindow?.showFloatWindow() reportListFloatWindow?.refreshData(reportList) - }else{ + } else { //关闭工控机上报列表 reportListFloatWindow?.hideFloatWindow() } } }) - if(mDebugSettingView!=null){ + if (mDebugSettingView != null) { Log.i("DebugViewSwitchLog", "new DebugSettingView success") } } @@ -607,38 +632,39 @@ import java.util.* var gravity = Gravity.RIGHT //调试窗默认靠右显示,Bus的乘客端右端有视图覆盖,调试窗靠左显示 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && - AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { + AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + ) { side = SidePattern.LEFT gravity = Gravity.LEFT } mDebugSettingViewFloat = WarningFloat.with(it) - .setTag("DebugSettingView") - .setLayout(mDebugSettingView!!) - .setSidePattern(side) - .setGravity(gravity, offsetY = 70) - .setImmersionStatusBar(true) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag("DebugSettingView") + .setLayout(mDebugSettingView!!) + .setSidePattern(side) + .setGravity(gravity, offsetY = 70) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() } } } @@ -653,15 +679,16 @@ import java.util.* */ @Synchronized override fun showWarningV2X( - v2xType: String, - alertContent: CharSequence?, - ttsContent: String?, - tag: String?, - listener: IMoGoWarningStatusListener?, - playTts: Boolean, - expireTime: Long + v2xType: String, + alertContent: CharSequence?, + ttsContent: String?, + tag: String?, + listener: IMoGoWarningStatusListener?, + playTts: Boolean, + expireTime: Long ) { - val playTTS = playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) + val playTTS = + playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) activity?.let { val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType) @@ -672,70 +699,87 @@ import java.util.* val content = mViewNotificationProvider?.getNotificationView() ?: return content.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType)) content.setWarningContent(warningContent) - Log.d("$M_HMI$TAG", "--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime") - Reminder.enqueue(this@MoGoHmiFragment, object : PopupWindowReminder(PopupWindow(content, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).also { itx -> - itx.isTouchable = false - itx.isFocusable = false - itx.isClippingEnabled = false - itx.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - val transition = Slide(when(content.sidePattern) { - LEFT, RESULT_LEFT-> Gravity.LEFT - RIGHT, RESULT_RIGHT -> Gravity.RIGHT - TOP, RESULT_TOP -> Gravity.TOP - BOTTOM, RESULT_BOTTOM -> Gravity.BOTTOM - else -> Gravity.TOP - }).also { t -> - t.interpolator = AccelerateDecelerateInterpolator() - t.duration = 200 - } - if (VERSION.SDK_INT >= VERSION_CODES.M) { - itx.enterTransition = transition - itx.exitTransition = transition - } - }) { - override fun show() { - val parent = it.window.decorView - parent.doOnAttach { - Log.d("$M_HMI$TAG", "--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime") - popupWindow.showAtLocation(parent, content.layoutGravity, 0, 0) - } - } - override fun isOverride(): Boolean { - return true - } - - override fun key(): String { - return v2xType - } - }, object : IStateChangeListener { - - override fun onShow(reminder: IReminder) { - listener?.onShow() - lastShowV2XJob?.safeCancel() - lastSpeakJob?.safeCancel() - showingV2XTip = reminder - lifecycleScope.launch { - delay(expireTime) - }.also { itx -> - lastShowV2XJob = itx - }.invokeOnCompletion { _ -> - reminder.hide() - } - if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) { - lifecycleScope.launch { - speak(it, ttsContent) - }.also { itx -> - lastSpeakJob = itx + Log.d( + "$M_HMI$TAG", + "--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime" + ) + Reminder.enqueue( + this@MoGoHmiFragment, + object : PopupWindowReminder( + PopupWindow( + content, + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT + ).also { itx -> + itx.isTouchable = false + itx.isFocusable = false + itx.isClippingEnabled = false + itx.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + val transition = Slide( + when (content.sidePattern) { + LEFT, RESULT_LEFT -> Gravity.LEFT + RIGHT, RESULT_RIGHT -> Gravity.RIGHT + TOP, RESULT_TOP -> Gravity.TOP + BOTTOM, RESULT_BOTTOM -> Gravity.BOTTOM + else -> Gravity.TOP + } + ).also { t -> + t.interpolator = AccelerateDecelerateInterpolator() + t.duration = 200 + } + if (VERSION.SDK_INT >= VERSION_CODES.M) { + itx.enterTransition = transition + itx.exitTransition = transition + } + }) { + override fun show() { + val parent = it.window.decorView + parent.doOnAttach { + Log.d( + "$M_HMI$TAG", + "--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime" + ) + popupWindow.showAtLocation(parent, content.layoutGravity, 0, 0) } } - } - override fun onHide(reminder: IReminder) { - listener?.onDismiss() - showingV2XTip = null - showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } - }) + override fun isOverride(): Boolean { + return true + } + + override fun key(): String { + return v2xType + } + }, + object : IStateChangeListener { + + override fun onShow(reminder: IReminder) { + listener?.onShow() + lastShowV2XJob?.safeCancel() + lastSpeakJob?.safeCancel() + showingV2XTip = reminder + lifecycleScope.launch { + delay(expireTime) + }.also { itx -> + lastShowV2XJob = itx + }.invokeOnCompletion { _ -> + reminder.hide() + } + if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) { + lifecycleScope.launch { + speak(it, ttsContent) + }.also { itx -> + lastSpeakJob = itx + } + } + } + + override fun onHide(reminder: IReminder) { + listener?.onDismiss() + showingV2XTip = null + showWarning(WarningDirectionEnum.ALERT_WARNING_NON) + } + }) } } @@ -782,8 +826,8 @@ import java.util.* * @param checkLightId 0-都是默认不亮起,1-红,2-黄,3-绿 * @param lightSource 1:云端下发;2:自车感知 */ - override fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) { - mViewTrafficLight?.showWarningTrafficLight(checkLightId,lightSource) + override fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) { + mViewTrafficLight?.showWarningTrafficLight(checkLightId, lightSource) } override fun isWarningTrafficLightShow(): Boolean { @@ -857,7 +901,7 @@ import java.util.* * @see WarningDirectionEnum */ override fun showWarning(direction: WarningDirectionEnum) { - Log.d(TAG,"showWarning====") + Log.d(TAG, "showWarning====") flV2XWarningView?.showWarning(direction) flicker(flV2XWarningView) } @@ -906,42 +950,42 @@ import java.util.* mNoticeFloat = it?.let { it1 -> noticeBannerView?.let { it2 -> WarningFloat.with(it1) - .setTag(WaringConst.NOTICE_FOR_TRAFFIC_KEY) - .setLayout(it2) - .setSidePattern(SidePattern.TOP) - .setCountDownTime(60 * 1000 * 3) - .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) - .setImmersionStatusBar(true) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onShow() { - // 创建弹窗成功才进行TTS播报 + .setTag(WaringConst.NOTICE_FOR_TRAFFIC_KEY) + .setLayout(it2) + .setSidePattern(SidePattern.TOP) + .setCountDownTime(60 * 1000 * 3) + .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) + .setImmersionStatusBar(true) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onShow() { + // 创建弹窗成功才进行TTS播报 // AIAssist.getInstance(activity) // .speakTTSVoice("") - } + } - }) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + }) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() } } } @@ -956,41 +1000,41 @@ import java.util.* mNoticeFloat = it.let { it1 -> noticeBannerView?.let { it2 -> WarningFloat.with(it1) - .setTag(WaringConst.NOTICE_FOR_NORMAL_KEY) - .setLayout(it2) - .setSidePattern(SidePattern.TOP) - .setCountDownTime(10000) - .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) - .setImmersionStatusBar(true) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onShow() { - // 创建弹窗成功才进行TTS播报 - // AIAssist.getInstance(activity) - // .speakTTSVoice("") - } - }) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag(WaringConst.NOTICE_FOR_NORMAL_KEY) + .setLayout(it2) + .setSidePattern(SidePattern.TOP) + .setCountDownTime(10000) + .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) + .setImmersionStatusBar(true) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onShow() { + // 创建弹窗成功才进行TTS播报 + // AIAssist.getInstance(activity) + // .speakTTSVoice("") + } + }) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() } } } @@ -1077,7 +1121,7 @@ import java.util.* dismissToolsFloatView() } - @BizConfig(V2I,"",BIZ_RTS) + @BizConfig(V2I, "", BIZ_RTS) override fun showVideoDialog(infList: List) { context?.let { if (roadVideoDialog == null) { @@ -1087,7 +1131,7 @@ import java.util.* } } - @BizConfig(V2I,"", BIZ_RTS) + @BizConfig(V2I, "", BIZ_RTS) private fun showCameraList(cameraList: List?) { context?.let { if (cameraViewFloat == null) { @@ -1116,40 +1160,40 @@ import java.util.* } }) cameraViewFloat = WarningFloat.with(it) - .setTag("CameraListFloat") - .setLayout(cameraListView!!) - .setSidePattern(SidePattern.RIGHT) - .setGravity(Gravity.RIGHT, -40, 255) - .setImmersionStatusBar(true) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern) - ?.apply { - interpolator = OvershootInterpolator() - } + .setTag("CameraListFloat") + .setLayout(cameraListView!!) + .setSidePattern(SidePattern.RIGHT) + .setGravity(Gravity.RIGHT, -40, 255) + .setImmersionStatusBar(true) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onDismiss() { - cameraViewFloat = null - cameraListView = null - ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor) - } - }) - .show() + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onDismiss() { + cameraViewFloat = null + cameraListView = null + ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor) + } + }) + .show() } else { cameraViewFloat?.show() } @@ -1180,9 +1224,9 @@ import java.util.* } } - private var isLeftLight :Boolean = false - private var isRightLight :Boolean = false - private var isDisappare :Boolean = false + private var isLeftLight: Boolean = false + private var isRightLight: Boolean = false + private var isDisappare: Boolean = false /** * 显示转向灯效果 if (HmiBuildConfig.isShowBadCaseView) { @@ -1287,13 +1331,14 @@ import java.util.* padSn: String, releaseId: String ) { - ThreadUtils.runOnUiThread{ - if(adUpgradeDialog == null){ - adUpgradeDialog = AdUpgradeDialog(requireContext(),images, padSn, releaseId) - adUpgradeDialog?.setClickListener(object: AdUpgradeDialog.ClickListener{ + ThreadUtils.runOnUiThread { + if (adUpgradeDialog == null) { + adUpgradeDialog = AdUpgradeDialog(requireContext(), images, padSn, releaseId) + adUpgradeDialog?.setClickListener(object : AdUpgradeDialog.ClickListener { override fun confirm() { //确认升级 - CallerBindingcarManager.getBindingcarProvider().upgradeConfirm(images, padSn, releaseId) + CallerBindingcarManager.getBindingcarProvider() + .upgradeConfirm(images, padSn, releaseId) AdUpgradeStateHelper.setConfirmUpgrade(true) ToastUtils.showLong("最新版本下载中...") adUpgradeDialog?.dismiss() @@ -1312,10 +1357,10 @@ import java.util.* } override fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) { - ThreadUtils.runOnUiThread{ + ThreadUtils.runOnUiThread { toolsView?.showAdUpgradeStatus(ipcUpgradeStateInfo) ipcUpgradeStateInfo.status.let { - if(AdUpgradeStateHelper.isUpgradeSuccess(it)){ + if (AdUpgradeStateHelper.isUpgradeSuccess(it)) { ToastUtils.showLong("升级成功") AdUpgradeStateHelper.setConfirmUpgrade(false) } @@ -1342,17 +1387,37 @@ import java.util.* */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { guardianInfo?.let { - if(reportList.size>49){ + if (reportList.size > 49) { reportList.removeLast() } - reportList.add(0, - ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()), - it.src,it.level,it.msg,it.code,it.resultList,it.actionsList)) + reportList.add( + 0, + ReportEntity( + TimeUtils.millis2String(System.currentTimeMillis()), + it.src, it.level, it.msg, it.code, it.resultList, it.actionsList + ) + ) } - reportListFloatWindow?.let { - ThreadUtils.runOnUiThread{ + ThreadUtils.runOnUiThread { + + reportListFloatWindow?.let { it.refreshData(reportList) } + + guardianInfo?.let { + when (it.code) { + NODE, NODE_DEAD, + EXIT_AUTOPILOT_FOR_PLANNING, + EXIT_AUTOPILOT_FOR_LOCATION, + EXIT_AUTOPILOT_FOR_CHASSIS, + EXIT_AUTOPILOT_FOR_DISTANCE, + AICLOUD_AUTH_ERROR, + TOPIC_FREQ_DROPED, + FATAL -> { + + } + } + } } } @@ -1362,12 +1427,16 @@ import java.util.* .navigation() as BaseFragment activity?.supportFragmentManager?.beginTransaction() ?.setCustomAnimations(R.anim.slide_in, R.anim.fade_out)?.apply { - if (!fragmentOverview.isAdded) { - add(R.id.module_main_id_smp_fragment, fragmentOverview, fragmentOverview.tagName) - } else { + if (!fragmentOverview.isAdded) { + add( + R.id.module_main_id_smp_fragment, + fragmentOverview, + fragmentOverview.tagName + ) + } else { show(fragmentOverview) - }.commitAllowingStateLoss() - } + }.commitAllowingStateLoss() + } CallerDevaToolsManager.hideStatusBar() } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapPointCloudSubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapPointCloudSubscriber.kt index 7617da5cc4..f49b4d1804 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapPointCloudSubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapPointCloudSubscriber.kt @@ -5,7 +5,8 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPointCloudListener import com.mogo.eagle.core.function.api.base.IMoGoSubscriber import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP import com.zhidaoauto.map.sdk.open.business.PointCloudHelper import java.math.BigDecimal @@ -44,7 +45,7 @@ class MapPointCloudSubscriber private constructor() try {// 根据配置动态控制点云是否绘制 if (FunctionBuildConfig.isDrawPointCloudData && isDrawCloudPointDockerVersion()) { if (!isDrawPointCloud) { - Logger.d(TAG, "====开启点云渲染====") + CallerLogger.d(M_MAP + TAG, "====开启点云渲染====") isDrawPointCloud = true PointCloudHelper.setIsDrawPointCloud(true)//打开点云绘制 } @@ -58,12 +59,12 @@ class MapPointCloudSubscriber private constructor() * @param isStrong 是否加粗显示 * @return 是否执行 */ - Logger.d(TAG, "====开始传入地图点云数据====") + CallerLogger.d(M_MAP + TAG, "====开始传入地图点云数据====") val result = PointCloudHelper.updatePointCloudDataByPb(pointCloud, true, false, false) - Logger.d(TAG, "====结束传入地图点云数据=====$result") + CallerLogger.d(M_MAP + TAG, "====结束传入地图点云数据=====$result") } else { if (isDrawPointCloud) { - Logger.d(TAG, "====停止点云绘制====") + CallerLogger.d(M_MAP + TAG, "====停止点云绘制====") isDrawPointCloud = false PointCloudHelper.setIsDrawPointCloud(false)//停止点云绘制 } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java index 3fd4d1dcaa..9b6d11fc98 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java @@ -12,7 +12,7 @@ import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager; import com.mogo.eagle.core.function.v2x.events.scenario.impl.AbsV2XScenario; import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker; import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.module.common.entity.MarkerExploreWay; import com.mogo.module.common.entity.V2XMessageEntity; import com.mogo.module.common.entity.V2XRoadEventEntity; @@ -41,7 +41,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void init(V2XMessageEntity v2XMessageEntity) { try { - Logger.d(M_V2X + TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity)); + CallerLogger.INSTANCE.d(M_V2X + TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity)); V2XRoadEventEntity v2XRoadEventEntity = v2XMessageEntity.getContent(); if (v2XRoadEventEntity != null) { if (v2XMessageEntity.isShowState()) { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightProvider.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightProvider.kt index 75e8dc18e8..69ca7b4ad7 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightProvider.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/TrafficLightProvider.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.v2x.trafficlight import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.data.trafficlight.TrafficLightControl import com.mogo.eagle.core.data.trafficlight.TrafficLightDetail import com.mogo.eagle.core.function.api.trafficlight.ITrafficLightProvider import com.mogo.eagle.core.function.v2x.trafficlight.TrafficLightConst.Companion.MODULE_NAME @@ -31,7 +32,7 @@ class TrafficLightProvider : ITrafficLightProvider { crossingNo: String, heading: Double, controlTime: Int, - onSuccess: (() -> Unit), + onSuccess: ((TrafficLightControl) -> Unit), onError: ((String) -> Unit) ) { return MogoTrafficLightManager.INSTANCE.turnLightToGreen( diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt index 9911a3b99c..96f39e2222 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt @@ -4,11 +4,8 @@ import android.content.Context import android.location.Location import android.os.Handler import android.os.Looper +import com.mogo.eagle.core.data.trafficlight.* import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X -import com.mogo.eagle.core.data.trafficlight.RoadIDResult -import com.mogo.eagle.core.data.trafficlight.TrafficLightDetail -import com.mogo.eagle.core.data.trafficlight.TrafficLightResult -import com.mogo.eagle.core.data.trafficlight.isInRange import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager @@ -159,7 +156,7 @@ class MogoTrafficLightManager : IMogoCarLocationChangedListener2 { crossingNo: String, heading: Double, controlTime: Int, - onSuccess: (() -> Unit), + onSuccess: ((TrafficLightControl) -> Unit), onError: ((String) -> Unit) ) { trafficLightNetWorkModel.turnLightToGreen( diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightApiService.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightApiService.kt index d498cfa27d..7670e34c35 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightApiService.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/network/TrafficLightApiService.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.v2x.trafficlight.network import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.data.trafficlight.RoadIDResult +import com.mogo.eagle.core.data.trafficlight.TrafficLightControl import com.mogo.eagle.core.data.trafficlight.TrafficLightResult import retrofit2.http.FieldMap import retrofit2.http.FormUrlEncoded @@ -22,6 +23,6 @@ interface TrafficLightApiService { //变灯 @FormUrlEncoded @POST("mec-etl-server/light/bdg/newTask") - suspend fun changeLight(@FieldMap turnLight: Map): BaseResponse + suspend fun changeLight(@FieldMap turnLight: Map): BaseResponse } \ No newline at end of file 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 04c61374d9..f9a30eeb9a 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 @@ -107,10 +107,10 @@ class TrafficLightNetWorkModel { crossingNo: String, heading: Double, controlTime: Int, - onSuccess: (() -> Unit), + onSuccess: ((TrafficLightControl) -> Unit), onError: ((String) -> Unit) ) { - request> { + request> { val map = hashMapOf() start { val trafficLightRequestData = @@ -124,7 +124,7 @@ class TrafficLightNetWorkModel { } } onSuccess { - onSuccess.invoke() + onSuccess.invoke(it.result) } onError { if (it.message != null) { 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 c08f0490ba..0b005c3e4f 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 @@ -1,16 +1,17 @@ package com.mogo.eagle.core.function.v2x.vip import android.content.Context -import android.location.Location import android.os.Handler import android.os.Looper import android.os.Message import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager -import com.mogo.cloud.commons.utils.CoordinateUtils +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.trafficlight.* +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.v2x.VipMessage import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener @@ -22,10 +23,10 @@ import com.mogo.eagle.core.function.v2x.trafficlight.core.MogoTrafficLightManage import com.mogo.eagle.core.function.v2x.vip.network.VipNetWorkModel 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.module.common.enums.EventTypeEnum import com.zhjt.service_biz.BizConfig -import kotlin.math.abs class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListener, Handler.Callback { @@ -42,7 +43,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } private var mContext: Context? = null - private var mLocation: Location? = null private var turnLightFirst = false private var turnLightEnd = true private var vip: Boolean = false @@ -51,7 +51,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe private var exit: Boolean = false private var result: TrafficLightResult? = null - private var lastResult: TrafficLightStatus? = null private val vipNetWorkModel = VipNetWorkModel() private val handler = Handler(Looper.getMainLooper(), this) @@ -101,9 +100,9 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { - if (!vip) { - return - } +// if (!vip) { +// return +// } if (exit) { CallerLogger.d("$M_V2X$TAG", "驶离路口,返回 , then resetConditions") @@ -115,14 +114,14 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe if (trafficLightResult.currentRoadTrafficLight() == null) { CallerLogger.d( "$M_V2X$TAG", - "vip 获取到灯态,但没找到对应车道数据 result : $trafficLightResult , then resetConditions" + "vip 获取到灯态,但没找到对应车道数据 trafficLightResult : $trafficLightResult , then resetConditions" ) resetConditions() return } val currentResult = trafficLightResult.currentRoadTrafficLight() - lastResult = result?.currentRoadTrafficLight() + val lastResult = result?.currentRoadTrafficLight() CallerLogger.d( "$M_V2X$TAG", "检查是否变灯 last.remain : ${lastResult?.remain} , color : ${lastResult?.color} , current.remain : ${currentResult?.remain} , color : ${currentResult?.color}, turnLightFirst : $turnLightFirst" @@ -130,32 +129,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe this.result = trafficLightResult - lastResult?.let { - //如果上次结果和本次灯态结果变化比较大,则已变灯,控制HMI展示弹窗 - if (abs(currentResult!!.remain - it.remain) > 5 && currentResult.isGreen()) { - CallerLogger.d("$M_V2X$TAG", "调用showWarningV2X to show") - CallerHmiManager.showWarningV2X( - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, - EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, - object : IMoGoWarningStatusListener { - override fun onShow() {} - override fun onDismiss() { - CallerLogger.d( - "$M_V2X$TAG", - "showWarningV2X vip dismiss , resetConditions" - ) - resetConditions() - } - }, - true, - 5000L - ) - } - } - - if (!turnLightFirst) { // 首次判断,变灯 turnLightFirst = true @@ -164,19 +137,12 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe turnLight(controlTime) } - //可作为补偿措施,暂不启用 -// mLocation?.let { -// if (canGetThroughCross(it, trafficLightResult)) { -// turnLight() -// } -// } } private fun resetConditions() { turnLightFirst = false turnLightEnd = true result = null - lastResult = null } private fun setVip(cancelDelayTime: Long) { @@ -196,32 +162,13 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe if (handler.hasMessages(MSG_WHAT_VIP_CANCEL)) { handler.removeMessages(MSG_WHAT_VIP_CANCEL) } + resetConditions() CallerHmiManager.vipIdentification(false) CallVipSetListenerManager.invokeVipSetStatus(false) CallerTrafficLightListenerManager.unRegisterTrafficLightListener(TAG) CallerTrafficLightListenerManager.unRegisterEnterCrossRoadListener(TAG) } - private fun canGetThroughCross( - it: Location, - trafficLightResult: TrafficLightResult - ): Boolean { - return if (CoordinateUtils.calculateLineDistance( - it.longitude, - it.latitude, - trafficLightResult.lon, - trafficLightResult.lat - ) < 20 - && turnLightEnd - && trafficLightResult.laneList.mid.turnRedAtOnce() - ) { - turnLightEnd = false - false - } else { - true - } - } - private fun requestVip() { vipNetWorkModel.requestVip({ if (handler.hasMessages(MSG_WHAT_VIP_SEARCH)) { @@ -249,20 +196,60 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe if (result == null || mContext == null) return val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) if (locationClient != null) { - var bearing = + val bearing = locationClient.lastKnowLocation.bearing.toDouble() CallerLogger.d("$M_V2X$TAG", "turnLight -- bearing : $bearing") MogoTrafficLightManager.INSTANCE.turnLightToGreen( result!!.lightId, result!!.crossId, bearing, controlTime, { - CallerLogger.d("$M_V2X$TAG", "变灯请求成功") + 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 + ) + } else { + val time = if (it.countDown / 60 > 1) { + "${it.countDown / 60}分${it.countDown % 60}秒后重试" + } else { + "${it.countDown}秒后重试" + } + 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 + ) + } }, { errorMsg -> CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") + ToastUtils.showLong("服务异常,请稍后重试") }) } } + private fun showWarning( + v2xType: String, + alertContent: CharSequence, + ttsContent: String, + tag: String + ) { + CallerHmiManager.showWarningV2X( + v2xType, alertContent, ttsContent, tag, + object : IMoGoWarningStatusListener { + override fun onShow() {} + override fun onDismiss() { + resetConditions() + } + }, + true, + 5000L + ) + } + fun destroy() { MogoAiCloudSocketManager.getInstance(mContext) .unregisterLifecycleListener(401025) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/trafficlight/TrafficLightControl.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/trafficlight/TrafficLightControl.kt new file mode 100644 index 0000000000..e20e91289b --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/trafficlight/TrafficLightControl.kt @@ -0,0 +1,6 @@ +package com.mogo.eagle.core.data.trafficlight + +/** + * 控灯实体 + */ +data class TrafficLightControl(val sn:String,val data:String,val next:String,val countDown:Int,val code:Int) \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/trafficlight/ITrafficLightProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/trafficlight/ITrafficLightProvider.kt index eb5bf57ad3..11539e4b31 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/trafficlight/ITrafficLightProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/trafficlight/ITrafficLightProvider.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.api.trafficlight import android.content.Context +import com.mogo.eagle.core.data.trafficlight.TrafficLightControl import com.mogo.eagle.core.data.trafficlight.TrafficLightDetail import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider @@ -21,7 +22,7 @@ interface ITrafficLightProvider : IMoGoFunctionServerProvider { crossingNo: String, heading: Double, controlTime:Int, - onSuccess: (() -> Unit), + onSuccess: ((TrafficLightControl) -> Unit), onError: ((String) -> Unit) ) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index 0c915a5f31..4d462086d5 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -1,12 +1,9 @@ package com.mogo.eagle.core.function.call.autopilot -import android.util.* import androidx.annotation.Nullable import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.base.CallerBase -import com.mogo.eagle.core.utilcode.kotlin.* -import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.util.GsonUtils import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg @@ -180,7 +177,6 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { val listener = it.value autoPilotMessageCode = guardianInfo?.code ?: "" autoPilotMessageContent = guardianInfo?.msg ?: "" - Logger.d("XXXXX", "code: ${guardianInfo?.code}, msg: ${guardianInfo?.msg}") listener.onAutopilotGuardian(guardianInfo) } } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt index 6ed65bac39..70ed1e0534 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt @@ -1,7 +1,6 @@ package com.mogo.eagle.core.utilcode.mogo.logger.scene import android.util.ArrayMap -import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_CHAT @@ -120,7 +119,6 @@ class Scene { //此处存在用户自定义方式,可根据过滤找到对应不符合标准的模块 var logCache = sceneCache["$moduleName-"] if (logCache == null) { - Logger.i("emArrow","tag : $tag , module : $moduleName , sceneCache : $sceneCache") logCache = SceneLogCache(mutableMapOf(), true) businessName?.let { logCache.tagMap!![it] = true diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt index b491c152dc..2280f2e882 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt @@ -358,6 +358,7 @@ enum class EventTypeEnum( ), TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯,请优先通行"), + TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,请稍后重试"), TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线"); From 10c309d5e3286ef6ffc78252c4029b2f19a50422 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 20 Sep 2022 15:21:42 +0800 Subject: [PATCH 023/226] test --- .../mogo/launcher/stageone/HttpDnsStartUp.kt | 2 +- .../hmi/ui/setting/DebugSettingView.kt | 59 +++++++++++++++---- .../main/res/layout/view_debug_setting.xml | 38 ++++++++++++ .../network/TrafficLightNetWorkModel.kt | 2 +- .../core/function/v2x/vip/VipCarManager.kt | 22 +++---- .../core/data/config/FunctionBuildConfig.kt | 11 +--- 6 files changed, 99 insertions(+), 35 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 6b4cd129b3..fb7f1b09c9 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -111,7 +111,7 @@ class HttpDnsStartUp : AndroidStartup() { // 设置是否输出日志 clientConfig.isShowDebugLog = true // 设置是否输出网络日志 - clientConfig.isShowNetDebugLog = false + clientConfig.isShowNetDebugLog = true //todo test // 设置是否是直播推流的主播 clientConfig.isAnchor = true when (DebugConfig.getCarMachineType()) { 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 69c8390db5..036391e977 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 @@ -62,6 +62,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView import com.mogo.eagle.core.function.hmi.ui.upgrade.UpgradeListAdapter +import com.mogo.eagle.core.function.v2x.vip.VipCarManager import com.mogo.eagle.core.network.* import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -439,15 +440,27 @@ class DebugSettingView @JvmOverloads constructor( /** * 日志中心 */ +// tbLogcatCenter.setOnCheckedChangeListener { buttonView, isChecked -> +// if (isChecked) { +// buttonView.setCompoundDrawables(null, null, iconDown, null) +// //展示日志中心 +// logcatCenterLayout.visibility = View.VISIBLE +// } else { +// buttonView.setCompoundDrawables(null, null, iconRight, null) +// //隐藏日志中心 +// logcatCenterLayout.visibility = View.GONE +// } +// } + //todo test tbLogcatCenter.setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked) { buttonView.setCompoundDrawables(null, null, iconDown, null) - //展示日志中心 logcatCenterLayout.visibility = View.VISIBLE + VipCarManager.INSTANCE.turnLight(30) } else { buttonView.setCompoundDrawables(null, null, iconRight, null) - //隐藏日志中心 logcatCenterLayout.visibility = View.GONE + VipCarManager.INSTANCE.turnLight(30) } } @@ -666,12 +679,8 @@ class DebugSettingView @JvmOverloads constructor( // 初始化 tracker感知数据源 数据 trackerProvider.check( when (FunctionBuildConfig.debugTrackerProvider) { - 0 -> { - R.id.trackerProviderOrigin - } - 1 -> { - R.id.trackerProviderObu - } + 0 -> R.id.trackerProviderOrigin + 1 -> R.id.trackerProviderObu else -> R.id.trackerProviderOrigin } ) @@ -680,14 +689,38 @@ class DebugSettingView @JvmOverloads constructor( R.id.trackerProviderOrigin -> { FunctionBuildConfig.debugTrackerProvider = 0 // update tracker provider view + trackerIPCProvider.visibility = View.VISIBLE } R.id.trackerProviderObu -> { FunctionBuildConfig.debugTrackerProvider = 1 // update tracker provider view + trackerIPCProvider.visibility = View.GONE } } } + // 初始化 trackerIPC 感知数据源 数据 + trackerIPCProvider.check( + when (FunctionBuildConfig.trackerIPCProvider) { + 0 -> R.id.trackerIPCUnion + 1 -> R.id.trackerIPCObu + 2 -> R.id.trackerIPCV2N + else -> R.id.trackerIPCUnion + } + ) + trackerProvider.setOnCheckedChangeListener{ _, checkedId -> + when(checkedId){ + R.id.trackerIPCUnion -> { + FunctionBuildConfig.trackerIPCProvider = 0 + } + R.id.trackerIPCObu -> { + FunctionBuildConfig.trackerIPCProvider = 1 + } + R.id.trackerIPCV2N -> { + FunctionBuildConfig.trackerIPCProvider = 2 + } + } + } // 初始化 ADAS感知数据是否绘制 选择情况 tbIsDrawIdentifyData.isChecked = FunctionBuildConfig.isDrawIdentifyData @@ -1855,13 +1888,13 @@ class DebugSettingView @JvmOverloads constructor( override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) { when (type) { - BIZ_BEAUTY_MODE -> tbIsDemoMode.isClickable = !lock - BIZ_RAIN_MODE -> tbIsRainMode.isClickable = !lock + BIZ_BEAUTY_MODE -> tbIsDemoMode.isClickable = !lock + BIZ_RAIN_MODE -> tbIsRainMode.isClickable = !lock BIZ_WARNING_UPLOAD -> tbReportWarning.isClickable = !lock - BIZ_BAG_RECORD -> { - if(lock){ + BIZ_BAG_RECORD -> { + if (lock) { btnRecordBag.isClickable = false - }else{ + } else { btnRecordBag.isClickable = true btnRecordBag.requestFocus() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 38e38c551a..13f392ed35 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1783,6 +1783,44 @@ + + + + + + + + + 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 f9a30eeb9a..68651a6f14 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 @@ -120,7 +120,7 @@ class TrafficLightNetWorkModel { } loader { apiCall { - getNetWorkApi().changeLight(map) + getNetWorkApi("http://dzt-test.zhidaozhixing.com").changeLight(map) } } onSuccess { 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 0b005c3e4f..38fdfe5a27 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 @@ -192,15 +192,17 @@ 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 -- bearing : $bearing") + fun turnLight(controlTime: Int) { + //todo test note +// 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, +// result!!.lightId, result!!.crossId, bearing, controlTime, + 100530, "10008", 6.403929233551025, controlTime, { if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { CallerLogger.d("$M_V2X$TAG", "变灯请求成功") @@ -211,7 +213,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType ) } else { - val time = if (it.countDown / 60 > 1) { + val time = if (it.countDown / 60 >= 1) { "${it.countDown / 60}分${it.countDown % 60}秒后重试" } else { "${it.countDown}秒后重试" @@ -228,7 +230,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") ToastUtils.showLong("服务异常,请稍后重试") }) - } +// } } private fun showWarning( diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index 1a50cabba3..4f12272c8f 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -84,7 +84,7 @@ object FunctionBuildConfig { */ @Volatile @JvmField - var trackerProvider = 0 + var trackerIPCProvider = 0 /** * 地图是否绘制Adas识别回调的Marker @@ -104,15 +104,6 @@ object FunctionBuildConfig { @JvmField var isDrawUnknownIdentifyData = false - /** - * 地图是否绘制 OBU 识别回调的Marker - * true - 绘制 - * false - 不绘制 - */ - @Volatile - @JvmField - var isDrawObuIdentifyData = true - /** * 地图是否绘制 点云数据 * true - 绘制 From 9ab6f98ab9490f01597ffe74d3ebeabc46ae5696 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 20 Sep 2022 15:35:01 +0800 Subject: [PATCH 024/226] wait to test --- .../core/function/hmi/ui/MoGoHmiFragment.kt | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) 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 a69bb3b50e..410ddb6e05 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 @@ -20,6 +20,7 @@ import androidx.core.view.* import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter +import com.kwai.koom.base.postOnMainThread import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig @@ -93,10 +94,7 @@ import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.mogo.map.MogoMap import com.mogo.module.common.enums.* -import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EAGENT.FATAL import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EMAP.* -import com.zhidao.support.adas.high.common.MogoReport.Code.Error.ESYS.TOPIC_FREQ_DROPED -import com.zhidao.support.adas.high.common.MogoReport.Code.Error.ETELEMATICS.AICLOUD_AUTH_ERROR import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.service_biz.BizConfig import kotlinx.android.synthetic.main.fragment_hmi.* @@ -1399,22 +1397,18 @@ class MoGoHmiFragment : MvpFragment(), ) } ThreadUtils.runOnUiThread { - - reportListFloatWindow?.let { - it.refreshData(reportList) - } - + reportListFloatWindow?.refreshData(reportList) guardianInfo?.let { when (it.code) { - NODE, NODE_DEAD, EXIT_AUTOPILOT_FOR_PLANNING, EXIT_AUTOPILOT_FOR_LOCATION, EXIT_AUTOPILOT_FOR_CHASSIS, - EXIT_AUTOPILOT_FOR_DISTANCE, - AICLOUD_AUTH_ERROR, - TOPIC_FREQ_DROPED, - FATAL -> { + EXIT_AUTOPILOT_FOR_DISTANCE-> { + //todo test + postOnMainThread(6_000L) { + + } } } } From 82721757e500bdf3dfab5928cd78911ee9fabe26 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 20 Sep 2022 15:56:21 +0800 Subject: [PATCH 025/226] test of vip has finished and through --- .../mogo/launcher/stageone/HttpDnsStartUp.kt | 2 +- .../hmi/ui/setting/DebugSettingView.kt | 17 ++------------ .../core/function/v2x/vip/VipCarManager.kt | 23 +++++++++++-------- 3 files changed, 16 insertions(+), 26 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 fb7f1b09c9..6b4cd129b3 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -111,7 +111,7 @@ class HttpDnsStartUp : AndroidStartup() { // 设置是否输出日志 clientConfig.isShowDebugLog = true // 设置是否输出网络日志 - clientConfig.isShowNetDebugLog = true //todo test + clientConfig.isShowNetDebugLog = false // 设置是否是直播推流的主播 clientConfig.isAnchor = true when (DebugConfig.getCarMachineType()) { 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 036391e977..384af51e4f 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 @@ -62,7 +62,6 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView import com.mogo.eagle.core.function.hmi.ui.upgrade.UpgradeListAdapter -import com.mogo.eagle.core.function.v2x.vip.VipCarManager import com.mogo.eagle.core.network.* import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils @@ -440,27 +439,15 @@ class DebugSettingView @JvmOverloads constructor( /** * 日志中心 */ -// tbLogcatCenter.setOnCheckedChangeListener { buttonView, isChecked -> -// if (isChecked) { -// buttonView.setCompoundDrawables(null, null, iconDown, null) -// //展示日志中心 -// logcatCenterLayout.visibility = View.VISIBLE -// } else { -// buttonView.setCompoundDrawables(null, null, iconRight, null) -// //隐藏日志中心 -// logcatCenterLayout.visibility = View.GONE -// } -// } - //todo test tbLogcatCenter.setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked) { buttonView.setCompoundDrawables(null, null, iconDown, null) + //展示日志中心 logcatCenterLayout.visibility = View.VISIBLE - VipCarManager.INSTANCE.turnLight(30) } else { buttonView.setCompoundDrawables(null, null, iconRight, null) + //隐藏日志中心 logcatCenterLayout.visibility = View.GONE - VipCarManager.INSTANCE.turnLight(30) } } 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 38fdfe5a27..14637ab334 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 @@ -193,16 +193,14 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } fun turnLight(controlTime: Int) { - //todo test note -// if (result == null || mContext == null) return -// val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) -// if (locationClient != null) { -// val bearing = -// locationClient.lastKnowLocation.bearing.toDouble() + 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, - 100530, "10008", 6.403929233551025, controlTime, + result!!.lightId, result!!.crossId, bearing, controlTime, { if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { CallerLogger.d("$M_V2X$TAG", "变灯请求成功") @@ -216,7 +214,12 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe val time = if (it.countDown / 60 >= 1) { "${it.countDown / 60}分${it.countDown % 60}秒后重试" } else { - "${it.countDown}秒后重试" + val temp = if (it.countDown == 0) { + 1 + } else { + it.countDown + } + "${temp}秒后重试" } showWarning( EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType, @@ -230,7 +233,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") ToastUtils.showLong("服务异常,请稍后重试") }) -// } + } } private fun showWarning( From b3431757734d32c9abf06b3a13a10ab3483707d8 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 20 Sep 2022 15:57:24 +0800 Subject: [PATCH 026/226] .. --- .../v2x/trafficlight/network/TrafficLightNetWorkModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 68651a6f14..f9a30eeb9a 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 @@ -120,7 +120,7 @@ class TrafficLightNetWorkModel { } loader { apiCall { - getNetWorkApi("http://dzt-test.zhidaozhixing.com").changeLight(map) + getNetWorkApi().changeLight(map) } } onSuccess { From 7ada4abc45f605c6585e09031cf25fcc8745a33b Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 20 Sep 2022 16:00:02 +0800 Subject: [PATCH 027/226] =?UTF-8?q?[2110]=20=E8=B4=A6=E5=8F=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/tools/AutoPilotAndCheckView.kt | 8 ++- .../function/hmi/ui/tools/BusOperationView.kt | 16 +++-- .../res/drawable-xxhdpi/icon_account_head.png | Bin 0 -> 7164 bytes .../main/res/layout/view_auto_pilot_check.xml | 40 +++++++----- .../res/layout/view_och_bus_operation.xml | 60 ++++++++++++------ .../src/main/res/values/strings.xml | 2 +- 6 files changed, 80 insertions(+), 46 deletions(-) create mode 100755 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 2dc8c466e2..371667ad77 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -160,14 +160,16 @@ class AutoPilotAndCheckView @JvmOverloads constructor( actvLoginout.onClick { EventBus.getDefault().post(EventLogout()) } + actvLoginout.visibility = View.VISIBLE + CallerHmiManager.setBusOperationView(toolBusOperationView) + EventBus.getDefault().post(EventBusOperation(0)) when (DebugConfig.getProductFlavor()) { "fPadLenovoOchTaxi" -> { - actvLoginout.visibility = View.VISIBLE + //出租车司机 } "fPadLenovoOchBus" ->{ - CallerHmiManager.setBusOperationView(toolBusOperationView) - EventBus.getDefault().post(EventBusOperation(0)) + //小巴车司机 } else -> { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt index bfc83e98b9..5eeb8dd0bf 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt @@ -7,6 +7,8 @@ import android.view.View import com.mogo.eagle.core.data.temp.EventBusOperation import com.mogo.eagle.core.function.api.hmi.view.IOchBusView import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.util.ShadowUtils +import com.mogo.eagle.core.utilcode.util.SharedPrefs import kotlinx.android.synthetic.main.view_och_bus_operation.view.* import org.greenrobot.eventbus.EventBus @@ -23,6 +25,9 @@ class BusOperationView @JvmOverloads constructor( init { LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true) ochBusOperationStatus.setOnClickListener(this) + context?.let { + actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") + } } override fun showBusOperation() { @@ -30,10 +35,13 @@ class BusOperationView @JvmOverloads constructor( } override fun changerOperationStatus(isOut: Boolean) { - if (isOut){ - ochBusOperationStatusCTV.text = "收车" - }else{ - ochBusOperationStatusCTV.text = "出车" + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + context?.let { + actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_account_head.png new file mode 100755 index 0000000000000000000000000000000000000000..c9de0b61b99ab6f4d4dbf572b22a52f75626fd06 GIT binary patch literal 7164 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 literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index 88f719956b..fe20f404b3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -17,24 +17,34 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + + app:layout_constraintTop_toBottomOf="@+id/toolBusOperationView" /> + app:layout_constraintStart_toStartOf="@+id/tv_check_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/v_second_group"> + app:layout_constraintStart_toEndOf="@+id/v_second_group" + app:layout_constraintTop_toTopOf="@+id/v_second_group" + app:layout_constraintBottom_toBottomOf="@+id/v_second_group" + /> - - - - - \ No newline at end of file + android:layout_marginTop="40px"/> + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index 44111ae8da..958c053241 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -23,7 +23,7 @@ 调试面板 录包设置 车速设置 - 出收车状态 + 账户信息 系统运行 关机 重启 From b94325b343135b08f793df01b3fb904faf65258e Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 20 Sep 2022 16:12:08 +0800 Subject: [PATCH 028/226] fix bug --- .../core/function/v2x/vip/VipCarManager.kt | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) 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 14637ab334..998d98c934 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 @@ -43,8 +43,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } private var mContext: Context? = null - private var turnLightFirst = false - private var turnLightEnd = true + private var turnLight = false private var vip: Boolean = false @Volatile @@ -100,9 +99,9 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { -// if (!vip) { -// return -// } + if (!vip) { + return + } if (exit) { CallerLogger.d("$M_V2X$TAG", "驶离路口,返回 , then resetConditions") @@ -124,14 +123,14 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe val lastResult = result?.currentRoadTrafficLight() CallerLogger.d( "$M_V2X$TAG", - "检查是否变灯 last.remain : ${lastResult?.remain} , color : ${lastResult?.color} , current.remain : ${currentResult?.remain} , color : ${currentResult?.color}, turnLightFirst : $turnLightFirst" + "检查是否变灯 last.remain : ${lastResult?.remain} , color : ${lastResult?.color} , current.remain : ${currentResult?.remain} , color : ${currentResult?.color}, turnLight : $turnLight" ) this.result = trafficLightResult - if (!turnLightFirst) { + if (!turnLight) { // 首次判断,变灯 - turnLightFirst = true + turnLight = true val controlTime = if (currentResult!!.isGreen()) 45 - currentResult.remain else 45 CallerLogger.d("$M_V2X$TAG", "触发变灯 , controlTime : $controlTime") turnLight(controlTime) @@ -140,8 +139,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } private fun resetConditions() { - turnLightFirst = false - turnLightEnd = true + turnLight = false result = null } @@ -192,7 +190,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } } - fun turnLight(controlTime: Int) { + private fun turnLight(controlTime: Int) { if (result == null || mContext == null) return val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) if (locationClient != null) { From f25f909efc27f1dfa27bbb52685cb332ca518ba1 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Tue, 20 Sep 2022 19:11:27 +0800 Subject: [PATCH 029/226] add func of take over view and fix bug of tts speak --- .../core/function/hmi/ui/MoGoHmiFragment.kt | 48 +++++++++++------- .../function/hmi/ui/takeover/TakeOverView.kt | 18 +++++++ .../icon_take_over_request.png | Bin 0 -> 408854 bytes .../src/main/res/layout/fragment_hmi.xml | 20 ++++++-- .../src/main/res/layout/view_take_over.xml | 13 +++++ .../res/values-xhdpi-2560x1440/dimens.xml | 3 ++ .../src/main/res/values/dimens.xml | 4 ++ .../icon_warning_take_over.png | Bin 0 -> 3143 bytes .../mogo/module/common/enums/EventTypeEnum.kt | 10 +++- 9 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_take_over_request.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_take_over.xml create mode 100644 core/mogo-core-res/src/main/function-hmi-res/drawable-xxhdpi/icon_warning_take_over.png 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 410ddb6e05..ba754a638d 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 @@ -1384,33 +1384,45 @@ class MoGoHmiFragment : MvpFragment(), * 工控机监控节点上报 */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { - guardianInfo?.let { - if (reportList.size > 49) { - reportList.removeLast() - } - reportList.add( - 0, - ReportEntity( - TimeUtils.millis2String(System.currentTimeMillis()), - it.src, it.level, it.msg, it.code, it.resultList, it.actionsList - ) - ) - } ThreadUtils.runOnUiThread { - reportListFloatWindow?.refreshData(reportList) guardianInfo?.let { when (it.code) { EXIT_AUTOPILOT_FOR_PLANNING, EXIT_AUTOPILOT_FOR_LOCATION, EXIT_AUTOPILOT_FOR_CHASSIS, - EXIT_AUTOPILOT_FOR_DISTANCE-> { - //todo test + EXIT_AUTOPILOT_FOR_DISTANCE -> { + showWarningV2X( + EventTypeEnum.TAKE_OVER_EVENT.poiType, + EventTypeEnum.TAKE_OVER_EVENT.content, + EventTypeEnum.TAKE_OVER_EVENT.tts, + EventTypeEnum.TAKE_OVER_EVENT.poiType, + object : IMoGoWarningStatusListener { + override fun onShow() { + clTakeOverView.visibility = View.VISIBLE + } - postOnMainThread(6_000L) { - - } + override fun onDismiss() { + clTakeOverView.visibility = View.GONE + } + }, + true, + 6000L + ) } } + + if (reportList.size > 49) { + reportList.removeLast() + } + reportList.add( + 0, + ReportEntity( + TimeUtils.millis2String(System.currentTimeMillis()), + it.src, it.level, it.msg, it.code, it.resultList, it.actionsList + ) + ) + reportListFloatWindow?.refreshData(reportList) + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt new file mode 100644 index 0000000000..7c33227f88 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/takeover/TakeOverView.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.function.hmi.ui.takeover + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.function.hmi.R + +class TakeOverView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.view_take_over, this, true) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_take_over_request.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi-2560x1440/icon_take_over_request.png new file mode 100644 index 0000000000000000000000000000000000000000..11b42eaa3d956b9e852d5ee9c0bbacf6773d32ad GIT binary patch literal 408854 zcmd2@gLfU>*N$!5Zfx7OZJTZE8>6w^*tYGYL1WuS^QG1!C`$+fRZZa?e|`}) z)08rolLPv^3J3}aILrzN?9U~i8_wtU`SV<0Akfb}@SkJ3ApbiHN|Ouvzt13ye=gJl zQx^gP5(JVG6;kyCKI??`*Vpjc^sx|s?b5C@9ZkUOz}*eWQZEAQGY0|W2?|4z%iY8m z6E{d5r>Li~PfA$ANF@rUGst8FqwNF-liNaz`fC|?1YmaPG?D8hG-|esrx$%}esCRj zdFXetq+>_ZYH>@nJ@Ou|OuM9bWk0UHcB!dp0|fuywH`pU;1WR1pdkh7``?yHgN#*H zHoucyEoDhll=Q!&7s#A+zb&&aAWJ8zMRWf&?11^AEz7CnG=G_ZTUpW8Wh&%9Ewuyc zyRg}fu@>vU-{N_INh3S25%bc67o~DlU7>HI1pH}I(Sp>f6l|GdT7So+r$sf zGlz5cP*ABU))3K~FT1!nj_7Tus=7GV^~jP9&Vf{`_pk0k}FwE@k}3jEPKc zxAO(7`Ke0t32h!uvzM|mi`AW~Qk7&?J{3$4=&G;9v;-%|X@0IPIBde870*$m!i5`I zSWmZeJsAvA7RnmQ)s3P2@a<)JzpZoq4rjJWc_3b2-Bm$@c*=f@{0f73%}Jm0urzUd z+8XK-31jD1Q;U7yj^-%4O6zFyP2Ei_X-=fbUxGGp{9}MWE%D9S6x#Bio$I+k3MZ$7 zKROdl4-f5Ij4m=SF4$Borumys(rVouhoac@R4ghgi(3s?I)I1?Dd_AE2BF=T1|l0# z?U@5jUT=aVK~;KyzHXu)Wwu9}v!4ga?86R5oyWAob@qy%U zzbE`!DB-jD`yH1so%{Y8*P)|!Q+T*mCr6JL0pA3DQP(8F1f9zJUq4H%z;-tL(&ejU z%m4bgVFMHuF7NhZ&xTaZ^@B$D*OL=)So(B!mnrn1dUJynHlGJ{J(fd#CAlp37#3~v zx5D!?so(G-hVJxm%4l%7D=;#0)2&Rd+618NhV!9`EY<@XgJMm%eELm{E5)pZ!lsr~ zvns^%MZS{0nh=?K$~o$0Z37Bmx=&zlLEuT>|2=z65CWWsfDOia-&P-2<^YVwwRenWeVb#RG|W)>&_}nSIH(zT~lV>H9MOT4@~EeqVVk ztJr^J9PJoArTODOV+et@Y^JD_D1J7_RdN4?2T{4IM^3koyDtV@F4tNXdP{s3y)tbF z6Mjxh6J88Iie>dOH4sLoGQg#@StLst)7sdtIpZk-gkZz2$11ouXmP@VO^Af1m4aY4 zJCmNLqGY3cPRfTK}%Pz=B-ys zTWxxl6Q)G{MdWtV8Txb4g8Rb=u-4j7GlE_{d|WI)VjR57(%m<&I~KZqmwTa36I)Xr zCu$o0!QDJFNS9hpGRv1lnop4ABqbHB`bI*z@eS`~)8+ks9Ftz_Cclac)*xS^c{!WX zpk&8EFSD@Ee;||H`<`sS@M6wHu@z}_FbEc5PJ<+mZWlVziJby#ze3fN?*yPb^a~Nf z#A*})hL!>Qm#~rg>Ws)@LPj*RWD{+UsVr*dVGn2IPw&QjQ)#%0DpLX4nK+ZE7}}ik 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%0AZ?J&OeeU|)d+|ofwrFQzrZ^*5EO!Nu3}s1y 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 uO2(?x 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 X@d#^ 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%0A0ft6JVrbT{Tnj1Vo@5H54j5- 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

*< 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 + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/viewLimitingVelocity" + app:layout_goneMarginEnd="40px" + app:layout_goneMarginTop="30px" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_take_over.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_take_over.xml new file mode 100644 index 0000000000..b8612e14f6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_take_over.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml index 4619c517d6..bc1b90f4f5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -66,4 +66,7 @@ 40px 46px + 810px + 560px + 524px \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml index 58c932f939..53e5d6676b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/dimens.xml @@ -65,4 +65,8 @@ 42px 40px 46px + + 810px + 560px + 524px \ No newline at end of file diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xxhdpi/icon_warning_take_over.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xxhdpi/icon_warning_take_over.png new file mode 100644 index 0000000000000000000000000000000000000000..fdab3a4a873e78cc042d69552474a16eb2081b62 GIT binary patch literal 3143 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 R^Zq>X2qSY?m4RE-zX1UQ*tY-x literal 0 HcmV?d00001 diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt index 2280f2e882..7521d0ac83 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt @@ -111,6 +111,12 @@ enum class EventTypeEnum( GHOST_PROBE("10024", "前方盲区行人预警", "前方盲区行人预警", R.drawable.icon_warning_v2x_pedestrian_crossing, "前方盲区行人通行,请注意", "前方盲区即将有行人通过,请减速慢行"), + //接管 + TAKE_OVER_EVENT( + "20000", "注意周围、立即接管", "注意周围、立即接管", R.drawable.icon_warning_take_over, + "注意周围、立即接管", "自动驾驶退出请立即接管" + ), + // 前方静止or慢速车辆报警 ALERT_FRONT_CAR("99999"), @@ -357,8 +363,8 @@ enum class EventTypeEnum( tts = "" ), - TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯,请优先通行"), - TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,请稍后重试"), + TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯请优先通行"), + TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败请稍后重试"), TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线"); From 38c439830d4c5cc953b309de1781427bd72a10e6 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Tue, 20 Sep 2022 19:48:39 +0800 Subject: [PATCH 030/226] =?UTF-8?q?[2.11.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=E8=B7=AF=E7=BA=BF=E9=9D=A2=E6=9D=BF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/och/bus/bean/BusRoutesResult.java | 6 + .../callback/IRefreshBusStationsCallback.java | 8 +- .../mogo/och/bus/fragment/BusFragment.java | 313 ++++++++++++------ .../com/mogo/och/bus/model/BusOrderModel.java | 104 ++++-- .../mogo/och/bus/presenter/BusPresenter.java | 36 +- .../mogo/och/bus/ui/BusStationCommonItem.kt | 65 ++++ .../bus_no_line_icon.png | Bin 0 -> 13534 bytes .../icon_arrow_blue_bus.png | Bin 0 -> 377 bytes .../icon_arrow_green_bus.png | Bin 0 -> 400 bytes .../icon_arrow_grey_bus.png | Bin 0 -> 402 bytes .../icon_no_bus_line.png | Bin 0 -> 13534 bytes .../icon_point_blue_bus.png | Bin 0 -> 1427 bytes .../icon_point_green_bus.png | Bin 0 -> 3797 bytes .../icon_point_grey_bus.png | Bin 0 -> 1580 bytes .../bus_no_line_icon.png | Bin 0 -> 13534 bytes .../icon_arrow_blue_bus.png | Bin 0 -> 377 bytes .../icon_arrow_green_bus.png | Bin 0 -> 400 bytes .../icon_arrow_grey_bus.png | Bin 0 -> 402 bytes .../icon_no_bus_line.png | Bin 0 -> 13534 bytes .../icon_point_blue_bus.png | Bin 0 -> 1427 bytes .../icon_point_green_bus.png | Bin 0 -> 3797 bytes .../icon_point_grey_bus.png | Bin 0 -> 1580 bytes .../res/drawable-xhdpi/bus_no_line_icon.png | Bin 0 -> 13534 bytes .../drawable-xhdpi/icon_arrow_blue_bus.png | Bin 0 -> 377 bytes .../drawable-xhdpi/icon_arrow_green_bus.png | Bin 0 -> 400 bytes .../drawable-xhdpi/icon_arrow_grey_bus.png | Bin 0 -> 402 bytes .../res/drawable-xhdpi/icon_no_bus_line.png | Bin 0 -> 13534 bytes .../drawable-xhdpi/icon_point_blue_bus.png | Bin 0 -> 1427 bytes .../drawable-xhdpi/icon_point_green_bus.png | Bin 0 -> 3797 bytes .../drawable-xhdpi/icon_point_grey_bus.png | Bin 0 -> 1580 bytes .../main/res/drawable/bus_task_time_bg.xml | 6 + .../src/main/res/layout/bus_no_line_view.xml | 28 ++ .../res/layout/bus_stations_common_item.xml | 54 +++ .../src/main/res/layout/fragment_och_bus.xml | 162 ++++----- .../res/values-xhdpi-2560x1440/dimens.xml | 3 +- .../res/values-xhdpi-2560x1600/dimens.xml | 3 +- .../src/main/res/values/colors.xml | 4 + .../src/main/res/values/dimens.xml | 2 + .../src/main/res/values/strings.xml | 8 + .../common/module/wigets/OCHCommitDialog.kt | 95 ++++++ .../wigets/OCHRoundConstraintLayout.java | 165 +++++++++ .../src/main/res/layout/dialog_bus_commit.xml | 82 +++++ .../src/main/res/values/colors.xml | 4 + .../src/main/res/values/styles.xml | 16 + 44 files changed, 928 insertions(+), 236 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_no_line_icon.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_blue_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_green_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_grey_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_no_bus_line.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_blue_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_green_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_grey_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_no_line_icon.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_blue_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_green_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_grey_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_no_bus_line.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_blue_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_green_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_grey_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_no_line_icon.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_blue_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_green_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_grey_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_no_bus_line.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_blue_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_green_bus.png create mode 100755 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_grey_bus.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_task_time_bg.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java create mode 100644 OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/colors.xml create mode 100644 OCH/mogo-och-common-module/src/main/res/values/styles.xml diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java index ba188d3bee..485c68f0ec 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java @@ -14,6 +14,7 @@ public class BusRoutesResult { private int lineType; //线路类型,0:环形 private String description; private int status; + private long taskTime; //线路时间班次 //线路轨迹相关字段 public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“” @@ -44,12 +45,17 @@ public class BusRoutesResult { this.sites = sites; } + public long getTaskTime() { + return taskTime; + } + @Override public String toString() { return "BusRoutesResult{" + "sites=" + sites + ", lineId=" + lineId + ", name='" + name + '\'' + + ", taskTime='" + taskTime + '\'' + ", lineType=" + lineType + ", description='" + description + '\'' + ", status=" + status + diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java index 40ea27c44a..758fd4b0bf 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java @@ -9,6 +9,12 @@ import java.util.List; * @date: 2021/10/22 */ public interface IRefreshBusStationsCallback { - void refreshBusStations(String lineName,List stationList, int currentStation, int nextStation, boolean isArrived); + void updateBusTaskStatus(String lineName,String lintTime, + List stationList, + int arrivingOrArrivedIndex, + boolean isArrived); + void clearBusStationsMarkers(); + + void updateEmptyUi(); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 7278755f1a..62fd42cd80 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -7,6 +7,8 @@ import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.Group; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.voice.AIAssist; @@ -25,17 +27,17 @@ import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusStationBean; import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.presenter.BusPresenter; +import com.mogo.och.bus.ui.BusStationCommonItem; import com.mogo.och.bus.ui.BusSwitchLineActivity; import com.mogo.och.bus.view.SlidePanelView; import com.mogo.och.common.module.utils.OCHThreadPoolManager; +import com.mogo.och.common.module.wigets.OCHCommitDialog; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.List; -import mogo.telematics.pad.MessagePad; - /** * 网约车小巴界面 @@ -46,18 +48,24 @@ public class BusFragment extends BaseBusTabFragment implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener { private static final String TAG = "BusFragment"; - private TextView mCurrentStationName; - private TextView mNextStationName; - private TextView mCurrentTag; - private TextView mNextTag; +// private TextView mCurrentStationName; +// private TextView mNextStationName; +// private TextView mCurrentTag; +// private TextView mNextTag; private TextView mSwitchLine; //切换路线 private TextView mLineName; - private int mCurrentStation = 0; + private TextView mTaskTime; + private Group groupStationsPanel; + private ConstraintLayout noDataView; +// private int mCurrentStation = 0; // private View mBus; private BusStationBean startStation = null; private BusStationBean endStation = null; + private BusStationCommonItem firstStationItem; + private BusStationCommonItem secondStationItem; + private BusStationCommonItem thirdStationItem; @Override public String getTagName() { @@ -67,22 +75,20 @@ public class BusFragment extends BaseBusTabFragment @Override protected void initViews() { super.initViews(); -// mBus = findViewById(R.id.module_och_bus_tag); - mCurrentStationName = findViewById(R.id.module_och_bus_current_station); - mCurrentTag = findViewById(R.id.module_och_bus_current_station_anchor); - mNextStationName = findViewById(R.id.module_och_bus_order_end_station); - mNextTag = findViewById(R.id.module_och_bus_next_station_anchor); +// mCurrentStationName = findViewById(R.id.module_och_bus_current_station); +// mCurrentTag = findViewById(R.id.module_och_bus_current_station_anchor); +// mNextStationName = findViewById(R.id.module_och_bus_order_end_station); +// mNextTag = findViewById(R.id.module_och_bus_next_station_anchor); mSwitchLine = findViewById(R.id.switch_line_btn); mSwitchLine.setTag(0); mLineName = findViewById(R.id.module_och_bus_line_name); - //调用测试面板 - mCurrentStationName.setOnLongClickListener(v -> { - debugTestBar(); - showHideTestBar(); - return true; - }); -// } + firstStationItem = findViewById(R.id.bus_panel_first_station); + secondStationItem = findViewById(R.id.bus_panel_second_station); + thirdStationItem = findViewById(R.id.bus_panel_third_station); + mTaskTime = findViewById(R.id.bus_task_time_tv); + groupStationsPanel = findViewById(R.id.group_stations_panel); + noDataView = findViewById(R.id.no_line_data_view); CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); // 初始化的时候设置 UI 按钮状态 @@ -122,78 +128,64 @@ public class BusFragment extends BaseBusTabFragment super.onResume(); } - /** - * 根据站点列表信息刷新车站面板,滑块面板 - * - * @param stationList 车站列表信息 - * @param currentStation 当前站点 - * @param nextStation 下个站点 - * @param isArrived 是否都站 - */ - public void refreshBusStations(String lineName,List stationList - , int currentStation, int nextStation, boolean isArrived) { - mCurrentStation = currentStation; + public void hideStationsPanel(){ + groupStationsPanel.setVisibility(View.GONE); + noDataView.setVisibility(View.VISIBLE); + } + + public void showStationsPanel(){ + groupStationsPanel.setVisibility(View.VISIBLE); + noDataView.setVisibility(View.GONE); + } + + public void updateLineEmptyUI(){ + hideStationsPanel(); + } + + public void updateBusTaskStatus(String lineName, String lineTime, + List stationList, + int arrivingOrArrivedIndex, + boolean isArrived){ + if (getActivity() == null) { return; } + getActivity().runOnUiThread(() -> { if (stationList == null) { // 获取小巴数据失败 return; } + showStationsPanel(); + + mLineName.setText(lineName); + mTaskTime.setText(getString(R.string.bus_line_time_tag)+ lineTime); // 渲染小巴路线数据 - renderCurrentStationStatus(lineName,stationList, currentStation, nextStation, isArrived); + updateBusStationStatus(stationList,arrivingOrArrivedIndex,isArrived); }); } - /** - * 重新刷新站点信息 isArrived 是否到站 - */ - private void renderCurrentStationStatus(String lineName,List stationList, int currentStation - , int nextStation, boolean isArrived) { - CallerLogger.INSTANCE.d(M_BUS + "MapMaker ", "currentStation=" + currentStation + ",nextStation=" + nextStation + "isArrived=" + isArrived); - String currentStationName = null; - String nextStationName = null; - - boolean isArriveEndStation = false; - boolean isArriveAtStation = false; - boolean isArriveAtStartStation = false; - - mLineName.setText(lineName); - - // 获取当前站点的名称 - currentStationName = stationList.get(currentStation).getName(); + private void updateBusStationStatus(List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { startStation = stationList.get(0); endStation = stationList.get(stationList.size() - 1); - // 是否到达起点 - if (currentStation == 0) { - isArriveAtStartStation = true; - mCurrentTag.setText(getResources().getString(R.string.bus_arrive_to_end_start)); + //切换路线和结束路线按钮切换 + if (arrivingOrArrivedIndex == 0 && isArrived){ + showOrHideSwitchLineBtn(true); + }else { + showOrHideSwitchLineBtn(false); + } + if (arrivingOrArrivedIndex == 0){ setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); - } else if (currentStation > 0 && currentStation < stationList.size() - 1) {// 是否到达站点 - isArriveAtStation = true; - mCurrentTag.setText(getResources().getString(R.string.bus_arrive_to_current_tag)); - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_next_tag)); - - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); - } else if (currentStation == stationList.size() - 1) {// 是否到达终点 - isArriveEndStation = true; - nextStationName = "--"; - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); - - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - + }else if (arrivingOrArrivedIndex == stationList.size() - 1){ if (isArrived) { setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); @@ -201,47 +193,158 @@ public class BusFragment extends BaseBusTabFragment setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); } - } - - // 获取下一站点名称 - if (nextStation > currentStation && nextStation <= stationList.size() - 1) { - nextStationName = stationList.get(nextStation).getName(); - } - - // 是否到达终点 - if ( nextStation == stationList.size() - 1 || nextStation == -1) { - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); }else { - mNextTag.setText(getResources().getString(R.string.bus_arrive_to_next_tag)); - } - - if (currentStation == 0 && isArrived){ - showOrHideSwitchLineBtn(true); - }else { - showOrHideSwitchLineBtn(false); + setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(),R.raw.star_marker); + setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(),R.raw.end_marker); } // 重置滑动按钮文字 - if (isArriveEndStation) { + if (arrivingOrArrivedIndex == stationList.size() -1 && isArrived) { showSlidePanle("单程结束"); - } else if (isArriveAtStartStation) { - showSlidePanle("滑动出发"); - } else if (isArriveAtStation) { + } else if (isArrived){ showSlidePanle("滑动出发"); } - mCurrentStationName.setText(currentStationName); - mNextStationName.setText(nextStationName); + if (stationList.size() > 2){ //只有两个站点 + updateMoreThanTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); + }else { + updateTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); + } + updateBusTestBarInfo(); } + /** + * 有两个以上站点的路线 + * @param stationList + * @param arrivingOrArrivedIndex + * @param isArrived + */ + private void updateMoreThanTwoStationsUI(List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { + secondStationItem.setStationTag(""); + thirdStationItem.setStationTag(""); + secondStationItem.setVisibility(View.VISIBLE); + thirdStationItem.showOrHideStationArrowBg(false); + + if (arrivingOrArrivedIndex == 0){ + firstStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_start)); + } + if (arrivingOrArrivedIndex + 1 == stationList.size() - 1 + || arrivingOrArrivedIndex + 2 == stationList.size() - 1){ //确认是否显示 "终" + thirdStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_end)); + } + + //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 + if (arrivingOrArrivedIndex == 0 && isArrived){ + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + secondStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + + firstStationItem.setStationName(stationList.get(0).getName()); + secondStationItem.setStationName(stationList.get(1).getName()); + thirdStationItem.setStationName(stationList.get(2).getName()); + + firstStationItem.setStationPointBg(1); + secondStationItem.setStationPointBg(2); + thirdStationItem.setStationPointBg(2); + + firstStationItem.setStationArrowBg(2); + secondStationItem.setStationArrowBg(2); + + }else if (arrivingOrArrivedIndex == stationList.size() - 1){ + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + secondStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + + firstStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -2).getName()); + secondStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -1).getName()); + thirdStationItem.setStationName(stationList.get(arrivingOrArrivedIndex).getName()); + + firstStationItem.setStationPointBg(0); + secondStationItem.setStationPointBg(0); + thirdStationItem.setStationPointBg(1); + + firstStationItem.setStationArrowBg(0); + if (isArrived){ + secondStationItem.setStationArrowBg(0); + }else { + secondStationItem.setStationArrowBg(1); + } + + }else { + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + secondStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + + firstStationItem.setStationName(stationList.get(arrivingOrArrivedIndex -1).getName()); + secondStationItem.setStationName(stationList.get(arrivingOrArrivedIndex).getName()); + thirdStationItem.setStationName(stationList.get(arrivingOrArrivedIndex + 1).getName()); + + firstStationItem.setStationPointBg(0); + secondStationItem.setStationPointBg(1); + thirdStationItem.setStationPointBg(2); + secondStationItem.setStationArrowBg(2); + if (isArrived){ + firstStationItem.setStationArrowBg(0); + }else { + firstStationItem.setStationArrowBg(1); + } + } + + } + + /** + * 只有两个站点的路线 + * @param stationList + * @param arrivingOrArrivedIndex + * @param isArrived + */ + private void updateTwoStationsUI(List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { + + secondStationItem.setVisibility(View.GONE); + secondStationItem.showOrHideStationArrowBg(false); + + firstStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_start)); + thirdStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_end)); + + firstStationItem.setStationName(stationList.get(0).getName()); + thirdStationItem.setStationName(stationList.get(1).getName()); + + //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 + if (arrivingOrArrivedIndex == 0 && isArrived){//到站 + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_arrived_station_name_text_color)); + firstStationItem.setStationPointBg(1); + firstStationItem.setStationArrowBg(2); + thirdStationItem.setStationPointBg(0); + + }else { + firstStationItem.setStationNameColor(getResources().getColor(R.color.bus_station_tag_txt_un_color)); + thirdStationItem.setStationNameColor(getResources().getColor(R.color.bus_line_station_color_selected)); + if (isArrived){ //到终点 + firstStationItem.setStationPointBg(0); + firstStationItem.setStationArrowBg(0); + thirdStationItem.setStationPointBg(1); + + }else { //到终点途中 + firstStationItem.setStationPointBg(0); + firstStationItem.setStationArrowBg(1); + thirdStationItem.setStationPointBg(1); + } + } + } + private void showOrHideSwitchLineBtn(boolean isShow) { if (isShow){//显示切换路线 -// mSwitchLine.setVisibility(View.VISIBLE); mSwitchLine.setTag(0); mSwitchLine.setText(getResources().getString(R.string.bus_switch_line_btn)); }else {//显示结束路线 -// mSwitchLine.setVisibility(View.GONE); mSwitchLine.setTag(1); mSwitchLine.setText(getResources().getString(R.string.bus_close_line_btn)); } @@ -307,12 +410,10 @@ public class BusFragment extends BaseBusTabFragment if (launch) { // 出车的时候重制站点状态 mPresenter.queryBusRoutes(); -// tvOperationStatus.setText("收车"); tvArrived.setVisibility(View.VISIBLE); showPanel(); } else { AIAssist.getInstance(getContext()).speakTTSVoice("已收车"); -// tvOperationStatus.setText("出车"); tvArrived.setVisibility(View.GONE); hideSlidePanel(); hidPanel(); @@ -410,7 +511,25 @@ public class BusFragment extends BaseBusTabFragment Intent intent = new Intent(getContext(), BusSwitchLineActivity.class); startActivity(intent); }else {//结束路线 - mPresenter.resetCurrentLineStatus(); + OCHCommitDialog.Builder builder = new OCHCommitDialog.Builder(); + OCHCommitDialog closeLineConfirmDialog = builder + .title(getString(R.string.bus_dialog_title)) + .tips(getString(R.string.bus_dialog_tips)) + .confirmStr(getString(R.string.bus_dialog_confirm)) + .cancelStr(getString(R.string.bus_dialog_cancel)) + .build(getContext()); + closeLineConfirmDialog.setClickListener(new OCHCommitDialog.ClickListener() { + @Override + public void confirm() { + mPresenter.resetCurrentLineStatus(); + } + + @Override + public void cancel() { + + } + }); + closeLineConfirmDialog.show(); } } } 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 f8e5b3bd17..12db987a6e 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 @@ -4,6 +4,7 @@ import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_ADAS; import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +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; @@ -54,6 +55,7 @@ import com.mogo.och.bus.presenter.BusModelLoopManager; import com.mogo.och.bus.util.BusAnalyticsManager; import com.mogo.och.bus.util.BusTrajectoryManager; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; +import com.mogo.och.common.module.utils.DateTimeUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -429,20 +431,76 @@ public class BusOrderModel { || data.getResult() == null || data.getResult().getSites() == null || data.getResult().getSites().isEmpty() ) { + //当为空时,显示无绑定路线图 + CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据:空 " ); + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.updateEmptyUi(); + } return; } CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + data ); - renderBusStationsStatus( data.getResult()); + updateBusStatus( data.getResult()); } @Override public void onFail(String failMsg) { // 重复请求小巴路线,直至成功 - queryBusStationDelay(); + //改为任务,为空不再去一直取 +// queryBusStationDelay(); } }); } + /** + * 更新正在运行的任务UI + * @param stations + */ + private void updateBusTaskStatus(List stations) { + + int arrivingOrArrivedStationIndex = 0;//已经到站或者即将到站的索引呢 + + for (int i =0 ; i< stations.size(); i++){ + BusStationBean station = stations.get(i); + + if (i == 0){ // 首发站 显示在最上面 + if (station.getDrivingStatus() == STATION_STATUS_STOPPED + && !station.isLeaving()){ //到达第一站 + arrivingOrArrivedStationIndex = i; + break; + } + }else { + BusStationBean preStation = stations.get(i-1); + if ((station.getDrivingStatus() == STATION_STATUS_STOPPED && !station.isLeaving()) + || (station.getDrivingStatus() == STATION_STATUS_ARRIVING + && preStation.isLeaving())){ + //到站未离开 | 即将到站 显示在最中间 + arrivingOrArrivedStationIndex = i; + break; + } + } + } + + BusStationBean arrivingOrArrivedStation = stations.get(arrivingOrArrivedStationIndex); + + String lineTime = DateTimeUtil.formatLongToString( + busRoutesResult.getTaskTime(), + DateTimeUtil.TAXI_HH_mm); + + if (arrivingOrArrivedStationIndex == 0 || + arrivingOrArrivedStation.getDrivingStatus() == STATION_STATUS_STOPPED + && !arrivingOrArrivedStation.isLeaving()){ + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(),lineTime, + stationList,arrivingOrArrivedStationIndex,true); + } + }else { + if (refreshBusStationsCallback != null){ + refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(),lineTime, + stationList,arrivingOrArrivedStationIndex,false); + } + } + } + /** * 重置路线站点状态--结束路线,当前路线恢复到始发站 */ @@ -517,20 +575,21 @@ public class BusOrderModel { clientPkFileName = "sn" ) private void leaveStationSuccess(BusRoutesResult result, boolean isRestart) { - renderBusStationsStatus(result); -// if (slidePannelHideCallback != null) { -// slidePannelHideCallback.hideSlidePanel(); -// } + + updateBusStatus(result); + //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 if (isRestart || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ startAutopilot(isRestart); } + if (isGoingToNextStation) { // 为了避免恢复自动驾驶时重复的接口请求 return; } isGoingToNextStation = true; + AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" ); } @@ -546,10 +605,6 @@ public class BusOrderModel { BusStationBean currentStation = stationList.get( backgroundCurrentStationIndex); BusStationBean nextStation = stationList.get( backgroundCurrentStationIndex + 1); -// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -// == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { -// ToastUtils.showShort("自动驾驶状态为不可用!"); -// } AutopilotControlParameters parameters = new AutopilotControlParameters(); parameters.isSpeakVoice = !isRestart; parameters.routeID = busRoutesResult.getLineId(); @@ -601,7 +656,7 @@ public class BusOrderModel { public void onSuccess(BaseData o) { CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); if (!isRestart){ - renderArriveBusStation(); + arrivedBusStationSuccess(); } } @@ -617,13 +672,16 @@ public class BusOrderModel { }); } - private void renderArriveBusStation() { + private void arrivedBusStationSuccess() { List site = busRoutesResult.getSites(); if (site != null && site.size() > 0){ backgroundCurrentStationIndex ++; if (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(busRoutesResult.getName(),stationList, backgroundCurrentStationIndex - , getNextStopStation(),true); + String lineTime = DateTimeUtil.formatLongToString( + busRoutesResult.getTaskTime(), + DateTimeUtil.TAXI_HH_mm); + refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(),lineTime, + stationList, backgroundCurrentStationIndex ,true); } } } @@ -739,7 +797,6 @@ public class BusOrderModel { }else { ToastUtils.showShort("出车收车状态查询:"+failMsg); } -// queryOperationStatus(); } }); } @@ -759,20 +816,21 @@ public class BusOrderModel { /** * 渲染站点信息 * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, - * 车机端展示 离开站为当前站点,前往站为下一站, 下一站到站后在置为当前站 + * 车机端展示 三站: 中间为即将到到达或者刚到达的站 * @param result */ - private void renderBusStationsStatus(BusRoutesResult result) { + private void updateBusStatus(BusRoutesResult result) { if (result == null) return; busRoutesResult = result; List site = result.getSites(); currentLineId = result.getLineId(); stationList.clear(); stationList.addAll( site ); + for ( int i = 0; i < stationList.size(); i++ ) { BusStationBean s = stationList.get( i ); - CallerLogger.INSTANCE.d( M_BUS + "renderBusStationsStatus--", + CallerLogger.INSTANCE.d( M_BUS + "updateBusStationsStatus--", "Index="+ i+" ,name = "+s.getName()+" ,"+s.isLeaving()+","+s.getDrivingStatus()); // 是否正在开往下一站 @@ -790,7 +848,7 @@ public class BusOrderModel { CallerLogger.INSTANCE.d( M_BUS + TAG, "渲染站点信息服务端currentStationIndex="+backgroundCurrentStationIndex - +" isLeaving()="+currentStation.isLeaving()); + +" isLeaving()="+currentStation.isLeaving()); //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 // ,订单开始站下在始发站的状态流转有问题 @@ -808,15 +866,13 @@ public class BusOrderModel { CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)"); } - if (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(result.getName(),stationList - , backgroundCurrentStationIndex, getNextStopStation(),!currentStation.isLeaving()); - } - if ( currentStation.isLeaving() && slidePannelHideCallback != null) { slidePannelHideCallback.hideSlidePanel(); } + //更新bus路线面板 + updateBusTaskStatus(stationList); + //需放在currentStationIndex赋值之后 BusTrajectoryManager.getInstance().syncTrajectoryInfo(); } 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 15b161f032..435252fefa 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 @@ -123,20 +123,44 @@ public class BusPresenter extends Presenter } } +// @Override +// public void refreshBusStations(String lineName,List stationList +// , int currentStation, int nextStation, boolean isArrived) { +// mStationList.clear(); +// mStationList.addAll(stationList); +// mCurrentStation = currentStation; +//// functionDemoModeChange(); +// CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation); +// if (mView != null) { +// runOnUIThread(() -> mView.refreshBusStations(lineName, +// stationList, currentStation, nextStation, isArrived)); +// } +// } + @Override - public void refreshBusStations(String lineName,List stationList - , int currentStation, int nextStation, boolean isArrived) { + public void updateBusTaskStatus(String lineName,String lineTime, + List stationList, + int arrivingOrArrivedIndex, + boolean isArrived) { mStationList.clear(); mStationList.addAll(stationList); - mCurrentStation = currentStation; -// functionDemoModeChange(); + if (arrivingOrArrivedIndex == 0 || isArrived){ + mCurrentStation = arrivingOrArrivedIndex; + }else { + mCurrentStation = arrivingOrArrivedIndex -1; + } CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation); if (mView != null) { - runOnUIThread(() -> mView.refreshBusStations(lineName, - stationList, currentStation, nextStation, isArrived)); + runOnUIThread(() -> mView.updateBusTaskStatus(lineName,lineTime, + stationList, arrivingOrArrivedIndex, isArrived)); } } + @Override + public void updateEmptyUi() { + runOnUIThread(() -> mView.updateLineEmptyUI()); + } + @Override public void clearBusStationsMarkers() { runOnUIThread(() -> mView.clearBusStationsMarkers()); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt new file mode 100644 index 0000000000..8ce6f38d16 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt @@ -0,0 +1,65 @@ +package com.mogo.och.bus.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import com.mogo.och.bus.R +import kotlinx.android.synthetic.main.bus_stations_common_item.view.* + +/** + * @author: wangmingjun + * @date: 2022/9/15 + */ +class BusStationCommonItem @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr){ + + init { + LayoutInflater.from(context).inflate(R.layout.bus_stations_common_item,this,true) + } + + fun setStationName(name: String){ + busStationNameTv.text = name + } + + fun setStationNameColor(color: Int){ + busStationNameTv.setTextColor(color) + } + + fun setStationPointBg(type: Int){ // 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 + when(type){ + 0 -> busCircleIv.setImageResource(R.drawable.icon_point_grey_bus) + 1 -> busCircleIv.setImageResource(R.drawable.icon_point_green_bus) + 2 -> busCircleIv.setImageResource(R.drawable.icon_point_blue_bus) + } + } + + fun setStationArrowBg(type: Int){// 0:灰色 过站 1:绿色 前往下一站 2:蓝色 未到站 + when(type){ + 0 -> busArrowBg.setImageResource(R.drawable.icon_arrow_grey_bus) + 1 -> busArrowBg.setImageResource(R.drawable.icon_arrow_green_bus) + 2 -> busArrowBg.setImageResource(R.drawable.icon_arrow_blue_bus) + } + + } + + fun setStationTag(tag: String){ // 0:起 1:终 + if (tag.isNullOrEmpty()){ + busTagTxt.visibility = GONE + }else{ + busTagTxt.text = tag + busTagTxt.visibility = VISIBLE + } + } + + fun showOrHideStationArrowBg(isShow:Boolean){ + if (isShow){ + busArrowBg.visibility = VISIBLE + }else{ + busArrowBg.visibility = GONE + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_no_line_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_no_line_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..fc20dca73c6966b7a0ef7a1fe7d41b167fe900d1 GIT binary patch literal 13534 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 Uh9g@3`?p9^RPJZBuwKCb09^Nox&QzG literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_arrow_blue_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..026c36086ffd6c895244972e447844158dd17e76 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^96)T#!3HEJ?9iABq!^2X+?^QKos)S9Eak- zA^3KxBOjxqfNTB9BLddd8>imr6u!ZsC}<`mt@nV(%r8kj`Nj>aM&=#uE(RJ`FIV{( zyT9;D+qLSRf9dj|xk@<|jGI?QEb^RKc-4<%#^i>6pZi+?VnxH*!`r|7 zF8KT4*TJucmoq7T7x)xY8MjMgqilh6kAq$OvcMGkIUKrzxydW8w6xi7Zdl#I-NhM` z*s*f%L5Bq00=7lh|I2#xX(TIsSSfUq>5!ahPvG+QrmWh21(|>&9uH!b|C%=~ej>HN vd%H=Eak- zA($NU+kR&wBUgpwji~cR%l@~0bTm0#&(>C@(x|5(?aC-TNhR#r3MP*YJ#B|GEELiw zT>N4%OU~^wvkHsJKmU(`f9+NIk0giuwU>-|>A)b*Ed4#aEq+_Qq=Xrh>y4Qb5}N~z z&V{$#_j5S;Rl#$D*aAOgF#%?_hDoa%bNB@2Pi!nK6mc%I>f&^;H8>giizlg*x2NZS zfKS7#82zIQWcSXxD43zZ%-qG8XAa|S$-Q+--c2`r9Ojx!NJQA?8>!X1O=tOB`p3|NkG(Y{=em{=|tL5!25b%EmJK6p2n=nw;b; z@z`EO`+%CE(VFW|(|h7%kNpro;%>;8@h&W_?qf$A+gtmDqYg}oOv;b#GF@*zxXOEL zf5IdMsT`&Yj_E%lZ!)PpU-{2v8q3C+4U^1o%#g5sUV5{}Z925d$ V*!Oz|J=y~b4^LM=mvv4FO#mstjFA8U literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_no_bus_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_no_bus_line.png new file mode 100755 index 0000000000000000000000000000000000000000..fc20dca73c6966b7a0ef7a1fe7d41b167fe900d1 GIT binary patch literal 13534 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 Uh9g@3`?p9^RPJZBuwKCb09^Nox&QzG literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_blue_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..dc4c4f6f0da0a03c903cf6a1e7f84dc2864a3204 GIT binary patch literal 1427 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 LNkvXXu0mjfKvgIU literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_point_grey_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..d43e34bb2634ebe1ea0028dff390741c8fa32990 GIT binary patch literal 1580 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 Uh9g@3`?p9^RPJZBuwKCb09^Nox&QzG literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_arrow_blue_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..026c36086ffd6c895244972e447844158dd17e76 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^96)T#!3HEJ?9iABq!^2X+?^QKos)S9Eak- zA^3KxBOjxqfNTB9BLddd8>imr6u!ZsC}<`mt@nV(%r8kj`Nj>aM&=#uE(RJ`FIV{( zyT9;D+qLSRf9dj|xk@<|jGI?QEb^RKc-4<%#^i>6pZi+?VnxH*!`r|7 zF8KT4*TJucmoq7T7x)xY8MjMgqilh6kAq$OvcMGkIUKrzxydW8w6xi7Zdl#I-NhM` z*s*f%L5Bq00=7lh|I2#xX(TIsSSfUq>5!ahPvG+QrmWh21(|>&9uH!b|C%=~ej>HN vd%H=Eak- zA($NU+kR&wBUgpwji~cR%l@~0bTm0#&(>C@(x|5(?aC-TNhR#r3MP*YJ#B|GEELiw zT>N4%OU~^wvkHsJKmU(`f9+NIk0giuwU>-|>A)b*Ed4#aEq+_Qq=Xrh>y4Qb5}N~z z&V{$#_j5S;Rl#$D*aAOgF#%?_hDoa%bNB@2Pi!nK6mc%I>f&^;H8>giizlg*x2NZS zfKS7#82zIQWcSXxD43zZ%-qG8XAa|S$-Q+--c2`r9Ojx!NJQA?8>!X1O=tOB`p3|NkG(Y{=em{=|tL5!25b%EmJK6p2n=nw;b; z@z`EO`+%CE(VFW|(|h7%kNpro;%>;8@h&W_?qf$A+gtmDqYg}oOv;b#GF@*zxXOEL zf5IdMsT`&Yj_E%lZ!)PpU-{2v8q3C+4U^1o%#g5sUV5{}Z925d$ V*!Oz|J=y~b4^LM=mvv4FO#mstjFA8U literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_no_bus_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_no_bus_line.png new file mode 100755 index 0000000000000000000000000000000000000000..fc20dca73c6966b7a0ef7a1fe7d41b167fe900d1 GIT binary patch literal 13534 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 Uh9g@3`?p9^RPJZBuwKCb09^Nox&QzG literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_blue_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..dc4c4f6f0da0a03c903cf6a1e7f84dc2864a3204 GIT binary patch literal 1427 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 LNkvXXu0mjfKvgIU literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_point_grey_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..d43e34bb2634ebe1ea0028dff390741c8fa32990 GIT binary patch literal 1580 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 Uh9g@3`?p9^RPJZBuwKCb09^Nox&QzG literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_arrow_blue_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..026c36086ffd6c895244972e447844158dd17e76 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^96)T#!3HEJ?9iABq!^2X+?^QKos)S9Eak- zA^3KxBOjxqfNTB9BLddd8>imr6u!ZsC}<`mt@nV(%r8kj`Nj>aM&=#uE(RJ`FIV{( zyT9;D+qLSRf9dj|xk@<|jGI?QEb^RKc-4<%#^i>6pZi+?VnxH*!`r|7 zF8KT4*TJucmoq7T7x)xY8MjMgqilh6kAq$OvcMGkIUKrzxydW8w6xi7Zdl#I-NhM` z*s*f%L5Bq00=7lh|I2#xX(TIsSSfUq>5!ahPvG+QrmWh21(|>&9uH!b|C%=~ej>HN vd%H=Eak- zA($NU+kR&wBUgpwji~cR%l@~0bTm0#&(>C@(x|5(?aC-TNhR#r3MP*YJ#B|GEELiw zT>N4%OU~^wvkHsJKmU(`f9+NIk0giuwU>-|>A)b*Ed4#aEq+_Qq=Xrh>y4Qb5}N~z z&V{$#_j5S;Rl#$D*aAOgF#%?_hDoa%bNB@2Pi!nK6mc%I>f&^;H8>giizlg*x2NZS zfKS7#82zIQWcSXxD43zZ%-qG8XAa|S$-Q+--c2`r9Ojx!NJQA?8>!X1O=tOB`p3|NkG(Y{=em{=|tL5!25b%EmJK6p2n=nw;b; z@z`EO`+%CE(VFW|(|h7%kNpro;%>;8@h&W_?qf$A+gtmDqYg}oOv;b#GF@*zxXOEL zf5IdMsT`&Yj_E%lZ!)PpU-{2v8q3C+4U^1o%#g5sUV5{}Z925d$ V*!Oz|J=y~b4^LM=mvv4FO#mstjFA8U literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_no_bus_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_no_bus_line.png new file mode 100755 index 0000000000000000000000000000000000000000..fc20dca73c6966b7a0ef7a1fe7d41b167fe900d1 GIT binary patch literal 13534 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 Uh9g@3`?p9^RPJZBuwKCb09^Nox&QzG literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_blue_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_blue_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..dc4c4f6f0da0a03c903cf6a1e7f84dc2864a3204 GIT binary patch literal 1427 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 LNkvXXu0mjfKvgIU literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_grey_bus.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_point_grey_bus.png new file mode 100755 index 0000000000000000000000000000000000000000..d43e34bb2634ebe1ea0028dff390741c8fa32990 GIT binary patch literal 1580 zcmV+{2GjY8P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91CZGcV1ONa40RR91CIA2c0EF@&TL1tBmPtfGR9Fe^mQ8FMMHI)qYkQqI zveVFnmL3{fL_-BcDu)89#0ex+(GS7Bv=?q1xO3;W-kf7TsApbI zfhiPfaSnrLPo8@|H?aK-+Y?JCa2C)(a^{S|;vd|(_t5Mg)1S{0!kKjOjl@Y!%a|D+ z-9OM@yzjKCWXdIq*z@F6V_dJ>IaSW6DBe!JzJZa`!^8UrBq1+LZgRx7B(Nrw>z;x%~FS=KN3=61(IE zP(d0BCGd58WQ<}4PLy=}W z^WrCzDc=vqWmis&?^{(&^KtH)Ee?!DoVggR2chSU5Y(2?-8!d+f^wYAnG-+rEDBlJ zhy>HYHR z?K#d^^Y)2i=FMHtXTl!#h`k+< zw$!Mi@CMc?B|q#=$uPC@Pid+xc)}nFj7&6BrC+{!`(nMi&i@*kiM33&w?JGF`zdi{ zq@r^vr?VD|OxW;r;iTDiPb{`1!_Cpasb*qku~s>$s+ z0+bg3vJtxP7yD#<>*}S6a`|qVm}10MKovr!Y~uiSHfoQthH-;}oAck@9NP8BHu>1@ zBZ+~OgtkW&3x>!>MWd8`N5*#+N}tSp^VWM3Yenp?*qRvMG9Xn9d9Fe3S9S;=*?!jh>0Et4#GvBi&xNKfoxboTMsW;yZ!}>BqF~HWv07JP=fr(%9YfPyz zbG;>S`r4JrnM@{kBVXLL$CFQpQOA{vX9FZRm|XSh+O6xQ$+L6czVlH8>W(Y|rX|&K z%2ccAm2J(~Ct$RUee%rz2#R9c#0JF**=)YJ`{5%8i}#Kl$o1W`+s_6?l&e3(X)Ns}$$gVHJd^9mX$Xt*p7)r2*a|8%R30K8>mQdDB zO9In30F1Zd?P<(2CNW7VGhoDtf&s2z_yI)EoE~^RTbfIjS}h3-58Xfj8UYnl!6;+& z2N^$n0K%`Ecs;~;PB+y4uehaM%M7s7G?0000 + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml new file mode 100644 index 0000000000..9276383a2a --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml @@ -0,0 +1,28 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml new file mode 100644 index 0000000000..3d60449b26 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml @@ -0,0 +1,54 @@ + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml index 57ae0979a5..0e9b06e8b6 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -12,7 +12,7 @@ - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toLeftOf="@+id/bus_task_time_tv"/> + + - - - - - - - + - - + - - - - - + android:layout_marginTop="@dimen/dp_18" + android:layout_marginLeft="@dimen/dp_68" + app:layout_constraintRight_toRightOf="@+id/bus_task_time_tv" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/bus_panel_second_station"/> + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml index cc1babed1f..dc56f53ed7 100644 --- a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -86,7 +86,7 @@ 92px 30px - 616px + 618px 754px @@ -138,4 +138,5 @@ 154px 130px 60px + 27px \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml index dee684f3e6..50b5675277 100644 --- a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml @@ -86,7 +86,7 @@ 92px 30px - 616px + 618px 754px @@ -136,4 +136,5 @@ 154px 130px 60px + 27px \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml index 96338fac55..90e66e5a88 100644 --- a/OCH/mogo-och-bus/src/main/res/values/colors.xml +++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml @@ -45,4 +45,8 @@ #FFFFE198 #FFFF9B00 #59FFFFFF + + #8E9DD4 + #2B6EFF + #00FFF8 \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/dimens.xml b/OCH/mogo-och-bus/src/main/res/values/dimens.xml index ce34734e02..83e1b61a23 100644 --- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml @@ -152,4 +152,6 @@ 154px 130px 60px + + 27px \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/strings.xml b/OCH/mogo-och-bus/src/main/res/values/strings.xml index 992ab6c19c..09ead5d3c0 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -26,4 +26,12 @@ 下一站: 自动驾驶状态为0不可用 进站 + + + 班次: + + 提示 + 您确认要结束路线吗? + 确认 + 取消 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt new file mode 100644 index 0000000000..1e0fde8d5f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHCommitDialog.kt @@ -0,0 +1,95 @@ +package com.mogo.och.common.module.wigets + +import android.content.Context +import android.widget.TextView +import androidx.lifecycle.LifecycleObserver +import com.mogo.module.common.dialog.BaseFloatDialog +import com.mogo.och.common.module.R + +/** + * 带有title, tip,confirm,cancel的dialog + */ +class OCHCommitDialog: BaseFloatDialog, LifecycleObserver { + + private var commonConfirm : TextView? = null + private var commonCancel : TextView? = null + private var commonTitle : TextView? = null + private var commonTips : TextView? = null + + private var clickListener: ClickListener? = null + + constructor(builder: Builder,context: Context) : super(context) { + commonTitle?.text = builder.titleStr + commonTips?.text = builder.tipsStr + commonCancel?.text = builder.cancelStr + commonConfirm?.text = builder.confirmStr + } + + init{ + setContentView(R.layout.dialog_bus_commit) + + setCanceledOnTouchOutside(true) + + commonConfirm = findViewById(R.id.common_confirm) + commonCancel = findViewById(R.id.common_cancel) + commonTitle = findViewById(R.id.common_title) + commonTips = findViewById(R.id.common_tips) + + commonConfirm?.setOnClickListener{ + clickListener?.confirm() + dismiss() + } + commonCancel?.setOnClickListener { + clickListener?.cancel() + dismiss() + } + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + fun showUpgradeDialog(){ + if(isShowing){ + return + } + show() + } + + interface ClickListener{ + fun confirm() + fun cancel() + } + + class Builder{ + var titleStr:String = "" + var tipsStr:String = "" + var confirmStr:String = "" + var cancelStr:String = "" + + fun title(title: String) : Builder{ + this.titleStr = title + return this + } + + fun tips(tips: String) : Builder{ + this.tipsStr = tips + return this + } + + fun confirmStr(commit: String) : Builder{ + this.confirmStr = commit + return this + } + + fun cancelStr(cancel: String) : Builder{ + this.cancelStr = cancel + return this + } + + fun build(context: Context): OCHCommitDialog? { + return OCHCommitDialog(this,context) + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java new file mode 100644 index 0000000000..5280174fd2 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/OCHRoundConstraintLayout.java @@ -0,0 +1,165 @@ +package com.mogo.och.common.module.wigets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.MotionEvent; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.mogo.och.common.module.R; + + +/** + * author : donghongyu + * e-mail : 1358506549@qq.com + * date : 2020/5/27 2:08 PM + * desc : + * version: 1.0 + */ +public class OCHRoundConstraintLayout extends ConstraintLayout implements GestureDetector.OnGestureListener { + + private float roundLayoutRadius = 14f; + private Path roundPath; + private RectF rectF; + + // 上次滑动的坐标 + private int mLastXIntercept; + private int mLastYIntercept; + + private IScrollListener mScrollListener; + + private GestureDetector mDetector; + + public OCHRoundConstraintLayout(Context context) { + this(context, null); + } + + public OCHRoundConstraintLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundLayout); + roundLayoutRadius = typedArray.getDimensionPixelSize(R.styleable.RoundLayout_roundLayoutRadius, (int) roundLayoutRadius); + typedArray.recycle(); + + init(); + } + + public OCHRoundConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + + private void init() { + setWillNotDraw(false);//如果你继承的是ViewGroup,注意此行,否则draw方法是不会回调的; + roundPath = new Path(); + rectF = new RectF(); + mDetector = new GestureDetector(getContext(), this); + } + + private void setRoundPath() { + //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行 + roundPath.reset(); + roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW); + } + + + public void setRoundLayoutRadius(float roundLayoutRadius) { + this.roundLayoutRadius = roundLayoutRadius; + setRoundPath(); + postInvalidate(); + } + + public void setScrollListener(IScrollListener listener) { + mScrollListener = listener; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + rectF.set(0f, 0f, getMeasuredWidth(), getMeasuredHeight()); + setRoundPath(); + } + + @Override + public void draw(Canvas canvas) { + if (roundLayoutRadius > 0f) { + canvas.clipPath(roundPath); + } + super.draw(canvas); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + boolean intercepted = false; + int x = (int) ev.getX(); + int y = (int) ev.getY(); + switch (ev.getAction()) { + case MotionEvent.ACTION_MOVE: + int deltaX = x - mLastXIntercept; + int deltaY = y - mLastYIntercept; + if (Math.abs(deltaX) > Math.abs(deltaY)) { + intercepted = true; + } + break; + default: + break; + } + mLastXIntercept = x; + mLastYIntercept = y; + return intercepted; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mDetector != null) { + return mDetector.onTouchEvent(event); + } else { + return super.onTouchEvent(event); + } + } + + @Override + public boolean onDown(MotionEvent e) { + return true; + } + + @Override + public void onShowPress(MotionEvent e) { + } + + @Override + public boolean onSingleTapUp(MotionEvent e) { + return true; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + return true; + } + + @Override + public void onLongPress(MotionEvent e) { + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + if (e2 != null) { + float deltaX = e2.getX() - (e1 != null ? e1.getX() : 0f); + float deltaY = e2.getY() - (e1 != null ? e1.getY() : 0f); + if (Math.abs(deltaX) > Math.abs(deltaY)) { + if (mScrollListener != null) { + mScrollListener.onScroll(velocityX < 0); + } + } + } + return true; + } + + public interface IScrollListener { + void onScroll(boolean isNextPage); + } +} diff --git a/OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml b/OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml new file mode 100644 index 0000000000..9f65ffcb79 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/layout/dialog_bus_commit.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/colors.xml b/OCH/mogo-och-common-module/src/main/res/values/colors.xml new file mode 100644 index 0000000000..3c1365f4de --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #3B4577 + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/res/values/styles.xml b/OCH/mogo-och-common-module/src/main/res/values/styles.xml new file mode 100644 index 0000000000..d983a865a0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/res/values/styles.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file From d355d9816148b27660806a955be06a9faed8774d Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Tue, 20 Sep 2022 19:49:24 +0800 Subject: [PATCH 031/226] =?UTF-8?q?[1.6.0]=20bus=E4=B9=98=E5=AE=A2?= =?UTF-8?q?=E5=B1=8F=E8=B7=AF=E7=BA=BF=E9=9D=A2=E6=9D=BF=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusPassengerLineStationsAdapter.java | 121 +++++++++--------- .../bus_p_line_blue.png | Bin 0 -> 475 bytes .../bus_p_line_green.png | Bin 0 -> 494 bytes .../bus_p_line_grey.png | Bin 0 -> 505 bytes .../bus_p_point_blue.png | Bin 0 -> 996 bytes .../bus_p_point_gray.png | Bin 0 -> 632 bytes .../bus_p_point_green.png | Bin 0 -> 6180 bytes .../res/drawable-xhdpi/bus_p_line_blue.png | Bin 0 -> 475 bytes .../res/drawable-xhdpi/bus_p_line_green.png | Bin 0 -> 494 bytes .../res/drawable-xhdpi/bus_p_line_grey.png | Bin 0 -> 505 bytes .../res/drawable-xhdpi/bus_p_point_blue.png | Bin 0 -> 996 bytes .../res/drawable-xhdpi/bus_p_point_gray.png | Bin 0 -> 632 bytes .../res/drawable-xhdpi/bus_p_point_green.png | Bin 0 -> 6180 bytes .../res/layout/bus_p_stations_common_item.xml | 70 ++++++++++ 14 files changed, 128 insertions(+), 63 deletions(-) create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_blue.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_green.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_grey.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_blue.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_gray.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_green.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_blue.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_green.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_grey.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_blue.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_gray.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_green.png create mode 100644 OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java index 93e66bad7e..bdcdac6271 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java @@ -8,6 +8,7 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.Group; import androidx.recyclerview.widget.RecyclerView; import com.mogo.och.bus.passenger.R; @@ -15,6 +16,8 @@ import com.mogo.och.bus.passenger.bean.BusPassengerStation; import java.util.List; +import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_ARRIVING; +import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_LEAVING; import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_STOPPED; /** @@ -28,7 +31,6 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter stations){ this.mContext = context; @@ -38,78 +40,54 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.AdapterN^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&b9?9?Dx&i1}by)ba4#v z;C&lr>&@&aP`kNvnUHY6iSsA*Kjd>{C8oPvS$*Zyp_mODE?{rI`#)t{fqv6o-5F_2|A`gYwL$WBJ<<7hcb=AbWA^>b zxtNdofh~Wz7};`}w`j8*O1QIJ{G*qPg;rY!2aC?*Ss;)4(@3>bo9FDQ>CWb3xV0(nH+KJ94uDPU}#-M=pboFyt=akR{0MgO32LJ#7 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_line_green.png new file mode 100644 index 0000000000000000000000000000000000000000..dab0bedbfad45823e710dccff347919e28058ef5 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^JV0#A!3HE}26wy%QjEnx?oJHr&dIz4a$Hg)JkxxA z8MJ_G4hF{dOa>N^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&b9?9?Dx&i1}cm2ba4#v z;C&lr>wnllq~?5C!&KG@4i_fbUy47_pWrC^ra?ee_>IX@X6c?Y2Ido%#T!i))YU5b>8|( zLfPDl9!9<3-74tW=znr~isylNUT*`gx4}V=HZaVeq$<(+@Bfq;m;9L+A0@orx_9|! z$z?q<|4cbHDrVnY&f_Anr1#$D&ypI6$8YlGu^l=7$TBeBVM;$|Rn(vOwTzB;d=FK; zNSVMsS9k3MKgDy;PVsfzsJ*>M(pqv!1((RWy6)B13UPJszAW!!lL?OLF5S4b+2+R2 z6_RJ?@EFZ}Shu4tUr5?oV1c@zTle(&2bUh7wIuQV$pzY)R~?%EG))aXyvXFl9eK6g zcN-lS2kc~Ie8$LN^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&b9?9?Dx&i1}aPTba4#v z;7y*h?bViF|NsBLDzTtp;>3?(VKZL(O32SmW7PcjfBr#s#gFye6MBQ0g`E@&*97t& zX}O%C(c31}Cm`V~Wx>SeT46FJpoy71-DFAu3s0B9Tjx&Jqjns}^G=-#{uOaV^55U| zsJ?}a5$T^9MVk${5|UCXCI}}MO|P&wFj~hv(_spmo7%C{8=kQ^@*dcByk3p%+E;_` zf>#*6yzD$<(7fCwGa)76$Ki8-(uI8tJC0>D3oAd~H^pFexl1Mk+vDx}_BYEEw2x&U z{{P?Sw)f*N`xj*&=&;zp%iOkn<_w8>`*v)5 zsbY3i!H|cyUUJ4Ya}$$4hnF%Q_3Y{4*4zoAIV5aOiTH5@bKsN3Wi+=vv!HcK2eJ@ a3{Yf9776ZI7}5obTn0~9KbLh*2~7Y;(7e9@ literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_blue.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6947f4538da2a8c1d52c2339f72174f579ab5b0f GIT binary patch literal 996 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$jKx9jP7LeL$-D%~q(*qA`T8rk6I|A10W*RPQh4Cz;r&46ex5FlAr*{o zXKc(DHWWEFznE7zRw8(t#{xc4=g;;Vmc`yoOmN_7H%jZ7(%IOU*Rl8Pxl=d%ctoAe zZZ$Ht88yB;^L_6R+3Rn%xqQ{Jto#1v^WE>CH_OiNP*;DzGN(bffXVLwrv)QUPNNWu zQ)hdQ{o@a{GXM5X%9K!GpUI;o$@@VqRQ39X^AF=??@YgXvin2&?|XNyA8mYd{?SC1 zNTwqak60h2HtT%=3>QJnq$5uvLx2=>_x7(z&k~ zdnZiuk3XFw=XAUNW6U?db$#1^|NRgwCJ^D?kl`!Edc0mYb5Ygg0>^|)UVmS%-F0ut ztTnC^IVyh`$vM7Q>BntzQR&FC(`&P5TkS3DnKyT#%=8&{HydT_`VYT%)HD3@I4??N z;~XL8BO2l%t;xZx40&rczpzKjzd2R+u60}Yg_y#Mt0%T(rk=?>bjL))P&R6c;nXj) zWivPH-rm@IGw@h^-AR+{)lvIzHac9ma%AQKkBuU;Hg&3ru)5jje9pGM!@S{UV@iAo zW8$LAjF+7jGbBY8?d|!%xtN93-OXF#%jIR0ea-Bv&bLgr4CYi&7G)J>Yih7~<+DX| zMybingfg@DscAaMqiHSBW-I#g#o?5j;{F^_?1z<_?Y0Up5&QmnzrduEb2c#_ zJQ3IKCbzPn&*;*&b^l8L*K?LHZy)3pV#PjpWDowxoFKVrc!awXsz64$BTFQCjZ%HeegQ+FpmAX-|hJc@j7_XEj z+u=n@jR6L|I`iM2>ZzUL@mF^Jku~tb6Z}-<~oCmz~pOSMJ}dEi9?F z&qBa%hWdl`_9;=Ub9}XCKH$Eo;rP-{@m=VqOJ9%QyW)*A^`fNfMr+px`nwcXa5!yf QYX;>oPgg&ebxsLQ0NE?2SpWb4 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_gray.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9da6fb76f3de78391d72506d0196be41ce320e GIT binary patch literal 632 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$jKx9jP7LeL$-D%~q(*qA`T8rk6I|A10W*RPQh4Cz;r&2mk33x*Ln;{G z-Z1n#Y#?&1aQA@&yaLP$g{^rV%m+etcni8ayoy~QEW@zzE0@QCh8>K|i`3$;dS$jc z&-oF_^Pf+pbpHL#^@}p&<~(j?VB%0{z(oW&9hk1MDKgoN+gg5pzViFSCt3}7&b`+@ zw)?}oJ@Z>1EU(_pe)-{r`rLC{>*8geJpA}H>D^tGmV!H5EZ_hAtgz$b&6gKrgJa&E z?`jNTX#TzY`s`O0em7lMjVz3^0&lGl@k63-b{XI=M9)4lUJ<1>X@6RHGC*RDRhRL*p}i~QnJQO3Z9soe8> zlz7gD_6e<5x|>(4Y@@I$Tj%`$&&o&Qr=1qS7w8QQjR*J{geTqf(B}RNigiy{KbLh* G2~7ar)c6+w literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_point_green.png new file mode 100644 index 0000000000000000000000000000000000000000..f02d893f648de9a42a4fd12f72033e2c4c3f061e GIT binary patch literal 6180 zcmV+<7~AKGP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91M4$rz1ONa40RR91L;wH)0KnP9zW@Lij!8s8RCodHn@w{Z$9cz}nc4Tn z8$m)8C|N?B*ilhAMHk=XLr$iy%9qGRx11u8`ULtMW>u<^l3bOl9HbARo205lj*GGt z(lS60zykX^FZunur*~%;3t~YcNtNwpEqbP>=jrG9_w&|0&B*>gN@3AT!$wxD)bAQQ z#n(vdkAl={Gj$bFSDpQ<(0pFsYu2Kd2joHks@neG<;QWLd{iNN0m+vH=+7pzpnVs> zywIz9yHq186K6ARxL>~awS9f{ajIjM*Kga~ZlFNdH(#PPSJar*7`+gLnebvxjLr-H zzMALCzJ0UWnB`kLcDIUl+4^uwQy|@+-h~T+v}BkSz^Mfi|6BDU06lxWgwxeWUk=df z?_bvQa^}uyN0_jgcD!FPiG6$9(X0wSv^&#r-ms_B>&uwa^WWOdFrc;U@$`D#?zrn6 z`+C~;urw)8H<;4GaF=MwLhlNT=YY_&F!qD!e%aNV$om#FApju|7KI;J&y6>-vvSm`bm?9ze!_!8gx`#AS^_8nVa<;1 zDLGH#UP>*BG8;t+f~qb_xhk$3FEA~(L1(~y#WCDD4{?z;Z6*L}12F1=3yBbdmU zCGk2Sh)8N32gEucq&7rTBG=B$#+gkVoown${IKC~Vq-UWVs*5|&Y7ond_eV=!* zZV3M;$Xn4Ar^b~o<>d@K4~Bfk+Ya#n2Dap?%0NqWzfmGumfAwdtAf)8To>^G01XL`yV9TVrS}jj6H4gLn}rp0}rH z>l4SbcvnaW6C2PtFE@mjHD1;x2daV3>;MqfnYn~qppBWdFd>uyU!S23DKnYcG4~y6 zV^-TBb4q&@N0?G>UGG@t25g!%BC;BOBF%GK!;ehd42_9Z_zyIr&hL(lCSF665CR7~ zzLpK|{FmxmaaH2!Nm=Fn?iA-T=eXbix zWDSH*B{=nv_Btk$LXINq{#`V68|D@sj!2Hg{afZ_1vU@tEVfP{A*;DCJjO(pr-Ma{<$SJJgb z$V63{4I|_#q}BnX&+ON6bP?K;ig}p?0@efq*IL6&(3VIbaji@?#rJqNxCWF2X;K)W z3poZ_geGM~nVPhPfAY|(Nz(uhO#!Smo==ps5c1p78nop!y3ODX{LcP#5+6%0C!|l= zg1l}%oWKi!co6*G0Li~&D#}EAFu&)(fC26Y{I-~_0$}7Q$Ef}WGkO335g;|W4nPbU zrzHnLpIksWGl{sy%u2nL;Uow;VfJe%hrqF1?*I}SGo-GQizEP}bg3j43Xq*TH z%td@f{EpyDInF6PH=*>%N$eMdL9XS#8_ za;QqonHRUYsc37SR;Dq;Y%q9tjZeiqAf%bC!MwmpZVqnW zYo*-};w(d=q4N&%A_={q&`Oi!E%15kjqFGNFi!fPJZT<&mNWU72OTCtA2X`4o^j^G za0<^J-VR!ENvW2G?0umN-evf01{yz%uOlt;njD!Z6 zjl!xAtxDN5%*o=l3bSD+LCSChu;aZQTA zksa)|4G57_TZK|FEvG6qmP(Vh*W+>PgULycnP+|xJZML?mZnVa(Gb@UUj}y5^v&ByozV>9u|HIM?R1p3$gk9_Xm*a*-xEzwTcI~| zV`^-TS>;FfFH%-;s@f7%fJ5D#O`2weWNGYb5OpcJU!P>Cw2K)qDD};gd=%d+`Xu&} z*s+cK0KSYdo^OTJi{$-aVyTr@h9H5MmtHGqp_UZukVaHqF zOte#_rB{M7G+KW8jX z(pM&*il%;kjOv&(e#G007Pc;&t~#M+MCS3+N1%pnpq~0jGz59=MXbTTw){K!#9Ho0 z>Lq{xMZX%qoPJnQEB$2LVaJnEIB!do|PKm`=Ax{eWYEfcKV5Ec|b&4 zTaDTv$~1r*U%ZGX@g^R{t9Tag;bXa;`!X+Mz~Mq467~$(e#3Adkpkaft7X&eDkxGk z*nGjwF{w(B_(H?tnk_yUWjV$j_Ki2lNuf!g->7}o`w#ospxb)4ea4cXH>9N6#c-2N zRp3Y5HFW_f3cESizXbx8v0o&2FgyS+loe=pnDJUL&kWHJcMfU?OW^3e@98^M>v%#zGSKh_a2m8oVQBL<*2 z+xqM1!=fI2ak|DwEG^N1GH8J_52$)gK}4>5Q2&;eqCg(+8-g2RaRJ+&Qffaw2qs9&t+k=?Kh)A-ASR)osH5k=`i`0o3 zpbb@R!?dah@GQ_s|R`E|KkCJ;mYkbh>b8HJuXlb3Ic_&$!ur?+}GsiKz8quh= zW}md*NIzrlWk~$AeK=tkEXl@p1P@K1(>It16RG9whd7?tk8#h$D<=lfj!pQH!Cqb# z0QsnV>4DyqR+9|xl4JN|PzQWKny|mH3Gxlwh5@a_wVpUYaD~l`fjcR)$o3vvO3)xf z#cb+4i}4Ue-q{;`+O_(>o%|+$@2sEv;ezp1I_)|OxQ{F}r z#h(ZbnaElJAkS*Hf!XM~j~3JbB;tejExy-i|21PLWmNouEg?Sp!K*Lf)26@EiN+xB z{j!HQv+2#^g>0>7+R9gX#Ba~pY12C|J_?NiCPzwf-o}C1EG}L z$RFjr(?BZ{=;z8m92lPV2!SI2YoHYat|#il1V(6SQt;`UdwnE7=6;yv)UKFo&sr`>KG<_xHYJ1e5Em9!@Ze15|qm!$*8* zviyt_JricP#f7TVGWlr_vPLg-^mMUJ$Q13P9rMhi~?U3IL9C0xmXZ8)(Hz#$g(O zXl6rp+c|^6P|tw2z`5?^C*-y|W+hY65l$VP`P`j~4yTFaP)l*8q-A-I$%HNsaYQ<= zr7|_0h_C&=H7|%b1$(T6(r?rNCv)Hc41Puh zF)4v7IY*!6%1lOFYbD#pG&f4k=p*zlVZBE>I6;G?xdYa`Z8WG`h&Ku5!SJTyovF-a zxv6M;l@$Q-9jkw9_z#&*7temiNdUxQ=C(13L-tgg9Ej@?YV~D5%F!13`e6z-ePc|F zkKhQHq9rY+)$hp$`bw}kJHk(k+*9bTQ)}@b;ipoxLfZ=s9B&V8h%po8JlkjoFaSo^ z-jsGYQ&HPhOQ|#EYg3ca{r$=_f7s5Oj*emKNYyqGAaF?3FqsDTN0`Sgv_a7%IM9Jps(H;g z5kQ#AVd+Spl%^ue!CZ8G-@U6V2Ap2cYe;x72aMkECi6LdMPb-~H1?l5H4F9fsDTcy z1W?WpL?6HlA`<)NSsQ;Na5(;e=4i{2AnH~%9Su+^ednyzfMdpoXeob;S+1cCPXVTd z!15Qq1TaX~X@63J@hV_^g^-W!b9Z1SnEZqAny-VrmDY+DR9YP%0kj8|K6g3E>^~Uq zJHx+A#_@Z!M8~S0p$QphG!#m2DU!gozM=G8-Er-L;RKMz(Ch+;uPY;SsRXaV;6O@^ z19id!6NHtLclasC&>H1HaRpP7&rn3^p&75z{te#EAIp^2nAZ$BQx#aa8X*2P@9F|5 z{#20;uzB;*!CgfjZ$4&k5>&r)9x@}c2pk>O6)2*X6HawJ!PmOihph9(J4qp~1H8v& zt@{o@3^>di<6O_2U=4hR*>`xUU?$aw;^DxNmLOCji-vu1KmyZ$?}XKzzI^%5o!+PD zw1Bk5?61&*A6W2x2N+$z(6?26;oIlkZFh>)Yt0Y`tEJsMC;~%(>6rlVZcz?%2f_CN zMJw(z((^abirWbKYodwQ3ZHyEam)LM(^Jgi_Lox=bDE(hl_h}8`w-vFcRc4u^iW89 zEeY8F+?_2~IDW?O5Kw*%0EaNXLEjSu(HDk30(QwV4{@qH07jr8Nb19vk~@FcR`k92 zb$8NGu}LYr2SKY=(efrG+TYQ?2N-gmO1%6z_s>OUt_1CvYg`J3dcfEPWeyO=n=8SD zKBDy@H2lZociiDT-|^VKa@wRLoN7@t@=s(c%5+r(q)rJ|i_WS)aSa|+|BO>Yj)`!l zebfGCI_qCf5B%%@%*cU0C!266e+6> z0;u-jya_m==+v`z+p0xvTA_-$8_<=12nYLJvrD-Am9n9q(nkP_hnFwYS-X(bg_;ty zL~r^$#nT8!4IUGs-*HXKTl_Qa!Ripp>P03Idi(thty#aM$*;iYfvDygRqdz@d4Xnx zF)BSn(~^1)l<-`9RzV5vvqT5EYD#^v`AV6r}LCvpHWH$eIWi<_{@^emG7WutMYn0NxOp!)hqzzTN3nE=&BGor_ zz3}$p;}z~N1xPfOfwThcb6u)_Av|0V;feqRDxsbxTA|@jyFV` z;{7EozNAK6akRzm*K~g=XyrK9EbJ=W|Jh^~Q2HN$Q?mPm`_!-i0000N^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&b9?9?Dx&i1}by)ba4#v z;C&lr>&@&aP`kNvnUHY6iSsA*Kjd>{C8oPvS$*Zyp_mODE?{rI`#)t{fqv6o-5F_2|A`gYwL$WBJ<<7hcb=AbWA^>b zxtNdofh~Wz7};`}w`j8*O1QIJ{G*qPg;rY!2aC?*Ss;)4(@3>bo9FDQ>CWb3xV0(nH+KJ94uDPU}#-M=pboFyt=akR{0MgO32LJ#7 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_line_green.png new file mode 100644 index 0000000000000000000000000000000000000000..dab0bedbfad45823e710dccff347919e28058ef5 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^JV0#A!3HE}26wy%QjEnx?oJHr&dIz4a$Hg)JkxxA z8MJ_G4hF{dOa>N^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&b9?9?Dx&i1}cm2ba4#v z;C&lr>wnllq~?5C!&KG@4i_fbUy47_pWrC^ra?ee_>IX@X6c?Y2Ido%#T!i))YU5b>8|( zLfPDl9!9<3-74tW=znr~isylNUT*`gx4}V=HZaVeq$<(+@Bfq;m;9L+A0@orx_9|! z$z?q<|4cbHDrVnY&f_Anr1#$D&ypI6$8YlGu^l=7$TBeBVM;$|Rn(vOwTzB;d=FK; zNSVMsS9k3MKgDy;PVsfzsJ*>M(pqv!1((RWy6)B13UPJszAW!!lL?OLF5S4b+2+R2 z6_RJ?@EFZ}Shu4tUr5?oV1c@zTle(&2bUh7wIuQV$pzY)R~?%EG))aXyvXFl9eK6g zcN-lS2kc~Ie8$LN^5+IfWVg?501&j>LK$;OGwtxvP%d>zP&b9?9?Dx&i1}aPTba4#v z;7y*h?bViF|NsBLDzTtp;>3?(VKZL(O32SmW7PcjfBr#s#gFye6MBQ0g`E@&*97t& zX}O%C(c31}Cm`V~Wx>SeT46FJpoy71-DFAu3s0B9Tjx&Jqjns}^G=-#{uOaV^55U| zsJ?}a5$T^9MVk${5|UCXCI}}MO|P&wFj~hv(_spmo7%C{8=kQ^@*dcByk3p%+E;_` zf>#*6yzD$<(7fCwGa)76$Ki8-(uI8tJC0>D3oAd~H^pFexl1Mk+vDx}_BYEEw2x&U z{{P?Sw)f*N`xj*&=&;zp%iOkn<_w8>`*v)5 zsbY3i!H|cyUUJ4Ya}$$4hnF%Q_3Y{4*4zoAIV5aOiTH5@bKsN3Wi+=vv!HcK2eJ@ a3{Yf9776ZI7}5obTn0~9KbLh*2~7Y;(7e9@ literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_blue.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6947f4538da2a8c1d52c2339f72174f579ab5b0f GIT binary patch literal 996 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$jKx9jP7LeL$-D%~q(*qA`T8rk6I|A10W*RPQh4Cz;r&46ex5FlAr*{o zXKc(DHWWEFznE7zRw8(t#{xc4=g;;Vmc`yoOmN_7H%jZ7(%IOU*Rl8Pxl=d%ctoAe zZZ$Ht88yB;^L_6R+3Rn%xqQ{Jto#1v^WE>CH_OiNP*;DzGN(bffXVLwrv)QUPNNWu zQ)hdQ{o@a{GXM5X%9K!GpUI;o$@@VqRQ39X^AF=??@YgXvin2&?|XNyA8mYd{?SC1 zNTwqak60h2HtT%=3>QJnq$5uvLx2=>_x7(z&k~ zdnZiuk3XFw=XAUNW6U?db$#1^|NRgwCJ^D?kl`!Edc0mYb5Ygg0>^|)UVmS%-F0ut ztTnC^IVyh`$vM7Q>BntzQR&FC(`&P5TkS3DnKyT#%=8&{HydT_`VYT%)HD3@I4??N z;~XL8BO2l%t;xZx40&rczpzKjzd2R+u60}Yg_y#Mt0%T(rk=?>bjL))P&R6c;nXj) zWivPH-rm@IGw@h^-AR+{)lvIzHac9ma%AQKkBuU;Hg&3ru)5jje9pGM!@S{UV@iAo zW8$LAjF+7jGbBY8?d|!%xtN93-OXF#%jIR0ea-Bv&bLgr4CYi&7G)J>Yih7~<+DX| zMybingfg@DscAaMqiHSBW-I#g#o?5j;{F^_?1z<_?Y0Up5&QmnzrduEb2c#_ zJQ3IKCbzPn&*;*&b^l8L*K?LHZy)3pV#PjpWDowxoFKVrc!awXsz64$BTFQCjZ%HeegQ+FpmAX-|hJc@j7_XEj z+u=n@jR6L|I`iM2>ZzUL@mF^Jku~tb6Z}-<~oCmz~pOSMJ}dEi9?F z&qBa%hWdl`_9;=Ub9}XCKH$Eo;rP-{@m=VqOJ9%QyW)*A^`fNfMr+px`nwcXa5!yf QYX;>oPgg&ebxsLQ0NE?2SpWb4 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_gray.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9da6fb76f3de78391d72506d0196be41ce320e GIT binary patch literal 632 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$jKx9jP7LeL$-D%~q(*qA`T8rk6I|A10W*RPQh4Cz;r&2mk33x*Ln;{G z-Z1n#Y#?&1aQA@&yaLP$g{^rV%m+etcni8ayoy~QEW@zzE0@QCh8>K|i`3$;dS$jc z&-oF_^Pf+pbpHL#^@}p&<~(j?VB%0{z(oW&9hk1MDKgoN+gg5pzViFSCt3}7&b`+@ zw)?}oJ@Z>1EU(_pe)-{r`rLC{>*8geJpA}H>D^tGmV!H5EZ_hAtgz$b&6gKrgJa&E z?`jNTX#TzY`s`O0em7lMjVz3^0&lGl@k63-b{XI=M9)4lUJ<1>X@6RHGC*RDRhRL*p}i~QnJQO3Z9soe8> zlz7gD_6e<5x|>(4Y@@I$Tj%`$&&o&Qr=1qS7w8QQjR*J{geTqf(B}RNigiy{KbLh* G2~7ar)c6+w literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_green.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_point_green.png new file mode 100644 index 0000000000000000000000000000000000000000..f02d893f648de9a42a4fd12f72033e2c4c3f061e GIT binary patch literal 6180 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 + + + + + + + + + + + + \ No newline at end of file From 78bf858c2ac198508c4080d54fae7dc346fd38c8 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Tue, 20 Sep 2022 20:59:05 +0800 Subject: [PATCH 032/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E4=B9=98=E5=AE=A2=E5=B1=8F=E8=B7=AF=E7=BA=BF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/BusPassengerBaseFragment.java | 3 ++ .../ui/BusPassengerRouteFragment.java | 1 + .../main/res/layout/bus_p_base_fragment.xml | 2 +- .../res/layout/bus_p_stations_common_item.xml | 3 +- .../mogo/och/bus/fragment/BusFragment.java | 45 +++++++++---------- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java index e2b0ac575c..143e4d1cc4 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java @@ -22,6 +22,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.bus.passenger.R; import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.common.module.utils.NumberFormatUtil; +import com.mogo.och.common.module.wigets.OCHBorderShadowLayout; /** * Created on 2022/3/31 @@ -102,6 +103,8 @@ public abstract class BusPassengerBaseFragment + app:layout_constraintTop_toTopOf="@+id/bus_p_circle" + app:layout_constraintBottom_toBottomOf="@+id/bus_p_circle"/> startStation = stationList.get(0); endStation = stationList.get(stationList.size() - 1); - //切换路线和结束路线按钮切换 - if (arrivingOrArrivedIndex == 0 && isArrived){ - showOrHideSwitchLineBtn(true); - }else { + if (arrivingOrArrivedIndex == stationList.size() - 1 && isArrived){ + //切换路线和结束路线按钮切换 showOrHideSwitchLineBtn(false); - } - if (arrivingOrArrivedIndex == 0){ - setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, startStation.getLat() - , startStation.getLon(),R.raw.star_marker); - setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() + showSlidePanle("单程结束"); + + setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); - }else if (arrivingOrArrivedIndex == stationList.size() - 1){ - if (isArrived) { - setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); - } else { - setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() - , endStation.getLon(),R.raw.end_marker); - } + }else if (arrivingOrArrivedIndex == 0 && isArrived){ + + showOrHideSwitchLineBtn(true); + + showSlidePanle("滑动出发"); + + setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, + startStation.getLat(), startStation.getLon(),R.raw.star_marker); + setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, + endStation.getLat(), endStation.getLon(),R.raw.end_marker); }else { + + showOrHideSwitchLineBtn(false); + + // 重置滑动按钮文字 + showSlidePanle("滑动出发"); + setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); } - // 重置滑动按钮文字 - if (arrivingOrArrivedIndex == stationList.size() -1 && isArrived) { - showSlidePanle("单程结束"); - } else if (isArrived){ - showSlidePanle("滑动出发"); - } - if (stationList.size() > 2){ //只有两个站点 updateMoreThanTwoStationsUI(stationList,arrivingOrArrivedIndex,isArrived); }else { From 055d186b6d7fd0cbc7fab8ebc73bd749fc5e478f Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 14 Sep 2022 19:46:06 +0800 Subject: [PATCH 033/226] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../appupgrade/network/UpgradeApiService.java | 7 +- .../network/UpgradeAppNetWorkManager.java | 32 ++-- .../appupgrade/network/UpgradeAppRequest.java | 57 ++----- .../bindingcar/BindingcarProvider.java | 28 +++- .../eagle/core/data/bindingcar/AppInfo.java | 148 +++++++----------- .../core/data/bindingcar/UpgradeAppInfo.java | 20 ++- .../module/common/constants/HostConst.java | 3 +- 7 files changed, 130 insertions(+), 165 deletions(-) diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java index f6357e630a..b18c08508d 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java @@ -11,7 +11,7 @@ import retrofit2.http.Query; /** * @author lixiaopeng - * @description 绑定车辆 + * @description 升级 * @since: 6/20/22 */ public interface UpgradeApiService { @@ -21,7 +21,8 @@ public interface UpgradeApiService { * @return {@link UpgradeAppInfo} */ @Headers("Content-Type:application/json;charset=UTF-8") - @POST("unify/selectResources") - Observable getUpgradeInfo(@Query("resources") String res, @Body RequestBody requestBody); + @POST("/eagleEye-mis/config/versionInfo") +// Observable getUpgradeInfo(@Query("resources") String res, @Body RequestBody requestBody); + Observable getUpgradeInfo(@Body RequestBody requestBody); } 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 cefcdcc149..cb2599ff70 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 @@ -35,7 +35,7 @@ import okhttp3.RequestBody; public class UpgradeAppNetWorkManager { private static volatile UpgradeAppNetWorkManager requestNoticeManager; private final UpgradeApiService mUpgradeApiService; - private static final String TAG = "UpgradeAppNetWorkManager"; + private static final String TAG = "Upgrade"; private UpgradeAppNetWorkManager() { @@ -58,18 +58,16 @@ public class UpgradeAppNetWorkManager { /** * 获取app升级信息 */ - public void getAppUpgradeInfo(Context context, String screenType, String carType) { + public void getAppUpgradeInfo(Context context, String mac, String screenType) { String sn = "X20202203105S688HZ"; -// int versionCode = 2070000; -// String versionName = "2.7.0"; - +// String mac = "48:b0:2d:3a:bc:78"; // String sn = MoGoAiCloudClientConfig.getInstance().getSn(); int versionCode = AppUtils.getAppVersionCode(); - String versionName = AppUtils.getAppVersionName(); - UpgradeAppRequest request = new UpgradeAppRequest(sn, versionCode, versionName, screenType, carType); + //TODO 不能写死 + UpgradeAppRequest request = new UpgradeAppRequest(sn, mac, screenType); RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); - mUpgradeApiService.getUpgradeInfo("apps_control", requestBody) + mUpgradeApiService.getUpgradeInfo(requestBody) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -79,18 +77,20 @@ public class UpgradeAppNetWorkManager { @Override public void onNext(@NonNull UpgradeAppInfo info) { - if (info != null && info.getData() != null && info.getData().size() > 0) { - CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo url = " + info.getData().get(0).getApp_url() + "----code = " + info.getData().get(0).getVersion_code()); -// if (info.getData().get(0).getVersion_code() > versionCode) { - - CallerHmiManager.INSTANCE.showUpgradeDialog(info.getData().get(0).getApp_url().substring(info.getData().get(0).getApp_url().lastIndexOf("/")+1), info.getData().get(0).getApp_url()); -// } + if (info != null) { + CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode()); + Log.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode() + "--versionCode =" + versionCode + "--info.result = " + info.result); + if (info.result.getVersionCode() > versionCode) { + CallerHmiManager.INSTANCE.showUpgradeDialog(info.result.getAppUrl().substring(info.result.getAppUrl().lastIndexOf("/")+1), info.result.getAppUrl()); + } + } else { + Log.e(TAG, "onNext info == null"); } } @Override - public void onError(@NonNull Throwable e) { - CallerLogger.INSTANCE.e(TAG, "UpgradeAppInfo onError e = " + e.toString() + "---e.getMessage = " + e.getMessage()); + public void onError(Throwable e) { + } @Override diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java index 78e35e9531..ab5c927cc2 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java @@ -6,18 +6,15 @@ package com.mogo.eagle.core.function.appupgrade.network; * @since: 11/15/21 */ public class UpgradeAppRequest { + private String mac; private String sn; - private int version_code; - private String version_name; - private String screen_type; - private String car_type; + private String screenType; - public UpgradeAppRequest( String sn, int versionCode, String versionName, String type, String carType) { + + public UpgradeAppRequest( String sn, String mac, String screenType) { this.sn = sn; - this.version_code = versionCode; - this.version_name = versionName; - this.screen_type = type; - this.car_type = carType; + this.mac = mac; + this.screenType = screenType; } public String getSn() { @@ -28,46 +25,20 @@ public class UpgradeAppRequest { this.sn = sn; } - public int getVersion_code() { - return version_code; + public String getMac() { + return mac; } - public void setVersion_code(int version_code) { - this.version_code = version_code; + public void setMac(String mac) { + this.mac = mac; } - public String getVersion_name() { - return version_name; + public String getScreenType() { + return screenType; } - public void setVersion_name(String version_name) { - this.version_name = version_name; + public void setScreenType(String screenType) { + this.screenType = screenType; } - public String getScreen_type() { - return screen_type; - } - - public void setScreen_type(String screen_type) { - this.screen_type = screen_type; - } - - public String getCar_type() { - return car_type; - } - - public void setCar_type(String car_type) { - this.car_type = car_type; - } - - @Override - public String toString() { - return "UpgradeAppRequest{" + - "sn='" + sn + '\'' + - ", version_code=" + version_code + - ", version_name='" + version_name + '\'' + - ", screen_type='" + screen_type + '\'' + - ", car_type='" + car_type + '\'' + - '}'; - } } diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index 8a5e01ee78..f04f3343c3 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -116,6 +116,10 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { } } + /** + * 以后可能废弃 + * @return + */ private int getScreenType() { int screenType = -1; if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { @@ -142,12 +146,34 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { } + private String getCarScreenType() { + String screenType = ""; + if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + screenType = "1"; //taxi乘客端 + } + + if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + screenType = "2"; //taxi司机端 + } + + if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + screenType = "3"; //bus 乘客端 + } + + if(AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + screenType = "4"; //bus 司机端 + } + + return screenType; + } + /** * 查询app是否需要升级 */ @Override public void queryAppUpgrade() { - UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, String.valueOf(getScreenType()), String.valueOf(getCarType())); + Log.d("Upgrade", "mac = " + mAddress + "---type = " + getCarScreenType() ); + UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, mAddress, getCarScreenType()); } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java index 9ac0f4394e..eb573de5f3 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java @@ -8,140 +8,100 @@ import java.io.Serializable; * @since 6/21/22 */ public class AppInfo implements Serializable { - private IdInfo _id; - private int bk_inst_id; - private String bk_inst_name; - private String bk_supplier_account; - private String screen_type; //1,司机屏,2乘客屏 - private String sn; - private String last_time; - private String app_url; - private String bk_obj_id; - private int version_code; - private String version_name; - private String create_time; - private String car_type; + private String appUrl; + private int versionCode; + private String versionName; + private String screenType; + private String installTitle; + private String installContent; + private String installType; + private String beginTime; + private String endTime; - public IdInfo get_id() { - return _id; + public String getAppUrl() { + return appUrl; } - public void set_id(IdInfo _id) { - this._id = _id; + public void setAppUrl(String appUrl) { + this.appUrl = appUrl; } - public int getBk_inst_id() { - return bk_inst_id; + public int getVersionCode() { + return versionCode; } - public void setBk_inst_id(int bk_inst_id) { - this.bk_inst_id = bk_inst_id; + public void setVersionCode(int versionCode) { + this.versionCode = versionCode; } - public String getBk_inst_name() { - return bk_inst_name; + public String getVersionName() { + return versionName; } - public void setBk_inst_name(String bk_inst_name) { - this.bk_inst_name = bk_inst_name; + public void setVersionName(String versionName) { + this.versionName = versionName; } - public String getBk_supplier_account() { - return bk_supplier_account; + public String getScreenType() { + return screenType; } - public void setBk_supplier_account(String bk_supplier_account) { - this.bk_supplier_account = bk_supplier_account; + public void setScreenType(String screenType) { + this.screenType = screenType; } - public String getScreen_type() { - return screen_type; + public String getInstallTitle() { + return installTitle; } - public void setScreen_type(String screen_type) { - this.screen_type = screen_type; + public void setInstallTitle(String installTitle) { + this.installTitle = installTitle; } - public String getSn() { - return sn; + public String getInstallContent() { + return installContent; } - public void setSn(String sn) { - this.sn = sn; + public void setInstallContent(String installContent) { + this.installContent = installContent; } - public String getApp_url() { - return app_url; + public String getInstallType() { + return installType; } - public void setApp_url(String app_url) { - this.app_url = app_url; + public void setInstallType(String installType) { + this.installType = installType; } - public String getBk_obj_id() { - return bk_obj_id; + public String getBeginTime() { + return beginTime; } - public void setBk_obj_id(String bk_obj_id) { - this.bk_obj_id = bk_obj_id; + public void setBeginTime(String beginTime) { + this.beginTime = beginTime; } - public int getVersion_code() { - return version_code; + public String getEndTime() { + return endTime; } - public void setVersion_code(int version_code) { - this.version_code = version_code; - } - - public String getVersion_name() { - return version_name; - } - - public void setVersion_name(String version_name) { - this.version_name = version_name; - } - - public String getLast_time() { - return last_time; - } - - public void setLast_time(String last_time) { - this.last_time = last_time; - } - - public String getCreate_time() { - return create_time; - } - - public void setCreate_time(String create_time) { - this.create_time = create_time; - } - - public String getCar_type() { - return car_type; - } - - public void setCar_type(String car_type) { - this.car_type = car_type; + public void setEndTime(String endTime) { + this.endTime = endTime; } @Override public String toString() { return "AppInfo{" + - "_id=" + _id + - ", bk_inst_id=" + bk_inst_id + - ", bk_inst_name='" + bk_inst_name + '\'' + - ", bk_supplier_account='" + bk_supplier_account + '\'' + - ", screen_type='" + screen_type + '\'' + - ", sn='" + sn + '\'' + - ", last_time='" + last_time + '\'' + - ", app_url='" + app_url + '\'' + - ", bk_obj_id='" + bk_obj_id + '\'' + - ", version_code=" + version_code + - ", version_name='" + version_name + '\'' + - ", create_time='" + create_time + '\'' + - ", car_type='" + car_type + '\'' + + "appUrl='" + appUrl + '\'' + + ", versionCode=" + versionCode + + ", versionName='" + versionName + '\'' + + ", screenType='" + screenType + '\'' + + ", installTitle='" + installTitle + '\'' + + ", installContent='" + installContent + '\'' + + ", installType='" + installType + '\'' + + ", beginTime='" + beginTime + '\'' + + ", endTime='" + endTime + '\'' + '}'; } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java index 840ee74d66..deafb46c3a 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java @@ -10,20 +10,26 @@ import java.util.ArrayList; * @since: 6/21/22 */ public class UpgradeAppInfo extends BaseData { - public ArrayList data; +// public ArrayList data; +// +// public ArrayList getData() { +// return data; +// } +// +// public void setData(ArrayList data) { +// this.data = data; +// } - public ArrayList getData() { - return data; - } + public AppInfo result; - public void setData(ArrayList data) { - this.data = data; + public void setResult(AppInfo data) { + this.result = data; } @Override public String toString() { return "UpgradeAppInfo{" + - "data=" + data + + "result=" + result + '}'; } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java index 1caf51adcb..1a9fad34fd 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java @@ -22,6 +22,7 @@ public class HostConst { public static final String BINDING_SN_HOST = "https://mygateway.zhidaozhixing.com/cmdbapi/"; //中台提供的接口服务 public static final String BINDING_SN_HOST_TEST = "https://mygateway.zhidaozhixing.com/cmdbapitest/"; //中台提供的接口服务测试 - public static final String UPGRADE_APP_HOST = "http://10.0.200.12:32423?/"; +// public static final String UPGRADE_APP_HOST = "http://10.0.200.12:32423?/"; + public static final String UPGRADE_APP_HOST = "https://eagle-qa.zhidaozhixing.com/"; } From 18d1137627c30f6cd94ae561b146b49b744afaaf Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 21 Sep 2022 12:04:45 +0800 Subject: [PATCH 034/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E4=B9=98=E5=AE=A2=E5=B1=8F=E8=B7=AF=E7=BA=BF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusPassengerLineStationsAdapter.java | 15 ++++++++------ .../mogo/och/bus/fragment/BusFragment.java | 20 ++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java index bdcdac6271..6a5cf47c32 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java @@ -55,10 +55,12 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter startStation.getLat(), startStation.getLon(),R.raw.star_marker); setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat(), endStation.getLon(),R.raw.end_marker); - }else { + }else{ + if (isArrived){ + // 重置滑动按钮文字 + showSlidePanle("滑动出发"); + } showOrHideSwitchLineBtn(false); - // 重置滑动按钮文字 - showSlidePanle("滑动出发"); - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() @@ -227,12 +228,17 @@ public class BusFragment extends BaseBusTabFragment secondStationItem.setVisibility(View.VISIBLE); thirdStationItem.showOrHideStationArrowBg(false); - if (arrivingOrArrivedIndex == 0){ + if (arrivingOrArrivedIndex == 0 || arrivingOrArrivedIndex -1 == 0){ firstStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_start)); + }else { + firstStationItem.setStationTag(""); } - if (arrivingOrArrivedIndex + 1 == stationList.size() - 1 - || arrivingOrArrivedIndex + 2 == stationList.size() - 1){ //确认是否显示 "终" + + if (arrivingOrArrivedIndex + 1 == stationList.size() - 1 || arrivingOrArrivedIndex == stationList.size() - 1 + || (arrivingOrArrivedIndex == 0 && arrivingOrArrivedIndex + 2 == stationList.size() - 1)){ //确认是否显示 "终" thirdStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_end)); + }else { + thirdStationItem.setStationTag(""); } //圆点: 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 From 1517497c78281202cfa85722e99918d146af0939 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Wed, 21 Sep 2022 14:49:22 +0800 Subject: [PATCH 035/226] opt --- .../function/appupgrade/network/UpgradeAppNetWorkManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cb2599ff70..709103a240 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 @@ -77,7 +77,7 @@ public class UpgradeAppNetWorkManager { @Override public void onNext(@NonNull UpgradeAppInfo info) { - if (info != null) { + if (info != null && info.result != null) { CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode()); Log.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode() + "--versionCode =" + versionCode + "--info.result = " + info.result); if (info.result.getVersionCode() > versionCode) { From 831f601ca3e807636e40aa64a637fba6fe275e09 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 21 Sep 2022 16:39:40 +0800 Subject: [PATCH 036/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E4=B9=98=E5=AE=A2=E5=B1=8F=E8=B7=AF=E7=BA=BF?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusPassengerLineStationsAdapter.java | 52 ------------- .../bean/BusPassengerRoutesResponse.java | 1 + .../bean/BusPassengerRoutesResult.java | 20 +++++ .../passenger/bean/BusPassengerStation.java | 27 +++++++ .../IBusPassengerRouteLineInfoCallback.java | 2 + .../passenger/model/BusPassengerModel.java | 11 +++ .../presenter/BaseBusPassengerPresenter.java | 10 +++ .../ui/BusPassengerRouteFragment.java | 18 +++++ .../res/layout/bus_p_no_data_common_view.xml | 2 +- .../main/res/layout/bus_p_route_fragment.xml | 2 +- .../res/layout/bus_p_stations_end_item.xml | 72 ------------------ .../res/layout/bus_p_stations_middle_item.xml | 61 --------------- .../res/layout/bus_p_stations_start_item.xml | 74 ------------------- .../src/main/res/values/strings.xml | 3 +- .../mogo/och/bus/fragment/BusFragment.java | 13 +--- .../src/main/res/layout/bus_no_line_view.xml | 4 +- .../src/main/res/layout/fragment_och_bus.xml | 8 +- .../src/main/res/values/strings.xml | 8 +- 18 files changed, 106 insertions(+), 282 deletions(-) delete mode 100644 OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml delete mode 100644 OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml delete mode 100644 OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java index 6a5cf47c32..25ef3ead6d 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java @@ -28,9 +28,6 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter mStations; - private static final int LINE_START_STATION_ITEM = 0; - private static final int LINE_END_STATION_ITEM = 1; - private static final int LINE_MIDDLE_STATION_ITEM = 2; public BusPassengerLineStationsAdapter(Context context, List stations){ this.mContext = context; @@ -99,19 +96,6 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter + android:text="@string/bus_p_no_out"/> \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml index 58ae13004c..2dd36c279b 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml @@ -148,7 +148,7 @@ android:layout_height="match_parent" android:layout_marginTop="@dimen/dp_280" android:paddingBottom="@dimen/dp_30" - android:paddingLeft="@dimen/bus_p_route_info_margin_left" + android:paddingLeft="@dimen/dp_30" android:paddingRight="@dimen/bus_p_route_info_margin_right" android:requiresFadingEdge="vertical" app:layout_constraintLeft_toLeftOf="@+id/bus_p_driver_num_plate_tv" diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml deleted file mode 100644 index 9d2edfd07f..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml deleted file mode 100644 index 9acb37947a..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml deleted file mode 100644 index 50ed06a589..0000000000 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml index d142ef29fc..0f4dc17854 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml @@ -1,7 +1,8 @@ KM/H - 您已收车 + 您已收车 + 暂无班次 到达站: diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index e7dad27d26..b256f9f2a4 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -48,18 +48,11 @@ public class BusFragment extends BaseBusTabFragment implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener { private static final String TAG = "BusFragment"; -// private TextView mCurrentStationName; -// private TextView mNextStationName; -// private TextView mCurrentTag; -// private TextView mNextTag; private TextView mSwitchLine; //切换路线 private TextView mLineName; private TextView mTaskTime; private Group groupStationsPanel; private ConstraintLayout noDataView; -// private int mCurrentStation = 0; - -// private View mBus; private BusStationBean startStation = null; private BusStationBean endStation = null; @@ -75,10 +68,7 @@ public class BusFragment extends BaseBusTabFragment @Override protected void initViews() { super.initViews(); -// mCurrentStationName = findViewById(R.id.module_och_bus_current_station); -// mCurrentTag = findViewById(R.id.module_och_bus_current_station_anchor); -// mNextStationName = findViewById(R.id.module_och_bus_order_end_station); -// mNextTag = findViewById(R.id.module_och_bus_next_station_anchor); + mSwitchLine = findViewById(R.id.switch_line_btn); mSwitchLine.setTag(0); mLineName = findViewById(R.id.module_och_bus_line_name); @@ -224,6 +214,7 @@ public class BusFragment extends BaseBusTabFragment int arrivingOrArrivedIndex, boolean isArrived) { secondStationItem.setStationTag(""); + secondStationItem.showOrHideStationArrowBg(true); thirdStationItem.setStationTag(""); secondStationItem.setVisibility(View.VISIBLE); thirdStationItem.showOrHideStationArrowBg(false); diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml index 9276383a2a..9cbebe5646 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_no_line_view.xml @@ -1,7 +1,7 @@ @@ -24,5 +24,5 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/no_line_data_iv" - android:text="暂无服务订单"/> + android:text="@string/bus_no_task_tip"/> \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml index 0e9b06e8b6..8609630b9c 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml @@ -97,7 +97,7 @@ android:layout_height="@dimen/bus_switch_line_btn_height_1" android:layout_marginLeft="@dimen/dp_28" android:layout_marginTop="@dimen/dp_40" - app:layout_goneMarginTop="@dimen/dp_400" + app:layout_goneMarginTop="@dimen/dp_600" android:background="@drawable/bus_switch_line_btn" android:gravity="center" android:text="@string/bus_switch_line_btn" @@ -109,10 +109,10 @@ app:layout_constraintLeft_toLeftOf="parent" /> + android:layout_marginTop="@dimen/dp_160" + app:layout_constraintTop_toTopOf="parent"/> 起点: 终点: 确认 - 切换路线 - 结束路线 + 选择任务 + 结束任务 自动驾驶状态中,不可切换或结束路线 当前行程未完成,不可切换路线 当前车辆无路线\n请联系运营人员绑定 @@ -31,7 +31,9 @@ 班次: 提示 - 您确认要结束路线吗? + 您确认要结束任务吗? 确认 取消 + + 暂无任务 From 376aeae7f3dfe5012e426234da7ba89c84effb3c Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Wed, 21 Sep 2022 16:47:44 +0800 Subject: [PATCH 037/226] =?UTF-8?q?[change]=20=E5=AE=8C=E5=96=84=E5=A4=87?= =?UTF-8?q?=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhidao/support/adas/high/bean/AutopilotAbility.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java index 7ecbfe6bb5..c9e3dc9fa1 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java @@ -11,11 +11,13 @@ public class AutopilotAbility { /** * 刹车踏板开度 0~100 * -1表示未赋值 + * 值为0时表示 制动踏板未踩下 */ public final float brake; /** * 挡位 * null表示未赋值 + * 挡位处于P挡和R挡时不能启动自动驾驶 */ public final Chassis.GearPosition gear; /** From 8c31bb7320760711042981bdfb3e06c4930a936e Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 21 Sep 2022 16:51:10 +0800 Subject: [PATCH 038/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=E4=BB=BB=E5=8A=A1=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/och/bus/fragment/BusFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index b256f9f2a4..d21c1eae71 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -303,6 +303,7 @@ public class BusFragment extends BaseBusTabFragment secondStationItem.setVisibility(View.GONE); secondStationItem.showOrHideStationArrowBg(false); + thirdStationItem.showOrHideStationArrowBg(false); firstStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_start)); thirdStationItem.setStationTag(getResources().getString(R.string.bus_station_txt_tag_end)); From 99763d236d819c9e022c1bcdd9248828e058cece Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 21 Sep 2022 17:35:42 +0800 Subject: [PATCH 039/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=20=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/bean/BusCloseTaskRequest.java | 20 ++++++ .../bus/bean/BusQueryLineStationsRequest.java | 3 +- .../bus/bean/BusUpdateSiteStatusRequest.java | 8 +-- .../mogo/och/bus/fragment/BusFragment.java | 4 +- .../com/mogo/och/bus/model/BusOrderModel.java | 68 ++++++++++++------- .../mogo/och/bus/net/BusServiceManager.java | 39 +++++++---- .../com/mogo/och/bus/net/IBusApiService.java | 34 ++++++++-- .../mogo/och/bus/presenter/BusPresenter.java | 4 +- 8 files changed, 128 insertions(+), 52 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java new file mode 100644 index 0000000000..02c4e1e8f1 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java @@ -0,0 +1,20 @@ +package com.mogo.och.bus.bean; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; + +/** + * + */ +public class BusCloseTaskRequest { + + private String sn; + private int taskId; + public BusCloseTaskRequest(int taskId) { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + this.taskId = taskId; + } + + public String getSn() { + return sn; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java index 6485027084..87fdd01745 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java @@ -2,14 +2,13 @@ package com.mogo.och.bus.bean; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -public /** * @author congtaowang * @since 2021/3/22 * * 根据车机行驶线路站点信息 */ -class BusQueryLineStationsRequest { +public class BusQueryLineStationsRequest { private String sn; private double lat; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java index a9552157ff..c25bccb128 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java @@ -12,16 +12,14 @@ import com.mogo.commons.network.Utils; public class BusUpdateSiteStatusRequest { public String sn; + public int taskId; public int seq;//站点序号 public int siteId;//站点id - public double lon; - public double lat; - public BusUpdateSiteStatusRequest(int seq, int siteId, double lon, double lat) { + public BusUpdateSiteStatusRequest(int taskId,int siteId,int seq) { this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); this.seq = seq; this.siteId = siteId; - this.lon = lon; - this.lat = lat; + this.taskId = taskId; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index d21c1eae71..edae3fb2cc 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -505,7 +505,7 @@ public class BusFragment extends BaseBusTabFragment if ((int)mSwitchLine.getTag() == 0){//切换路线 Intent intent = new Intent(getContext(), BusSwitchLineActivity.class); startActivity(intent); - }else {//结束路线 + }else {//结束任务 OCHCommitDialog.Builder builder = new OCHCommitDialog.Builder(); OCHCommitDialog closeLineConfirmDialog = builder .title(getString(R.string.bus_dialog_title)) @@ -516,7 +516,7 @@ public class BusFragment extends BaseBusTabFragment closeLineConfirmDialog.setClickListener(new OCHCommitDialog.ClickListener() { @Override public void confirm() { - mPresenter.resetCurrentLineStatus(); + mPresenter.abortTask(); } @Override 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 9929bafac1..31aa80465e 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 @@ -504,13 +504,13 @@ public class BusOrderModel { /** * 重置路线站点状态--结束路线,当前路线恢复到始发站 */ - public void resetCurrentLineStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线"); - BusServiceManager.getInstance().resetCurrentLineStatus(mContext, currentLineId + public void abortTask() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线abortTask"); + BusServiceManager.getInstance().abortTask(mContext, currentLineId , new IBusServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { - CallerLogger.INSTANCE.d(M_BUS + TAG, "结束当前路线成功: " + o); + CallerLogger.INSTANCE.d(M_BUS + TAG, "abortTask success: " + o); isGoingToNextStation = false; if (o.code == 0){ // 重置成功 queryBusRoutes(); @@ -528,27 +528,22 @@ public class BusOrderModel { /** * 离站上报 */ - public void leaveStation(boolean isOneWayOver,boolean isRestart){ + public void leaveStation(boolean isRestart){ CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); - BusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq() - , stationList.get(backgroundCurrentStationIndex).getSiteId(), new IBusServiceCallback() { + BusServiceManager.getInstance().leaveStation(mContext, + stationList.get(backgroundCurrentStationIndex).getSeq(), + stationList.get(backgroundCurrentStationIndex).getSiteId(), + currentLineId, + new IBusServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) { return; } isArrivedStation = false; - if (!isOneWayOver){ - CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" ); - //需要更改当前站和下一站的状态 然后渲染 - leaveStationSuccess(o.getResult(),isRestart); - }else { - CallerLogger.INSTANCE.d( M_BUS + TAG, "单程真的结束了====" ); - isGoingToNextStation = false; - backgroundCurrentStationIndex = 0; - CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); - queryBusRoutes(); - } + CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" ); + //需要更改当前站和下一站的状态 然后渲染 + leaveStationSuccess(o.getResult(),isRestart); } @Override public void onFail(String failMsg) { @@ -649,9 +644,11 @@ public class BusOrderModel { } CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex); - BusServiceManager.getInstance().arriveSiteStation(mContext - , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId() - , new IBusServiceCallback() { + BusServiceManager.getInstance().arriveSiteStation(mContext , + stationList.get(arrivedStationIndex).getSeq(), + stationList.get(arrivedStationIndex).getSiteId(), + currentLineId , + new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); @@ -810,7 +807,7 @@ public class BusOrderModel { travelOver(); return; } - leaveStation(false,isRestart); + leaveStation(isRestart); } /** @@ -984,7 +981,32 @@ public class BusOrderModel { CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" ); CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" ); - leaveStation(true,true); +// leaveStation(true,true); + endTask(); + } + + /** + * task正常结束 + */ + private void endTask() { + CallerLogger.INSTANCE.d( M_BUS + TAG, "任务正常走完endTask()"); + BusServiceManager.getInstance().endTask(mContext, currentLineId + , new IBusServiceCallback() { + @Override + public void onSuccess(BusRoutesResponse o) { + CallerLogger.INSTANCE.d(M_BUS + TAG, "endTask success: " + o); + if (o.code == 0){ // 重新获取任务 + isGoingToNextStation = false; + backgroundCurrentStationIndex = 0; + queryBusRoutes(); + } + } + + @Override + public void onFail(String failMsg) { + ToastUtils.showShort(failMsg); + } + }); } public boolean isWorking() { diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index 44284cb122..5fbd7f23b2 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -10,8 +10,8 @@ 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.utilcode.mogo.logger.CallerLogger; +import com.mogo.och.bus.bean.BusCloseTaskRequest; import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.bean.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; @@ -83,17 +83,31 @@ public class BusServiceManager { } /** - * 结束当前路线,当前路线状态重置到始发站 + * 结束当前任务 * @param context - * @param lineId + * @param taskId * @param callback */ - public void resetCurrentLineStatus(Context context, int lineId, IBusServiceCallback callback){ - mService.resetCurrentLineStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + public void abortTask(Context context, int taskId, IBusServiceCallback callback){ + mService.abortTask(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusResetLineStatusRequest()) + ,new BusCloseTaskRequest(taskId)) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"resetCurrentLineStatus")); + .subscribe(getSubscribeImpl(context,callback,"abortTask")); + } + + /** + * 正常结束任务 + * @param context + * @param taskId + * @param callback + */ + public void endTask(Context context, int taskId, IBusServiceCallback callback){ + mService.endTask(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new BusCloseTaskRequest(taskId)) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"endTask")); } /** @@ -103,11 +117,10 @@ public class BusServiceManager { * @param siteId * @param callback */ - public void leaveStation(Context context, int seq, int siteId, IBusServiceCallback callback){ + public void leaveStation(Context context, int seq, int siteId,int taskId, IBusServiceCallback callback){ mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusUpdateSiteStatusRequest(seq,siteId, BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) + ,new BusUpdateSiteStatusRequest(taskId,siteId,seq)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"leaveStation")); @@ -120,11 +133,11 @@ public class BusServiceManager { * @param siteId * @param callback */ - public void arriveSiteStation(Context context, int seq, int siteId, IBusServiceCallback callback){ + public void arriveSiteStation(Context context, int seq, int siteId,int taskId, + IBusServiceCallback callback){ mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusUpdateSiteStatusRequest(seq,siteId - , BusOrderModel.getInstance().mLongitude, BusOrderModel.getInstance().mLatitude)) + ,new BusUpdateSiteStatusRequest(taskId,siteId,seq)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"leaveStation")); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 291fb9f67f..799fbd2088 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -1,9 +1,9 @@ package com.mogo.och.bus.net; import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.bus.bean.BusCloseTaskRequest; import com.mogo.och.bus.bean.BusOperationStatusRequest; import com.mogo.och.bus.bean.BusOrdersResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.bean.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; @@ -59,7 +59,8 @@ public interface IBusApiService { */ @Headers({"Content-Type:application/json;charset=UTF-8"}) // @POST("/autopilot-car-hailing/car/v2/bus/driving/away") - @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away") +// @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away") + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/leave") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away") Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusUpdateSiteStatusRequest request); @@ -70,7 +71,8 @@ public interface IBusApiService { */ @Headers({"Content-type:application/json;charset=UTF-8"}) // @POST("/autopilot-car-hailing/order/v2/bus/driving/attachSite") - @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite") +// @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite") + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/arrive") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite") Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusUpdateSiteStatusRequest request); @@ -150,8 +152,30 @@ public interface IBusApiService { @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" ) Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); +// @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @POST("/autopilot-car-hailing/operation/v1/driver/bus/line/resetStart") +// Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); + + /** + * 中止任务 + * @param appId + * @param ticket + * @param data + * @return + */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST("/autopilot-car-hailing/operation/v1/driver/bus/line/resetStart") - Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") + Observable abortTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); + + /** + * 任务正常跑完结束 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endTask") + Observable endTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); } 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 435252fefa..89d48ed70c 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 @@ -94,8 +94,8 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().queryOperationStatus(); } - public void resetCurrentLineStatus() { - BusOrderModel.getInstance().resetCurrentLineStatus(); + public void abortTask() { + BusOrderModel.getInstance().abortTask(); } public void autoDriveToNextStation(boolean isRestart) { From 7190b445445cd3b63dd269e9c1e2911e27d1cfda Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 21 Sep 2022 17:57:42 +0800 Subject: [PATCH 040/226] Rename .java to .kt --- .../ui/{BusSwitchLineActivity.java => BusSwitchLineActivity.kt} | 0 .../{SwitchLineTaskAdapter.java => SwitchLineTaskAdapter.kt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/{BusSwitchLineActivity.java => BusSwitchLineActivity.kt} (100%) rename OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/{SwitchLineTaskAdapter.java => SwitchLineTaskAdapter.kt} (100%) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt similarity index 100% rename from OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java rename to OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt similarity index 100% rename from OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.java rename to OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt From 93d5bae0b4240ca108dd37bc96507b077e415d02 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 21 Sep 2022 17:57:42 +0800 Subject: [PATCH 041/226] =?UTF-8?q?[2110]=20=E8=B4=A6=E5=8F=B7=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=99=BB=E5=87=BA=E3=80=81=E5=88=87=E6=8D=A2=E8=B7=AF?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/bean/BusQueryLineTaskResponse.java | 19 ++ .../och/bus/bean/BusQueryLinesResponse.java | 4 +- .../bus/bean/BusResetDrivingLineRequest.java | 8 +- .../och/bus/callback/IBusLinesCallback.java | 3 +- .../mogo/och/bus/fragment/BusFragment.java | 32 +- .../com/mogo/och/bus/model/BusLineModel.java | 12 +- .../com/mogo/och/bus/model/BusOrderModel.java | 12 + .../mogo/och/bus/net/BusServiceManager.java | 16 +- .../com/mogo/och/bus/net/IBusApiService.java | 18 +- .../och/bus/presenter/BusLinePresenter.java | 28 +- .../mogo/och/bus/presenter/BusPresenter.java | 19 +- .../mogo/och/bus/ui/BusSwitchLineActivity.kt | 319 ++++++++---------- .../mogo/och/bus/ui/BusSwitchLineView.java | 3 +- .../och/bus/ui/adapter/SwitchLineAdapter.kt | 47 ++- .../bus/ui/adapter/SwitchLineTaskAdapter.kt | 119 +++---- .../biz/bean/DriverStatusQueryRespBean.java | 6 + .../module/biz/constant/OchCommonConst.kt | 2 + .../module/biz/model/OchCommonLoginModel.kt | 4 + .../model/OchCommonLoginStatusDefaultModel.kt | 3 + .../biz/network/OchCommonServiceApiNew.java | 34 +- .../biz/network/OchCommonServiceManager.java | 86 +++-- .../module/biz/provider/LoginServiceImpl.kt | 3 +- .../com/mogo/och/taxi/model/TaxiModel.java | 3 +- .../com/mogo/och/taxi/ui/TaxiFragment.java | 3 +- .../function/hmi/ui/tools/BusOperationView.kt | 20 +- 25 files changed, 517 insertions(+), 306 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java new file mode 100644 index 0000000000..4911c3cf99 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineTaskResponse.java @@ -0,0 +1,19 @@ +package com.mogo.och.bus.bean; + +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2022/2/9 + */ +public class BusQueryLineTaskResponse extends BaseData { + + public List data; + + public static class Result { + public int id; + public long taskStartTime; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java index 21dd901fc8..17540e3eed 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java @@ -19,9 +19,9 @@ public class BusQueryLinesResponse extends BaseData { public String startSiteName;//始发站名称 public String endSiteName;//终点名称 - public boolean open; + public boolean open;//true 打开状态 false public boolean haveTask; - public List taskList; + public List taskList; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java index c27264694f..6ab70768f9 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java @@ -9,10 +9,10 @@ import com.mogo.commons.network.Utils; */ public class BusResetDrivingLineRequest { public String sn; - public int lineId; //切换到的线路id + public int taskId; //切换到的线路id - public BusResetDrivingLineRequest(int lineId) { - sn = MoGoAiCloudClientConfig.getInstance().getSn(); - this.lineId = lineId; + public BusResetDrivingLineRequest(int taskId) { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + this.taskId = taskId; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java index 805a359757..74cac63aa3 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java @@ -1,5 +1,6 @@ package com.mogo.och.bus.callback; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; /** @@ -9,5 +10,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse; public interface IBusLinesCallback { void onBusLinesChange(BusQueryLinesResponse lines); void onChangeLineIdSuccess(); - void onBusLineTasks(BusQueryLinesResponse o, int position); + void onBusLineTasks(BusQueryLineTaskResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 7278755f1a..b03625c1c7 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -1,17 +1,22 @@ package com.mogo.och.bus.fragment; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import android.content.Intent; +import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.temp.EventBusOperation; +import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; @@ -27,6 +32,8 @@ import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.presenter.BusPresenter; import com.mogo.och.bus.ui.BusSwitchLineActivity; import com.mogo.och.bus.view.SlidePanelView; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.OCHThreadPoolManager; import org.greenrobot.eventbus.Subscribe; @@ -34,8 +41,6 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; -import mogo.telematics.pad.MessagePad; - /** * 网约车小巴界面 @@ -59,11 +64,28 @@ public class BusFragment extends BaseBusTabFragment private BusStationBean startStation = null; private BusStationBean endStation = null; + private LoginService loginService; + @Override public String getTagName() { return "BusFragment"; } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); + if(loginService!=null){ + loginService.registerFragment(this, getPresenter()); + } + } + @Override + public void onDestroyView() { + super.onDestroyView(); + loginService.unRegisterFragment(); + loginService = null; + } + @Override protected void initViews() { super.initViews(); @@ -101,6 +123,12 @@ public class BusFragment extends BaseBusTabFragment } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void changeOverview(EventLogout eventLogout){ + CallerLogger.INSTANCE.d(M_TAXI + TAG,"changeOverview Event消息去登出"); + mPresenter.logout(); + } + @Override protected void onArriveStation() { mPresenter.onAutopilotArriveAtStation(null); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 54014f9f5a..96e3308475 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -4,12 +4,15 @@ import android.content.Context; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.eagle.core.utilcode.util.SharedPrefs; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.callback.IBusLinesCallback; import com.mogo.och.bus.net.BusServiceManager; import com.mogo.och.bus.net.IBusServiceCallback; +import com.mogo.och.bus.ui.BusSwitchLineActivity; /** * @author: wangmingjun @@ -69,9 +72,9 @@ public class BusLineModel { * @param position 位置 */ public void queryBusLineTasksById(int lineId, int position){ - BusServiceManager.getInstance().queryBusLines(mContext, new IBusServiceCallback() { + BusServiceManager.getInstance().queryBusTaskByLineId(mContext, String.valueOf(lineId),new IBusServiceCallback() { @Override - public void onSuccess(BusQueryLinesResponse data) { + public void onSuccess(BusQueryLineTaskResponse data) { if (null == data && mBusLinesCallback != null) { mBusLinesCallback.onBusLineTasks(null,position); return; @@ -93,10 +96,11 @@ public class BusLineModel { }); } - public void commitSwitchLineId(int lineId){ - BusServiceManager.getInstance().switchLine(mContext,lineId, new IBusServiceCallback() { + public void commitSwitchLineId(int taskId,int lineId){ + BusServiceManager.getInstance().switchLine(mContext,taskId, new IBusServiceCallback() { @Override public void onSuccess(BusRoutesResponse o) { + SharedPrefs.getInstance(mContext).putInt(BusSwitchLineActivity.LASTCOMMITLINEID,lineId); if (mBusLinesCallback != null){ mBusLinesCallback.onChangeLineIdSuccess(); } 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 f8e5b3bd17..3294442a68 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 @@ -14,6 +14,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; +import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.cloud.commons.utils.CoordinateUtils; @@ -53,6 +54,8 @@ import com.mogo.och.bus.net.IBusServiceCallback; import com.mogo.och.bus.presenter.BusModelLoopManager; import com.mogo.och.bus.util.BusAnalyticsManager; import com.mogo.och.bus.util.BusTrajectoryManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; +import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.service.statusmanager.IMogoStatusChangedListener; @@ -116,6 +119,8 @@ public class BusOrderModel { private volatile boolean isArrivedStation = false; + private LoginService loginService; + private final Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { @@ -144,6 +149,7 @@ 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")) { @@ -351,6 +357,7 @@ public class BusOrderModel { //自动驾驶路线规划接口 CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); + loginService = null; } private Object readResolve() { @@ -998,6 +1005,11 @@ public class BusOrderModel { } } + // 登出 + public void logout() { + loginService.loginOut(mLatitude,mLongitude); + } + public void triggerStartServiceEvent(boolean isRestart, boolean send) { if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) { return; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index 44284cb122..a35c16e7bf 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -10,6 +10,7 @@ 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.utilcode.mogo.logger.CallerLogger; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; @@ -72,12 +73,12 @@ public class BusServiceManager { /** * 重置线路站点 * @param context - * @param lineId + * @param taskId * @param callback */ - public void switchLine(Context context, int lineId, IBusServiceCallback callback){ + public void switchLine(Context context, int taskId, IBusServiceCallback callback){ mService.switchLine(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(lineId)) + ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(taskId)) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus")); } @@ -211,6 +212,15 @@ public class BusServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryBusLines")); } + public void queryBusTaskByLineId(Context context,String lineId,IBusServiceCallback callback){ + mService.queryBusTaskByLineId(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,lineId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"queryBusLines")); + } + public void updateOrderRoute(Context context,int lineId, int startSiteId, int endSiteId , List< BusRoutePlanningUpdateReqBean.Result > points , IBusServiceCallback callback){ diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 291fb9f67f..9501ae03a5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -2,6 +2,7 @@ package com.mogo.och.bus.net; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.bus.bean.BusOperationStatusRequest; import com.mogo.och.bus.bean.BusOrdersResponse; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; @@ -45,11 +46,10 @@ public interface IBusApiService { /** * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的 * @return 返回值是重置后的车站列表 + * 开始路线 */ @Headers( {"Content-Type:application/json;charset=UTF-8"} ) -// @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" ) - @POST( "/autopilot-car-hailing/car/v2/driver/bus/drivingLine/reset" ) -// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" ) + @POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" ) Observable switchLine(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request); /** @@ -142,10 +142,20 @@ public interface IBusApiService { * @param sn * @return */ -// @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query") @GET("/autopilot-car-hailing/line/v2/driver/bus/bindLine/query") Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); + /** + * 查询路线当天的任务 + * @param appId + * @param ticket + * @param lineId 线路id + * @return + */ + @GET("/autopilot-car-hailing/line/v2/driver/bus/task/query") + Observable queryBusTaskByLineId(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("lineId") String lineId); + + @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" ) Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index 5fb1485874..7f1a70a0d1 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -7,18 +7,26 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.callback.IBusLinesCallback; import com.mogo.och.bus.model.BusLineModel; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.ui.BusSwitchLineView; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.disposables.Disposable; + /** * @author: wangmingjun * @date: 2022/2/9 */ public class BusLinePresenter extends Presenter implements IBusLinesCallback { + private Disposable subscribe; + public BusLinePresenter(BusSwitchLineView view) { super(view); BusLineModel.getInstance().init(); @@ -61,12 +69,21 @@ public class BusLinePresenter extends Presenter implements IB BusLineModel.getInstance().queryBusLines(); } - public void queryBusLineTasks(int lineId, int position){ + public void queryBusLineTasks(int lineId, int position,boolean close){ + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } + if(close){ + return; + } BusLineModel.getInstance().queryBusLineTasksById(lineId,position); + subscribe = Observable.interval(5, TimeUnit.SECONDS).subscribe(aLong -> { + BusLineModel.getInstance().queryBusLineTasksById(lineId,position); + }); } - public void commitSwitchLineId(int lineId){ - BusLineModel.getInstance().commitSwitchLineId(lineId); + public void commitSwitchLineId(int taskId,int lineId){ + BusLineModel.getInstance().commitSwitchLineId(taskId,lineId); } public void removeListener(){ @@ -80,11 +97,14 @@ public class BusLinePresenter extends Presenter implements IB @Override public void onDestroy(@NonNull LifecycleOwner owner) { super.onDestroy(owner); + if(subscribe!=null&&!subscribe.isDisposed()){ + subscribe.dispose(); + } } @Override - public void onBusLineTasks(BusQueryLinesResponse o, int position) { + public void onBusLineTasks(BusQueryLineTaskResponse o, int position) { mView.onBusLineTasks(o,position); } } 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 15b161f032..126a97dd83 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 @@ -24,6 +24,8 @@ import com.mogo.och.bus.callback.ISlidePannelHideCallback; import com.mogo.och.bus.fragment.BusFragment; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BusTrajectoryManager; +import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; +import com.mogo.och.common.module.biz.callback.ILoginCallback; import org.jetbrains.annotations.NotNull; @@ -41,7 +43,7 @@ import system_master.SystemStatusInfo; */ public class BusPresenter extends Presenter implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback - , IMoGoAutopilotStatusListener, IBusControllerStatusCallback { + , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback { private static final String TAG = "BusPresenter"; @@ -116,6 +118,11 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().onChangeOperationStatus(); } + // 登出 + public void logout() { + BusOrderModel.getInstance().logout(); + } + @Override public void changeOperationStatus(boolean changeStatus) { if (mView != null) { @@ -295,4 +302,14 @@ public class BusPresenter extends Presenter public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { } + + @Override + public void loginSuccess(DriverStatusQueryRespBean data) { + + } + + @Override + public void loginFail(boolean isLogin) { + + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt index 0b5e58c53c..976bc2711e 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -1,233 +1,210 @@ -package com.mogo.och.bus.ui; +package com.mogo.och.bus.ui -import android.content.Context; -import android.graphics.Point; -import android.os.Bundle; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.commons.mvp.MvpActivity; -import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.module.common.view.SpacesItemDecoration; -import com.mogo.och.bus.R; -import com.mogo.och.bus.bean.BusQueryLinesResponse; -import com.mogo.och.bus.presenter.BusLinePresenter; -import com.mogo.och.bus.ui.adapter.OpenItemAnimator; -import com.mogo.och.bus.ui.adapter.SwitchLineAdapter; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import io.reactivex.Observable; -import io.reactivex.disposables.Disposable; +import android.graphics.Point +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.mvp.MvpActivity +import com.mogo.eagle.core.utilcode.util.SharedPrefs +import com.mogo.och.bus.presenter.BusLinePresenter +import com.mogo.och.bus.ui.adapter.SwitchLineAdapter +import com.mogo.och.bus.bean.BusQueryLinesResponse +import com.mogo.och.bus.ui.adapter.OpenItemAnimator +import com.mogo.module.common.view.SpacesItemDecoration +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.bus.R +import com.mogo.och.bus.bean.BusQueryLineTaskResponse +import java.util.ArrayList /** * @author: wangmingjun * @date: 2022/2/8 */ -public class BusSwitchLineActivity extends MvpActivity - implements View.OnClickListener, BusSwitchLineView { +class BusSwitchLineActivity : MvpActivity(), + View.OnClickListener, BusSwitchLineView { - private ImageView mClose; - private ConstraintLayout mNoDatasView; - private RecyclerView mLinesListView; - private TextView mLineCommitBtn; - private SwitchLineAdapter mAdapter; - private List mData = new ArrayList<>(); - private int mSelectLineId = -1; - - private Disposable subscribe; - - @Override - protected int getLayoutId() { - return R.layout.activity_bus_switch_line; + companion object{ + const val LASTCOMMITLINEID = "lastcommitlineid" } - @NonNull - @Override - protected BusLinePresenter createPresenter() { - return new BusLinePresenter(this); + private lateinit var mClose: ImageView + private lateinit var mNoDatasView: ConstraintLayout + private lateinit var mLinesListView: RecyclerView + private lateinit var mLineCommitBtn: TextView + private lateinit var mAdapter: SwitchLineAdapter + private lateinit var linearLayoutManager:LinearLayoutManager + private val mData: MutableList = ArrayList() + override fun getLayoutId(): Int { + return R.layout.activity_bus_switch_line } - @Override - protected void initViews() { - initWH(); - initView(); + override fun createPresenter(): BusLinePresenter { + return BusLinePresenter(this) } - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - initDatas(); + override fun initViews() { + initWH() + initView() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDatas() } /** * 初始化view */ - private void initView() { - mClose = findViewById(R.id.switch_line_close); - mClose.setOnClickListener(this); - mNoDatasView = findViewById(R.id.no_order_data_view); - - mLineCommitBtn = findViewById(R.id.switch_line_btn_commit); - mLineCommitBtn.setOnClickListener(this); - - mLinesListView = findViewById(R.id.switch_line_rv); - mLinesListView.setLayoutManager(new LinearLayoutManager(this)); - mLinesListView.setItemAnimator(new OpenItemAnimator()); - mAdapter = new SwitchLineAdapter(getApplicationContext(),mData); - mLinesListView.addItemDecoration(new SpacesItemDecoration(4)); - mLinesListView.setAdapter(mAdapter); + private fun initView() { + mClose = findViewById(R.id.switch_line_close) + mClose.setOnClickListener(this) + mNoDatasView = findViewById(R.id.no_order_data_view) + mLineCommitBtn = findViewById(R.id.switch_line_btn_commit) + mLineCommitBtn.setOnClickListener(this) + mLinesListView = findViewById(R.id.switch_line_rv) + linearLayoutManager = LinearLayoutManager(this) + mLinesListView.setLayoutManager(linearLayoutManager) + mLinesListView.setItemAnimator(OpenItemAnimator()) + mAdapter = SwitchLineAdapter(applicationContext, mData) + mLinesListView.addItemDecoration(SpacesItemDecoration(4)) + mLinesListView.setAdapter(mAdapter) //设置item 点击事件 - mAdapter.setOnLineItemClickListener((position) -> { - mPresenter.queryBusLineTasks(mData.get(position).lineId,position); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); + mAdapter.setOnLineItemClickListener(object :SwitchLineAdapter.LineItemClickListener{ + override fun onItemClick(position: Int, close: Boolean) { + mPresenter?.queryBusLineTasks(mData[position].lineId, position, close) } - subscribe = Observable.timer(3, TimeUnit.MINUTES).subscribe(aLong -> { - mPresenter.queryBusLineTasks(mData.get(position).lineId,position); - }); - }); + }) } /** * 设置布局宽高 */ - private void initWH() { - - Window window = getWindow(); - - WindowManager.LayoutParams params = window.getAttributes(); - WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); - Point point = new Point(); - windowManager.getDefaultDisplay().getSize(point);//用于获取屏幕高度 - - params.width = (int)(point.x * 0.375); - params.height = ViewGroup.LayoutParams.MATCH_PARENT; - window.setAttributes(params); - window.setGravity(Gravity.LEFT|Gravity.BOTTOM); + private fun initWH() { + val window = window + val params = window.attributes + val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager + val point = Point() + windowManager.defaultDisplay.getSize(point) //用于获取屏幕高度 + params.width = (point.x * 0.375).toInt() + params.height = ViewGroup.LayoutParams.MATCH_PARENT + window.attributes = params + window.setGravity(Gravity.START or Gravity.BOTTOM) } /** * 初始化数据 */ - private void initDatas() { - mPresenter.queryBusLines(); + private fun initDatas() { + mPresenter?.queryBusLines() } /** * 查询返回绑定路线集合 * @param data */ - @Override - public void onBusLinesChange(BusQueryLinesResponse data){ - if (null == data){ - showNoData(true); - return; + override fun onBusLinesChange(data: BusQueryLinesResponse?) { + if (null == data) { + showNoData(true) + return } - if (data.data != null && data.data.size() > 0){ - showNoData(false); - mData.clear(); - mData.addAll(data.data); - mAdapter.notifyDataSetChanged(); - changeCommitBtnBg(); - }else { - showNoData(true); + var lastCommitLineid = SharedPrefs.getInstance(this).getInt(LASTCOMMITLINEID, -1) + if (data.data != null && data.data.size > 0) { + showNoData(false) + mData.clear() + mData.addAll(data.data) + mAdapter.notifyDataSetChanged() + if(lastCommitLineid>0){ + mData.forEachIndexed { index, line -> + if(line.lineId==lastCommitLineid){ + line.open = true + mPresenter?.queryBusLineTasks(line.lineId,index,false) + return + } + } + } + } else { + showNoData(true) } } - /** - * 根据路线选中情况设置提交按钮样式 - */ - private void changeCommitBtnBg() { - for (int i=0; i(); - } - if(o.data.size()!=result.taskList.size()) {// 不相等有变动 重新赋值 - result.taskList.clear(); - if (position % 3 != 0) { - result.taskList.addAll(o.data); - result.haveTask = false; - } else { - result.haveTask = true; + if (lineTaskInfo == null) { + result.haveTask = true + // 打开操作 + mAdapter.notifyItemChanged(position) + } else { + if (lineTaskInfo.data == null || lineTaskInfo.data.isEmpty()) { + result.haveTask = true + lineTaskInfo.data = ArrayList() + } + if (lineTaskInfo.data.size != result.taskList.size) { // 不相等有变动 重新赋值 + result.taskList.clear() + result.taskList.addAll(lineTaskInfo.data) + // 打开操作 + mAdapter.notifyItemChanged(position) + if(position==mData.size-1||position==mData.size-2){ + linearLayoutManager.stackFromEnd = true + }else{ + linearLayoutManager.stackFromEnd = false + } + mLinesListView.scrollToPosition(position) } } - mAdapter.notifyItemChanged(position); } /** * 有无数据UI显示 * @param b */ - private void showNoData(boolean b) { - if (b){ - mLinesListView.setVisibility(View.GONE); - mLineCommitBtn.setVisibility(View.GONE); - mNoDatasView.setVisibility(View.VISIBLE); - }else { - mLinesListView.setVisibility(View.VISIBLE); - mLineCommitBtn.setVisibility(View.VISIBLE); - mNoDatasView.setVisibility(View.GONE); + private fun showNoData(b: Boolean) { + if (b) { + mLinesListView.visibility = View.GONE + mLineCommitBtn.visibility = View.GONE + mNoDatasView.visibility = View.VISIBLE + } else { + mLinesListView.visibility = View.VISIBLE + mLineCommitBtn.visibility = View.VISIBLE + mNoDatasView.visibility = View.GONE } } - @Override - public void onClick(View v) { + override fun onClick(v: View) { //关闭dialog - if (v.getId() == R.id.switch_line_close){ - finish(); - return; + if (v.id == R.id.switch_line_close) { + finish() + return } //切换路线提交 - if (v.getId() == R.id.switch_line_btn_commit){ - if (mSelectLineId > -1){ - mPresenter.commitSwitchLineId(mSelectLineId); - }else { - finish(); + if (v.id == R.id.switch_line_btn_commit) { + if(mAdapter.checkLineId!=-1&&mAdapter.checkTaskId!=-1){ + mPresenter?.commitSwitchLineId(mAdapter.checkTaskId,mAdapter.checkLineId) + }else{ + ToastUtils.showLong("请选择时间") } } } - @Override - protected void onDestroy() { - super.onDestroy(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } + override fun onDestroy() { + mPresenter!!.removeListener() + super.onDestroy() } -} +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java index 14309a101f..e71474dcc7 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -1,6 +1,7 @@ package com.mogo.och.bus.ui; import com.mogo.commons.mvp.IView; +import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; /** @@ -12,6 +13,6 @@ public interface BusSwitchLineView extends IView { void onBusLinesChange(BusQueryLinesResponse data); void onChangeLineIdSuccess(); - void onBusLineTasks(BusQueryLinesResponse o, int position); + void onBusLineTasks(BusQueryLineTaskResponse o, int position); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt index 45f0d1b1fb..c6dd0640e5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -24,6 +24,8 @@ class SwitchLineAdapter( } // RecyclerView设置点击事件 private var mItemClickListener: LineItemClickListener? = null + var checkLineId:Int = -1 + var checkTaskId:Int = -1 override fun onCreateViewHolder( parent: ViewGroup, viewType: Int @@ -40,11 +42,21 @@ class SwitchLineAdapter( holder.lineName.text = line.name holder.lineEndName.text = mContext.getString(R.string.bus_line_goto_end, line.endSiteName) holder.rvLineTask.layoutManager = GridLayoutManager(mContext, 3) - val switchLineTaskAdapter = - SwitchLineTaskAdapter( - mContext, - line.taskList - ) + val switchLineTaskAdapter = SwitchLineTaskAdapter( + mContext, + checkTaskId, + line.taskList, + object : SwitchLineTaskAdapter.TaskItemClickListener { + override fun onItemClick(position: Int,isCheck:Boolean) { + if(isCheck) { + checkLineId = line.lineId + checkTaskId = line.taskList[position].id + }else{ + checkLineId=-1 + checkTaskId=-1 + } + } + }) holder.rvLineTask.adapter = switchLineTaskAdapter holder.rvLineTask.isFocusableInTouchMode = false holder.actvShowMore.visibility = View.VISIBLE @@ -95,18 +107,19 @@ class SwitchLineAdapter( if(holder.actvShowMore.text==mContext.getString(R.string.bus_switch_line_no_task)){ return@setOnClickListener } - closeOther() - mItemClickListener?.onItemClick(currentPosition) - line.open = holder.rvLineTask.visibility == View.GONE - } - } - - private fun closeOther() { - mData.forEachIndexed { index, result -> - if(result.open){ - result.open = false; - notifyItemChanged(index) + mData.forEachIndexed { index, result -> + if(result.open){ + result.open = false; + notifyItemChanged(index) + result.taskList.clear() + if(index==currentPosition){// 点击当前已经打开的item 去关闭定时网络请求 + mItemClickListener?.onItemClick(currentPosition,true) + return@setOnClickListener + } + } } + mItemClickListener?.onItemClick(currentPosition,false) + line.open = holder.rvLineTask.visibility == View.GONE } } @@ -137,6 +150,6 @@ class SwitchLineAdapter( } interface LineItemClickListener { - fun onItemClick(position: Int) + fun onItemClick(position: Int,close:Boolean) } } \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt index c4abd05426..8183e0efd4 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineTaskAdapter.kt @@ -1,73 +1,76 @@ -package com.mogo.och.bus.ui.adapter; +package com.mogo.och.bus.ui.adapter - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import com.mogo.och.bus.R; -import com.mogo.och.bus.bean.BusQueryLinesResponse; - -import java.util.List; +import android.content.Context +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.utilcode.util.TimeUtils +import com.mogo.och.bus.R +import com.mogo.och.bus.bean.BusQueryLineTaskResponse +import com.mogo.och.bus.ui.adapter.SwitchLineTaskAdapter.SwitchLineTaskViewHolder /** * 路线列表adapter */ -public class SwitchLineTaskAdapter extends RecyclerView.Adapter { - - private Context mContext; - private List mData; - - public SwitchLineTaskAdapter(Context context, List data) { - mContext = context; - mData = data; +class SwitchLineTaskAdapter( + private val mContext: Context, + private var checkTaskId:Int, + private val mData: List?, + private val mTaskItemClickListener: TaskItemClickListener? +) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SwitchLineTaskViewHolder { + val view = LayoutInflater.from(mContext).inflate( + R.layout.bus_switch_line_list_task_item, parent, false + ) + return SwitchLineTaskViewHolder(view) } - @NonNull - @Override - public SwitchLineTaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(mContext).inflate(R.layout.bus_switch_line_list_task_item - , parent, false); - return new SwitchLineTaskViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull SwitchLineTaskViewHolder holder, int position) { - int currentPosition = holder.getBindingAdapterPosition(); - BusQueryLinesResponse.Result line = mData.get(currentPosition); - holder.lineTask.setText("13:40"); - holder.lineTask.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - + override fun onBindViewHolder(holder: SwitchLineTaskViewHolder, position: Int) { + val currentPosition = holder.bindingAdapterPosition + val task = mData!![currentPosition] + val taskStartTime = TimeUtils.millis2String(task.taskStartTime, "HH:mm") + holder.lineTask.text = taskStartTime + if(checkTaskId==task.id){ + holder.lineTask.setBackgroundResource(R.drawable.bus_shape_select_line_item_time_bg_selected) + }else{ + holder.lineTask.setBackgroundResource(R.drawable.bus_shape_select_line_item_time_bg) + } + holder.lineTask.setOnClickListener { + if(checkTaskId==task.id){ + checkTaskId = -1 + mTaskItemClickListener?.onItemClick(currentPosition,false) + }else { + resetOther() + checkTaskId = task.id + mTaskItemClickListener?.onItemClick(currentPosition,true) } - }); - } - - @Override - public int getItemCount() { - return mData==null?0:mData.size(); - } - - static class SwitchLineTaskViewHolder extends RecyclerView.ViewHolder { - - private TextView lineTask; // 时间 - - public SwitchLineTaskViewHolder(@NonNull View itemView) { - super(itemView); - lineTask = itemView.findViewById(R.id.actv_line_task); + notifyItemChanged(currentPosition) } } - public interface LineItemClickListener { - void onItemClick(int position) ; + private fun resetOther() { + mData?.forEachIndexed { index, result -> + if(result.id==checkTaskId){ + checkTaskId = -1 + notifyItemChanged(index) + } + } } -} + override fun getItemCount(): Int { + return mData?.size ?: 0 + } + class SwitchLineTaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val lineTask: TextView // 时间 + init { + lineTask = itemView.findViewById(R.id.actv_line_task) + } + } + interface TaskItemClickListener { + fun onItemClick(position: Int,isCheck:Boolean) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java index 903fece224..e7a3138fd1 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/bean/DriverStatusQueryRespBean.java @@ -15,5 +15,11 @@ public class DriverStatusQueryRespBean extends BaseData { public int driverStatus; //1登录,0登出 public String orderNo; public int purpose; // 1 运营, 2 测试, 3演示 + + public String sn; + public String plateNumber;//车牌号 + public String phone;//手机号 + public String lineId;//线路id + public String taskId;//任务id } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt index 55a0b5cc2a..6e1891710e 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/constant/OchCommonConst.kt @@ -24,5 +24,7 @@ class OchCommonConst { // token 失效 重新获取token const val WAIT_TAKEN = 100046 + const val LOGINSERVICE = "/ochbiz/common/login" + } } \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt index 08f1acc43f..b9874084bc 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginModel.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.SharedPrefs import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.map.navi.IMogoCarLocationChangedListener2 import com.mogo.module.common.MogoApisHandler @@ -106,6 +107,9 @@ object OchCommonLoginModel{ // 获取验证码成功 ToastUtils.showShort(mContext?.getString(R.string.module_och_taxi_login_login_success)) LoginStatusManager.setLoginStatus(TaxiLoginStatusEnum.Login) + mContext?.let { + SharedPrefs.getInstance(it).putString("och_account",phone) + } iTaxiLoginCallback?.loginSuccess() } else { if (data != null) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt index c935981982..10348b6b2b 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/model/OchCommonLoginStatusDefaultModel.kt @@ -3,6 +3,7 @@ package com.mogo.och.common.module.biz.model import android.annotation.SuppressLint import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.SharedPrefs import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean import com.mogo.och.common.module.biz.callback.ILoginCallback import com.mogo.och.common.module.biz.callback.ILoginViewCallback @@ -21,8 +22,10 @@ object OchCommonLoginStatusDefaultModel : OchCommonLoginStatusModel() { override fun loginSuccess(data: DriverStatusQueryRespBean?) { CallerLogger.d(SceneConstant.M_TAXI + TAG, "loginSuccess:${LoginStatusManager.isLogin()}") if (LoginStatusManager.isLogin()) { + SharedPrefs.getInstance(mContext).putString("och_account", data?.data?.phone) loginViewCallback?.hideLoginDialogFragment() } else { + SharedPrefs.getInstance(mContext).putString("och_account", "") loginViewCallback?.showLoginDialogFragment() } loginCallback?.loginSuccess(data) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java index da32fc85be..d31f624578 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceApiNew.java @@ -12,6 +12,7 @@ import retrofit2.http.GET; import retrofit2.http.Header; import retrofit2.http.Headers; import retrofit2.http.POST; +import retrofit2.http.Path; import retrofit2.http.Query; /** @@ -26,7 +27,6 @@ interface OchCommonServiceApiNew { * @return */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" ) Observable getPhoneCode(@Header("appId") String appId , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean data); @@ -39,25 +39,43 @@ interface OchCommonServiceApiNew { */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startOperation" ) - Observable gotoLoginBycode(@Header("appId") String appId + Observable gotoLoginBycode4Taxi(@Header("appId") String appId + , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); + + /** + * 通过验证码登录 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" ) + Observable gotoLoginBycode4Bus(@Header("appId") String appId , @Header("ticket") String ticket, @Body TaxiLoginReqBean data); /** * 登出接口 */ @Headers({"Content-type:application/json;charset=UTF-8"}) @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation") - Observable logout(@Header("appId") String appId, @Header("ticket") String ticket, + Observable logout4Taxi(@Header("appId") String appId, @Header("ticket") String ticket, + @Body TaxiLogoutReqBean data); + /** + * 登出接口 + */ + @Headers({"Content-type:application/json;charset=UTF-8"}) + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endOperation") + Observable logout4Bus(@Header("appId") String appId, @Header("ticket") String ticket, @Body TaxiLogoutReqBean data); /** - * 接单状态和登录状态查询 + * 接单状态和登录状态查询 出租车司机端、小巴车司机端、小巴车乘客端 * @param sn * @return */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) - @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus" ) - Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId - ,@Header("ticket") String ticket,@Query("sn") String sn); + @GET( "/autopilot-car-hailing/operation/v1/driver/{flavor}/loginStatus") + Observable queryDriverServiceStatusAndLoginStatus(@Path(value = "flavor",encoded = true) String flavor,@Header ("appId") String appId + , @Header("ticket") String ticket, @Query("sn") String sn); } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java index 668f781253..ecc0129cfe 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/network/OchCommonServiceManager.java @@ -6,6 +6,7 @@ import android.content.Context; import com.mogo.cloud.passport.MoGoAiCloudClient; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.network.MoGoRetrofitFactory; import com.mogo.eagle.core.network.RequestOptions; @@ -18,6 +19,7 @@ import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean; import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean; import com.mogo.och.common.module.biz.constant.OchCommonConst; +import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -48,8 +50,8 @@ public class OchCommonServiceManager { * @param context * @param callback */ - public void getPhoneCode(Context context,String phone, - OchCommonServiceCallback callback) { + public void getPhoneCode(Context context, String phone, + OchCommonServiceCallback callback) { mOCHTaxiServiceApi.getPhoneCode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() , MoGoAiCloudClientConfig.getInstance().getToken() , new TaxiLoginSmsReqBean(phone)) @@ -66,56 +68,98 @@ public class OchCommonServiceManager { TaxiLoginReqBean.Location4Login location4Login, OchCommonServiceCallback callback) { String sn = MoGoAiCloudClientConfig.getInstance().getSn(); - mOCHTaxiServiceApi.gotoLoginBycode(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + Observable taxiLoginRespBeanObservable = null; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Taxi(MoGoAiCloudClientConfig.getInstance().getServiceAppId() , MoGoAiCloudClientConfig.getInstance().getToken() - , new TaxiLoginReqBean(phone, code, sn, location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); + , new TaxiLoginReqBean(phone, code, sn, location4Login)); + break; + } + case "fPadLenovoOchBus": {//小巴车司机 + taxiLoginRespBeanObservable = mOCHTaxiServiceApi.gotoLoginBycode4Bus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , new TaxiLoginReqBean(phone, code, sn, location4Login)); + break; + } + } + if (taxiLoginRespBeanObservable != null) { + taxiLoginRespBeanObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "gotoLoginBycode")); + } } /** * 登出 */ public void logout(Context context, TaxiLogoutReqBean.Location4Login location4Login, OchCommonServiceCallback callback) { - mOCHTaxiServiceApi.logout( + Observable logout = null; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + logout = mOCHTaxiServiceApi.logout4Taxi( MoGoAiCloudClientConfig.getInstance().getServiceAppId(), MoGoAiCloudClientConfig.getInstance().getToken(), - new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "logout")); + new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)); + break; + } + case "fPadLenovoOchBus": {//小巴车司机 + logout = mOCHTaxiServiceApi.logout4Bus( + MoGoAiCloudClientConfig.getInstance().getServiceAppId(), + MoGoAiCloudClientConfig.getInstance().getToken(), + new TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().getSn(), location4Login)); + break; + } + } + if (logout != null) { + logout.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "logout")); + } } /** * 接单状态和登录状态查询 + * * @param context * @param callback */ public void queryDriverServiceStatus(Context context, OchCommonServiceCallback callback) { - if(MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()){ - callback.onFail(OchCommonConst.WAIT_TAKEN,"等待令牌中请稍等"); + if (MoGoAiCloudClientConfig.getInstance().getToken().isEmpty()) { + callback.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等"); MoGoAiCloudClient.getInstance().refreshToken(); return; } - mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,MoGoAiCloudClientConfig.getInstance().getSn()) + String flavor = ""; + switch (DebugConfig.getProductFlavor()) { + case "fPadLenovoOchTaxi": {//出租车司机 + flavor = "taxi"; + break; + } + case "fPadLenovoOchBus": {//小巴车司机 + flavor = "bus"; + break; + } + case "fPadLenovoOchBusPassenger": {//小巴车乘客 + flavor = "bus/passenger"; + break; + } + } + mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(flavor, MoGoAiCloudClientConfig.getInstance().getServiceAppId() + , MoGoAiCloudClientConfig.getInstance().getToken() + , MoGoAiCloudClientConfig.getInstance().getSn()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus")); } - private SubscribeImpl getSubscribeImpl( Context context, OchCommonServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { @Override public void onSuccess(T o) { super.onSuccess(o); - CallerLogger.INSTANCE.d(M_TAXI + TAG,apiName + ": onSuccess() " + o.msg); + CallerLogger.INSTANCE.d(M_TAXI + TAG, apiName + ": onSuccess() " + o.msg); if (callback != null) { callback.onSuccess(o); } @@ -124,7 +168,7 @@ public class OchCommonServiceManager { @Override public void onError(Throwable e) { super.onError(e); - CallerLogger.INSTANCE.e(M_TAXI + TAG,apiName + ": onError() " + e.getMessage()); + CallerLogger.INSTANCE.e(M_TAXI + TAG, apiName + ": onError() " + e.getMessage()); if (callback != null) { callback.onError(); } @@ -133,7 +177,7 @@ public class OchCommonServiceManager { @Override public void onError(String message, int code) { super.onError(message, code); - CallerLogger.INSTANCE.e(M_TAXI + TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message)); + CallerLogger.INSTANCE.e(M_TAXI + TAG, String.format(apiName + ": onError() code = %d; message = %s;", code, message)); if (callback != null) { callback.onFail(code, message); } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt index dcbe881200..352fa57e6b 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -12,12 +12,13 @@ import com.mogo.eagle.core.utilcode.util.AppStateManager.currentActivity import com.mogo.och.common.module.biz.callback.ILoginCallback import com.mogo.och.common.module.biz.callback.ILoginViewCallback import com.mogo.och.common.module.biz.constant.LoginStatusManager +import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.presenter.OchCommonLoginStatusDefaultPresenter import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment import com.mogo.och.common.module.biz.ui.TaxiLoginDialogFragment.Companion.newInstance import java.lang.ref.WeakReference -@Route(path = "/ochbiz/common/login") +@Route(path = OchCommonConst.LOGINSERVICE) class LoginServiceImpl : LoginService,ILoginViewCallback { companion object{ 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 dc0f367ad6..e515c4e397 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 @@ -36,6 +36,7 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.common.module.biz.constant.LoginStatusManager; +import com.mogo.och.common.module.biz.constant.OchCommonConst; import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; @@ -147,7 +148,7 @@ public class TaxiModel { public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); - loginService = (LoginService) ARouter.getInstance().build("/ochbiz/common/login").navigation(); + loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); // IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index e35ca7e733..fba6c4b394 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -19,6 +19,7 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.common.module.biz.constant.OchCommonConst; import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.taxi.R; import com.mogo.och.taxi.constant.TaxiOrderStatusEnum; @@ -64,7 +65,7 @@ public class TaxiFragment extends BaseTaxiTabFragment Date: Wed, 21 Sep 2022 19:10:21 +0800 Subject: [PATCH 042/226] =?UTF-8?q?[Change]=20A=E3=80=81=E5=B0=86=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=BF=A1=E6=81=AF=E5=9B=9E=E8=B0=83=E7=94=B1=E9=AB=98?= =?UTF-8?q?=E7=B2=BE=E5=9C=B0=E5=9B=BE=E5=9B=9E=E8=B0=83=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=B8=BA=E7=9B=B4=E6=8E=A5=E5=B0=86=E5=B7=A5=E6=8E=A7?= =?UTF-8?q?=E6=9C=BA=E6=95=B0=E6=8D=AE=E5=9B=9E=E8=B0=83=E7=BB=99=E5=90=84?= =?UTF-8?q?=E4=B8=AA=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: donghongyu --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 253 ++++++++++-------- .../java/com/mogo/map/AMapViewWrapper.java | 13 +- 2 files changed, 136 insertions(+), 130 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 9174f7da53..d43b686d7e 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 @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.autopilot.adapter +import android.location.Location import chassis.VehicleStateOuterClass import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig @@ -48,6 +49,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudList import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordResult import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.map.navi.MogoCarLocationChangedListenerRegister import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasListener import com.zhidao.support.adas.high.bean.AutopilotAbility @@ -77,12 +79,12 @@ class MoGoAdasListenerImpl : OnAdasListener { //车前引导线 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onTrajectory(header: MessagePad.Header, trajectory: MessagePad.Trajectory?) { if (HdMapBuildConfig.isMapLoaded) { @@ -94,16 +96,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //感知物体 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onTrackedObjects( - header: MessagePad.Header, - trackedObjects: MessagePad.TrackedObjects + header: MessagePad.Header, + trackedObjects: MessagePad.TrackedObjects ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotIdentifyDataUpdate(trackedObjects.objsList as List?) @@ -112,12 +114,12 @@ class MoGoAdasListenerImpl : OnAdasListener { //自车定位信息 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onGnssInfo(header: MessagePad.Header, gnssInfo: MessagePad.GnssInfo?) { invokeAutopilotCarStateData(gnssInfo) @@ -127,26 +129,41 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( - gnssInfo.satelliteTime, - gnssInfo.longitude, - gnssInfo.latitude + gnssInfo.satelliteTime, + gnssInfo.longitude, + gnssInfo.latitude ) + + // 直接将工控机惯导数据同步给各个模块 + val sysLocation = Location("GNSS") + sysLocation.altitude = gnssInfo.altitude + sysLocation.latitude = gnssInfo.latitude + sysLocation.longitude = gnssInfo.longitude + sysLocation.provider = "GNSS" + sysLocation.accuracy = gnssInfo.acceleration.toFloat() + sysLocation.time = gnssInfo.satelliteTime.toLong() + sysLocation.bearing = gnssInfo.heading.toFloat() + sysLocation.speed = gnssInfo.gnssSpeed.toFloat() + + if (MogoCarLocationChangedListenerRegister.getInstance().listener != null) { + MogoCarLocationChangedListenerRegister.getInstance().listener.onCarLocationChanged2(sysLocation) + } } } } //自车状态(底盘),车灯等。 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onVehicleState( - header: MessagePad.Header, - vehicleState: VehicleStateOuterClass.VehicleState? + header: MessagePad.Header, + vehicleState: VehicleStateOuterClass.VehicleState? ) { if (vehicleState != null) { @@ -172,16 +189,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //自动驾驶状态 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onAutopilotState( - header: MessagePad.Header, - autopilotState: MessagePad.AutopilotState? + header: MessagePad.Header, + autopilotState: MessagePad.AutopilotState? ) { if (autopilotState != null) { //工控机模拟时间 @@ -216,16 +233,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //监控 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onReportMessage( - header: MessagePad.Header, - mogoReportMessage: MogoReportMsg.MogoReportMessage? + header: MessagePad.Header, + mogoReportMessage: MogoReportMsg.MogoReportMessage? ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotGuardian(mogoReportMessage) @@ -234,27 +251,27 @@ class MoGoAdasListenerImpl : OnAdasListener { //感知红绿灯 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onPerceptionTrafficLight( - header: MessagePad.Header?, - trafficLights: TrafficLightOuterClass.TrafficLights? + header: MessagePad.Header?, + trafficLights: TrafficLightOuterClass.TrafficLights? ) { if (trafficLights != null) { CallerAutopilotIdentifyListenerManager.invokeAutopilotPerceptionTrafficLight( - trafficLights + trafficLights ) } } override fun onPredictionObstacleTrajectory( - header: MessagePad.Header?, - predictionObjects: Prediction.mPredictionObjects? + header: MessagePad.Header?, + predictionObjects: Prediction.mPredictionObjects? ) { //他车轨迹预测 } @@ -272,16 +289,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //planning障碍物 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onPlanningObjects( - header: MessagePad.Header?, - planningObjects: MessagePad.PlanningObjects + header: MessagePad.Header?, + planningObjects: MessagePad.PlanningObjects ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotIdentifyPlanningObj(planningObjects.objsList as List) @@ -289,24 +306,24 @@ class MoGoAdasListenerImpl : OnAdasListener { } override fun onBasicInfoReq( - header: MessagePad.Header, - basicInfoReq: MessagePad.BasicInfoReq? + header: MessagePad.Header, + basicInfoReq: MessagePad.BasicInfoReq? ) { invokeAutopilotSNRequest() } //工控机基础配置信息 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onCarConfigResp( - header: MessagePad.Header, - carConfigResp: MessagePad.CarConfigResp? + header: MessagePad.Header, + carConfigResp: MessagePad.CarConfigResp? ) { if (HdMapBuildConfig.isMapLoaded && carConfigResp != null) { AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 @@ -318,16 +335,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //全局路径规划 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onGlobalPathResp( - header: MessagePad.Header, - globalPathResp: MessagePad.GlobalPathResp? + header: MessagePad.Header, + globalPathResp: MessagePad.GlobalPathResp? ) { if (HdMapBuildConfig.isMapLoaded) { invokeAutopilotRotting(globalPathResp) @@ -336,16 +353,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //数据采集,badCase @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onRecordResult( - header: MessagePad.Header, - recordPanel: RecordPanelOuterClass.RecordPanel? + header: MessagePad.Header, + recordPanel: RecordPanelOuterClass.RecordPanel? ) { if (recordPanel != null) { invokeAutopilotRecordResult(recordPanel) @@ -367,16 +384,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //到站回调 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onArrivalNotification( - header: MessagePad.Header, - arrivalNotification: MessagePad.ArrivalNotification? + header: MessagePad.Header, + arrivalNotification: MessagePad.ArrivalNotification? ) { if (HdMapBuildConfig.isMapLoaded) { invokeArriveAtStation(arrivalNotification) @@ -385,16 +402,16 @@ class MoGoAdasListenerImpl : OnAdasListener { //状态查询应答 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onStatusQueryResp( - header: MessagePad.Header?, - statusInfo: SystemStatusInfo.StatusInfo? + header: MessagePad.Header?, + statusInfo: SystemStatusInfo.StatusInfo? ) { invokeAutopilotStatusRespByQuery(statusInfo) } @@ -403,8 +420,8 @@ class MoGoAdasListenerImpl : OnAdasListener { * 数据采集配置应答 */ override fun onRecordDataConfigResp( - header: MessagePad.Header?, - config: MessagePad.RecordDataConfig? + header: MessagePad.Header?, + config: MessagePad.RecordDataConfig? ) { } @@ -413,16 +430,16 @@ class MoGoAdasListenerImpl : OnAdasListener { * planning决策状态, 透传 */ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS, + linkCode = CHAIN_LINK_ADAS, + endpoint = PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS, + paramIndexes = [0, 1], + clientPkFileName = "sn" ) override fun onPlanningActionMsg( - header: MessagePad.Header?, - planningActionMsg: MessagePad.PlanningActionMsg? + header: MessagePad.Header?, + planningActionMsg: MessagePad.PlanningActionMsg? ) { planningActionMsg?.let { invokePNCActions(it) diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index fa71aec7a7..8c47f680c6 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -744,15 +744,6 @@ public class AMapViewWrapper implements IMogoMapView, mainHandler.removeCallbacks(mLocationTask); mainHandler.post(mLocationTask); } - Location sysLocation = new Location(location.getProvider()); - sysLocation.setAltitude(location.getAltitude()); - sysLocation.setLatitude(location.getLat()); - sysLocation.setLongitude(location.getLon()); - sysLocation.setProvider(location.getProvider()); - sysLocation.setAccuracy(location.getAcceleration()); - sysLocation.setTime(location.duration); - sysLocation.setBearing((float) location.getHeading()); - sysLocation.setSpeed(location.getSpeed()); // 将有效经纬度暂存本地,提供给下一次的Http-DNS使用,防止首次请求位置获取不到 if (location.getLat() > 0 && location.getLon() > 0) { @@ -766,9 +757,7 @@ public class AMapViewWrapper implements IMogoMapView, .putString(SharedPrefsConstants.LOCATION_LONGITUDE, String.valueOf(location.getLon())); } - if (MogoCarLocationChangedListenerRegister.getInstance().getListener() != null) { - MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2(sysLocation); - } + if (checkAMapView() && mMapLoaded) { // 地图初始化完成后,每隔5s自动判断当前地图的模式 if (mIsFirstLocated) { From a07432405475c739b5d0d3f72f7094d18564135a Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Wed, 21 Sep 2022 19:14:35 +0800 Subject: [PATCH 043/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/BusPassengerModelLoopManager.java | 12 +- .../com/mogo/och/bus/constant/BusConst.kt | 4 + .../com/mogo/och/bus/model/BusOrderModel.java | 150 +++++++++--------- .../mogo/och/bus/net/BusServiceManager.java | 8 +- .../com/mogo/och/bus/net/IBusApiService.java | 6 +- .../bus/presenter/BusModelLoopManager.java | 24 +++ 6 files changed, 114 insertions(+), 90 deletions(-) diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java index c37b463947..c0d1db411d 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java @@ -36,7 +36,7 @@ public class BusPassengerModelLoopManager { return SingletonHolder.INSTANCE; } - private Disposable mHeartbeatDisposable; //心跳轮询 + private Disposable mQueryLineDisposable; //心跳轮询 private CompositeDisposable mRouteWipeDisposable; private CompositeDisposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 @@ -78,11 +78,11 @@ public class BusPassengerModelLoopManager { } public void startQueryDriverLineLoop() { - if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) { + if (mQueryLineDisposable != null && !mQueryLineDisposable.isDisposed()) { return; } CallerLogger.INSTANCE.i(M_BUS_P + TAG, "startQueryDriverLineLoop()"); - mHeartbeatDisposable = Observable.interval(LOOP_DELAY, + mQueryLineDisposable = Observable.interval(LOOP_DELAY, LOOP_LINE_2S, TimeUnit.MILLISECONDS) .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) @@ -91,10 +91,10 @@ public class BusPassengerModelLoopManager { } public void stopQueryDriverLineLoop() { - if (mHeartbeatDisposable != null) { + if (mQueryLineDisposable != null) { CallerLogger.INSTANCE.i(M_BUS_P + TAG, "stopQueryDriverLineLoop()"); - mHeartbeatDisposable.dispose(); - mHeartbeatDisposable = null; + mQueryLineDisposable.dispose(); + mQueryLineDisposable = null; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt index bd1c823a13..867aa2df61 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt @@ -75,5 +75,9 @@ class BusConst { //围栏到站 暂定10米 const val ARRIVE_AT_END_STATION_DISTANCE = 10 + + // 轮询 + const val LOOP_PASSENGER_2S = 2 * 1000L + const val LOOP_PASSENGER_1S = 1 * 1000L } } \ No newline at end of file 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 31aa80465e..30203d9076 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 @@ -340,6 +340,7 @@ public class BusOrderModel { mBusOrdersDisposable.dispose(); } startOrStopOrderLoop(false); + startOrStopQueryPassengerWriteOff(false); MogoApisHandler.getInstance() .getApis() .getStatusManagerApi() @@ -507,9 +508,9 @@ public class BusOrderModel { public void abortTask() { CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线abortTask"); BusServiceManager.getInstance().abortTask(mContext, currentLineId - , new IBusServiceCallback() { + , new IBusServiceCallback() { @Override - public void onSuccess(BusRoutesResponse o) { + public void onSuccess(BaseData o) { CallerLogger.INSTANCE.d(M_BUS + TAG, "abortTask success: " + o); isGoingToNextStation = false; if (o.code == 0){ // 重置成功 @@ -525,37 +526,6 @@ public class BusOrderModel { } - /** - * 离站上报 - */ - public void leaveStation(boolean isRestart){ - CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); - BusServiceManager.getInstance().leaveStation(mContext, - stationList.get(backgroundCurrentStationIndex).getSeq(), - stationList.get(backgroundCurrentStationIndex).getSiteId(), - currentLineId, - new IBusServiceCallback() { - @Override - public void onSuccess(BusRoutesResponse o) { - if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) { - return; - } - isArrivedStation = false; - CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" ); - //需要更改当前站和下一站的状态 然后渲染 - leaveStationSuccess(o.getResult(),isRestart); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else{ - ToastUtils.showShort("离站上报失败:"+failMsg); - } - } - }); - } - /** * 离站上报成功后渲染站点 * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, @@ -569,9 +539,7 @@ public class BusOrderModel { paramIndexes = {0}, clientPkFileName = "sn" ) - private void leaveStationSuccess(BusRoutesResult result, boolean isRestart) { - - updateBusStatus(result); + private void leaveStationSuccess(boolean isRestart) { //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 if (isRestart || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() @@ -630,6 +598,21 @@ public class BusOrderModel { } } + /** + * 到站查询核销乘客 + */ + public void queryPassengerWriteOff(){ + //todo 查询接口拿到核销乘客波播报 + } + + private void startOrStopQueryPassengerWriteOff(boolean isStart){ + if (isStart){ + BusModelLoopManager.getInstance().startQueryPassengerWriteOffLoop(); + }else { + BusModelLoopManager.getInstance().stopQueryPassengerWriteOffLoop(); + } + } + /** * 到站后重置站点状态 */ @@ -654,17 +637,46 @@ public class BusOrderModel { CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); if (!isRestart){ arrivedBusStationSuccess(); + //todo 开始轮询到站核销的乘客 + startOrStopQueryPassengerWriteOff(true); } } @Override public void onFail(String failMsg) { -// if (!NetworkUtils.isConnected(mContext)) { -// ToastUtils.showShort("网络异常,请稍后重试"); -// }else { -// ToastUtils.showShort("离站上报失败:"+failMsg); -// } + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + } + } + }); + } + /** + * 离站上报 + */ + public void leaveStation(boolean isRestart){ + CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); + BusServiceManager.getInstance().leaveStation(mContext, + stationList.get(backgroundCurrentStationIndex).getSeq(), + stationList.get(backgroundCurrentStationIndex).getSiteId(), + currentLineId, + new IBusServiceCallback() { + @Override + public void onSuccess(BaseData o) { + isArrivedStation = false; + CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" ); + //需要更改当前站和下一站的状态 然后渲染 + leaveStationSuccess(isRestart); + queryBusRoutes(); + startOrStopQueryPassengerWriteOff(false); + } + @Override + public void onFail(String failMsg) { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort("网络异常,请稍后重试"); + }else{ + ToastUtils.showShort("离站上报失败:"+failMsg); + } } }); } @@ -801,7 +813,7 @@ public class BusOrderModel { /** * 开启自动驾驶到下一站 */ - public void autoDriveToNextStation( boolean isRestart ) { + public void autoDriveToNextStation(boolean isRestart) { if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { // 当前站是最后一站,结束当前行程 travelOver(); @@ -880,25 +892,6 @@ public class BusOrderModel { } } - /** - * 根据订单状态、获取下一站靠站的的站点 - * - * @return -1 当前已是最后一个站点 - */ - private int getNextStopStation() { - if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) { - return -1; - } - int nextStationIndex = backgroundCurrentStationIndex + 1; - for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) { - if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) { - break; - } - break; - } - return nextStationIndex; - } - /** * 延时查询站点信心 */ @@ -911,7 +904,7 @@ public class BusOrderModel { */ public void restartAutopilot() { CallerLogger.INSTANCE.d( M_BUS + TAG, "重启自动驾驶===" + isGoingToNextStation ); - autoDriveToNextStation( true ); + autoDriveToNextStation(true); } /** @@ -981,7 +974,7 @@ public class BusOrderModel { CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" ); CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" ); -// leaveStation(true,true); + endTask(); } @@ -991,14 +984,15 @@ public class BusOrderModel { private void endTask() { CallerLogger.INSTANCE.d( M_BUS + TAG, "任务正常走完endTask()"); BusServiceManager.getInstance().endTask(mContext, currentLineId - , new IBusServiceCallback() { + , new IBusServiceCallback() { @Override - public void onSuccess(BusRoutesResponse o) { + public void onSuccess(BaseData o) { CallerLogger.INSTANCE.d(M_BUS + TAG, "endTask success: " + o); - if (o.code == 0){ // 重新获取任务 + if (o.code == 0){ isGoingToNextStation = false; backgroundCurrentStationIndex = 0; - queryBusRoutes(); + queryBusRoutes();// 重新获取任务 + startOrStopQueryPassengerWriteOff(false); } } @@ -1035,16 +1029,18 @@ public class BusOrderModel { CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex); isGoingToNextStation = false; - queryStationLeaveAwayPassengers(); - UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单 - @Override - public void run() { - if (!hadQueryLeaveAwayPassager){ - arriveSiteStation(false); - } - hadQueryLeaveAwayPassager = false; - } - },1500); + arriveSiteStation(false); + +// queryStationLeaveAwayPassengers();// 2.11.0不再播报乘客下车 +// UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单 +// @Override +// public void run() { +// if (!hadQueryLeaveAwayPassager){ +// arriveSiteStation(false); +// } +// hadQueryLeaveAwayPassager = false; +// } +// },1500); } public boolean isGoingToNextStation() { diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index 5fbd7f23b2..edcfe36f6f 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -83,12 +83,12 @@ public class BusServiceManager { } /** - * 结束当前任务 + * 中断当前任务 * @param context * @param taskId * @param callback */ - public void abortTask(Context context, int taskId, IBusServiceCallback callback){ + public void abortTask(Context context, int taskId, IBusServiceCallback callback){ mService.abortTask(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() ,new BusCloseTaskRequest(taskId)) @@ -102,7 +102,7 @@ public class BusServiceManager { * @param taskId * @param callback */ - public void endTask(Context context, int taskId, IBusServiceCallback callback){ + public void endTask(Context context, int taskId, IBusServiceCallback callback){ mService.endTask(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() ,new BusCloseTaskRequest(taskId)) @@ -117,7 +117,7 @@ public class BusServiceManager { * @param siteId * @param callback */ - public void leaveStation(Context context, int seq, int siteId,int taskId, IBusServiceCallback callback){ + public void leaveStation(Context context, int seq, int siteId,int taskId, IBusServiceCallback callback){ mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() ,new BusUpdateSiteStatusRequest(taskId,siteId,seq)) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 799fbd2088..a2fdb90796 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -62,7 +62,7 @@ public interface IBusApiService { // @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away") @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/leave") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away") - Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusUpdateSiteStatusRequest request); + Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusUpdateSiteStatusRequest request); /** * 到站 更新到站信息 @@ -165,7 +165,7 @@ public interface IBusApiService { */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") - Observable abortTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); + Observable abortTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); /** * 任务正常跑完结束 @@ -176,6 +176,6 @@ public interface IBusApiService { */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endTask") - Observable endTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); + Observable endTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java index b431946ae0..676aab6775 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java @@ -1,6 +1,8 @@ package com.mogo.och.bus.presenter; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +import static com.mogo.och.bus.constant.BusConst.LOOP_DELAY; +import static com.mogo.och.bus.constant.BusConst.LOOP_PASSENGER_2S; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.bus.constant.BusConst; @@ -31,6 +33,28 @@ public class BusModelLoopManager { } private Disposable mHeartbeatDisposable; //心跳轮询 + private Disposable mQueryPassengerDisposable; //查询核销乘客 + + public void startQueryPassengerWriteOffLoop() { + if (mQueryPassengerDisposable != null && !mQueryPassengerDisposable.isDisposed()) { + return; + } + CallerLogger.INSTANCE.i(M_BUS + TAG, "startQueryPassengerWriteOffLoop()"); + mQueryPassengerDisposable = Observable.interval(LOOP_DELAY, + LOOP_PASSENGER_2S, TimeUnit.MILLISECONDS) + .map((aLong -> aLong + 1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> BusOrderModel.getInstance().queryPassengerWriteOff()); + } + + public void stopQueryPassengerWriteOffLoop() { + if (mQueryPassengerDisposable != null) { + CallerLogger.INSTANCE.i(M_BUS + TAG, "stopQueryPassengerWriteOffLoop()"); + mQueryPassengerDisposable.dispose(); + mQueryPassengerDisposable = null; + } + } public void startHeartbeatLoop() { if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) { From 43ea5777e1687d0be31aaacfd64d4e82bf629537 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Wed, 21 Sep 2022 19:23:27 +0800 Subject: [PATCH 044/226] =?UTF-8?q?[Change]=20A=E3=80=81=E8=BF=98=E5=8E=9F?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: donghongyu --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 15 --------------- .../main/java/com/mogo/map/AMapViewWrapper.java | 13 +++++++++++++ 2 files changed, 13 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 d43b686d7e..65d1aa08fa 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 @@ -133,21 +133,6 @@ class MoGoAdasListenerImpl : OnAdasListener { gnssInfo.longitude, gnssInfo.latitude ) - - // 直接将工控机惯导数据同步给各个模块 - val sysLocation = Location("GNSS") - sysLocation.altitude = gnssInfo.altitude - sysLocation.latitude = gnssInfo.latitude - sysLocation.longitude = gnssInfo.longitude - sysLocation.provider = "GNSS" - sysLocation.accuracy = gnssInfo.acceleration.toFloat() - sysLocation.time = gnssInfo.satelliteTime.toLong() - sysLocation.bearing = gnssInfo.heading.toFloat() - sysLocation.speed = gnssInfo.gnssSpeed.toFloat() - - if (MogoCarLocationChangedListenerRegister.getInstance().listener != null) { - MogoCarLocationChangedListenerRegister.getInstance().listener.onCarLocationChanged2(sysLocation) - } } } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index 8c47f680c6..6a64322c93 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -757,7 +757,20 @@ public class AMapViewWrapper implements IMogoMapView, .putString(SharedPrefsConstants.LOCATION_LONGITUDE, String.valueOf(location.getLon())); } + // 同步给各个模块 + Location sysLocation = new Location(location.getProvider()); + sysLocation.setAltitude(location.getAltitude()); + sysLocation.setLatitude(location.getLat()); + sysLocation.setLongitude(location.getLon()); + sysLocation.setProvider(location.getProvider()); + sysLocation.setAccuracy(location.getAcceleration()); + sysLocation.setTime(location.duration); + sysLocation.setBearing((float) location.getHeading()); + sysLocation.setSpeed(location.getSpeed()); + if (MogoCarLocationChangedListenerRegister.getInstance().getListener() != null) { + MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2(sysLocation); + } if (checkAMapView() && mMapLoaded) { // 地图初始化完成后,每隔5s自动判断当前地图的模式 if (mIsFirstLocated) { From 87f34a6dbcbc2c2ee5615b18e10f7a9809500f24 Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 22 Sep 2022 09:46:02 +0800 Subject: [PATCH 045/226] =?UTF-8?q?[=E7=BA=BF=E7=A8=8B=E4=BC=98=E5=8C=96]?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 18 ++--- .../com/mogo/launcher/MogoApplication.java | 70 ++++++++++--------- build.gradle | 2 +- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d7334c8151..afb3ab9496 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,19 +33,19 @@ if (!isAndroidTestBuild()) { apply plugin: 'apm-plugin' } -//if (!isAndroidTestBuild()) { -// apply plugin: 'bytex.threadOpt' -// thread_opt { -// enable true -// enableInDebug true -// logLevel "DEBUG" -// //白名单中的类不进行替换 +if (!isAndroidTestBuild()) { + apply plugin: 'bytex.threadOpt' + thread_opt { + enable true + enableInDebug true + logLevel "DEBUG" + //白名单中的类不进行替换 // white_list = [ // 'leakcanary.*', // 'com.loc.*' // ] -// } -//} + } +} //if (!isAndroidTestBuild()) { // /** diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index c472f0a6d4..ee39bc7a34 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -3,14 +3,14 @@ package com.mogo.launcher; import com.mogo.eagle.core.function.main.MainMoGoApplication; import android.content.Context; -//import androidx.annotation.NonNull; +import androidx.annotation.NonNull; import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.launcher.crash.CrashSystem; -//import com.mogo.thread.ext.core.ThreadManager; -//import com.mogo.thread.ext.core.config.ThreadConfig; -// -//import java.util.concurrent.ThreadPoolExecutor; +import com.mogo.thread.ext.core.ThreadManager; +import com.mogo.thread.ext.core.config.ThreadConfig; + +import java.util.concurrent.ThreadPoolExecutor; /** * @author congtaowang @@ -23,36 +23,40 @@ public class MogoApplication extends MainMoGoApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); -// ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() { -// @Override -// public boolean isEnabled() { -// return true; // 如果返回true,会有后续的回调;如果返回false, 不会有后续的回调 -// } + ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() { + @Override + public boolean isEnabled() { + return true; // 如果返回true,会有后续的回调;如果返回false, 不会有后续的回调 + } + + @Override + public void onExecutorBefore(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) { + //每个任务执行前回调 +// if (type == ThreadConfig.TaskType.HandlerThread) { // -// @Override -// public void onExecutorBefore(@NonNull Runnable runnable) { -// //每个任务执行前回调 -// } // -// @Override -// public void onExecutorAfter(@NonNull Runnable runnable) { -// //每个任务执行后回调 -// } -// -// /** -// * @param core 线程池的核心数 -// * @param max 线程池的最大线程数 -// * @param active 线程池正在活跃的任务数 -// * @param completed 线程池已完成的任务数 -// */ -// @Override -// public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) { -// //线程池在执行过程,状态变化回调 -// //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed); -// } -// }); -// builder.loggable(false); -// ThreadManager.INSTANCE.init(builder); +// } + } + + @Override + public void onExecutorAfter(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) { + //每个任务执行后回调 + } + + /** + * @param core 线程池的核心数 + * @param max 线程池的最大线程数 + * @param active 线程池正在活跃的任务数 + * @param completed 线程池已完成的任务数 + */ + @Override + public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) { + //线程池在执行过程,状态变化回调 + //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed); + } + }); + builder.loggable(false); + ThreadManager.INSTANCE.init(builder); } @Override diff --git a/build.gradle b/build.gradle index 786ea8b61e..a1ad739077 100644 --- a/build.gradle +++ b/build.gradle @@ -34,7 +34,7 @@ buildscript { classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}" classpath "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}" classpath 'com.volcengine:apm_insight_plugin:1.4.1' - classpath 'com.mogo.thread.opt:plg:2.2.12' + classpath 'com.mogo.thread.opt:plg:3.0.0' classpath 'com.mogo.cloud:systrace:1.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath 'com.mogo.sticky:service:1.0.8' From 26c44b3ed7186fd3caf2578260825941675c125d Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 22 Sep 2022 10:51:41 +0800 Subject: [PATCH 046/226] =?UTF-8?q?[2110]=20=E5=88=A0=E9=99=A4=E6=94=B6?= =?UTF-8?q?=E8=BD=A6=E5=87=BA=E8=BD=A6(=E6=A0=B7=E5=BC=8F=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E8=B4=A6=E5=8F=B7=E4=BF=A1=E6=81=AF)=E3=80=81?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E4=BB=BB=E5=8A=A1=E9=9D=A2=E6=9D=BF=E4=B8=80?= =?UTF-8?q?=E7=9B=B4=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/bean/BusOperationStatusResponse.java | 20 ---- .../callback/ICarOperationStatusCallback.java | 9 -- .../callback/IRefreshBusStationsCallback.java | 3 + .../bus/constant/LineAndTaskStatusManager.kt | 21 ++++ .../och/bus/fragment/BaseBusTabFragment.java | 24 +--- .../mogo/och/bus/fragment/BusFragment.java | 46 +------- .../com/mogo/och/bus/model/BusOrderModel.java | 111 +----------------- .../mogo/och/bus/net/BusServiceManager.java | 43 ------- .../com/mogo/och/bus/net/IBusApiService.java | 36 +----- .../mogo/och/bus/presenter/BusPresenter.java | 39 +++--- .../och/bus/util/BusTrajectoryManager.java | 4 +- .../src/main/res/layout/bus_base_fragment.xml | 3 +- .../biz/bean/DriverStatusQueryRespBean.java | 4 +- .../core/function/hmi/ui/MoGoHmiFragment.kt | 5 - .../hmi/ui/tools/AutoPilotAndCheckView.kt | 2 - .../function/hmi/ui/tools/BusOperationView.kt | 8 +- .../eagle/core/data/temp/EventBusOperation.kt | 10 -- .../api/hmi/warning/IMoGoWaringProvider.kt | 2 - .../function/call/hmi/CallerHmiManager.kt | 7 -- 19 files changed, 54 insertions(+), 343 deletions(-) delete mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java delete mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt delete mode 100644 core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java deleted file mode 100644 index 744fbac9c5..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.mogo.och.bus.bean; - -import com.mogo.eagle.core.data.BaseData; - -/** - * @author congtaowang - * @since 2021/3/22 - * - * 小巴车运营状态返回参数 - */ -public class BusOperationStatusResponse extends BaseData { - - public Result data; - - public static class Result { - - public int serviceStatus;//0:已收车,1:已出车 - - } -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java deleted file mode 100644 index d414f71e2c..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.mogo.och.bus.callback; - -/** - * @author: wangmingjun - * @date: 2021/10/22 - */ -public interface ICarOperationStatusCallback { - void changeOperationStatus(boolean changeStatus); -} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java index 758fd4b0bf..95292ef6a6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java @@ -14,6 +14,9 @@ public interface IRefreshBusStationsCallback { int arrivingOrArrivedIndex, boolean isArrived); + /** + * 结束清理一遍、选择任务后清理一遍 + */ void clearBusStationsMarkers(); void updateEmptyUi(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt new file mode 100644 index 0000000000..577445a2d6 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt @@ -0,0 +1,21 @@ +package com.mogo.och.bus.constant + +object LineAndTaskStatusManager { + var lineId: Int? = null//线路id + var taskId: Int? = null//任务id + + + @JvmStatic + fun setLineAndTaskId(lineId: Int?,taskId: Int?){ + this.lineId = lineId + this.taskId = taskId + } + @JvmStatic + fun hasLineAndTaskId():Boolean{ + if(lineId!=null&& taskId!=null){ + return true + }else{ + return false + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index adbbf2c0eb..9a33fcdc06 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -111,8 +111,6 @@ public abstract class BaseBusTabFragment return R.layout.bus_base_fragment; } - private View panelView; - @Override protected void initViews() { groupTestPanel = findViewById(R.id.groupTestPanel); @@ -131,7 +129,7 @@ public abstract class BaseBusTabFragment flSpeed = (FrameLayout) findViewById(R.id.fl_speed); mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc); - panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); + LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener); mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout); @@ -287,10 +285,6 @@ public abstract class BaseBusTabFragment MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this); } - protected void onChangeOperationStatus() { - - } - /** * 展示滑动按钮 * @@ -428,22 +422,6 @@ public abstract class BaseBusTabFragment }); } - public void hidPanel() { - getActivity().runOnUiThread(() -> { - flStationPanelContainer.setVisibility(View.GONE); - }); - } - - public void showPanel() { - getActivity().runOnUiThread(() -> { - flStationPanelContainer.setVisibility(View.VISIBLE); - }); - } - - public View getPanelView() { - return panelView; - } - public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() { return null; } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 18a181d217..0e7cda6b4d 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -16,7 +16,6 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.map.CenterLine; -import com.mogo.eagle.core.data.temp.EventBusOperation; import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; @@ -110,19 +109,9 @@ public class BusFragment extends BaseBusTabFragment mSwitchLine.setOnClickListener(this); } - @Subscribe(threadMode = ThreadMode.MAIN) - public void onClickChangeOperationStatus(EventBusOperation eventBusOperation){ - if (eventBusOperation.getId() == 0){ // 查询 - mPresenter.queryOperationStatus(); - }else if (eventBusOperation.getId() == 1){ // 出车/收车切换 - CallerLogger.INSTANCE.d(M_BUS + TAG,"bus出车/收车"); - onChangeOperationStatus(); - } - } - @Subscribe(threadMode = ThreadMode.MAIN) public void changeOverview(EventLogout eventLogout){ - CallerLogger.INSTANCE.d(M_TAXI + TAG,"changeOverview Event消息去登出"); + CallerLogger.INSTANCE.d(M_BUS + TAG,"changeOverview Event消息去登出"); mPresenter.logout(); } @@ -415,37 +404,6 @@ public class BusFragment extends BaseBusTabFragment } } - @Override - protected void onChangeOperationStatus() { - super.onChangeOperationStatus(); - mPresenter.onChangeOperationStatus(); - } - - /** - * 修改经营状态 - * - * @param launch true-收车,false-出车 - */ - public void changeOperationStatus(boolean launch) { - isOperationStatus = launch; - - CallerHmiManager.INSTANCE.changeBusOperationStatus(launch); - - if (launch) { - // 出车的时候重制站点状态 - mPresenter.queryBusRoutes(); - tvArrived.setVisibility(View.VISIBLE); - showPanel(); - } else { - AIAssist.getInstance(getContext()).speakTTSVoice("已收车"); - tvArrived.setVisibility(View.GONE); - hideSlidePanel(); - hidPanel(); - //移除起点终点 - clearBusStationsMarkers(); - } - } - public void clearBusStationsMarkers(){ CallerLogger.INSTANCE.d(M_BUS + TAG,"clearBusStationsMarkers()"); if (null != startStation) { @@ -550,7 +508,7 @@ public class BusFragment extends BaseBusTabFragment @Override public void cancel() { - + closeLineConfirmDialog.dismiss(); } }); closeLineConfirmDialog.show(); 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 fe20a774b9..317e28566e 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 @@ -31,13 +31,11 @@ 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.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; 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.bean.BusOperationStatusResponse; import com.mogo.och.bus.bean.BusOrderBean; import com.mogo.och.bus.bean.BusOrdersResponse; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; @@ -45,7 +43,6 @@ import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.BusRoutesResult; import com.mogo.och.bus.bean.BusStationBean; import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; -import com.mogo.och.bus.callback.ICarOperationStatusCallback; import com.mogo.och.bus.callback.IBusControllerStatusCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; @@ -89,10 +86,7 @@ public class BusOrderModel { private final String TAG = BusOrderModel.class.getSimpleName(); private int currentLineId = -1; private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引 - /** - * 运营状态、后端更具运营状态来判断车辆是否派单 - */ - private boolean mIsWorking = false; + private static volatile BusOrderModel sInstance; public double mLongitude = 0; public double mLatitude = 0; @@ -110,7 +104,6 @@ public class BusOrderModel { private static final int MSG_QUERY_BUS_STATION = 1001; private static final long QUERY_BUS_STATION_DELAY = 5000; - private ICarOperationStatusCallback carOperationStatusCallback; private IRefreshBusStationsCallback refreshBusStationsCallback; private ISlidePannelHideCallback slidePannelHideCallback; private IBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 @@ -209,10 +202,6 @@ public class BusOrderModel { startLoopBusOrders(); } - public void setCarOperationStatusCallback(ICarOperationStatusCallback callback){ - this.carOperationStatusCallback = callback; - } - public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){ this.refreshBusStationsCallback = callback; } @@ -718,34 +707,10 @@ public class BusOrderModel { }); } - /** - * 收车 - */ - public void stopTakeOrder(){ - BusServiceManager.getInstance().stopTakeOrder(mContext, new IBusServiceCallback() { - @Override - public void onSuccess(BaseData o) { - mIsWorking = !mIsWorking; - closeBeautificationMode(); - carOperationStatusCallback.changeOperationStatus(isWorking()); - startOrStopOrderLoop(mIsWorking); - BusTrajectoryManager.getInstance().stopTrajReqLoop(); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else { - ToastUtils.showShort("收车失败:"+failMsg); - } - } - }); - } - /** * 关闭美化模式 */ - private void closeBeautificationMode() { + public void closeBeautificationMode() { if (FunctionBuildConfig.isDemoMode) {//收车结束美化 FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false); @@ -754,60 +719,6 @@ public class BusOrderModel { } } - /** - * 出车 - */ - public void startTakeOrder(){ - BusServiceManager.getInstance().startTakeOrder(mContext, new IBusServiceCallback() { - @Override - public void onSuccess(BaseData o) { - mIsWorking = !mIsWorking; - startOrStopOrderLoop(mIsWorking); - if ( stationList != null && stationList.size() > 0 ) { - AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往" - + stationList.get( backgroundCurrentStationIndex ).getName() + "站点" ); - } - carOperationStatusCallback.changeOperationStatus(isWorking()); - queryBusRoutes(); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else { - ToastUtils.showShort("出车失败:"+failMsg); - } - } - }); - } - - /** - * 查询运营状态 - */ - public void queryOperationStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态"); - BusServiceManager.getInstance().queryOperationStatus(mContext - , new IBusServiceCallback() { - @Override - public void onSuccess(BusOperationStatusResponse o) { - if ( o.data != null ) { - mIsWorking = o.data.serviceStatus == 1; - CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态 result.status: " + o.data.serviceStatus); - startOrStopOrderLoop(mIsWorking); - } - carOperationStatusCallback.changeOperationStatus(isWorking()); - } - @Override - public void onFail(String failMsg) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试"); - }else { - ToastUtils.showShort("出车收车状态查询:"+failMsg); - } - } - }); - } - /** * 开启自动驾驶到下一站 */ @@ -967,18 +878,6 @@ public class BusOrderModel { AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() ); } - /** - * 修改小巴运营状态 - */ - public void onChangeOperationStatus() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "修改小巴运营状态"); - if (isWorking()){//收车 - stopTakeOrder(); - }else {//出车 - startTakeOrder(); - } - } - /** * 行程结束 */ @@ -994,10 +893,6 @@ public class BusOrderModel { leaveStation(true,true); } - public boolean isWorking() { - return mIsWorking; - } - /** * 到站 * @param data @@ -1052,7 +947,7 @@ public class BusOrderModel { }); } - private void startOrStopOrderLoop(boolean start) { + public void startOrStopOrderLoop(boolean start) { CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start); if (start) { BusModelLoopManager.getInstance().startHeartbeatLoop(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index a35c16e7bf..b41c1a03b6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -16,8 +16,6 @@ import com.mogo.och.bus.bean.BusResetLineStatusRequest; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; -import com.mogo.och.bus.bean.BusOperationStatusRequest; -import com.mogo.och.bus.bean.BusOperationStatusResponse; import com.mogo.och.bus.bean.BusOrdersResponse; import com.mogo.och.bus.bean.BusQueryLineStationsRequest; import com.mogo.och.bus.bean.BusResetDrivingLineRequest; @@ -147,48 +145,7 @@ public class BusServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers")); } - /** - * 收车 - * @param context - * @param callback - */ - public void stopTakeOrder(Context context, IBusServiceCallback callback){ - mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder")); - } - /** - * 出车 - * @param context - * @param callback - */ - public void startTakeOrder(Context context, IBusServiceCallback callback){ - mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"startTakeOrder")); - } - - /** - * 查询出车/收车状态 - * @param context - * @param callback - */ - public void queryOperationStatus(Context context, IBusServiceCallback callback){ - mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() - ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) - .subscribeOn( Schedulers.io() ) - .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus")); - } /** * 查询小巴车订单 diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 9501ae03a5..35f011cd17 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -9,7 +9,6 @@ import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; import com.mogo.och.bus.bean.BusQueryLineStationsRequest; -import com.mogo.och.bus.bean.BusOperationStatusResponse; import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest; import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; import com.mogo.och.bus.bean.BusResetDrivingLineRequest; @@ -86,39 +85,6 @@ public interface IBusApiService { // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders") Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request); - /** - * 出车 - * @param request - * @return - */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder") - @POST("/autopilot-car-hailing/car/v2/driver/bus/startTakeOrder") -// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder") - Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request); - - /** - * 收车 - * @param request - * @return - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) -// @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder") - @POST("/autopilot-car-hailing/car/v2/driver/bus/stopTakeOrder") -// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder") - Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request); - - /** - * 查询小巴出车/收车状态 - * @param sn - * @return - */ - @Headers({"Content-type:application/json;charset=UTF-8"}) -// @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query") - @GET("/autopilot-car-hailing/car/v2/driver/bus/takeOrderStatus/query") -// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query") - Observable queryOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); - @Headers({"Content-type:application/json;charset=UTF-8"}) // @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query") @GET("/autopilot-car-hailing/order/v2/driver/bus/servicingOrders/query") @@ -161,7 +127,7 @@ public interface IBusApiService { Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST("/autopilot-car-hailing/operation/v1/driver/bus/line/resetStart") + @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); } 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 0f0c561539..22855144e0 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 @@ -17,15 +17,16 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.bus.bean.BusStationBean; -import com.mogo.och.bus.callback.ICarOperationStatusCallback; import com.mogo.och.bus.callback.IBusControllerStatusCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; +import com.mogo.och.bus.constant.LineAndTaskStatusManager; import com.mogo.och.bus.fragment.BusFragment; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BusTrajectoryManager; import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; import com.mogo.och.common.module.biz.callback.ILoginCallback; +import com.zhidao.socket.utils.LoginStatusUtil; import org.jetbrains.annotations.NotNull; @@ -42,7 +43,7 @@ import system_master.SystemStatusInfo; * @author tongchenfei */ public class BusPresenter extends Presenter - implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback + implements IRefreshBusStationsCallback, ISlidePannelHideCallback , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback { private static final String TAG = "BusPresenter"; @@ -62,7 +63,6 @@ public class BusPresenter extends Presenter @Override public void onCreate(@NonNull LifecycleOwner owner) { super.onCreate(owner); - queryOperationStatus(); BusOrderModel.getInstance().queryBusRoutes(); initModelListener(); } @@ -75,14 +75,12 @@ public class BusPresenter extends Presenter } public void initModelListener() { - BusOrderModel.getInstance().setCarOperationStatusCallback(this); BusOrderModel.getInstance().setRefreshBusStationsCallback(this); BusOrderModel.getInstance().setSlidePannelHideCallback(this); BusOrderModel.getInstance().setControllerStatusCallback(this); } public void releaseListener() { - BusOrderModel.getInstance().setCarOperationStatusCallback(null); BusOrderModel.getInstance().setRefreshBusStationsCallback(null); BusOrderModel.getInstance().setSlidePannelHideCallback(null); BusOrderModel.getInstance().setControllerStatusCallback(null); @@ -92,10 +90,6 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().queryBusRoutes(); } - public void queryOperationStatus(){ - BusOrderModel.getInstance().queryOperationStatus(); - } - public void resetCurrentLineStatus() { BusOrderModel.getInstance().resetCurrentLineStatus(); } @@ -114,22 +108,11 @@ public class BusPresenter extends Presenter } } - public void onChangeOperationStatus() { - BusOrderModel.getInstance().onChangeOperationStatus(); - } - // 登出 public void logout() { BusOrderModel.getInstance().logout(); } - @Override - public void changeOperationStatus(boolean changeStatus) { - if (mView != null) { - runOnUIThread(() -> mView.changeOperationStatus(changeStatus)); - } - } - // @Override // public void refreshBusStations(String lineName,List stationList // , int currentStation, int nextStation, boolean isArrived) { @@ -326,10 +309,22 @@ public class BusPresenter extends Presenter public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { } - @Override public void loginSuccess(DriverStatusQueryRespBean data) { - + LineAndTaskStatusManager.setLineAndTaskId(data.data.lineId,data.data.taskId); + if(LoginStatusUtil.isLogin()){ + BusOrderModel.getInstance().startOrStopOrderLoop(true); + }else { + BusTrajectoryManager.getInstance().stopTrajReqLoop(); + BusOrderModel.getInstance().startOrStopOrderLoop(false); + BusTrajectoryManager.getInstance().stopTrajReqLoop(); + clearBusStationsMarkers(); + mView.hideSlidePanel(); + BusOrderModel.getInstance().closeBeautificationMode(); + } + if(LineAndTaskStatusManager.hasLineAndTaskId()){ + BusOrderModel.getInstance().queryBusRoutes(); + } } @Override diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java index 85654e2853..94ad2be2d1 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusTrajectoryManager.java @@ -6,10 +6,10 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.GsonUtils; -import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.och.bus.bean.BusRoutesResult; import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.model.BusOrderModel; +import com.zhidao.socket.utils.LoginStatusUtil; import java.util.concurrent.TimeUnit; @@ -50,7 +50,7 @@ public class BusTrajectoryManager { */ public void syncTrajectoryInfo() { BusRoutesResult routesResult = BusOrderModel.getInstance().getBusRoutesResult(); - if (BusOrderModel.getInstance().isWorking() && routesResult != null + if (LoginStatusUtil.isLogin() && routesResult != null && BusOrderModel.getInstance().getCurrentStationIndex() == 0 && !BusOrderModel.getInstance().isGoingToNextStation()) { CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() start."); diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml index 3cd819092e..a79d337496 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml @@ -60,8 +60,7 @@ app:layout_constraintLeft_toLeftOf="parent" android:layout_marginLeft="@dimen/dp_13" app:layout_constraintTop_toBottomOf="@id/module_mogo_och_autopilot_status" - app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" - android:visibility="gone"/> + app:layout_goneMarginTop="@dimen/module_mogo_och_station_panel_container_margin_top_no_call" /> (), mViewNotificationProvider = provider } - - override fun changeBusOperationStatus(isOut: Boolean) { - busOperationStatus?.changerOperationStatus(isOut) - } - override fun setBusOperationView(view: IOchBusView) { busOperationStatus = view busOperationStatus?.showBusOperation() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index c71b7541ee..26c294afd6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -14,7 +14,6 @@ import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo -import com.mogo.eagle.core.data.temp.EventBusOperation import com.mogo.eagle.core.data.temp.EventLogout import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener @@ -162,7 +161,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor( } actvLoginout.visibility = View.VISIBLE CallerHmiManager.setBusOperationView(toolBusOperationView) - EventBus.getDefault().post(EventBusOperation(0)) when (DebugConfig.getProductFlavor()) { "fPadLenovoOchTaxi" -> { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt index 4c4a5b966b..37709763dd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/BusOperationView.kt @@ -4,7 +4,6 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import com.mogo.eagle.core.data.temp.EventBusOperation import com.mogo.eagle.core.function.api.hmi.view.IOchBusView import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.SharedPrefs @@ -20,11 +19,10 @@ class BusOperationView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = null, defStyleAttr: Int = 0) - : IOchBusView(context, attrs, defStyleAttr), View.OnClickListener { + : IOchBusView(context, attrs, defStyleAttr) { init { LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true) - ochBusOperationStatus.setOnClickListener(this) context?.let { actvAccountPhone.text = SharedPrefs.getInstance(it).getString("account","") } @@ -45,10 +43,6 @@ class BusOperationView @JvmOverloads constructor( } } - override fun onClick(v: View?) { - EventBus.getDefault().post(EventBusOperation(1)) - } - /** * 用户电话号码的打码隐藏加星号加* diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt deleted file mode 100644 index 3aefda4737..0000000000 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/temp/EventBusOperation.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.mogo.eagle.core.data.temp - -/** - * @author: wangmingjun - * @date: 2022/8/23 - */ -class EventBusOperation constructor(var id:Int -) { - -} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt index 5921a99347..61b818993d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt @@ -257,7 +257,5 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy { fun showVideoDialog(infList: List) - fun changeBusOperationStatus(isOut:Boolean) - fun setBusOperationView(view:IOchBusView) } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index 2f8411528c..4b81da2533 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -397,13 +397,6 @@ object CallerHmiManager : CallerBase() { waringProviderApi?.showVideoDialog(infList) } - /** - * bus出车/收车状态设置 - * true : 显示收车; false:显示出车 - */ - fun changeBusOperationStatus(isOut: Boolean) { - waringProviderApi?.changeBusOperationStatus(isOut) - } /** * 设置 bus出车/收车View From 9f2e3ebcafce858b09ed7364e05d3f854d519fea Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 22 Sep 2022 11:17:25 +0800 Subject: [PATCH 047/226] =?UTF-8?q?[2110]=20=E5=88=A4=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt index c6dd0640e5..44d5a0fe25 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -111,7 +111,9 @@ class SwitchLineAdapter( if(result.open){ result.open = false; notifyItemChanged(index) - result.taskList.clear() + if(result.taskList!=null) { + result.taskList.clear() + } if(index==currentPosition){// 点击当前已经打开的item 去关闭定时网络请求 mItemClickListener?.onItemClick(currentPosition,true) return@setOnClickListener From efb57d550ca8652053d774fc09012bdb698a6db0 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Thu, 22 Sep 2022 11:23:06 +0800 Subject: [PATCH 048/226] =?UTF-8?q?[2110]=20mock=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/module/utils/CollectionUtils.java | 48 ++++++++++++ .../common/module/utils/SimpleInterceptor.kt | 75 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java create mode 100644 OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java new file mode 100644 index 0000000000..a8ae762168 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/CollectionUtils.java @@ -0,0 +1,48 @@ +package com.mogo.och.common.module.utils; + +import com.mogo.cloud.network.OkHttpFactory; + +import java.lang.reflect.Field; +import java.util.List; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; + +public class CollectionUtils { + public static void setInterceptor(){ + OkHttpClient okHttpClient = OkHttpFactory.Companion.getOkHttpClient(); + List interceptors = okHttpClient.interceptors(); + Field pro = getDeclaredField(interceptors, "list"); + pro.setAccessible(true); + List modifyerList = null; + try { + modifyerList = (List) pro.get(interceptors); + modifyerList.add(new SimpleInterceptor()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + /** + * 获得名为field的字段 + * @Description:如果本身找不到去父类寻找 + * @param object + * @param fieldName + * @return Field + * @author luhao + * @since:2019年2月26日 下午4:06:16 + */ + public static Field getDeclaredField(Object object, String fieldName){ + Field field = null ; + Class clazz = object.getClass() ; + for(; clazz != Object.class ; clazz = clazz.getSuperclass()) { + try { + field = clazz.getDeclaredField(fieldName) ; + return field ; + } catch (Exception e) { + //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 + //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 + } + } + return null; + } +} diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt new file mode 100644 index 0000000000..5bacbfe0d7 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/utils/SimpleInterceptor.kt @@ -0,0 +1,75 @@ +package com.mogo.och.common.module.utils + +import android.util.Log +import okhttp3.* + +class SimpleInterceptor: Interceptor { + var first = true; + override fun intercept(chain: Interceptor.Chain): Response { + val original = chain.request() + val encodedPath = original.url().encodedPath() + Log.e("SimpleInterceptor",original.method()+ encodedPath+original.url().encodedQuery()) + when (encodedPath) { + "/autopilot-car-hailing/operation/v1/driver/bus/loginStatus" -> { + val builder = Response.Builder() + val create:ResponseBody + if(first) { + create = ResponseBody.create( + MediaType.parse("application/json"), + "{\"code\":0,\"msg\":\"\",\"data\":{\"servingStatus\":0,\"driverStatus\":1,\"orderNo\":\"12111\",\"purpose\":1,\"sn\":\"fjsdlfjslf\",\"plateNumber\":\"车牌号\",\"phone\":\"18811539480\",\"lineId\":\"线路id\",\"taskId\":\"任务id\"}}" + ) + first = false + }else{ + create = ResponseBody.create( + MediaType.parse("application/json"), + "{\"code\":0,\"msg\":\"\",\"data\":{\"servingStatus\":0,\"driverStatus\":0,\"orderNo\":\"12111\",\"purpose\":1,\"sn\":\"fjsdlfjslf\",\"plateNumber\":\"车牌号\",\"phone\":\"18811539480\",\"lineId\":\"线路id\",\"taskId\":\"任务id\"}}" + ) + first = true + } + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/line/v2/driver/bus/task/query" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":[{\"id\":1,\"taskStartTime\":1663722000000},{\"id\":2,\"taskStartTime\":1663725600000},{\"id\":3,\"taskStartTime\":1663729200000},{\"id\":4,\"taskStartTime\":1663732800000},{\"id\":5,\"taskStartTime\":1663736400000},{\"id\":6,\"taskStartTime\":1663740000000},{\"id\":7,\"taskStartTime\":1663743600000},{\"id\":8,\"taskStartTime\":1663747200000},{\"id\":9,\"taskStartTime\":1663750800000},{\"id\":10,\"taskStartTime\":1663754400000}]}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startTask" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endOperation" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + "/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/startOperation" -> { + val builder = Response.Builder() + val create = ResponseBody.create(MediaType.parse("application/json"), "{\"code\":0,\"msg\":\"\",\"data\":null}") + builder.code(200) + builder.request(original) + builder.protocol(Protocol.HTTP_1_1) + builder.message("") + return builder.body(create).build() + } + else -> {} + } + return chain.proceed(original) + } +} \ No newline at end of file From d7f2c3dad139b1c5722ca0090da30db8477eeed7 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Thu, 22 Sep 2022 14:29:22 +0800 Subject: [PATCH 049/226] add func of identify obj to filter source and add limit twice , demo mode in take over --- .../core/function/hmi/ui/MoGoHmiFragment.kt | 58 ++++--- .../hmi/ui/setting/DebugSettingView.kt | 50 ++---- .../main/res/layout/view_debug_setting.xml | 14 +- .../map/identify/IdentifyOriginDataDrawer.kt | 122 ++------------- .../function/map/identify/TrackManager.java | 93 +---------- .../map/identify/TrackerSourceHelper.kt | 135 ++++++++++++++++ .../function/map/identify/WarningHelper.kt | 148 ++++++++++++++++++ .../core/data/config/FunctionBuildConfig.kt | 2 +- .../mogo/module/common/enums/EventTypeEnum.kt | 4 +- 9 files changed, 366 insertions(+), 260 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt 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 7760451e81..bcc57eb412 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 @@ -1374,6 +1374,7 @@ class MoGoHmiFragment : MvpFragment(), HmiBuildConfig.isShowSnBindingView = isOpen } + private var takeOver = false /** * 工控机监控节点上报 @@ -1381,31 +1382,6 @@ class MoGoHmiFragment : MvpFragment(), override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { ThreadUtils.runOnUiThread { guardianInfo?.let { - when (it.code) { - EXIT_AUTOPILOT_FOR_PLANNING, - EXIT_AUTOPILOT_FOR_LOCATION, - EXIT_AUTOPILOT_FOR_CHASSIS, - EXIT_AUTOPILOT_FOR_DISTANCE -> { - showWarningV2X( - EventTypeEnum.TAKE_OVER_EVENT.poiType, - EventTypeEnum.TAKE_OVER_EVENT.content, - EventTypeEnum.TAKE_OVER_EVENT.tts, - EventTypeEnum.TAKE_OVER_EVENT.poiType, - object : IMoGoWarningStatusListener { - override fun onShow() { - clTakeOverView.visibility = View.VISIBLE - } - - override fun onDismiss() { - clTakeOverView.visibility = View.GONE - } - }, - true, - 6000L - ) - } - } - if (reportList.size > 49) { reportList.removeLast() } @@ -1418,6 +1394,38 @@ class MoGoHmiFragment : MvpFragment(), ) reportListFloatWindow?.refreshData(reportList) + if(FunctionBuildConfig.isDemoMode){ + return@let + } + if(takeOver){ + return@let + } + when (it.code) { + EXIT_AUTOPILOT_FOR_PLANNING, + EXIT_AUTOPILOT_FOR_LOCATION, + EXIT_AUTOPILOT_FOR_CHASSIS, + EXIT_AUTOPILOT_FOR_DISTANCE -> { + showWarningV2X( + EventTypeEnum.TAKE_OVER_EVENT.poiType, + EventTypeEnum.TAKE_OVER_EVENT.content, + EventTypeEnum.TAKE_OVER_EVENT.tts, + EventTypeEnum.TAKE_OVER_EVENT.poiType, + object : IMoGoWarningStatusListener { + override fun onShow() { + takeOver = true + clTakeOverView.visibility = View.VISIBLE + } + + override fun onDismiss() { + takeOver = false + clTakeOverView.visibility = View.GONE + } + }, + true, + 6000L + ) + } + } } } } 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 384af51e4f..adc7747c96 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 @@ -9,6 +9,7 @@ import android.graphics.Color import android.os.Build import android.text.Html import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.* @@ -21,7 +22,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import chassis.Chassis import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.* @@ -57,7 +57,6 @@ import com.mogo.eagle.core.function.call.map.CallerSmpManager import com.mogo.eagle.core.function.call.obu.CallerOBUManager import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager -import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView @@ -633,33 +632,20 @@ class DebugSettingView @JvmOverloads constructor( } - // 初始化 GSP数据源 数据 rgGpsProvider.check( when (FunctionBuildConfig.gpsProvider) { - 0 -> { - R.id.rbGpsProviderAndroid - } - 1 -> { - R.id.rbGpsProviderRTK - } - 2 -> { - R.id.rbGpsProviderOBU - } + 0 -> R.id.rbGpsProviderAndroid + 1 -> R.id.rbGpsProviderRTK + 2 -> R.id.rbGpsProviderOBU else -> R.id.rbGpsProviderAndroid } ) rgGpsProvider.setOnCheckedChangeListener { _, checkedId -> when (checkedId) { - R.id.rbGpsProviderAndroid -> { - FunctionBuildConfig.gpsProvider = 0 - } - R.id.rbGpsProviderRTK -> { - FunctionBuildConfig.gpsProvider = 1 - } - R.id.rbGpsProviderOBU -> { - FunctionBuildConfig.gpsProvider = 2 - } + R.id.rbGpsProviderAndroid -> FunctionBuildConfig.gpsProvider = 0 + R.id.rbGpsProviderRTK -> FunctionBuildConfig.gpsProvider = 1 + R.id.rbGpsProviderOBU -> FunctionBuildConfig.gpsProvider = 2 } } @@ -690,22 +676,18 @@ class DebugSettingView @JvmOverloads constructor( trackerIPCProvider.check( when (FunctionBuildConfig.trackerIPCProvider) { 0 -> R.id.trackerIPCUnion - 1 -> R.id.trackerIPCObu - 2 -> R.id.trackerIPCV2N + 1 -> R.id.trackerIPC + 2 -> R.id.trackerIPCObu + 3 -> R.id.trackerIPCV2I else -> R.id.trackerIPCUnion } ) - trackerProvider.setOnCheckedChangeListener{ _, checkedId -> - when(checkedId){ - R.id.trackerIPCUnion -> { - FunctionBuildConfig.trackerIPCProvider = 0 - } - R.id.trackerIPCObu -> { - FunctionBuildConfig.trackerIPCProvider = 1 - } - R.id.trackerIPCV2N -> { - FunctionBuildConfig.trackerIPCProvider = 2 - } + trackerIPCProvider.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.trackerIPCUnion -> FunctionBuildConfig.trackerIPCProvider = 0 + R.id.trackerIPC -> FunctionBuildConfig.trackerIPCProvider = 1 + R.id.trackerIPCObu -> FunctionBuildConfig.trackerIPCProvider = 2 + R.id.trackerIPCV2I -> FunctionBuildConfig.trackerIPCProvider = 3 } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 13f392ed35..063ec5f432 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1796,6 +1796,16 @@ android:layout_height="wrap_content" android:layout_weight="1" android:padding="@dimen/dp_10" + android:text="融合全部感知数据" + android:textColor="#000" + android:textSize="@dimen/dp_24" /> + + @@ -1811,12 +1821,12 @@ android:textSize="@dimen/dp_24" /> diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt index 343bbd8449..d4c3e3d62b 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/IdentifyOriginDataDrawer.kt @@ -1,21 +1,14 @@ package com.mogo.eagle.core.function.map.identify import android.annotation.SuppressLint -import android.text.TextUtils import androidx.collection.ArraySet import com.mogo.commons.AbsMogoApplication -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.data.traffic.TrafficData -import com.mogo.eagle.core.data.traffic.threatLevelColor -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.w import com.mogo.map.MogoMarkerManager import com.mogo.module.common.MogoApisHandler -import mogo.telematics.pad.MessagePad -import mogo.telematics.pad.MessagePad.* +import mogo.telematics.pad.MessagePad.PlanningObject +import mogo.telematics.pad.MessagePad.TrackedObject import java.util.concurrent.ConcurrentHashMap /** @@ -23,20 +16,12 @@ import java.util.concurrent.ConcurrentHashMap * @date 2021/10/19 10:45 上午 * 域控制器识别信息绘制 */ -class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { +class IdentifyOriginDataDrawer : Identify { companion object { private const val TAG = "IdentifyDataDrawer" } - init { - // 添加 ADAS状态 监听 - CallerAutoPilotStatusListenerManager.addListener(TAG, this) - } - - @Volatile - private var mAutopilotStatus: Int = 0 //自动驾驶状态 - /** * 上一帧数据的缓存 */ @@ -54,58 +39,13 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { @SuppressLint("NewApi") private val mFilterTrafficData = HashMap() - /** - * planning 感知物预警缓存,用于重置color状态 - */ - private val pncWarningTrafficData = ConcurrentHashMap() - - /** - * obu 感知物预警缓存,用于重置color状态 - */ - private val obuWarningTrafficData = ConcurrentHashMap() - @SuppressLint("NewApi") - override fun renderPlanningWarningObj(planningObjects: List?) { - pncWarningTrafficData.clear() - if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || mAutopilotStatus == 2) { - if (planningObjects == null) { - return - } - planningObjects.forEach { planningObj -> - val trackId = planningObj.uuid.toString() - if (mMarkersCaches.containsKey(trackId)) { - val trackObj = mMarkersCaches[trackId] - if (planningObj.type == 0) { - //0是leading障碍物,障碍物车身红色提示 - trackObj?.let { - pncWarningTrafficData[trackId] = PlanningTrack( - "#D65D5AFF", - CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() - ) - } - } else if (planningObj.type == 1) { - //1是避障和择机的障碍物,障碍物车身黄色提示 - trackObj?.let { - pncWarningTrafficData[trackId] = PlanningTrack( - "#E4DD94FF", - CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() - ) - } - } - } - } - } + override fun renderPlanningWarningObj(planningObjects: List?) { + WarningHelper.renderPlanningOriginWarningObj(planningObjects, mMarkersCaches) } override fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) { - if (obuTrafficData.uuid.isNullOrEmpty()) { - return - } - if (exist) { - obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData - } else { - obuWarningTrafficData.remove(obuTrafficData.uuid!!) - } + WarningHelper.renderOBUWarningObj(exist, obuTrafficData) } /** @@ -129,7 +69,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { //清除缓存 for (data in resultList) { if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.uuid)) { - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type) { + if (TrackerSourceHelper.filterData(data)) { continue } trafficDataUuidList.remove("" + data.uuid) @@ -165,7 +105,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { trafficDataUuidList.clear() for (data in trafficData) { // 过滤掉未知感知数据 - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type) { + if (TrackerSourceHelper.filterData(data)) { continue } var temp: TrackedObject = data @@ -173,38 +113,8 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { //首次过来的数据不添加,首次未添加的感知物在调用完绘制方法后再塞入cache map val cacheData = mMarkersCaches[uuid] if (cacheData != null) { - - //OBU数据颜色标记 - val first = data.trackedSourceList.stream() - .filter { trackedSource: TrackedSource -> trackedSource.source == 4 } - .findFirst() - if (first.isPresent) { - val subFirst = first.get().subSourceList.stream() - .filter { subSource: SubSource -> subSource.source == 1 } - .findFirst() - if (subFirst.isPresent) { - val subID = subFirst.get().id - if (!TextUtils.isEmpty(subID)) { - temp = data.toBuilder().setColor("#36D3FE").build() - if (obuWarningTrafficData.containsKey(subID)) { - temp = data.toBuilder() - .setColor(obuWarningTrafficData[subID]!!.threatLevelColor()) - .build() - } - } - } - } - - //预警颜色变化 - if (pncWarningTrafficData.containsKey(uuid)) { - val planningTrack = pncWarningTrafficData[uuid] - if (!timeOut(planningTrack!!.time)) { - temp = data.toBuilder().setColor(planningTrack.color).build() - } else { - pncWarningTrafficData.remove(uuid) - } - } - + val color = TrackerSourceHelper.getDefaultColor(data) + temp = data.toBuilder().setColor(color).build() mFilterTrafficData[uuid] = temp } mMarkersCaches[uuid] = temp @@ -223,17 +133,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener { .removeMarker(uuid) } trafficDataUuidList.clear() - pncWarningTrafficData.clear() - } - - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - mAutopilotStatus = autoPilotStatusInfo.state - } - - private fun timeOut(time: Double): Boolean { - val duration = - (CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() * 1000).toLong() - (time * 1000).toLong() - return duration >= 500 + WarningHelper.clear() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java index dfccf31eb5..c5b5a301f3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackManager.java @@ -9,8 +9,6 @@ import androidx.annotation.RequiresApi; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.mogo.commons.AbsMogoApplication; -import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.enums.TrafficTypeEnum; import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.data.traffic.TrafficDataKt; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; @@ -22,7 +20,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import mogo.telematics.pad.MessagePad; @@ -64,57 +61,13 @@ public class TrackManager { @SuppressLint("NewApi") private final HashMap mFilterTrafficData = new HashMap<>(); - //感知物预警各自先以帧数更新保持,不做同一个集合的融合处理(以卫星时间做判断先后,可能会出现不同ip节点间的回溯问题) - /** - * planning 感知物预警缓存,用于重置color状态 - */ - private final ConcurrentHashMap pncWarningTrafficData = new ConcurrentHashMap<>(); - - /** - * obu 感知物预警缓存,用于重置color状态 - */ - private final ConcurrentHashMap obuWarningTrafficData = new ConcurrentHashMap<>(); - @SuppressLint("NewApi") public synchronized void renderPlanningWarningObj(List planningObjects) { - pncWarningTrafficData.clear(); - //处于美化模式或者自动驾驶状态下展示 - if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == 2) { - if (planningObjects == null) { - return; - } - planningObjects.forEach(planningObj -> { - String trackId = "" + planningObj.getUuid(); - if (mMarkersCaches.containsKey(trackId)) { - TrackObj trackObj = mMarkersCaches.get(trackId); - if (trackObj == null) { - return; - } - if (planningObj.getType() == 0) { - pncWarningTrafficData.put(trackId, new PlanningTrack( - "#D65D5AFF", - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() - )); - } else if (planningObj.getType() == 1) { - pncWarningTrafficData.put(trackId, new PlanningTrack( - "#E4DD94FF", - CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() - )); - } - } - }); - } + WarningHelper.INSTANCE.renderPlanningWarningObj(planningObjects, mMarkersCaches); } public synchronized void renderOBUWarningObj(boolean exist, TrafficData obuTrafficData) { - if (obuTrafficData.getUuid() == null || obuTrafficData.getUuid().isEmpty()) { - return; - } - if (exist) { - obuWarningTrafficData.put(obuTrafficData.getUuid(), obuTrafficData); - } else { - obuWarningTrafficData.remove(obuTrafficData.getUuid()); - } + WarningHelper.INSTANCE.renderOBUWarningObj(exist, obuTrafficData); } /** @@ -126,39 +79,14 @@ public class TrackManager { mFilterTrafficData.clear(); //进入过滤机制的感知物体,首先从缓存队列中进行查找 uuid for (MessagePad.TrackedObject data : trafficData) { - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { + if (TrackerSourceHelper.INSTANCE.filterData(data)) { continue; } String uuid = "" + data.getUuid(); TrackObj trackObj = mMarkersCaches.get(uuid); - //OBU数据颜色标记 - Optional first = data.getTrackedSourceList().stream() - .filter(trackedSource -> trackedSource.getSource() == 4).findFirst(); - if (first.isPresent()) { - Optional subFirst = first.get().getSubSourceList().stream().filter(subSource -> subSource.getSource() == 1).findFirst(); - if (subFirst.isPresent()) { - String subID = subFirst.get().getId(); - if (!TextUtils.isEmpty(subID)) { - data = data.toBuilder().setColor("#36D3FE").build(); - if (obuWarningTrafficData.containsKey(subID)) { - data = data.toBuilder() - .setColor(TrafficDataKt.threatLevelColor(obuWarningTrafficData.get(subID))) - .build(); - } - } - } - } - - // 判断物体是否与预警信息 - if (pncWarningTrafficData.containsKey(uuid)) { - PlanningTrack planningTrack = pncWarningTrafficData.get(uuid); - if (planningTrack != null && !timeOut(planningTrack.getTime())) { - data = data.toBuilder().setColor(planningTrack.getColor()).build(); - } else { - pncWarningTrafficData.remove(uuid); - } - } + String color = TrackerSourceHelper.INSTANCE.getDefaultColor(data); + data = data.toBuilder().setColor(color).build(); if (trackObj != null) { trackObj.updateObj(data); @@ -178,7 +106,7 @@ public class TrackManager { if (cache != null) { //相对静止物体并且非obu数据,则不改变,为感知融合同位置物体,使用缓存数据做覆盖 if (cacheTrack.relativeStatic()) { - if(data.getColor()!= null && !data.getColor().isEmpty()){ + if (data.getColor() != null && !data.getColor().isEmpty()) { cache = cache.toBuilder().setColor(data.getColor()).build(); } data = cache; @@ -206,7 +134,7 @@ public class TrackManager { //过滤现有元素 for (MessagePad.TrackedObject data : resultList) { String uuid = "" + data.getUuid(); - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) { + if (TrackerSourceHelper.INSTANCE.filterData(data)) { continue; } if (trafficDataUuid.size() > 0) { @@ -234,13 +162,8 @@ public class TrackManager { @SuppressLint("NewApi") public void clearAll() { trafficDataUuid.clear(); - pncWarningTrafficData.clear(); + WarningHelper.INSTANCE.clear(); mMarkersCaches.forEach((uuid, trackObj) -> removeKey(uuid)); } - private Boolean timeOut(Double time) { - long duration = (long) (CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() * 1000) - (long) (time * 1000); - return duration >= 500; - } - } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt new file mode 100644 index 0000000000..470b3068b6 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/TrackerSourceHelper.kt @@ -0,0 +1,135 @@ +package com.mogo.eagle.core.function.map.identify + +import android.annotation.SuppressLint +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.enums.TrafficTypeEnum +import mogo.telematics.pad.MessagePad.* + +object TrackerSourceHelper { + + @SuppressLint("NewApi") + fun filterData(data: TrackedObject): Boolean { + if (!FunctionBuildConfig.isDrawUnknownIdentifyData + && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type + ) { + return true + } + var trackIPCFilter = true + when (FunctionBuildConfig.trackerIPCProvider) { + 0 -> trackIPCFilter = false + 1 -> if (isIPC(data)) { + trackIPCFilter = false + } + 2 -> { + if (isObu(data).second) { + trackIPCFilter = false + } + } + 3 -> { + if (isV2I(data).second) { + trackIPCFilter = false + } + } + } + return trackIPCFilter + } + + fun getDefaultColor(data: TrackedObject): String { + var color = "" + if (!FunctionBuildConfig.isDrawUnknownIdentifyData + && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type + ) { + return "" + } + + if (isV2I(data).second) { + color = "#00AEFF" + } + + //等级最高 + if (isObu(data).second) { + color = "#36D3FE" + // obu预警 + isObu(data).first?.let { + val obuColor = WarningHelper.getObuColor(it.id) + if (obuColor.isNotBlank()) { + color = obuColor + } + } + } + + // pnc预警 + val pncColor = WarningHelper.getPncColor(data.uuid.toString()) + if (pncColor.isNotBlank()) { + color = pncColor + } + return color + } + + /** + * 过滤所有 工控感知数据 all match + */ + @SuppressLint("NewApi") + fun isIPC(data: TrackedObject): Boolean { + val source = data.trackedSourceList.stream().allMatch { + it.source != 4 + } + return source + } + + /** + * any match 任何一个匹配到OBU,则认为是存在obu数据 + */ + @SuppressLint("NewApi") + fun isObu(data: TrackedObject): Pair { + val source = data.trackedSourceList.stream().anyMatch { + it.source == 4 + } + if (source) { + val first = data.trackedSourceList.stream() + .filter { trackedSource: TrackedSource -> trackedSource.source == 4 }.findFirst() + if (first.isPresent) { + val subObu = first.get().subSourceList.stream().anyMatch { + it.source == 1 + } + if (subObu) { + val subFirst = first.get().subSourceList.stream() + .filter { subSource: SubSource -> subSource.source == 1 } + .findFirst() + if (subFirst.isPresent) { + return Pair(subFirst.get(), true) + } + } + } + } + return Pair(null, false) + } + + /** + * 过滤所有 v2i 感知数据 all match + */ + @SuppressLint("NewApi") + fun isV2I(data: TrackedObject): Pair { + val source = data.trackedSourceList.stream().allMatch { + it.source == 4 + } + if (source) { + val first = data.trackedSourceList.stream() + .filter { trackedSource: TrackedSource -> trackedSource.source == 4 }.findFirst() + if (first.isPresent) { + val subV2I = first.get().subSourceList.stream().allMatch { + it.source == 6 + } + if (subV2I) { + val subFirst = first.get().subSourceList.stream() + .filter { subSource: SubSource -> subSource.source == 6 } + .findFirst() + if (subFirst.isPresent) { + return Pair(subFirst.get(), true) + } + } + } + } + return Pair(null, false) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt new file mode 100644 index 0000000000..f7f70ccb05 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt @@ -0,0 +1,148 @@ +package com.mogo.eagle.core.function.map.identify + +import android.annotation.SuppressLint +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.traffic.TrafficData +import com.mogo.eagle.core.data.traffic.threatLevelColor +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.PlanningObject +import java.util.concurrent.ConcurrentHashMap +import java.util.function.Consumer + +object WarningHelper { + + //感知物预警各自先以帧数更新保持,不做同一个集合的融合处理(以卫星时间做判断先后,可能会出现不同ip节点间的回溯问题) + /** + * planning 感知物预警缓存,用于重置color状态 + */ + private val pncWarningBeautyTrafficData = ConcurrentHashMap() + + /** + * planning 感知物预警缓存,用于重置color状态 + */ + private val pncWarningOriginTrafficData = ConcurrentHashMap() + + /** + * obu 感知物预警缓存,用于重置color状态 + */ + private val obuWarningTrafficData = ConcurrentHashMap() + + @SuppressLint("NewApi") + fun renderPlanningWarningObj( + planningObjects: List?, + mMarkersCaches: ConcurrentHashMap + ) { + pncWarningBeautyTrafficData.clear() + //处于美化模式或者自动驾驶状态下展示 + if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || getAutoPilotStatusInfo().state == 2) { + if (planningObjects == null) { + return + } + planningObjects.forEach(Consumer { planningObj: PlanningObject -> + val trackId = "" + planningObj.uuid + if (mMarkersCaches.containsKey(trackId)) { + mMarkersCaches[trackId] ?: return@Consumer + if (planningObj.type == 0) { //0是leading障碍物,障碍物车身红色提示 + pncWarningBeautyTrafficData[trackId] = PlanningTrack( + "#D65D5AFF", + getCurWgs84SatelliteTime() + ) + } else if (planningObj.type == 1) { //1是避障和择机的障碍物,障碍物车身黄色提示 + pncWarningBeautyTrafficData[trackId] = PlanningTrack( + "#E4DD94FF", + getCurWgs84SatelliteTime() + ) + } + } + }) + } + } + + @SuppressLint("NewApi") + fun renderPlanningOriginWarningObj( + planningObjects: List?, + mMarkersCaches: ConcurrentHashMap + ) { + pncWarningOriginTrafficData.clear() + //处于美化模式或者自动驾驶状态下展示 + if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || getAutoPilotStatusInfo().state == 2) { + if (planningObjects == null) { + return + } + planningObjects.forEach(Consumer { planningObj: PlanningObject -> + val trackId = "" + planningObj.uuid + if (mMarkersCaches.containsKey(trackId)) { + mMarkersCaches[trackId] ?: return@Consumer + if (planningObj.type == 0) { //0是leading障碍物,障碍物车身红色提示 + pncWarningOriginTrafficData[trackId] = PlanningTrack( + "#D65D5AFF", + getCurWgs84SatelliteTime() + ) + } else if (planningObj.type == 1) { //1是避障和择机的障碍物,障碍物车身黄色提示 + pncWarningOriginTrafficData[trackId] = PlanningTrack( + "#E4DD94FF", + getCurWgs84SatelliteTime() + ) + } + } + }) + } + } + + fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) { + if (obuTrafficData.uuid == null || obuTrafficData.uuid!!.isEmpty()) { + return + } + if (exist) { + obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData + } else { + obuWarningTrafficData.remove(obuTrafficData.uuid) + } + } + + fun getObuColor(uuid: String): String { + if (obuWarningTrafficData.containsKey(uuid)) { + return obuWarningTrafficData[uuid]!!.threatLevelColor() + } + return "" + } + + fun getPncColor(uuid: String): String { + if (FunctionBuildConfig.isBeautyMode) { + // 判断物体是否有预警信息 + if (pncWarningBeautyTrafficData.containsKey(uuid)) { + val planningTrack = pncWarningBeautyTrafficData[uuid] + if (planningTrack != null && !timeOut(planningTrack.time)) { + return planningTrack.color + } else { + pncWarningBeautyTrafficData.remove(uuid) + } + } + return "" + } else { + // 判断物体是否有预警信息 + if (pncWarningOriginTrafficData.containsKey(uuid)) { + val planningTrack = pncWarningOriginTrafficData[uuid] + if (planningTrack != null && !timeOut(planningTrack.time)) { + return planningTrack.color + } else { + pncWarningOriginTrafficData.remove(uuid) + } + } + return "" + } + } + + fun clear() { + pncWarningBeautyTrafficData.clear() + pncWarningOriginTrafficData.clear() + obuWarningTrafficData.clear() + } + + private fun timeOut(time: Double): Boolean { + val duration = (getCurWgs84SatelliteTime() * 1000).toLong() - (time * 1000).toLong() + return duration >= 500 + } +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index 4f12272c8f..ed2b6943ae 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -80,7 +80,7 @@ object FunctionBuildConfig { var debugTrackerProvider = 0 /** - * 感知物识别使用的数据来源 0 = 默认输出 1 = 只显示工控硬件数据感知来源 2 = 只显示V2V数据来源 3 = 只显示V2N数据来源 + * 感知物识别使用的数据来源 0 = 默认输出 1 = 只显示工控硬件数据感知来源 2 = 只显示V2V数据来源 3 = 只显示V2I数据来源 */ @Volatile @JvmField diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt index 7521d0ac83..2f9a527d69 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt @@ -363,8 +363,8 @@ enum class EventTypeEnum( tts = "" ), - TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯请优先通行"), - TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败请稍后重试"), + TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯,请优先通行"), + TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,请稍后重试"), TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线"); From b90530ac2c778dc9849644911c54673599dae6e2 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Thu, 22 Sep 2022 15:48:40 +0800 Subject: [PATCH 050/226] =?UTF-8?q?[2.11.0/1.6.0]=20taxi=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BA=BA=E5=B7=A5/?= =?UTF-8?q?=E8=87=AA=E9=A9=BE=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/taxi/presenter/TaxiPresenter.java | 9 +- .../mogo/och/taxi/ui/BaseTaxiTabFragment.java | 8 +- .../ui/TaxiBeingServerdOrdersFragment.java | 151 ++++++++++++------ .../com/mogo/och/taxi/ui/TaxiFragment.java | 9 +- .../och/taxi/ui/TaxiServerOrdersFragment.java | 4 +- .../order_drive_mode_bg.png | Bin 0 -> 72035 bytes .../order_drive_mode_bg.png | Bin 0 -> 72035 bytes .../drawable-xhdpi/order_drive_mode_bg.png | Bin 0 -> 72035 bytes .../res/layout/auto_or_manual_btn_view.xml | 33 ++++ .../src/main/res/layout/taxi_being_order.xml | 7 + .../src/main/res/values/strings.xml | 2 + 11 files changed, 163 insertions(+), 60 deletions(-) create mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/order_drive_mode_bg.png create mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/order_drive_mode_bg.png create mode 100644 OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/order_drive_mode_bg.png create mode 100644 OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml 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 5bd2c9cb2f..deaafcc374 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 @@ -100,12 +100,19 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } /** - * 开启自动驾驶 + * 开启自动驾驶 自驾模式 */ public void startAutoPilot() { TaxiModel.getInstance().startAutoPilot(); } + /** + * 人工模式 + */ + public void startManualDrive(){ + TaxiModel.getInstance().startServicePilotDone(); + } + /** * 跳过乘客验证环节 */ diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index 32c19748a4..b79bd989b8 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -21,9 +21,7 @@ import androidx.annotation.Nullable; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentTransaction; -import com.mogo.cloud.httpdns.util.L; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; @@ -388,13 +386,11 @@ public abstract class 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/order_drive_mode_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/order_drive_mode_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ec754b829f3d767bc7d488df8301eb457440d33e GIT binary patch literal 72035 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/order_drive_mode_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/order_drive_mode_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ec754b829f3d767bc7d488df8301eb457440d33e GIT binary patch literal 72035 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml new file mode 100644 index 0000000000..4a265074d9 --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/res/layout/auto_or_manual_btn_view.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml index 285701fa67..9cb4d3a230 100644 --- a/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml +++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml @@ -275,6 +275,13 @@ android:textColor="#4DFFFFFF" android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" /> + + + + 出现异常情况时,可选择原因无责取消订单: 确认 开始服务 + 自驾模式 + 人工模式 跳过乘客验证 等待乘客开始行程 请等待乘客启动自动驾驶,或您自行启动 From 1760e03065e55985c9d294d139848a2768247b41 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Thu, 22 Sep 2022 16:48:25 +0800 Subject: [PATCH 051/226] merge --- .../autopilot/MoGoAutopilotProvider.kt | 4 +-- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 2 ++ .../adapter/MoGoHandAdasMsgManager.java | 15 ++++++++++- .../autopilot/telematic/TeleMsgHandler.kt | 1 - .../network/UpgradeAppNetWorkManager.java | 9 +++---- .../bindingcar/BindingcarProvider.java | 3 ++- .../upgrade/UpgradeManager.kt | 1 - .../core/function/hmi/ui/MoGoHmiFragment.kt | 4 +-- .../hmi/ui/bindingcar/UpgradeAppDialog.kt | 17 ++++++------ .../function/main/MainMoGoApplication.java | 17 +++++++++++- .../main/res/layout/dialog_upgrade_app.xml | 27 +++++++++++++++---- .../api/hmi/warning/IMoGoWaringProvider.kt | 2 +- .../call/devatools/CallerDevaToolsManager.kt | 2 ++ .../function/call/hmi/CallerHmiManager.kt | 4 +-- .../breakpoint/services/DownloadService.java | 2 -- .../breakpoint/thread/InitThread.java | 6 +++++ .../zhidao/support/adas/high/AdasChannel.java | 1 + 17 files changed, 84 insertions(+), 33 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 5260ae11df..43536569a6 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -6,7 +6,6 @@ import android.util.Log import androidx.annotation.RequiresPermission import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.cloud.passport.MoGoAiCloudClientConfig -import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.autopilot.toAutoPilotLine import com.mogo.eagle.core.data.autopilot.toRouteInfo @@ -29,6 +28,7 @@ import com.mogo.eagle.core.function.autopilot.adapter.MoGoHandAdasMsgManager import com.mogo.eagle.core.function.autopilot.server.AsyncDataToAutopilotServer import com.mogo.eagle.core.function.autopilot.telematic.IMsgHandler import com.mogo.eagle.core.function.autopilot.telematic.TeleMsgHandler +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager @@ -51,9 +51,7 @@ import com.zhidao.support.adas.high.OnMultiDeviceListener import com.zhidao.support.adas.high.common.Constants import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS import com.zhidao.support.adas.high.common.CupidLogUtils -import com.zhidao.support.adas.high.common.MessageType import com.zhidao.support.adas.high.common.MogoReport -import com.zhidao.support.adas.high.subscribe.SubscribeInterfaceOptions import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel 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 65d1aa08fa..8f37f431fd 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 @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.autopilot.adapter import android.location.Location +import android.util.Log import chassis.VehicleStateOuterClass import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig @@ -310,6 +311,7 @@ class MoGoAdasListenerImpl : OnAdasListener { header: MessagePad.Header, carConfigResp: MessagePad.CarConfigResp? ) { + Log.d("Upgrade", "isMapLoaded = " + HdMapBuildConfig.isMapLoaded + "___carConfigResp = " + carConfigResp) if (HdMapBuildConfig.isMapLoaded && carConfigResp != null) { AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java index ee651b95c2..046ba7c396 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java @@ -5,13 +5,13 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.Nullable; - import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotVehicleStateListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager; @@ -19,6 +19,8 @@ import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.zhidao.support.adas.high.AdasManager; import org.jetbrains.annotations.NotNull; @@ -60,6 +62,15 @@ public class MoGoHandAdasMsgManager implements private int brakeLight = -1; + public void getConfig() { + com.elegant.utils.UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + CallerAutoPilotManager.INSTANCE.getCarConfig(); + } + },0); + } + private int setTurnLightState(int turn_light) { if (turn_light == 0) { if (isOnTurnLight) { @@ -106,6 +117,7 @@ public class MoGoHandAdasMsgManager implements @Override public void onAutopilotCarConfig(@NotNull MessagePad.CarConfigResp carConfigResp) { if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.getMacAddress())) { + Log.d("Upgrade", "onAutopilotCarConfig carConfigResp.getMacAddress() = " + carConfigResp.getMacAddress()); CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfigResp.getMacAddress(), MoGoAiCloudClientConfig.getInstance().getSn()); } } @@ -166,4 +178,5 @@ public class MoGoHandAdasMsgManager implements public void onAutopilotBrake(float brake) { } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt index fbf3c04fb7..461b9fd7f4 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt @@ -73,7 +73,6 @@ class TeleMsgHandler : IMsgHandler { TextFormat.printer().escapingNonAscii(false).printToString(carConfig) }" ) -// Log.d("liyz", "TeleMsgHandler macAddress = " + carConfig.macAddress) CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo( carConfig.macAddress, MoGoAiCloudClientConfig.getInstance().sn 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 709103a240..164da63439 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 @@ -59,12 +59,11 @@ public class UpgradeAppNetWorkManager { * 获取app升级信息 */ public void getAppUpgradeInfo(Context context, String mac, String screenType) { - String sn = "X20202203105S688HZ"; +// String sn = "X20202203105S688HZ"; // String mac = "48:b0:2d:3a:bc:78"; -// String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); int versionCode = AppUtils.getAppVersionCode(); - - //TODO 不能写死 + Log.d("Upgrade", "mac = " + mac + "---type = " + screenType + "---sn = " + sn ); UpgradeAppRequest request = new UpgradeAppRequest(sn, mac, screenType); RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); mUpgradeApiService.getUpgradeInfo(requestBody) @@ -81,7 +80,7 @@ public class UpgradeAppNetWorkManager { CallerLogger.INSTANCE.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode()); Log.d(TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode() + "--versionCode =" + versionCode + "--info.result = " + info.result); if (info.result.getVersionCode() > versionCode) { - CallerHmiManager.INSTANCE.showUpgradeDialog(info.result.getAppUrl().substring(info.result.getAppUrl().lastIndexOf("/")+1), info.result.getAppUrl()); + CallerHmiManager.INSTANCE.showUpgradeDialog(info.result.getAppUrl().substring(info.result.getAppUrl().lastIndexOf("/")+1), info.result.getAppUrl(), info.result.getInstallTitle(), info.result.getInstallContent()); } } else { Log.e(TAG, "onNext info == null"); diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index f04f3343c3..f7af0795e6 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -11,6 +11,7 @@ import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingcarProvider; import com.mogo.eagle.core.function.appupgrade.network.UpgradeAppNetWorkManager; import com.mogo.eagle.core.function.bindingcar.network.BindingcarNetWorkManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.ipcupgrade.IPCUpgradeManager; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; @@ -57,6 +58,7 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { */ @Override public void getBindingcarInfo(String macAddress, String widevineIDWithMd5) { + Log.d("Upgrade", "getBindingcarInfo mAddress = " + macAddress + "--widevineIDWithMd5 = " + widevineIDWithMd5); mAddress = macAddress; mWidevineIDWithMd5 = widevineIDWithMd5; if (getScreenType() == 1) { //司机屏 @@ -172,7 +174,6 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { */ @Override public void queryAppUpgrade() { - Log.d("Upgrade", "mac = " + mAddress + "---type = " + getCarScreenType() ); UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, mAddress, getCarScreenType()); } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt index d4a9242b9b..d563420be8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt @@ -77,7 +77,6 @@ class UpgradeManager : IDownload { if (downloadUrl != null) { AppUtils.installApp(Config.downLoadPath + downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1)) } - findKey(downloadUrl) { CallerDevaToolsUpgradeListenerManager.invokeUpgradeFinish(it) } 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 bcc57eb412..63eb143fe9 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 @@ -1306,11 +1306,11 @@ class MoGoHmiFragment : MvpFragment(), /** * 升级app弹框 */ - override fun showUpgradeDialog(name: String, url: String) { + override fun showUpgradeDialog(name: String, url: String, title: String, content: String) { if (upgradeAppDialog == null) { upgradeAppDialog = UpgradeAppDialog(requireContext()) } - upgradeAppDialog!!.showUpgradeAppDialog(name, url) + upgradeAppDialog!!.showUpgradeAppDialog(name, url, title, content) } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt index 2a88a92cbe..88a4e13640 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt @@ -21,20 +21,17 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb private val TAG = "UpgradeAppDialog" private var confirmTv: TextView? = null private var cancleTv: TextView? = null + private var upgradeTitleTv: TextView? = null + private var upgradeContentTv: TextView? = null private var tag: String? = null private var downloarUrl: String? = null - private var mServiceApis: IMogoServiceApis? = null - private val statusChangedListenerForCheckNotice = IMogoStatusChangedListener { descriptor, isTrue -> - if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND) { - dismiss() - } - } - init { setContentView(R.layout.dialog_upgrade_app) setCanceledOnTouchOutside(true) + upgradeTitleTv = findViewById(R.id.tv_upgrade_title) + upgradeContentTv = findViewById(R.id.tv_upgrade_content) confirmTv = findViewById(R.id.tv_upgrade_confirm) cancleTv = findViewById(R.id.tv_upgrade_cancel) @@ -61,12 +58,16 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb super.dismiss() } - fun showUpgradeAppDialog(name: String, url: String) { + fun showUpgradeAppDialog(name: String, url: String, title: String, content: String) { if (isShowing) { return } tag = name downloarUrl = url + + upgradeTitleTv?.text = title + upgradeContentTv?.text = content + show() } 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 530b2b9c3f..ef395d3e67 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 @@ -4,16 +4,20 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI import android.content.Context; import android.os.Process; +import android.util.Log; import com.bytedance.boost_multidex.BoostMultiDex; import com.elegant.utils.UiThreadHandler; import com.kwai.koom.base.DefaultInitTask; import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.data.app.AppConfigInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.function.api.chat.biz.ChatConsts; +import com.mogo.eagle.core.function.autopilot.adapter.MoGoHandAdasMsgManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.notice.PushUIConstants; @@ -27,6 +31,7 @@ import com.mogo.map.MapApiPath; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; import com.mogo.module.service.ServiceConst; +import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.obu.ami.AmiClientManager; import com.zhjt.mogo_core_function_devatools.monitor.db.CpuInfo; import com.zhjt.mogo_core_function_devatools.monitor.db.MemInfo; @@ -71,12 +76,22 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { } private void queryAppUpgrade() { + UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + Log.e("Upgrade", "queryAppUpgrade isConnectAutopilot = " + AppConfigInfo.INSTANCE.isConnectAutopilot()); + if (AppConfigInfo.INSTANCE.isConnectAutopilot()) { + MoGoHandAdasMsgManager.getInstance(getBaseContext()).getConfig(); + } + } + },8000); + UiThreadHandler.postDelayed(new Runnable() { @Override public void run() { CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade(); } - },5000); + },10000); } private void checkMonitorDb() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml index 0850212f75..7c3e839b9a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml @@ -2,7 +2,7 @@ @@ -10,7 +10,7 @@ android:id="@+id/tv_upgrade_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="50px" + android:layout_marginTop="30px" android:text="@string/application_upgrade" android:textColor="#FFFFFFFF" android:textSize="56px" @@ -22,7 +22,7 @@ android:id="@+id/tv_upgrade_tips" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="50px" + android:layout_marginTop="30px" android:text="@string/application_upgrade_confirm" android:textColor="#FFFFFFFF" android:textSize="43px" @@ -30,15 +30,32 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/tv_upgrade_title" /> + + + app:layout_constraintTop_toBottomOf="@id/tv_upgrade_content" /> queryDriverOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); + } 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 cff599cca5..005b9a08fc 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 @@ -90,12 +90,6 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().queryBusRoutes(); } - public void resetCurrentLineStatus() { - BusOrderModel.getInstance().resetCurrentLineStatus(); - public void queryOperationStatus(){ - BusOrderModel.getInstance().queryOperationStatus(); - } - public void abortTask() { BusOrderModel.getInstance().abortTask(); } From fafe3f914a4424752fcdb3224d5cafa8cbe851f9 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Thu, 22 Sep 2022 19:10:47 +0800 Subject: [PATCH 053/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=E6=B7=BB=E5=8A=A0taskId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/och/bus/bean/BusRoutesResult.java | 5 +++++ .../java/com/mogo/och/bus/model/BusOrderModel.java | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java index 485c68f0ec..4b652d30df 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java @@ -15,6 +15,7 @@ public class BusRoutesResult { private String description; private int status; private long taskTime; //线路时间班次 + private int taskId;// 线路班次id //线路轨迹相关字段 public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“” @@ -33,6 +34,10 @@ public class BusRoutesResult { return lineId; } + public int getTaskId() { + return taskId; + } + public String getName() { return name; } 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 f383ba0917..98284d6d92 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 @@ -85,6 +85,7 @@ import mogo.telematics.pad.MessagePad; public class BusOrderModel { private final String TAG = BusOrderModel.class.getSimpleName(); private int currentLineId = -1; + private int currentTaskId = -1; private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引 private static volatile BusOrderModel sInstance; @@ -503,7 +504,7 @@ public class BusOrderModel { */ public void abortTask() { CallerLogger.INSTANCE.d( M_BUS + TAG, "结束当前路线abortTask"); - BusServiceManager.getInstance().abortTask(mContext, currentLineId + BusServiceManager.getInstance().abortTask(mContext, currentTaskId , new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { @@ -626,7 +627,7 @@ public class BusOrderModel { BusServiceManager.getInstance().arriveSiteStation(mContext , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId(), - currentLineId , + currentTaskId , new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { @@ -655,7 +656,7 @@ public class BusOrderModel { BusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq(), stationList.get(backgroundCurrentStationIndex).getSiteId(), - currentLineId, + currentTaskId, new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { @@ -750,6 +751,7 @@ public class BusOrderModel { if (result == null) return; busRoutesResult = result; List site = result.getSites(); + currentTaskId = result.getTaskId(); currentLineId = result.getLineId(); stationList.clear(); stationList.addAll( site ); @@ -889,7 +891,7 @@ public class BusOrderModel { */ private void endTask() { CallerLogger.INSTANCE.d( M_BUS + TAG, "任务正常走完endTask()"); - BusServiceManager.getInstance().endTask(mContext, currentLineId + BusServiceManager.getInstance().endTask(mContext, currentTaskId , new IBusServiceCallback() { @Override public void onSuccess(BaseData o) { From e117afea9e8f56fef126f640c3f265a57279780c Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Thu, 22 Sep 2022 19:16:04 +0800 Subject: [PATCH 054/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=E5=88=A0=E9=99=A4=E9=87=8D=E5=A4=8D=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/och/bus/net/IBusApiService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 2a1a465ebe..7090bc7ae8 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -139,9 +139,6 @@ public interface IBusApiService { * @param data * @return */ - @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") - Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/abortTask") Observable abortTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); From 31045baaf9e583a7181de863f92bf2931859f442 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Thu, 22 Sep 2022 21:17:25 +0800 Subject: [PATCH 055/226] [2.11.0/1.6.0] och-module compileSdkVersion --- OCH/mogo-och-common-module/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index 927d871c22..fe23c542d0 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'kotlin-kapt' apply plugin: 'com.alibaba.arouter' android { - compileSdkVersion 31 + compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion "30.0.2" defaultConfig { From 52e740fae2ff9c6ea72dfe195960c3523b2da332 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 23 Sep 2022 10:43:01 +0800 Subject: [PATCH 056/226] =?UTF-8?q?[2110]=20=E7=99=BB=E5=BD=95=E5=90=8E?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=9F=A5=E8=AF=A2=E8=AE=A2=E5=8D=95=E3=80=81?= =?UTF-8?q?=E7=BA=BF=E8=B7=AF=E5=B0=91=E4=B8=8D=E7=94=A8=E6=89=93=E5=BC=80?= =?UTF-8?q?=E4=BB=8E=E4=BD=8E=E6=8E=92=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/constant/LineAndTaskStatusManager.kt | 21 ------------------- .../mogo/och/bus/presenter/BusPresenter.java | 7 ++----- .../mogo/och/bus/ui/BusSwitchLineActivity.kt | 2 +- 3 files changed, 3 insertions(+), 27 deletions(-) delete mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt deleted file mode 100644 index 577445a2d6..0000000000 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/LineAndTaskStatusManager.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.mogo.och.bus.constant - -object LineAndTaskStatusManager { - var lineId: Int? = null//线路id - var taskId: Int? = null//任务id - - - @JvmStatic - fun setLineAndTaskId(lineId: Int?,taskId: Int?){ - this.lineId = lineId - this.taskId = taskId - } - @JvmStatic - fun hasLineAndTaskId():Boolean{ - if(lineId!=null&& taskId!=null){ - return true - }else{ - return false - } - } -} \ No newline at end of file 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 22855144e0..e1cfd22a0f 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 @@ -20,7 +20,6 @@ import com.mogo.och.bus.bean.BusStationBean; import com.mogo.och.bus.callback.IBusControllerStatusCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; -import com.mogo.och.bus.constant.LineAndTaskStatusManager; import com.mogo.och.bus.fragment.BusFragment; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BusTrajectoryManager; @@ -311,7 +310,6 @@ public class BusPresenter extends Presenter } @Override public void loginSuccess(DriverStatusQueryRespBean data) { - LineAndTaskStatusManager.setLineAndTaskId(data.data.lineId,data.data.taskId); if(LoginStatusUtil.isLogin()){ BusOrderModel.getInstance().startOrStopOrderLoop(true); }else { @@ -322,9 +320,8 @@ public class BusPresenter extends Presenter mView.hideSlidePanel(); BusOrderModel.getInstance().closeBeautificationMode(); } - if(LineAndTaskStatusManager.hasLineAndTaskId()){ - BusOrderModel.getInstance().queryBusRoutes(); - } + BusOrderModel.getInstance().queryBusRoutes(); + } @Override diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt index 976bc2711e..1309e825f5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -161,7 +161,7 @@ class BusSwitchLineActivity : MvpActivity result.taskList.addAll(lineTaskInfo.data) // 打开操作 mAdapter.notifyItemChanged(position) - if(position==mData.size-1||position==mData.size-2){ + if((position==mData.size-1||position==mData.size-2)&&mData.size>6){ linearLayoutManager.stackFromEnd = true }else{ linearLayoutManager.stackFromEnd = false From cfc9147f05cec60af590a2c7ff311a4def149710 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 23 Sep 2022 10:55:10 +0800 Subject: [PATCH 057/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AFBusOrderModer=E6=9A=82=E6=97=B6=E6=B3=A8=E9=87=8Achain?= =?UTF-8?q?Log(=E5=9B=A0=E6=96=B9=E6=B3=95=E5=8F=82=E6=95=B0=E6=94=B9?= =?UTF-8?q?=E5=8F=98=E5=AF=BC=E8=87=B4=E6=89=93=E5=8C=85=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/och/bus/model/BusOrderModel.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 98284d6d92..245c4a59bc 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 @@ -528,14 +528,14 @@ public class BusOrderModel { * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染 */ - @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT, - paramIndexes = {0}, - clientPkFileName = "sn" - ) +// @ChainLog( +// linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, +// linkCode = CHAIN_LINK_ADAS, +// endpoint = TracingConstants.Endpoint.PAD, +// nodeAliasCode = CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT, +// paramIndexes = {0}, +// clientPkFileName = "sn" +// ) private void leaveStationSuccess(boolean isRestart) { //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 From 317bbac2f7832de1a783caab324f2c8afcfdd6f3 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 23 Sep 2022 11:49:11 +0800 Subject: [PATCH 058/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=20=E5=8F=B8?= =?UTF-8?q?=E6=9C=BA=E7=AB=AF=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/bean/BusQueryLineStationsRequest.java | 71 ++++---- .../och/bus/fragment/BaseBusTabFragment.java | 14 +- .../mogo/och/bus/fragment/BusFragment.java | 9 +- .../com/mogo/och/bus/model/BusOrderModel.java | 162 +++++++++--------- .../mogo/och/bus/net/BusServiceManager.java | 13 +- .../com/mogo/och/bus/net/IBusApiService.java | 2 +- 6 files changed, 135 insertions(+), 136 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java index 87fdd01745..6c90d9f7e2 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java @@ -11,45 +11,48 @@ import com.mogo.cloud.passport.MoGoAiCloudClientConfig; public class BusQueryLineStationsRequest { private String sn; - private double lat; - private double lon; - private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus +// private double lat; +// private double lon; +// private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus // 0 - 关闭、1 - 启动 // public String status; - public BusQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) { +// public BusQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) { +// this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); +// this.lat = lat; +// this.lon = lon; +// this.markDrivingStatus = markDrivingStatus; +// } + public BusQueryLineStationsRequest() { this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); - this.lat = lat; - this.lon = lon; - this.markDrivingStatus = markDrivingStatus; } - public boolean isMarkDrivingStatus() { - return markDrivingStatus; - } - - public void setMarkDrivingStatus(boolean markDrivingStatus) { - this.markDrivingStatus = markDrivingStatus; - } - - public void setLat(double lat) { - this.lat = lat; - } - - public void setLon(double lon) { - this.lon = lon; - } - - public String getSn() { - return sn; - } - - public double getLat() { - return lat; - } - - public double getLon() { - return lon; - } +// public boolean isMarkDrivingStatus() { +// return markDrivingStatus; +// } +// +// public void setMarkDrivingStatus(boolean markDrivingStatus) { +// this.markDrivingStatus = markDrivingStatus; +// } +// +// public void setLat(double lat) { +// this.lat = lat; +// } +// +// public void setLon(double lon) { +// this.lon = lon; +// } +// +// public String getSn() { +// return sn; +// } +// +// public double getLat() { +// return lat; +// } +// +// public double getLon() { +// return lon; +// } // public BusOperationStatusRequest shutdown() { // status = "0"; // return this; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index 9a33fcdc06..eed07c13db 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -290,14 +290,12 @@ public abstract class BaseBusTabFragment * * @param text 指定的文字 */ - public void showSlidePanle(String text) { - if (isOperationStatus) { - getActivity().runOnUiThread(() -> { - slidePanelView.setText(text); - slidePanelView.setVisibility(View.VISIBLE); - }); - setArrivedClikable(false); - } + public void showSlidePanel(String text) { + getActivity().runOnUiThread(() -> { + slidePanelView.setText(text); + slidePanelView.setVisibility(View.VISIBLE); + }); + setArrivedClikable(false); } /** diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index b8866b5898..d230fcf5e0 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -14,12 +14,10 @@ import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.temp.EventLogout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerHDMapManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; @@ -147,6 +145,7 @@ public class BusFragment extends BaseBusTabFragment } public void updateLineEmptyUI(){ + setArrivedClikable(false); hideStationsPanel(); } @@ -185,7 +184,7 @@ public class BusFragment extends BaseBusTabFragment //切换路线和结束路线按钮切换 showOrHideSwitchLineBtn(false); - showSlidePanle("单程结束"); + showSlidePanel("单程结束"); setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); @@ -193,7 +192,7 @@ public class BusFragment extends BaseBusTabFragment showOrHideSwitchLineBtn(true); - showSlidePanle("滑动出发"); + showSlidePanel("滑动出发"); setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, startStation.getLat(), startStation.getLon(),R.raw.star_marker); @@ -202,7 +201,7 @@ public class BusFragment extends BaseBusTabFragment }else{ if (isArrived){ // 重置滑动按钮文字 - showSlidePanle("滑动出发"); + showSlidePanel("滑动出发"); } showOrHideSwitchLineBtn(false); 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 245c4a59bc..f90d8894e5 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 @@ -199,8 +199,8 @@ public class BusOrderModel { } }); - //2021/10/20 轮询小巴车订单,暂时用来播报 - startLoopBusOrders(); + //2021/10/20 轮询小巴车订单,暂时用来播报 2022/9/23 乘客上车和下车的播报都去除,增加核销的乘客播报 +// startLoopBusOrders(); } public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){ @@ -278,58 +278,58 @@ public class BusOrderModel { updateOrderRoute(); } - /** - * 轮询bus待服务订单 - */ - private void startLoopBusOrders() { - if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) { - return; - } - mBusOrdersDisposable = Observable.interval(BusConst.LOOP_DELAY, - BusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> queryBusOrders()); - } +// /** +// * 轮询bus待服务订单 +// */ +// private void startLoopBusOrders() { +// if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) { +// return; +// } +// mBusOrdersDisposable = Observable.interval(BusConst.LOOP_DELAY, +// BusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) +// .map((aLong -> aLong + 1)) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(aLong -> queryBusOrders()); +// } - private void queryBusOrders() { - BusServiceManager.getInstance().queryBusOrders(mContext, new IBusServiceCallback() { - @Override - public void onSuccess(BusOrdersResponse o) { - if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "获取到bus订单数据: " + o.data.orders.toString() ); - List busOrders = o.data.orders; - for (int i = 0; i < busOrders.size(); i++) { - BusOrderBean order = busOrders.get(i); - if (order == null) return; - if (TextUtils.isEmpty(order.getPassengerPhone())) return; - if (prevBusOrderNos.contains(order.getOrderNo())) continue; - try { - String tailNum = null; - try { - tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4); - } catch (Exception e) { - e.printStackTrace(); - tailNum = order.getPassengerPhone(); - } - CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + tailNum); - AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum - + " 上车站点为 " + order.getStartStationName()); - prevBusOrderNos.add(order.getOrderNo()); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - @Override - public void onFail(String failMsg) { - - } - }); - } +// private void queryBusOrders() { +// BusServiceManager.getInstance().queryBusOrders(mContext, new IBusServiceCallback() { +// @Override +// public void onSuccess(BusOrdersResponse o) { +// if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) { +// CallerLogger.INSTANCE.d( M_BUS + TAG, "获取到bus订单数据: " + o.data.orders.toString() ); +// List busOrders = o.data.orders; +// for (int i = 0; i < busOrders.size(); i++) { +// BusOrderBean order = busOrders.get(i); +// if (order == null) return; +// if (TextUtils.isEmpty(order.getPassengerPhone())) return; +// if (prevBusOrderNos.contains(order.getOrderNo())) continue; +// try { +// String tailNum = null; +// try { +// tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4); +// } catch (Exception e) { +// e.printStackTrace(); +// tailNum = order.getPassengerPhone(); +// } +// CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + tailNum); +// AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum +// + " 上车站点为 " + order.getStartStationName()); +// prevBusOrderNos.add(order.getOrderNo()); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } +// +// @Override +// public void onFail(String failMsg) { +// +// } +// }); +// } public void release(){ if (mBusOrdersDisposable != null) { @@ -692,30 +692,30 @@ public class BusOrderModel { } } - /** - * 查询到站下车乘客 - */ - private void queryStationLeaveAwayPassengers() { - CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客"); - - BusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext - , stationList.get(backgroundCurrentStationIndex +1).getSeq(), stationList.get(backgroundCurrentStationIndex+1).getSiteId() - , new IBusServiceCallback() { - @Override - public void onSuccess(QueryLeaveAwayPassengersResponse o) { - hadQueryLeaveAwayPassager = true; - arriveSiteStation(false); - playLeavePassengersMsg( o ); - queryBusOrders(); - } - - @Override - public void onFail(String failMsg) { - hadQueryLeaveAwayPassager = true; - arriveSiteStation(false); - } - }); - } +// /** +// * 查询到站下车乘客 +// */ +// private void queryStationLeaveAwayPassengers() { +// CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客"); +// +// BusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext +// , stationList.get(backgroundCurrentStationIndex +1).getSeq(), stationList.get(backgroundCurrentStationIndex+1).getSiteId() +// , new IBusServiceCallback() { +// @Override +// public void onSuccess(QueryLeaveAwayPassengersResponse o) { +// hadQueryLeaveAwayPassager = true; +// arriveSiteStation(false); +// playLeavePassengersMsg( o ); +// queryBusOrders(); +// } +// +// @Override +// public void onFail(String failMsg) { +// hadQueryLeaveAwayPassager = true; +// arriveSiteStation(false); +// } +// }); +// } /** * 关闭美化模式 @@ -780,10 +780,10 @@ public class BusOrderModel { +" isLeaving()="+currentStation.isLeaving()); //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 - // ,订单开始站下在始发站的状态流转有问题 - if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){ - arriveSiteStation(true); - } + // ,订单开始站下在始发站的状态流转有问题 2022.9.23不需要再调用此接口,拿到任务默认就是首站 +// if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){ +// arriveSiteStation(true); +// } // 美化是否开始 if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0 diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index f7a2cecde5..c0ed142fde 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -53,19 +53,18 @@ public class BusServiceManager { } /** - * 查询小巴车线路 + * 查询小巴车当前任务 * @param context * @param callback */ public void queryBusRoutes(Context context, IBusServiceCallback callback) { //获取当前高德坐标 - mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + mService.queryBusRoutes(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - , new BusQueryLineStationsRequest(BusOrderModel.getInstance().mLongitude - , BusOrderModel.getInstance().mLatitude,true)) + , new BusQueryLineStationsRequest()) .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() ) - .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate")); + .subscribe( getSubscribeImpl(context,callback,"queryBusRoutes")); } /** @@ -78,7 +77,7 @@ public class BusServiceManager { mService.switchLine(MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(taskId)) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus")); + .subscribe(getSubscribeImpl(context,callback,"switchLine")); } /** @@ -139,7 +138,7 @@ public class BusServiceManager { ,new BusUpdateSiteStatusRequest(taskId,siteId,seq)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) - .subscribe(getSubscribeImpl(context,callback,"leaveStation")); + .subscribe(getSubscribeImpl(context,callback,"arriveSiteStation")); } /** diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index 7090bc7ae8..c1ef5dd7a6 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -40,7 +40,7 @@ public interface IBusApiService { // @POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" ) @POST( "/autopilot-car-hailing/line/v2/driver/bus/lineDataWithDriver/query" ) // @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" ) - Observable querySiteByCoordinate(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusQueryLineStationsRequest request); + Observable queryBusRoutes(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusQueryLineStationsRequest request); /** * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的 From bee1572295634474a7d640388869b722fe6a97d0 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 23 Sep 2022 12:03:59 +0800 Subject: [PATCH 059/226] add func of take over in condition --- .../core/function/hmi/ui/MoGoHmiFragment.kt | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) 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 63eb143fe9..8ae5d0cce1 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 @@ -45,6 +45,7 @@ import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_RUNNING import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy.IViewNotificationProvider import com.mogo.eagle.core.function.api.hmi.view.IOchBusView @@ -55,6 +56,7 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener 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.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager import com.mogo.eagle.core.function.call.check.CallerCheckManager @@ -1394,10 +1396,10 @@ class MoGoHmiFragment : MvpFragment(), ) reportListFloatWindow?.refreshData(reportList) - if(FunctionBuildConfig.isDemoMode){ + if (FunctionBuildConfig.isDemoMode) { return@let } - if(takeOver){ + if (takeOver) { return@let } when (it.code) { @@ -1405,25 +1407,28 @@ class MoGoHmiFragment : MvpFragment(), EXIT_AUTOPILOT_FOR_LOCATION, EXIT_AUTOPILOT_FOR_CHASSIS, EXIT_AUTOPILOT_FOR_DISTANCE -> { - showWarningV2X( - EventTypeEnum.TAKE_OVER_EVENT.poiType, - EventTypeEnum.TAKE_OVER_EVENT.content, - EventTypeEnum.TAKE_OVER_EVENT.tts, - EventTypeEnum.TAKE_OVER_EVENT.poiType, - object : IMoGoWarningStatusListener { - override fun onShow() { - takeOver = true - clTakeOverView.visibility = View.VISIBLE - } + if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData + && getAutoPilotStatusInfo().state != STATUS_AUTOPILOT_RUNNING) { + showWarningV2X( + EventTypeEnum.TAKE_OVER_EVENT.poiType, + EventTypeEnum.TAKE_OVER_EVENT.content, + EventTypeEnum.TAKE_OVER_EVENT.tts, + EventTypeEnum.TAKE_OVER_EVENT.poiType, + object : IMoGoWarningStatusListener { + override fun onShow() { + takeOver = true + clTakeOverView.visibility = View.VISIBLE + } - override fun onDismiss() { - takeOver = false - clTakeOverView.visibility = View.GONE - } - }, - true, - 6000L - ) + override fun onDismiss() { + takeOver = false + clTakeOverView.visibility = View.GONE + } + }, + true, + 6000L + ) + } } } } From 1a50a2911bf888f99aad969e227809d2c32156e0 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 23 Sep 2022 12:15:35 +0800 Subject: [PATCH 060/226] remove note log and chainlog --- .../com/mogo/och/bus/model/BusOrderModel.java | 12 ---------- .../mogo/och/taxi/ui/BaseTaxiTabFragment.java | 5 +++-- .../autopilot/MoGoAutopilotProvider.kt | 3 --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 1 - .../adapter/MoGoHandAdasMsgManager.java | 7 ++---- .../bindingcar/BindingcarProvider.java | 2 -- .../core/function/hmi/ui/MoGoHmiFragment.kt | 22 ++++++++----------- .../core/data/deva/chain/ChainConstant.kt | 1 - 8 files changed, 14 insertions(+), 39 deletions(-) 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 245c4a59bc..733c956686 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 @@ -1,8 +1,5 @@ package com.mogo.och.bus.model; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_ADAS; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_ARRIVING; import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_STOPPED; @@ -528,16 +525,7 @@ public class BusOrderModel { * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染 */ -// @ChainLog( -// linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, -// linkCode = CHAIN_LINK_ADAS, -// endpoint = TracingConstants.Endpoint.PAD, -// nodeAliasCode = CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT, -// paramIndexes = {0}, -// clientPkFileName = "sn" -// ) private void leaveStationSuccess(boolean isRestart) { - //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 if (isRestart || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index b79bd989b8..42b2f906cc 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -1,12 +1,12 @@ package com.mogo.och.taxi.ui; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import static com.mogo.och.taxi.constant.TaxiConst.TIMER_START_AUTOPILOT_INTERVAL; import android.animation.ObjectAnimator; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.animation.LinearInterpolator; @@ -34,6 +34,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerSmpManager; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMapUIController; @@ -208,7 +209,7 @@ public abstract class BaseTaxiTabFragment(), reportListFloatWindow?.hideFloatWindow() reportListFloatWindow = null } else { - Log.i("DebugViewSwitchLog", "打开调试窗") if (mDebugSettingView == null) { mDebugSettingView = DebugSettingView(it) - Log.i("DebugViewSwitchLog", "new DebugSettingView") mDebugSettingView?.reportInit(reportList) mDebugSettingView?.setClickListener(object : DebugSettingView.ClickListener { override fun showReportListWindow(show: Boolean) { @@ -620,7 +616,7 @@ class MoGoHmiFragment : MvpFragment(), } }) if (mDebugSettingView != null) { - Log.i("DebugViewSwitchLog", "new DebugSettingView success") + CallerLogger.d("$M_HMI$TAG", "new DebugSettingView success") } } var side = SidePattern.RIGHT @@ -694,7 +690,7 @@ class MoGoHmiFragment : MvpFragment(), val content = mViewNotificationProvider?.getNotificationView() ?: return content.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType)) content.setWarningContent(warningContent) - Log.d( + CallerLogger.d( "$M_HMI$TAG", "--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime" ) @@ -730,7 +726,7 @@ class MoGoHmiFragment : MvpFragment(), override fun show() { val parent = it.window.decorView parent.doOnAttach { - Log.d( + CallerLogger.d( "$M_HMI$TAG", "--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime" ) @@ -809,7 +805,7 @@ class MoGoHmiFragment : MvpFragment(), activity?.let { WarningFloat.dismiss(tag) } - Log.d("$M_HMI$TAG", "--- disableWarningV2X ---") + CallerLogger.d("$M_HMI$TAG", "--- disableWarningV2X ---") lifecycleScope.launch { showingV2XTip?.takeIf { it.isShowing() }?.also { it.hide() } } @@ -896,7 +892,7 @@ class MoGoHmiFragment : MvpFragment(), * @see WarningDirectionEnum */ override fun showWarning(direction: WarningDirectionEnum) { - Log.d(TAG, "showWarning====") + CallerLogger.d(TAG, "showWarning====") flV2XWarningView?.showWarning(direction) flicker(flV2XWarningView) } @@ -906,10 +902,10 @@ class MoGoHmiFragment : MvpFragment(), */ fun flicker(view: View) { val alphaAnimation = AlphaAnimation(0f, 0.88f) - alphaAnimation.setDuration(600) - alphaAnimation.setInterpolator(LinearInterpolator()) - alphaAnimation.setRepeatCount(Animation.INFINITE) - alphaAnimation.setRepeatMode(Animation.REVERSE) + alphaAnimation.duration = 600 + alphaAnimation.interpolator = LinearInterpolator() + alphaAnimation.repeatCount = Animation.INFINITE + alphaAnimation.repeatMode = Animation.REVERSE view.startAnimation(alphaAnimation) } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index f5fb8b59b9..2e043376c1 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -66,7 +66,6 @@ class ChainConstant { const val CHAIN_ALIAS_CODE_START_UP = "CHAIN_ALIAS_CODE_START_UP" //operation by user - const val CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT = "CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT" const val CHAIN_ALIAS_CODE_OCH_TAXI_START_AUTOPILOT = "CHAIN_ALIAS_CODE_OCH_TAXI_START_AUTOPILOT" const val CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT = "CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT" const val CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT_RESULT = "CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT_RESULT" From eba9d60df04c9a93485c2171639552b0752eeb0b Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 23 Sep 2022 12:56:38 +0800 Subject: [PATCH 061/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/och/bus/fragment/BusFragment.java | 2 ++ .../src/main/java/com/mogo/och/bus/model/BusOrderModel.java | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index d230fcf5e0..65237e5915 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -146,7 +146,9 @@ public class BusFragment extends BaseBusTabFragment public void updateLineEmptyUI(){ setArrivedClikable(false); + showOrHideSwitchLineBtn(true); hideStationsPanel(); + hideSlidePanel(); } public void updateBusTaskStatus(String lineName, String lineTime, 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 f90d8894e5..0877742ffc 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 @@ -633,7 +633,7 @@ public class BusOrderModel { public void onSuccess(BaseData o) { CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); if (!isRestart){ - arrivedBusStationSuccess(); + queryBusRoutes(); //todo 开始轮询到站核销的乘客 startOrStopQueryPassengerWriteOff(true); } @@ -643,6 +643,8 @@ public class BusOrderModel { public void onFail(String failMsg) { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort("网络异常,请稍后重试"); + }else { + ToastUtils.showShort(failMsg); } } }); From 4e123c5f6d74021b8a7e7e435c6610c8a782004d Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 23 Sep 2022 13:09:58 +0800 Subject: [PATCH 062/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E5=B1=8F=E9=80=89=E6=8B=A9=E8=BF=90=E8=90=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=98=BE=E7=A4=BA"=E7=BB=93=E6=9D=9F=E4=BB=BB=E5=8A=A1"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/och/bus/fragment/BusFragment.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 65237e5915..71e872104d 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -167,6 +167,7 @@ public class BusFragment extends BaseBusTabFragment } showStationsPanel(); + showOrHideSwitchLineBtn(false); mLineName.setText(lineName); mTaskTime.setText(getString(R.string.bus_line_time_tag)+ lineTime); @@ -184,16 +185,12 @@ public class BusFragment extends BaseBusTabFragment if (arrivingOrArrivedIndex == stationList.size() - 1 && isArrived){ //切换路线和结束路线按钮切换 - showOrHideSwitchLineBtn(false); - showSlidePanel("单程结束"); setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat() , endStation.getLon(),R.raw.end_marker); }else if (arrivingOrArrivedIndex == 0 && isArrived){ - showOrHideSwitchLineBtn(true); - showSlidePanel("滑动出发"); setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, @@ -206,8 +203,6 @@ public class BusFragment extends BaseBusTabFragment showSlidePanel("滑动出发"); } - showOrHideSwitchLineBtn(false); - setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat() , startStation.getLon(),R.raw.star_marker); setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat() From d4937769f986754e31defc4d5a6902e046fd537b Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 19 Sep 2022 18:19:03 +0800 Subject: [PATCH 063/226] =?UTF-8?q?[Feat]=E4=B9=98=E5=AE=A2=E5=B1=8F?= =?UTF-8?q?=E7=9B=B4=E8=BF=9E=E5=B7=A5=E6=8E=A7=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotProvider.kt | 90 ++++++------------ .../call/autopilot/CallerAutoPilotManager.kt | 95 +++++++++++++------ 2 files changed, 98 insertions(+), 87 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 0e7d380a28..037bcb6bd5 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -80,7 +80,6 @@ class MoGoAutopilotProvider : // 初始化ADAS 域控制器 CupidLogUtils.setEnableLog(false) msgHandler = TeleMsgHandler() - // TODO 临时方案,根据不同的身份标识,连接不同的工控机IP if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {// 司机 // 注册地图采集功能 CallerMapDataCollectorManager.registerOnMapCollectTaskListener(this) @@ -95,11 +94,11 @@ class MoGoAutopilotProvider : // "192.168.1.102" val options = AdasOptions.Builder() - .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) - .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) - .setClient(false) + .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) + .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) + .setClient(false) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// - .build() + .build() AdasManager.getInstance().create(options, MoGoAdasMsgConnectStatusListenerImpl()) NSDNettyManager.getInstance().startNSDNettyServerWithSN(context, object : @@ -130,36 +129,34 @@ class MoGoAutopilotProvider : } }, MoGoAiCloudClientConfig.getInstance().sn) } else { - // 乘客端默认接收绘制全局路径+引导线 - //FunctionBuildConfig.isDemoMode = true - //FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true - // "192.168.1.103" val options = AdasOptions .Builder() - .setClient(true) + .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) + .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) + .setClient(false)// 乘客端直连工控机改为false .build() AdasManager.getInstance().create(options, MoGoAdasMsgConnectStatusListenerImpl()) NSDNettyManager.getInstance() - .searchAndConnectServer(context, MoGoAiCloudClientConfig.getInstance().sn, - AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode), - object : NettyClientListener { - override fun onMessageResponseClient( - msg: MogoProtocolMsg?, - sign: String?, - channel: Channel - ) { - // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 - msgHandler.handleMsgFromServer(msg, channel) - } + .searchAndConnectServer(context, MoGoAiCloudClientConfig.getInstance().sn, + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode), + object : NettyClientListener { + override fun onMessageResponseClient( + msg: MogoProtocolMsg?, + sign: String?, + channel: Channel + ) { + // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 + msgHandler.handleMsgFromServer(msg, channel) + } - override fun onClientStatusConnectChanged( - statusCode: Int, - sign: String?, - channel: Channel - ) { - msgHandler.handleClientConnStatus(statusCode, sign, channel) - } - }) + override fun onClientStatusConnectChanged( + statusCode: Int, + sign: String?, + channel: Channel + ) { + msgHandler.handleClientConnStatus(statusCode, sign, channel) + } + }) } //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// @@ -169,33 +166,6 @@ class MoGoAutopilotProvider : if (!AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { CallerAutopilotCarConfigListenerManager.addListener(TAG, this) } - AdasManager.getInstance().setOnMultiDeviceListener(object : OnMultiDeviceListener { - override fun onForwardingDriverIPCMessage(bytes: ByteArray?) { - if (bytes == null) - return - // 发送数据给乘客端 - if (NSDNettyManager.getInstance().isServerStart) { - msgHandler.synWriteTime() - NSDNettyManager.getInstance() - .sendMsgToAllClients(MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes)) - } else { - CallerLogger.d("$M_ADAS_IMPL$TAG", "司机端Server未启动!") - } - } - - override fun onForwardingPassengerIPCMessage(bytes: ByteArray?) { - if (bytes == null) - return - NSDNettyManager.getInstance() - .sendMogoProtocolMsgToServer( - MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes), - null - ) - - } - - }); - CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……") // 同步数据给工控机的服务 AsyncDataToAutopilotServer.INSTANCE.initServer() @@ -324,7 +294,7 @@ class MoGoAutopilotProvider : } override fun recordPackage(type: Int, id: Int, duration: Int, bduration: Int): Boolean { - return AdasManager.getInstance().startRecordPackage(id,duration, type, bduration) + return AdasManager.getInstance().startRecordPackage(id, duration, type, bduration) } override fun stopRecord(type: Int, id: Int): Boolean { @@ -366,7 +336,6 @@ class MoGoAutopilotProvider : } - /** * 演示模式(美化模式)设置只限定于鹰眼 * isEnable = true 开启 @@ -492,7 +461,10 @@ class MoGoAutopilotProvider : if (isEnable) { AdasManager.getInstance().sendAutoPilotModeReq(1, 0, null) } else { - AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null) + // 司机屏才可关闭自动驾驶 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null) + } } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt index a9d63a6b1b..85e8eb1663 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.call.autopilot import android.os.SystemClock import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT @@ -10,6 +11,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LO import com.mogo.eagle.core.data.trafficlight.TrafficLightResult import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotProvider import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants import kotlin.random.Random @@ -40,7 +42,7 @@ object CallerAutoPilotManager { /** * 断开与工控机的连接 */ - fun disconnectIpc(){ + fun disconnectIpc() { providerApi?.disconnectIpc() } @@ -69,51 +71,70 @@ object CallerAutoPilotManager { * 发送红绿灯数据至工控机 */ fun sendTrafficLightData(trafficLightResult: TrafficLightResult) { - providerApi?.sendTrafficLightData(trafficLightResult) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.sendTrafficLightData(trafficLightResult) + } } /** * 发送 轨迹下载请求 */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { - providerApi?.sendTrajectoryDownloadReq(autoPilotLine) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.sendTrajectoryDownloadReq(autoPilotLine) + } } /** * 结束自动驾驶 */ fun cancelAutoPilot() { - providerApi?.cancelAutoPilot() + // 司机屏才能取消自动驾驶 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.cancelAutoPilot() + } } /** * 开启域控制器录制bag包 */ fun recordPackage() { - providerApi?.recordPackage(1, Random(SystemClock.elapsedRealtime()).nextInt()) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.recordPackage(1, Random(SystemClock.elapsedRealtime()).nextInt()) + } } - fun recordPackage(duration: Int){ - providerApi?.recordPackage(1, Random(SystemClock.elapsedRealtime()).nextInt(),duration) + fun recordPackage(duration: Int) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.recordPackage(1, Random(SystemClock.elapsedRealtime()).nextInt(), duration) + } } fun recordPackage(type: Int, id: Int) { - providerApi?.recordPackage(type, id) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.recordPackage(type, id) + } } fun recordPackage(type: Int, id: Int, duration: Int) { - providerApi?.recordPackage(type, id, duration) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.recordPackage(type, id, duration) + } } - fun recordPackage(type: Int, id: Int, duration: Int,bduration: Int){ - providerApi?.recordPackage(type, id, duration, bduration) + fun recordPackage(type: Int, id: Int, duration: Int, bduration: Int) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.recordPackage(type, id, duration, bduration) + } } /** * 停止录制bag包 */ fun stopRecord(type: Int, id: Int) { - providerApi?.stopRecord(type, id) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.stopRecord(type, id) + } } /** @@ -127,8 +148,8 @@ object CallerAutoPilotManager { /** * ADAS日志开启状态 */ - fun isEnableLog(): Boolean{ - return providerApi?.isEnableLog()?:false + fun isEnableLog(): Boolean { + return providerApi?.isEnableLog() ?: false } @@ -136,11 +157,19 @@ object CallerAutoPilotManager { * speed单位:km/h */ fun setAutoPilotSpeed(speed: Int): Boolean { - return providerApi?.setAutoPilotSpeed(speed) ?: false + // 司机屏才可以设置最大速度 + return if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.setAutoPilotSpeed(speed) ?: false + } else { + false + } } fun recordCause(key: String?, name: String?, id: String?, reason: String?) { - providerApi?.recordCause(key, name, id, reason) + // 乘客屏不需要记录人工接管原因 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.recordCause(key, name, id, reason) + } } fun setIPCShutDown() { @@ -157,7 +186,9 @@ object CallerAutoPilotManager { * isEnable = false 关闭 */ fun setDemoMode(isEnable: Boolean) { - providerApi?.setDemoMode(isEnable) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.setDemoMode(isEnable) + } } /** @@ -173,8 +204,11 @@ object CallerAutoPilotManager { * isEnable = true 开启 * isEnable = false 关闭 */ - fun setIPCDemoMode(isEnable: Boolean){ - providerApi?.setIPCDemoMode(isEnable) + fun setIPCDemoMode(isEnable: Boolean) { + // 司机屏才能控制美化模式(状态是在客户端维护、管理的) + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.setIPCDemoMode(isEnable) + } } /** @@ -182,15 +216,18 @@ object CallerAutoPilotManager { * isEnable = true 开启 * isEnable = false 关闭 */ - fun setRainMode(isEnable: Boolean){ + fun setRainMode(isEnable: Boolean) { providerApi?.setRainMode(isEnable) } /** * 获取数据采集录制模式配置列表 */ - fun getBadCaseConfig(){ - providerApi?.getBadCaseConfig() + fun getBadCaseConfig() { + // 司机屏才能查询数据采集的配置 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.getBadCaseConfig() + } } /** @@ -224,8 +261,10 @@ object CallerAutoPilotManager { /** * 发送工控机所有节点重启命令 */ - fun sendIpcReboot(){ - providerApi?.sendIpcReboot() + fun sendIpcReboot() { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + providerApi?.sendIpcReboot() + } } /** @@ -247,22 +286,22 @@ object CallerAutoPilotManager { /** * 查询工控机基础配置信息 */ - fun getCarConfig(){ + fun getCarConfig() { providerApi?.getCarConfig() } /** * 获取全局路径 */ - fun getGlobalPath(){ + fun getGlobalPath() { providerApi?.getGlobalPath() } /** *获取协议版本 */ - fun getProtocolVersion(): Int{ - return providerApi?.getProtocolVersion() ?:0 + fun getProtocolVersion(): Int { + return providerApi?.getProtocolVersion() ?: 0 } fun connectSpecifiedServer(ip: String) { From 1742d3e8240e45c0885d912286c5ba766268fb3b Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 19 Sep 2022 19:25:40 +0800 Subject: [PATCH 064/226] =?UTF-8?q?[Fix]=E5=BF=BD=E7=95=A5=E7=B3=BB?= =?UTF-8?q?=E7=BB=9Fso=E7=9A=84=E7=9B=91=E6=8E=A7=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=97=B6=E8=A7=A3=E5=86=B3KOOM=E5=B4=A9=E6=BA=83=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/eagle/core/function/main/MainActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index ba48df44ff..ad61a55aa2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -304,7 +304,8 @@ public class MainActivity extends MvpActivity implement .setLoopInterval(50000) .setMonitorThreshold(16) .setNativeHeapAllocatedThreshold(0) - .setEnableLocalSymbolic(true) + .setIgnoredSoList(new String[]{"libart", "libc"}) + .setEnableLocalSymbolic(BuildConfig.DEBUG) .setLeakListener(leaks -> { StringBuilder stringBuilder = new StringBuilder(); if (!leaks.isEmpty()) { From e2396364cf20ce81e223d0c44ef5ebd6ea43abe9 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Tue, 20 Sep 2022 14:45:45 +0800 Subject: [PATCH 065/226] =?UTF-8?q?[Fix]=E8=A7=A3=E5=86=B3KOOM=E5=A4=84?= =?UTF-8?q?=E4=BA=8EDebugMode=E5=AF=BC=E8=87=B4=E7=9A=84Java=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/function/main/KoomInitTask.kt | 24 +++++++++++++++++++ .../function/main/MainMoGoApplication.java | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt new file mode 100644 index 0000000000..4fb06a0f67 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt @@ -0,0 +1,24 @@ +package com.mogo.eagle.core.function.main + +import android.app.Application +import android.os.Build +import com.kwai.koom.base.CommonConfig +import com.kwai.koom.base.InitTask +import com.kwai.koom.base.MonitorManager + +object KoomInitTask : InitTask { + override fun init(application: Application) { + val config = CommonConfig.Builder() + .setApplication(application) // Set application + .setDebugMode(false) + .setVersionNameInvoker { "1.0.0" } // Set version name, java leak feature use it + .setSdkVersionMatch( + Build.VERSION.SDK_INT <= 31 && Build.VERSION.SDK_INT + >= Build.VERSION_CODES.LOLLIPOP + ) // Set if current sdk version is supported + .build() + + MonitorManager.initCommonConfig(config) + .apply { onApplicationCreate() } + } +} \ 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 ef395d3e67..9560a84570 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 @@ -107,7 +107,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { } private void initKoom() { - DefaultInitTask.INSTANCE.init(this); + KoomInitTask.INSTANCE.init(this); } /** From d27b42c0a87dd2b952592cd9b75bf19e0282c2d5 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Tue, 20 Sep 2022 14:46:18 +0800 Subject: [PATCH 066/226] =?UTF-8?q?[Feat]=E4=BF=AE=E6=94=B9=E6=91=84?= =?UTF-8?q?=E5=83=8F=E5=A4=B4=E8=A7=86=E9=A2=91=E7=9A=84=E5=AE=BD=E9=AB=98?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/layout/view_camera_list.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml index b043efbb09..379e8e32d4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_camera_list.xml @@ -5,8 +5,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/notice_check_dialog_bg_color" - android:minWidth="777px" - android:minHeight="485px" + android:minWidth="882px" + android:minHeight="550px" app:roundLayoutRadius="30px"> @@ -68,8 +68,8 @@ Date: Wed, 21 Sep 2022 12:14:05 +0800 Subject: [PATCH 067/226] =?UTF-8?q?[Fix]=E8=A7=A3=E5=86=B3=E7=BE=8E?= =?UTF-8?q?=E5=8C=96=E6=A8=A1=E5=BC=8F=E6=97=B6=E5=BA=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotProvider.kt | 13 +++++- .../autopilot/telematic/TeleMsgHandler.kt | 46 +++++++++++++++---- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 037bcb6bd5..12fb24808b 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -344,7 +344,12 @@ class MoGoAutopilotProvider : override fun setDemoMode(isEnable: Boolean) { // 同步给乘客端 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - val byteArray = if (isEnable) byteArrayOf(1) else byteArrayOf(0) + val byteArray = if (isEnable) { + "1;${System.currentTimeMillis()}".toByteArray() + } else { + "0;${System.currentTimeMillis()}".toByteArray() + } +// val byteArray = if (isEnable) byteArrayOf(1) else byteArrayOf(0) if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() .sendMsgToAllClients( @@ -363,7 +368,11 @@ class MoGoAutopilotProvider : override fun setIgnoreConditionDraw(isIgnore: Boolean) { // 同步给乘客端 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - val byteArray = if (isIgnore) byteArrayOf(1) else byteArrayOf(0) + val byteArray = if (isIgnore) { + "1;${System.currentTimeMillis()}".toByteArray() + } else { + "0;${System.currentTimeMillis()}".toByteArray() + } if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() .sendMsgToAllClients( diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt index 461b9fd7f4..bff0d93ae0 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt @@ -41,6 +41,12 @@ class TeleMsgHandler : IMsgHandler { @Volatile private var isReceiveSN = false + @Volatile + private var demoModeTime = 0L + + @Volatile + private var timestamp = 0L + override fun handleMsgFromServer(msg: MogoProtocolMsg?, channel: Channel?) { msg?.let { when (it.protocolType) { @@ -57,11 +63,23 @@ class TeleMsgHandler : IMsgHandler { } } MogoProtocolMsg.SYNC_MODE_STATUS -> { - FunctionBuildConfig.isDemoMode = when (it.body[0].toInt()) { - 1 -> true - else -> false + val content = String(it.body) + if (content.contains(";")) { + val strArr = content.split(";") + if (strArr.size == 2) { + val currTime = strArr[1].toLong() + if (currTime > demoModeTime) { + FunctionBuildConfig.isDemoMode = when (strArr[0]) { + "1" -> true + else -> false + } + demoModeTime = currTime + invokeNettyConnResult("乘客屏收到的美化模式DemoMode为:${FunctionBuildConfig.isDemoMode}") + } else { + invokeNettyConnResult("乘客屏收到过时的美化模式DemoMode为:${FunctionBuildConfig.isDemoMode}") + } + } } - invokeNettyConnResult("乘客屏收到的美化模式DemoMode为:${FunctionBuildConfig.isDemoMode}") } MogoProtocolMsg.REQ_MAC_ADDRESS -> { val carConfig = MessagePad.CarConfigResp.parseFrom(msg.body) @@ -86,11 +104,23 @@ class TeleMsgHandler : IMsgHandler { } // 美化模式是否忽略条件直接绘制 11 -> { - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = when (it.body[0].toInt()) { - 1 -> true - else -> false + val content = String(it.body) + if (content.contains(";")) { + val strArr = content.split(";") + if (strArr.size == 2) { + val currTime = strArr[1].toLong() + if (currTime > timestamp) { + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = when (strArr[0]) { + "1" -> true + else -> false + } + timestamp = currTime + invokeNettyConnResult("乘客屏收到的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") + } else { + invokeNettyConnResult("乘客屏收到过时的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") + } + } } - invokeNettyConnResult("乘客屏收到的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") } else -> { } From 99b9d5acbefdf6491d69698c04f9615dedd58ea5 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 21 Sep 2022 15:00:14 +0800 Subject: [PATCH 068/226] =?UTF-8?q?[Fix]=E8=A7=A3=E5=86=B3=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=A9=BE=E9=A9=B6=E8=BF=87=E7=A8=8B=E4=B8=AD=E6=9D=80?= =?UTF-8?q?=E6=8E=89App=E5=86=8D=E8=BF=9B=E5=85=A5=E5=85=A8=E8=A7=88?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E6=B2=A1=E6=9C=89=E5=85=A8=E5=B1=80=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E8=A7=84=E5=88=92=E7=9A=84=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/eagle/core/function/smp/OverviewMapFragment.java | 3 +++ 1 file changed, 3 insertions(+) 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 c1862a7485..86e3cbf6e5 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 @@ -11,6 +11,7 @@ import com.mogo.commons.mvp.BaseFragment; 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.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; import com.mogo.eagle.core.function.map.R; import com.mogo.eagle.core.function.overview.InfStructureManager; @@ -89,6 +90,8 @@ public class OverviewMapFragment extends BaseFragment @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + // 主动查一次全局路径规划的数据 + CallerAutoPilotManager.INSTANCE.getGlobalPath(); // queryInfStructure(); } From 4d0625d4c6a9c234a92226e5fccd1fa02495abb1 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 21 Sep 2022 18:25:33 +0800 Subject: [PATCH 069/226] =?UTF-8?q?[Feat]=E4=BC=98=E5=8C=96=E8=87=AA?= =?UTF-8?q?=E8=BD=A6=E5=88=B0=E5=81=9C=E6=AD=A2=E7=BA=BF=E7=9A=84=E8=B7=9D?= =?UTF-8?q?=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2x/redlightwarning/LocationUtils.java | 74 +++++++++++++++++++ .../redlightwarning/RedLightWarningManager.kt | 28 ++++++- .../core/MogoTrafficLightManager.kt | 4 + 3 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/LocationUtils.java diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/LocationUtils.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/LocationUtils.java new file mode 100644 index 0000000000..fc062a3f45 --- /dev/null +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/LocationUtils.java @@ -0,0 +1,74 @@ +package com.mogo.eagle.core.function.v2x.redlightwarning; + +public class LocationUtils { + /** + * 地球半径 + */ + private static double EARTH_RADIUS = 6378.137; + + private static double rad( double d ) { + return d * Math.PI / 180.0; + } + + /** + * 计算两点间距离( 单位:米 ) + * @param lat1 + * @param lng1 + * @param lat2 + * @param lng2 + * @return + */ + public static double getDistance( double lat1, double lng1, double lat2, double lng2 ) { + double radLat1 = rad( lat1 ); + double radLat2 = rad(lat2); + double a = radLat1 - radLat2; + double b = rad(lng1) - rad(lng2); + double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) + * Math.pow(Math.sin(b / 2), 2))); + s = s * EARTH_RADIUS; + s = Math.round(s * 10000d) / 10000d; + s = s * 1000; + return s; + } + + + /** + * 点到直线的最短距离的判断 点(x0,y0) 到由两点组成的线段(x1,y1) ,( x2,y2 )
+ * ( 单位:米 ) + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param x0 + * @param y0 + * @return + */ + public static double pointToLine( double x1, double y1, double x2, double y2, double x0, double y0 ) { + double space; + double a, b, c; + a = getDistance(y1, x1, y2, x2);// 线段的长度 + b = getDistance(y1, x1, y0, x0);// (x1,y1)到点的距离 + c = getDistance(y2, x2, y0, x0);// (x2,y2)到点的距离 + if (c <= 0.000001 || b <= 0.000001) { + space = 0; + return space; + } + if (a <= 0.000001) { + space = b; + return space; + } + if (c * c >= a * a + b * b) { + space = b; + return space; + } + if (b * b >= a * a + c * c) { + space = c; + return space; + } + double p = (a + b + c) / 2;// 半周长 + double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));// 海伦公式求面积 + space = 2 * s / a;// 返回点到线的距离(利用三角形面积公式求高) + return space; + } +} diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt index 66acaf96d6..fa0c9d62ae 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/redlightwarning/RedLightWarningManager.kt @@ -15,6 +15,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager 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 import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.map.navi.IMogoCarLocationChangedListener2 import com.mogo.module.common.MogoApisHandler @@ -23,6 +24,7 @@ import com.zhjt.service_biz.BizConfig import kotlin.math.abs import kotlin.math.ceil import kotlin.math.floor +import kotlin.math.min class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, @@ -98,10 +100,15 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, CallerLogger.d("$M_V2X$TAG", "speed is:$speed") if (speed <= 2.5f) return// 小于等于9km/h不处理 // 由于到路口100m时回调不准,手动计算直线距离 - val distance = CallerMapUIServiceManager.getMapUIController()?.calculateLineDistance( - MogoLatLng(it.latitude, it.longitude), - MogoLatLng(trafficLightResult.lat, trafficLightResult.lon) - ) ?: 0f + val roadResult = MogoTrafficLightManager.INSTANCE.getRoadResult() + val distance = if (roadResult != null && roadResult.rectLatLngs.size >= 2) { + getMinDistance(roadResult.rectLatLngs, it.latitude, it.longitude) + } else { + CallerMapUIServiceManager.getMapUIController()?.calculateLineDistance( + MogoLatLng(it.latitude, it.longitude), + MogoLatLng(trafficLightResult.lat, trafficLightResult.lon) + ) ?: 0f + } CallerLogger.d( "$M_V2X$TAG", "路口经度为:${trafficLightResult.lon},纬度为:${trafficLightResult.lat};车的经度为:${it.longitude},纬度为:${it.latitude};两点距离为:${distance}" @@ -163,6 +170,19 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener, } } + private fun getMinDistance(points: List, lat: Double, lon: Double): Float { + // 到路口100m时才计算,赋值一个较大值 + var minValue = 9999.9 + val size = points.size + for (i in 0..size step 2) { + if (i < size) { + // 自车到0-1、2-3、4-5、6-7组成的线段的最小距离 + minValue = min(minValue, LocationUtils.pointToLine(points[i].lon, points[i].lat, points[i+1].lon, points[i+1].lat, lon, lat)) + } + } + return if (minValue > 9999) 0f else minValue.toFloat() + } + /** * 闯红灯预警 */ diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt index 96f39e2222..332fe3ba85 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/MogoTrafficLightManager.kt @@ -151,6 +151,10 @@ class MogoTrafficLightManager : IMogoCarLocationChangedListener2 { return null } + fun getRoadResult(): RoadIDResult? { + return roadIDResult + } + fun turnLightToGreen( lightId: Int, crossingNo: String, From 1c2b42c5c80eb4ba5ea8d0ff13baeb394f70fba5 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Fri, 23 Sep 2022 14:36:35 +0800 Subject: [PATCH 070/226] =?UTF-8?q?[Feat]=E6=AF=8F10s=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E5=B1=8F=E5=90=8C=E6=AD=A5=E4=B8=80=E6=AC=A1=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=B0=E6=89=80=E6=9C=89=E4=B9=98=E5=AE=A2=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotProvider.kt | 18 +++++++++++-- .../autopilot/telematic/IMsgHandler.kt | 2 ++ .../autopilot/telematic/TeleMsgHandler.kt | 25 ++++++++++++++++--- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 12fb24808b..0a8c633f83 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -54,6 +54,7 @@ import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel import mogo.telematics.pad.MessagePad +import java.util.* import java.util.concurrent.TimeUnit @@ -69,6 +70,7 @@ class MoGoAutopilotProvider : private val TAG = "MoGoAutoPilotProvider" private var mContext: Context? = null private lateinit var msgHandler: IMsgHandler + private var timer: Timer? = null override val functionName: String get() = TAG @@ -109,11 +111,25 @@ class MoGoAutopilotProvider : override fun onStartServer() { ToastUtils.showShort("司机端服务启动成功!") + if (timer == null) { + timer = Timer() + } + // 10s同步一次数据到乘客屏 + timer!!.schedule(object : TimerTask() { + override fun run() { + // 同步是否开启美化模式 + setDemoMode(FunctionBuildConfig.isDemoMode) + setIgnoreConditionDraw(FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData) + msgHandler.synMsgToAllClients() + } + }, 1000, 10000) invokeNettyConnResult("司机端服务启动成功!") } override fun onStopServer() { ToastUtils.showLong("司机端服务停止!") + timer?.cancel() + timer = null invokeNettyConnResult("司机端服务停止!") } @@ -169,8 +185,6 @@ class MoGoAutopilotProvider : CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……") // 同步数据给工控机的服务 AsyncDataToAutopilotServer.INSTANCE.initServer() - // 同步是否开启美化模式 - setDemoMode(FunctionBuildConfig.isDemoMode) // 同步是否开启雨天模式 setRainMode(FunctionBuildConfig.isRainMode) } diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt index f4d1c9bbab..3f9c72d8fc 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/IMsgHandler.kt @@ -17,4 +17,6 @@ interface IMsgHandler { fun synWriteTime() fun getTeleTimeStamp(): Long + + fun synMsgToAllClients() } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt index bff0d93ae0..716eab5c48 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/telematic/TeleMsgHandler.kt @@ -110,10 +110,11 @@ class TeleMsgHandler : IMsgHandler { if (strArr.size == 2) { val currTime = strArr[1].toLong() if (currTime > timestamp) { - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = when (strArr[0]) { - "1" -> true - else -> false - } + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = + when (strArr[0]) { + "1" -> true + else -> false + } timestamp = currTime invokeNettyConnResult("乘客屏收到的美化模式isIgnore为:${FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData}") } else { @@ -273,4 +274,20 @@ class TeleMsgHandler : IMsgHandler { } } } + + override fun synMsgToAllClients() { + if (NSDNettyManager.getInstance().isServerStart) { + val carConfig = AdasManager.getInstance().carConfig + if (carConfig != null) { + val configArray = carConfig.toByteArray() + + NSDNettyManager.getInstance().sendMsgToAllClients( + MogoProtocolMsg( + MogoProtocolMsg.REQ_MAC_ADDRESS, + configArray.size, configArray + ) + ) + } + } + } } \ No newline at end of file From f856d0fc238a5c23a19c813754d6119116c08216 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 23 Sep 2022 16:44:39 +0800 Subject: [PATCH 071/226] add trace of cloud v2n --- .../trace/TraceManager.kt | 5 ++++- .../core/function/v2x/events/V2XEventManager.kt | 14 ++++++++++++++ .../eagle/core/data/deva/chain/ChainConstant.kt | 3 +++ 3 files changed, 21 insertions(+), 1 deletion(-) 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 5d38abba20..a0c48db9ec 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 @@ -61,7 +61,8 @@ class TraceManager : IMoGoCloudListener { FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_PLANNING_ACTIONS) fwBuildMap[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_NATIVE_LEAK) - + fwBuildMap[ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_CLOUD_WEB_SOCKET_V2N) traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS] = @@ -84,6 +85,8 @@ class TraceManager : IMoGoCloudListener { ChainLogParam(true, "ADAS PLANNING 决策行为") traceInfoCache[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = ChainLogParam(true, "Native Leak Record") + traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N] = + ChainLogParam(true, "Cloud WebSocket V2N") FileWriteManager.getInstance() .init(context, MoGoAiCloudClientConfig.getInstance().sn, pkgName, fwBuildMap) diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index a01193f381..7d436e2693 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt @@ -14,6 +14,10 @@ import com.mogo.cloud.passport.IMoGoTokenCallback import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.network.ParamsUtil +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_V2N +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD_SHOW +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CLOUD_V2N import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.data.map.* import com.mogo.eagle.core.data.traffic.TrafficData @@ -76,6 +80,8 @@ import com.shuyu.gsyvideoplayer.model.VideoOptionModel import com.shuyu.gsyvideoplayer.player.IjkPlayerManager import com.shuyu.gsyvideoplayer.player.PlayerFactory import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.zhjt.service.chain.ChainLog +import com.zhjt.service.chain.TracingConstants import kotlinx.coroutines.* import kotlinx.coroutines.android.asCoroutineDispatcher import roadwork.Road.RW_PB @@ -433,6 +439,14 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb /** * V2XEvent事件回调 */ + @ChainLog( + linkChainLog = CHAIN_LINK_LOG_CLOUD_V2N, + linkCode = CHAIN_LINK_CLOUD_SHOW, + endpoint = TracingConstants.Endpoint.PAD, + nodeAliasCode = CHAIN_ALIAS_CODE_CLOUD_V2N, + paramIndexes = [0], + clientPkFileName = "sn" + ) override fun onAck(event: V2XEvent) { Log.d("$M_V2X$TAG", "OK->: $event") when (event) { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index 2e043376c1..58bc9c50b4 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -23,6 +23,7 @@ class ChainConstant { const val CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS = 7 const val CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS = 8 const val CHAIN_LINK_LOG_NATIVE_LEAK = 100 + const val CHAIN_LINK_LOG_CLOUD_V2N = 200 const val CHAIN_LINK_LOG_ADAS_INIT = "-eagleInitStatus" const val CHAIN_LINK_LOG_ADAS_GNSS = "-adasWsGnssInfo" @@ -34,6 +35,7 @@ class ChainConstant { const val CHAIN_LINK_LOG_ADAS_PLANNING_OBJECTS = "-adasWsPlanningObj" const val CHAIN_LINK_LOG_ADAS_PLANNING_ACTIONS = "-adasWsPlanningActions" const val CHAIN_LINK_LOG_RECORD_NATIVE_LEAK = "-eagleRecordNativeLeak" + const val CHAIN_LINK_LOG_CLOUD_WEB_SOCKET_V2N = "-eagleCloudWSV2N" const val CHAIN_ALIAS_CODE_MULTI_CONNECT = "CHAIN_ALIAS_CODE_MULTI_CONNECT" const val CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG = "CHAIN_ALIAS_CODE_CAR_CONFIG" @@ -60,6 +62,7 @@ class ChainConstant { const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_ERROR = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_ERROR" const val CHAIN_ALIAS_CODE_HTTP_DNS_CHANGED = "CHAIN_ALIAS_CODE_HTTP_DNS_CHANGED" const val CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED = "CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED" + const val CHAIN_ALIAS_CODE_CLOUD_V2N = "CHAIN_ALIAS_CODE_CLOUD_V2N" const val CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED = "CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED" const val CHAIN_ALIAS_CODE_INIT_ON_MAP_INIT = "CHAIN_ALIAS_CODE_INIT_ON_MAP_INIT" From 7c36193fcddf258b3ddf797d36160bf26f61fc47 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Fri, 23 Sep 2022 17:28:40 +0800 Subject: [PATCH 072/226] fixed conflict --- .../eagle/core/function/bindingcar/BindingcarProvider.java | 2 ++ .../mogo/eagle/core/function/main/MainMoGoApplication.java | 2 +- .../core/function/call/devatools/CallerDevaToolsManager.kt | 2 ++ .../core/utilcode/breakpoint/services/DownloadService.java | 3 ++- .../core/utilcode/breakpoint/thread/DownloadThread.java | 5 +++++ 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index 24cdbc4766..1e61715f12 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.bindingcar; import android.content.Context; +import android.util.Log; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.eagle.core.data.config.FunctionBuildConfig; @@ -57,6 +58,7 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { */ @Override public void getBindingcarInfo(String macAddress, String widevineIDWithMd5) { + Log.d("Upgrade", "getBindingcarInfo macAddress = " + macAddress + "--widevineIDWithMd5 = " + widevineIDWithMd5); mAddress = macAddress; mWidevineIDWithMd5 = widevineIDWithMd5; if (getScreenType() == 1) { //司机屏 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 9560a84570..a966242631 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 @@ -84,7 +84,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { MoGoHandAdasMsgManager.getInstance(getBaseContext()).getConfig(); } } - },8000); + },7000); UiThreadHandler.postDelayed(new Runnable() { @Override 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 75ef1f977a..2b79774e54 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 @@ -146,7 +146,9 @@ object CallerDevaToolsManager { */ fun downLoadPackage(downloadKey: String, downloadUrl: String) { devaToolsProviderApi?.downLoadPackage(downloadKey, downloadUrl) +// Log.d("Update", "downloadKey = $downloadKey --- downloadUrl = $downloadUrl") // devaToolsProviderApi?.downLoadPackage("IntelligentPilot_v2.9.0.1002_20220725_[fPadLenovoOchBus-launcher-qa]_debug.apk", "https://scm-1255510688.cos.ap-beijing.myqcloud.com/test/com.mogo.launcher.f/2.9.0.1002/IntelligentPilot_v2.9.0.1002_20220725_[fPadLenovoOchBus-launcher-qa]_debug.apk") +// devaToolsProviderApi?.downLoadPackage("IntelligentPilot_v2.10.0_20220921_[fPadLenovoOchBus-launcher-qa]_debug.apk", "http://datacollect-1255510688.cos.ap-beijing.myqcloud.com/eagle_eye_apk/a657ca047711d61fe43c5f54a2e3e2dd/IntelligentPilot_v2.10.0_20220921_%5BfPadLenovoOchBus-launcher-qa%5D_debug.apk?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDvGBZgjPVm09B7sjyTPL7najBQMB7baBb%26q-sign-time%3D1663916659%3B1666508659%26q-key-time%3D1663916659%3B1666508659%26q-header-list%3Dhost%26q-url-param-list%3D%26q-signature%3Dd2f97c31465c161ae3960166564affeca5464fbf&filename=/IntelligentPilot_v2.10.0_20220921_[fPadLenovoOchBus-launcher-qa]_debug.apk") } /** diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java index b5bd2285f0..544ebc8329 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java @@ -147,6 +147,7 @@ public class DownloadService implements InitThread.InitCallBack, DownloadCallBac @Override public void progressCallBack(String url, int length) { IDownload iDownload = callBacks.get(url); + Log.d(DOWN_LOAD_TAG, "iDownload progressCallBack = " + iDownload); if (iDownload != null) { iDownload.onProgress(url, length); } @@ -155,7 +156,7 @@ public class DownloadService implements InitThread.InitCallBack, DownloadCallBac @Override public void threadDownLoadFinished(String url, ThreadBean threadBean) { IDownload iDownload = callBacks.get(url); - Log.d(DOWN_LOAD_TAG, "iDownload = " + iDownload); + Log.d(DOWN_LOAD_TAG, "iDownload threadDownLoadFinished = " + iDownload); if (iDownload != null) { iDownload.onFinished(url, threadBean); } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/thread/DownloadThread.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/thread/DownloadThread.java index c8f2b05b6c..c20becc8ee 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/thread/DownloadThread.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/thread/DownloadThread.java @@ -1,6 +1,10 @@ package com.mogo.eagle.core.utilcode.breakpoint.thread; +import static com.mogo.eagle.core.utilcode.breakpoint.Config.DOWN_LOAD_TAG; + +import android.util.Log; + import com.mogo.eagle.core.utilcode.breakpoint.Config; import com.mogo.eagle.core.utilcode.breakpoint.bean.FileBean; import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean; @@ -51,6 +55,7 @@ public class DownloadThread extends Thread { raf = new RandomAccessFile(file,"rwd"); raf.seek(start); //开始下载 + Log.d(DOWN_LOAD_TAG, "DownloadThread connection.getResponseCode() = " + connection.getResponseCode() + "---threadBean.getUrl() =" + threadBean.getUrl()); if(connection.getResponseCode() == HttpURLConnection.HTTP_PARTIAL){ inputStream = connection.getInputStream(); byte[] bytes = new byte[1024]; From b83f066a8798ab98fc5e532dc29c1daf68487c54 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 23 Sep 2022 17:29:14 +0800 Subject: [PATCH 073/226] =?UTF-8?q?[2110]=20bus=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E9=A1=B5=E9=9D=A2=E3=80=81bus=E7=BA=BF?= =?UTF-8?q?=E8=B7=AF=E8=BF=87=E9=95=BF=E5=A4=84=E7=90=86=E3=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/presenter/BusLinePresenter.java | 2 +- .../mogo/och/bus/ui/BusSwitchLineActivity.kt | 8 +-- .../och/bus/ui/adapter/SwitchLineAdapter.kt | 15 ++++- .../res/layout/bus_switch_line_list_item.xml | 4 +- .../src/main/res/values/strings.xml | 4 +- .../module/biz/provider/LoginService.kt | 2 + .../module/biz/provider/LoginServiceImpl.kt | 63 ++++++++++-------- .../module/biz/ui/TaxiLoginDialogFragment.kt | 26 ++++++++ .../res/drawable-xhdpi/bus_ic_login_bg.webp | Bin 0 -> 51872 bytes .../src/main/res/layout/taxi_login_view.xml | 1 + 10 files changed, 86 insertions(+), 39 deletions(-) create mode 100644 OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/bus_ic_login_bg.webp diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index 7f1a70a0d1..90ae07ae4d 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -77,7 +77,7 @@ public class BusLinePresenter extends Presenter implements IB return; } BusLineModel.getInstance().queryBusLineTasksById(lineId,position); - subscribe = Observable.interval(5, TimeUnit.SECONDS).subscribe(aLong -> { + subscribe = Observable.interval(3, TimeUnit.MINUTES).subscribe(aLong -> { BusLineModel.getInstance().queryBusLineTasksById(lineId,position); }); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt index 1309e825f5..581690e7e4 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -161,12 +161,10 @@ class BusSwitchLineActivity : MvpActivity result.taskList.addAll(lineTaskInfo.data) // 打开操作 mAdapter.notifyItemChanged(position) - if((position==mData.size-1||position==mData.size-2)&&mData.size>6){ - linearLayoutManager.stackFromEnd = true - }else{ - linearLayoutManager.stackFromEnd = false - } + linearLayoutManager.stackFromEnd = (position==mData.size-1||position==mData.size-2)&&mData.size>6 mLinesListView.scrollToPosition(position) + }else if(lineTaskInfo.data.isEmpty()){ + mAdapter.notifyItemChanged(position) } } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt index 44d5a0fe25..8ff7865597 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/adapter/SwitchLineAdapter.kt @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView import com.mogo.och.bus.R import com.mogo.och.bus.bean.BusQueryLinesResponse import com.mogo.och.bus.ui.adapter.SwitchLineAdapter.SwitchLineViewHolder +import kotlin.text.StringBuilder /** * 路线列表adapter @@ -39,8 +40,20 @@ class SwitchLineAdapter( override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { val currentPosition = holder.bindingAdapterPosition val line = mData[currentPosition] + if(line.name!=null&&line.name.length>10){ + line.name = line.name.substring(0,10)+"…" + } holder.lineName.text = line.name - holder.lineEndName.text = mContext.getString(R.string.bus_line_goto_end, line.endSiteName) + val sb = StringBuilder() + if (line.endSiteName!=null&&line.endSiteName.length>10) { + sb.append(line.endSiteName.substring(0,5)) + sb.append("…") + sb.append(line.endSiteName.substring(line.endSiteName.length-5,line.endSiteName.length)) + }else{ + sb.append(line.endSiteName) + } + val string = mContext.getString(R.string.bus_line_goto_end, sb.toString()) + holder.lineEndName.text = string holder.rvLineTask.layoutManager = GridLayoutManager(mContext, 3) val switchLineTaskAdapter = SwitchLineTaskAdapter( mContext, diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml index 4d87d3ee0e..f983004340 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml @@ -49,13 +49,13 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_20" android:layout_marginBottom="@dimen/dp_35" - android:ellipsize="end" - android:maxLines="2" + android:singleLine="true" android:textColor="@color/bus_color_b9c3e9" android:textSize="@dimen/dp_36" app:layout_constraintBottom_toTopOf="@+id/v_line_task" app:layout_constraintStart_toStartOf="@+id/switch_line_name" app:layout_constraintTop_toBottomOf="@+id/switch_line_name" + app:layout_constraintEnd_toStartOf="@+id/actv_show_more" tools:text="@string/bus_switch_line_end" /> 起点: 终点: 往%1$s方向 - 更换路线成功 - 更换路线失败 + 更换任务成功 + 更换任务失败 起点: 终点: diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt index a311da107f..8ee6064620 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginService.kt @@ -21,6 +21,8 @@ interface LoginService : IProvider { fun queryLoginStatusByNet() + fun showUiModel(show:Boolean) + /** * 登出 */ diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt index 352fa57e6b..dbaa5c5c53 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/provider/LoginServiceImpl.kt @@ -28,6 +28,7 @@ class LoginServiceImpl : LoginService,ILoginViewCallback { private var fragment: Fragment?=null private var taxiLoginDialogFragment: WeakReference? = null private var presenter: OchCommonLoginStatusDefaultPresenter?=null + private var uiModel = true override fun init(context: Context) { @@ -53,40 +54,42 @@ class LoginServiceImpl : LoginService,ILoginViewCallback { override fun showLoginDialogFragment() { - fragment?.let { - CallerHmiManager.hideToolsView() - val parentFragmentManager = it.parentFragmentManager - val fragmentByTag: Fragment? = parentFragmentManager.findFragmentByTag(TAG) - if (fragmentByTag is DialogFragment) { - if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { - return - } - if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { - if (currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 - d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 权限验证") + if(uiModel) { + fragment?.let { + CallerHmiManager.hideToolsView() + val parentFragmentManager = it.parentFragmentManager + val fragmentByTag: Fragment? = parentFragmentManager.findFragmentByTag(TAG) + if (fragmentByTag is DialogFragment) { + if (fragmentByTag.dialog != null && fragmentByTag.dialog!!.isShowing) { return } + if (fragmentByTag.dialog != null && fragmentByTag.isAdded) { + if (currentActivity() == null) { // 没有在当前应用内 在启动页面关闭应用 + d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 权限验证") + return + } + } } - } - if (taxiLoginDialogFragment?.get() == null) { - taxiLoginDialogFragment = WeakReference(newInstance()) - } - val taxiLoginDialog = taxiLoginDialogFragment?.get() - if (taxiLoginDialog != null) { - if (taxiLoginDialog.dialog != null && taxiLoginDialog.dialog!!.isShowing) { - return + if (taxiLoginDialogFragment?.get() == null) { + taxiLoginDialogFragment = WeakReference(newInstance()) } - if (taxiLoginDialog.isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 - parentFragmentManager.beginTransaction().remove(taxiLoginDialog) - .commitAllowingStateLoss() + val taxiLoginDialog = taxiLoginDialogFragment?.get() + if (taxiLoginDialog != null) { + if (taxiLoginDialog.dialog != null && taxiLoginDialog.dialog!!.isShowing) { + return + } + if (taxiLoginDialog.isAdded) { //解决方法就是添加这行代码,如果已经添加了,就移除掉然后再show,就不会出现Fragment already added的错误了。 + parentFragmentManager.beginTransaction().remove(taxiLoginDialog) + .commitAllowingStateLoss() + } + d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面") + taxiLoginDialog.show(parentFragmentManager, TAG) + taxiLoginDialog.setOnDismissListener(DialogInterface.OnDismissListener { dialog: DialogInterface? -> + taxiLoginDialogFragment?.clear() + presenter?.queryLoginStatus() + }) } - d(SceneConstant.M_TAXI + TAG, "showLoginDialogFragment 展示登录界面") - taxiLoginDialog.show(parentFragmentManager, TAG) - taxiLoginDialog.setOnDismissListener(DialogInterface.OnDismissListener { dialog: DialogInterface? -> - taxiLoginDialogFragment?.clear() - presenter?.queryLoginStatus() - }) } } } @@ -104,6 +107,10 @@ class LoginServiceImpl : LoginService,ILoginViewCallback { presenter?.queryLoginStatus() } + override fun showUiModel(show:Boolean) { + uiModel = show; + } + override fun loginOut(mLatitude:Double,mLongitude:Double) { presenter?.logOut(mLatitude,mLongitude) } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt index b08e15472d..9751bc46cd 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/biz/ui/TaxiLoginDialogFragment.kt @@ -8,6 +8,7 @@ import android.util.Log import android.view.* import androidx.appcompat.widget.AppCompatButton import androidx.appcompat.widget.AppCompatEditText +import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat @@ -15,7 +16,9 @@ import androidx.core.widget.addTextChangedListener import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction +import com.alibaba.android.arouter.launcher.ARouter import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.mvp.MvpDialogFragment import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -23,7 +26,9 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.KeyboardUtils import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.constant.OchCommonConst import com.mogo.och.common.module.biz.presenter.OchCommonLoginPresenter +import com.mogo.och.common.module.biz.provider.LoginService /** @@ -40,6 +45,7 @@ class TaxiLoginDialogFragment : MvpDialogFragment @@ -81,6 +89,17 @@ class TaxiLoginDialogFragment : MvpDialogFragment { + acivLoginBg.setImageResource(R.drawable.taxi_ic_login_bg) + } + "fPadLenovoOchBus" -> { + acivLoginBg.setImageResource(R.drawable.bus_ic_login_bg) + } + } + } + private fun initListener() { mRootView.isFocusable = true mRootView.isFocusableInTouchMode = true @@ -121,6 +140,13 @@ class TaxiLoginDialogFragment : MvpDialogFragment if(itEditable.isNotEmpty()){ diff --git a/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/bus_ic_login_bg.webp b/OCH/mogo-och-common-module/src/main/res/drawable-xhdpi/bus_ic_login_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..7d762618637131f7f89cfe2a50166eead44ea5ab GIT binary patch literal 51872 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 Wcz*kKAFJd<0)? From 7943e2b57dd48262ad1f0568dfa019024c6907a6 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Fri, 23 Sep 2022 18:57:57 +0800 Subject: [PATCH 074/226] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/appupgrade/network/UpgradeAppNetWorkManager.java | 2 +- .../com/mogo/eagle/core/function/main/MainMoGoApplication.java | 2 +- .../core/utilcode/breakpoint/services/DownloadService.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) 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 164da63439..79b4690c45 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 @@ -63,7 +63,7 @@ public class UpgradeAppNetWorkManager { // String mac = "48:b0:2d:3a:bc:78"; String sn = MoGoAiCloudClientConfig.getInstance().getSn(); int versionCode = AppUtils.getAppVersionCode(); - Log.d("Upgrade", "mac = " + mac + "---type = " + screenType + "---sn = " + sn ); + Log.d("Upgrade", "mac = " + mac + "---type = " + screenType + "---sn = " + sn + "---versionCode =" + versionCode); UpgradeAppRequest request = new UpgradeAppRequest(sn, mac, screenType); RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); mUpgradeApiService.getUpgradeInfo(requestBody) 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 a966242631..9560a84570 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 @@ -84,7 +84,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { MoGoHandAdasMsgManager.getInstance(getBaseContext()).getConfig(); } } - },7000); + },8000); UiThreadHandler.postDelayed(new Runnable() { @Override diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java index 544ebc8329..a9d09d9203 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/breakpoint/services/DownloadService.java @@ -147,7 +147,6 @@ public class DownloadService implements InitThread.InitCallBack, DownloadCallBac @Override public void progressCallBack(String url, int length) { IDownload iDownload = callBacks.get(url); - Log.d(DOWN_LOAD_TAG, "iDownload progressCallBack = " + iDownload); if (iDownload != null) { iDownload.onProgress(url, length); } From d77993fdabc2eece4b5ae442a0b3228ec7644cef Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 23 Sep 2022 19:24:41 +0800 Subject: [PATCH 075/226] =?UTF-8?q?[2.11.0/1.6.0]=20bus=20=E5=8F=B8?= =?UTF-8?q?=E6=9C=BA=E7=AB=AF/=E4=B9=98=E5=AE=A2=E5=B1=8F=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=92=8CUI=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/BusPassengerRouteFragment.java | 5 + .../res/layout/bus_p_stations_common_item.xml | 1 + .../och/bus/bean/BusCloseTaskRequest.java | 2 +- .../BusQueryWriteOffPassengersResponse.java | 13 ++ .../BusWriteOffPassengersQueryRequest.java | 24 ++++ .../mogo/och/bus/bean/WriteOffPassenger.java | 12 ++ .../com/mogo/och/bus/constant/BusConst.kt | 2 + .../com/mogo/och/bus/model/BusOrderModel.java | 113 +++++++++-------- .../mogo/och/bus/net/BusServiceManager.java | 18 +++ .../com/mogo/och/bus/net/IBusApiService.java | 18 ++- .../bus/presenter/BusModelLoopManager.java | 8 +- OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 | Bin 0 -> 15150 bytes .../common/module/utils/SoundPoolHelper.java | 118 ++++++++++++++++++ 13 files changed, 271 insertions(+), 63 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java create mode 100644 OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java 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 3d14392c01..29a617b2fd 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 @@ -11,7 +11,9 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.PagerSnapHelper; import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SnapHelper; import com.amap.api.maps.model.LatLng; import com.elegant.utils.UiThreadHandler; @@ -88,10 +90,13 @@ public class BusPassengerRouteFragment extends mRouteInfoView = findViewById(R.id.bus_p_line_cl); mStationsListRv = findViewById(R.id.bus_p_line_stations_rl); + LinearLayoutManager manager = new LinearLayoutManager(getContext()); mStationsListRv.setLayoutManager(manager); mAdapter = new BusPassengerLineStationsAdapter(getContext(), mStationsList); mStationsListRv.setAdapter(mAdapter); + SnapHelper snapHelper = new PagerSnapHelper(); + snapHelper.attachToRecyclerView(mStationsListRv); mMapArrowIcon = findViewById(R.id.bus_p_arrow_nor); diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml index 9756db9d25..5a70e82c9c 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml @@ -34,6 +34,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitXY" + android:layout_marginLeft="12px" android:src="@drawable/bus_p_line_blue" app:layout_constraintLeft_toLeftOf="@+id/bus_p_circle" app:layout_constraintRight_toRightOf="@+id/bus_p_circle" diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java index 02c4e1e8f1..d8a11924af 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusCloseTaskRequest.java @@ -3,7 +3,7 @@ package com.mogo.och.bus.bean; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; /** - * + * 中止/结束任务请求 */ public class BusCloseTaskRequest { diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java new file mode 100644 index 0000000000..36a5e3b409 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryWriteOffPassengersResponse.java @@ -0,0 +1,13 @@ +package com.mogo.och.bus.bean; + +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2021/10/19 + */ +public class BusQueryWriteOffPassengersResponse extends BaseData { + public List data; +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java new file mode 100644 index 0000000000..6f07456c78 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusWriteOffPassengersQueryRequest.java @@ -0,0 +1,24 @@ +package com.mogo.och.bus.bean; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; + +/** + * 查询核销乘客 + */ +public class BusWriteOffPassengersQueryRequest { + + private String sn; + private int taskId; + private int siteId; + private long verificationTime; + public BusWriteOffPassengersQueryRequest(int taskId, int siteId,long prePassengerTime) { + this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); + this.taskId = taskId; + this.siteId = siteId; + this.verificationTime = prePassengerTime; + } + + public String getSn() { + return sn; + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java new file mode 100644 index 0000000000..0e2bebe17d --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/WriteOffPassenger.java @@ -0,0 +1,12 @@ +package com.mogo.och.bus.bean; + +/** + * @author: wangmingjun + * @date: 2022/9/23 + */ +public class WriteOffPassenger { + public String phone; + public String orderNo; + public int passengerSize; + public long writeOffTime; +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt index 867aa2df61..1c8cf2601c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt @@ -77,7 +77,9 @@ class BusConst { const val ARRIVE_AT_END_STATION_DISTANCE = 10 // 轮询 + const val LOOP_PASSENGER_5S = 5 * 1000L const val LOOP_PASSENGER_2S = 2 * 1000L const val LOOP_PASSENGER_1S = 1 * 1000L + const val LOOP_DELAY_500 = 500L } } \ No newline at end of file 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 767438c745..ce6eafa0c5 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 @@ -8,7 +8,6 @@ import android.content.Context; import android.location.Location; import android.os.Handler; import android.os.Message; -import android.text.TextUtils; import androidx.annotation.NonNull; @@ -30,16 +29,16 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; 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.bean.BusOrderBean; -import com.mogo.och.bus.bean.BusOrdersResponse; +import com.mogo.och.bus.R; +import com.mogo.och.bus.bean.BusQueryWriteOffPassengersResponse; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.BusRoutesResult; import com.mogo.och.bus.bean.BusStationBean; import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; +import com.mogo.och.bus.bean.WriteOffPassenger; import com.mogo.och.bus.callback.IBusControllerStatusCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; @@ -54,23 +53,18 @@ import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.DateTimeUtil; import com.mogo.och.common.module.utils.PinYinUtil; +import com.mogo.och.common.module.utils.SoundPoolHelper; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; -import com.zhjt.service.chain.ChainLog; -import com.zhjt.service.chain.TracingConstants; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; -import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; -import io.reactivex.schedulers.Schedulers; import mogo.telematics.pad.MessagePad; /** @@ -114,11 +108,13 @@ public class BusOrderModel { private LoginService loginService; + private long prePassengerWriteOffTime = 0; //记录最后查询到乘客核销的时间 + private final Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if ( msg.what == MSG_QUERY_BUS_STATION ) { - BusOrderModel.getInstance().queryBusRoutes(); + queryBusRoutes(); return true; } return false; @@ -509,6 +505,7 @@ public class BusOrderModel { isGoingToNextStation = false; if (o.code == 0){ // 重置成功 queryBusRoutes(); + startOrStopQueryPassengerWriteOff(false); } } @@ -588,12 +585,53 @@ public class BusOrderModel { */ public void queryPassengerWriteOff(){ //todo 查询接口拿到核销乘客波播报 + if ( backgroundCurrentStationIndex > stationList.size() - 1 ) { //到站短时间内调用多次 + CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" ); + return; + } + BusServiceManager.getInstance().queryStationWriteOffPassengers(mContext, + currentTaskId, + stationList.get(backgroundCurrentStationIndex).getSiteId(), + prePassengerWriteOffTime, + new IBusServiceCallback(){ + + @Override + public void onSuccess(BusQueryWriteOffPassengersResponse o) { + if (o.code !=0 || o.data == null || o.data.isEmpty()){ + return; + } + List passengers = o.data; + playWriteOffPassengersMsg(passengers); + } + + @Override + public void onFail(String failMsg) { + + } + }); + } + + private void playWriteOffPassengersMsg(List passengers) { + for (int i=0; i< passengers.size();i++){ + WriteOffPassenger passenger = passengers.get(i); + CallerLogger.INSTANCE.e( M_BUS + TAG, "size = " + passenger.passengerSize+ + " time = "+passenger.writeOffTime); + prePassengerWriteOffTime = passenger.writeOffTime; + int passengerNum = passenger.passengerSize; + if (passengerNum > 1){ //多人播报 "x人" + AIAssist.getInstance(mContext).speakTTSVoice(passengerNum + "人"); + }else { //是 1 播放 "滴" + SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(mContext, R.raw.bus_di); + } + } } private void startOrStopQueryPassengerWriteOff(boolean isStart){ if (isStart){ BusModelLoopManager.getInstance().startQueryPassengerWriteOffLoop(); }else { + prePassengerWriteOffTime = 0; + SoundPoolHelper.getSoundPoolHelper().releaseSoundPool(); BusModelLoopManager.getInstance().stopQueryPassengerWriteOffLoop(); } } @@ -601,15 +639,13 @@ public class BusOrderModel { /** * 到站后重置站点状态 */ - private void arriveSiteStation(boolean isRestart) { + private void arriveSiteStation() { if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { //到站短时间内调用多次 CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" ); return; } - int arrivedStationIndex = 0; - if (!isRestart){ - arrivedStationIndex = backgroundCurrentStationIndex + 1; - } + int arrivedStationIndex = backgroundCurrentStationIndex + 1; + CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex); BusServiceManager.getInstance().arriveSiteStation(mContext , @@ -620,11 +656,9 @@ public class BusOrderModel { @Override public void onSuccess(BaseData o) { CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success"); - if (!isRestart){ - queryBusRoutes(); - //todo 开始轮询到站核销的乘客 - startOrStopQueryPassengerWriteOff(true); - } + queryBusRoutes(); + //5s轮询核销乘客 + startOrStopQueryPassengerWriteOff(true); } @Override @@ -668,20 +702,6 @@ public class BusOrderModel { }); } - private void arrivedBusStationSuccess() { - List site = busRoutesResult.getSites(); - if (site != null && site.size() > 0){ - backgroundCurrentStationIndex ++; - if (refreshBusStationsCallback != null){ - String lineTime = DateTimeUtil.formatLongToString( - busRoutesResult.getTaskTime(), - DateTimeUtil.TAXI_HH_mm); - refreshBusStationsCallback.updateBusTaskStatus(busRoutesResult.getName(),lineTime, - stationList, backgroundCurrentStationIndex ,true); - } - } - } - // /** // * 查询到站下车乘客 // */ @@ -763,18 +783,16 @@ public class BusOrderModel { } } + if (backgroundCurrentStationIndex == 0){ //默认是第一站到站查询 + startOrStopQueryPassengerWriteOff(true); + } + BusStationBean currentStation = stationList.get(backgroundCurrentStationIndex); CallerLogger.INSTANCE.d( M_BUS + TAG, "渲染站点信息服务端currentStationIndex="+backgroundCurrentStationIndex +" isLeaving()="+currentStation.isLeaving()); - //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 - // ,订单开始站下在始发站的状态流转有问题 2022.9.23不需要再调用此接口,拿到任务默认就是首站 -// if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){ -// arriveSiteStation(true); -// } - // 美化是否开始 if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0 && backgroundCurrentStationIndex <= stationList.size()-1) @@ -923,18 +941,7 @@ public class BusOrderModel { CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex); isGoingToNextStation = false; - arriveSiteStation(false); - -// queryStationLeaveAwayPassengers();// 2.11.0不再播报乘客下车 -// UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单 -// @Override -// public void run() { -// if (!hadQueryLeaveAwayPassager){ -// arriveSiteStation(false); -// } -// hadQueryLeaveAwayPassager = false; -// } -// },1500); + arriveSiteStation(); } public boolean isGoingToNextStation() { diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java index c0ed142fde..d99fcc5d26 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java @@ -13,8 +13,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.bus.bean.BusCloseTaskRequest; import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; +import com.mogo.och.bus.bean.BusQueryWriteOffPassengersResponse; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; +import com.mogo.och.bus.bean.BusWriteOffPassengersQueryRequest; import com.mogo.och.bus.bean.CarHeartbeatReqBean; import com.mogo.och.bus.bean.BusOrdersResponse; import com.mogo.och.bus.bean.BusQueryLineStationsRequest; @@ -157,6 +159,22 @@ public class BusServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers")); } + /** + * 查询当前到站点核销乘客 + * @param context + * @param siteId + * @param callback + */ + public void queryStationWriteOffPassengers(Context context,int taskId,int siteId,long prePassengerTime + , IBusServiceCallback callback){ + mService.queryWriteOffPassengers( MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new BusWriteOffPassengersQueryRequest(taskId,siteId,prePassengerTime)) + .subscribeOn( Schedulers.io() ) + .observeOn( AndroidSchedulers.mainThread() ) + .subscribe(getSubscribeImpl(context,callback,"queryStationWriteOffPassengers")); + } + /** diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java index c1ef5dd7a6..7eced02c3a 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java @@ -1,8 +1,9 @@ package com.mogo.och.bus.net; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.bus.bean.BusCloseTaskRequest; -import com.mogo.och.bus.bean.BusOperationStatusRequest; import com.mogo.och.bus.bean.BusOrdersResponse; +import com.mogo.och.bus.bean.BusQueryWriteOffPassengersResponse; +import com.mogo.och.bus.bean.BusWriteOffPassengersQueryRequest; import com.mogo.och.bus.bean.BusQueryLineTaskResponse; import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; @@ -128,10 +129,6 @@ public interface IBusApiService { @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" ) Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); -// @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @POST("/autopilot-car-hailing/operation/v1/driver/bus/line/resetStart") -// Observable resetCurrentLineStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetLineStatusRequest data); - /** * 中止任务 * @param appId @@ -152,5 +149,16 @@ public interface IBusApiService { @Headers( {"Content-type:application/json;charset=UTF-8"} ) @POST("/autopilot-car-hailing/cab/flow/v1/bus/driver/bus/endTask") Observable endTask(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusCloseTaskRequest data); + + /** + * 任务正常跑完结束 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST("/autopilot-car-hailing/operation/v1/driver/order/verificationResult") + Observable queryWriteOffPassengers(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusWriteOffPassengersQueryRequest data); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java index 676aab6775..ad76324a64 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java @@ -1,8 +1,8 @@ package com.mogo.och.bus.presenter; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; -import static com.mogo.och.bus.constant.BusConst.LOOP_DELAY; -import static com.mogo.och.bus.constant.BusConst.LOOP_PASSENGER_2S; +import static com.mogo.och.bus.constant.BusConst.LOOP_DELAY_500; +import static com.mogo.och.bus.constant.BusConst.LOOP_PASSENGER_5S; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.bus.constant.BusConst; @@ -40,8 +40,8 @@ public class BusModelLoopManager { return; } CallerLogger.INSTANCE.i(M_BUS + TAG, "startQueryPassengerWriteOffLoop()"); - mQueryPassengerDisposable = Observable.interval(LOOP_DELAY, - LOOP_PASSENGER_2S, TimeUnit.MILLISECONDS) + mQueryPassengerDisposable = Observable.interval(LOOP_DELAY_500, + LOOP_PASSENGER_5S, TimeUnit.MILLISECONDS) .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 b/OCH/mogo-och-bus/src/main/res/raw/bus_di.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..15b31ed247d4390b1d571976c4f05d7d3da1571b GIT binary patch literal 15150 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 w<=LtEOaJJt%2@k{4eiMKgITNo8$iX11poj5 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java new file mode 100644 index 0000000000..74c80b8abd --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/SoundPoolHelper.java @@ -0,0 +1,118 @@ +package com.mogo.och.common.module.utils; + +import android.media.*; +import android.content.*; +import android.os.*; +import android.app.*; + +/** + * @author: wangmingjun + * @date: 2022/9/23 + * + */ +public class SoundPoolHelper { + private SoundPool mSoundPool; + private AudioManager mAudioManager; + private float volume; + // Maximumn sound stream. + private static final int MAX_STREAMS = 5; + // Stream type. + private static final int streamType = AudioManager.STREAM_MUSIC; + private int mSoundId; + private int resId; + private Context mContext; + + private volatile static SoundPoolHelper INSTANCE; + + public static SoundPoolHelper getSoundPoolHelper(){ + if (INSTANCE == null){ + synchronized (SoundPoolHelper.class){ + if (INSTANCE == null){ + INSTANCE = new SoundPoolHelper(); + } + } + } + return INSTANCE; + } + + public SoundPoolHelper(){} + + //播放资源文件 + public void playSoundWithRedId(Context context,int resId){ + this.mContext = context; + this.resId=resId; + init(); + } + + //init settings + private void init(){ + // AudioManager audio settings for adjusting the volume + mAudioManager = (AudioManager)this.mContext. getSystemService(Context.AUDIO_SERVICE); + + // Current volumn Index of particular stream type. + float currentVolumeIndex = (float) mAudioManager.getStreamVolume(streamType); + + // Get the maximum volume index for a particular stream type. + float maxVolumeIndex = (float) mAudioManager.getStreamMaxVolume(streamType); + + // Volumn (0 --> 1) + this.volume = currentVolumeIndex / maxVolumeIndex; + + // Suggests an audio stream whose volume should be changed by + // the hardware volume controls. + ((Activity)this.mContext).setVolumeControlStream(streamType); + + if (mSoundPool == null){ + // For Android SDK >= 21 + if (Build.VERSION.SDK_INT >= 21 ) { + + AudioAttributes audioAttrib = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_GAME) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(); + + SoundPool.Builder builder= new SoundPool.Builder(); + builder.setAudioAttributes(audioAttrib).setMaxStreams(MAX_STREAMS); + + this.mSoundPool = builder.build(); + } else {// for Android SDK < 21 + // SoundPool(int maxStreams, int streamType, int srcQuality) + this.mSoundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0); + } + } + + // When Sound Pool load complete. + this.mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { + @Override + public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { + playSound(); + } + }); + + //load res + this.mSoundId =this.mSoundPool.load(this.mContext,this.resId,1); + } + + /** + * 释放资源 + */ + public void releaseSoundPool() { + if (mSoundPool != null) { + mSoundPool.autoPause(); + mSoundPool.unload(mSoundId); + mSoundPool.release(); + mSoundPool = null; + } + } + + + + //play the sound res + private void playSound(){ + float leftVolumn = volume; + float rightVolumn = volume; + // Play sound of gunfire. Returns the ID of the new stream. + int streamId = this.mSoundPool.play(this.mSoundId,leftVolumn, rightVolumn, 1, 0, 1f); + } + +} From 850fa814bc7fa144b6ca0d6add0c3360d542b1e3 Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 23 Sep 2022 19:57:58 +0800 Subject: [PATCH 076/226] =?UTF-8?q?[V2X][Road]=E6=96=BD=E5=B7=A5=E5=8D=A0?= =?UTF-8?q?=E9=81=93=E4=BA=8B=E4=BB=B6=E8=A7=A6=E5=8F=91=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E9=81=93=E8=B7=AF=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/v2x/events/V2XEventManager.kt | 7 +- .../scenario/scene/airoad/AiRoadMarker.kt | 324 ++++++++++++++++++ .../scene/road/V2XRoadEventMarker.java | 28 -- gradle.properties | 2 +- .../src/main/java/com/mogo/map/IMogoMap.java | 13 +- .../java/com/mogo/map/center/CenterLine.kt | 13 + .../main/java/com/mogo/map/AMapWrapper.java | 25 ++ .../common/utils/DrivingDirectionUtils.java | 2 +- 8 files changed, 382 insertions(+), 32 deletions(-) create mode 100644 core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/center/CenterLine.kt diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index 7d436e2693..743505cf51 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt @@ -45,6 +45,8 @@ import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshCallback import com.mogo.eagle.core.function.v2x.events.observer.V2XOptimalRouteObserver import com.mogo.eagle.core.function.v2x.events.receiver.SceneBroadcastReceiver import com.mogo.eagle.core.function.v2x.events.scenario.impl.V2XScenarioManager +import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.* +import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker.Marker import com.mogo.eagle.core.function.v2x.events.utils.* import com.mogo.eagle.core.function.v2x.events.voice.V2XVoiceManager import com.mogo.eagle.core.network.utils.GsonUtil @@ -62,7 +64,6 @@ import com.mogo.module.common.drawer.TrafficMarkerDrawer import com.mogo.module.common.entity.* import com.mogo.module.common.entity.V2XMessageEntity.V2XTypeEnum import com.mogo.module.common.enums.EventTypeEnum -import com.mogo.module.common.enums.EventTypeEnum.FOURS_BLOCK_UP import com.mogo.module.common.enums.EventTypeHelper import com.mogo.service.statusmanager.IMogoStatusChangedListener import com.mogo.service.statusmanager.StatusDescriptor @@ -108,6 +109,7 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb BridgeApi.init(context) if (hasInit.compareAndSet(false, true)) { if (!V2XManager.hasInit()) { + AiRoadMarker.init(context) V2XManager.init(V2XConfig.Builder().also { it.aiCloudConfig(MoGoAiCloudClientConfig.getInstance()) it.context(context) @@ -483,6 +485,9 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb val p = CoordinateUtils.transformWgsToGcj(this.roadwork?.center?.point?.lat ?: 0.0, this.roadwork?.center?.point?.lon ?: 0.0) l4.lon = p[0] l4.lat = p[1] + AiRoadMarker.enqueue(Marker(this.roadwork?.center?.point?.lat ?: 0.0, this.roadwork?.center?.point?.lon ?: 0.0, this.roadwork?.polygonList?.takeIf { it.isNotEmpty() }?.map { d -> + android.util.Pair(d.lon, d.lat) + })) l4.angle = this.roadwork?.center?.road?.bearing?.toDouble() ?: 0.0 } }) diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt new file mode 100644 index 0000000000..411ab19fa7 --- /dev/null +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt @@ -0,0 +1,324 @@ +package com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad + +import android.content.* +import android.graphics.* +import android.util.* +import androidx.lifecycle.* +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.Lifecycle.Event.ON_CREATE +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import com.mogo.cloud.commons.utils.* +import com.mogo.eagle.core.data.map.* +import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine +import com.mogo.eagle.core.function.api.map.listener.* +import com.mogo.eagle.core.function.call.map.* +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener +import com.mogo.eagle.core.utilcode.kotlin.* +import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.mogo.map.* +import com.mogo.map.overlay.* +import com.mogo.module.common.utils.* +import io.netty.util.internal.* +import java.util.* +import java.util.concurrent.* +import java.util.concurrent.atomic.* + +/** + * Ai云道路施工事件,道路颜色标记类 + */ +object AiRoadMarker { + + private const val TAG = "AiRoadMarker" + + private val queue by lazy { LinkedBlockingQueue() } + + private val pool by lazy { Executors.newFixedThreadPool(2) } + + private val marker by lazy { AtomicReference() } + + private val curStopLine by lazy { AtomicReference() } + + private val lastStopLine by lazy { AtomicReference() } + + private val carLocation by lazy { AtomicReference>() } + + private val overlayManager by lazy { MogoOverlayManager.getInstance() } + + private val redLine by lazy { AtomicReference() } + + private val redLineColors = arrayListOf(Color.parseColor("#002ABAD9"), Color.parseColor("#FF7A30")) + +// private val blueLine by lazy { AtomicReference() } +// +// private val blueLineColors = arrayListOf(Color.parseColor("#002ABAD9"), Color.parseColor("#30A3FF")) + + private val markerCache = ConcurrentSet() + + private val redLineOptions by lazy { + MogoPolylineOptions().apply { + zIndex(40000f) + setGps(true) + width(30f) + useGradient(true) + colorValues(redLineColors) + } + } + +// private val blueLineOptions by lazy { +// MogoPolylineOptions().apply { +// zIndex(30000f) +// setGps(true) +// width(40f) +// useGradient(true) +// colorValues(blueLineColors) +// } +// } + + fun init(ctx: Context) { + ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == ON_CREATE) { + onCreate() + } + if (event == ON_DESTROY) { + onDestroy() + } + } + }) + + pool.execute { + var interrupted = false + Logger.d(TAG, "--- consumer --- 0 ---") + while (!interrupted) { + try { + Logger.d(TAG, "--- consumer --- 1 ---") + val top = queue.take() ?: continue + Logger.d(TAG, "--- consumer --- 2 ---") + val location = carLocation.get() ?: continue + val isFrontOfCar = isFrontOfCar(top.poi_lon, top.poi_lat, location.first, location.second, location.third) + val isSameRoad = isSameRoad(top.poi_lon, top.poi_lat, location.first, location.second, location.third) + Logger.d(TAG, "--- consumer --- 3 ---isFrontOfCar: $isFrontOfCar, isSameRoad: $isSameRoad") + if (isFrontOfCar && isSameRoad) { + marker.set(top) + marker(top) + } else { + markerCache.remove(top) + } + interrupted = Thread.currentThread().isInterrupted + } catch (e: InterruptedException) { + e.printStackTrace() + break + } + } + } + } + + private fun isSameRoad(x1: Double, y1: Double, x2: Double, y2: Double, angle: Double): Boolean { + val c1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(x1, y1, angle.toFloat(), 10f) + val c2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(x2, y2, angle.toFloat(), 10f) + Logger.d(TAG, "isSameRoad--: $c1 ==> $c2") + return c1 != null && c2 != null && c1.road_id.isNotEmpty() && c1.road_id == c2.road_id + } + + private val onRoadListener = object : OnRoadListener { + private var roadId = "" + private var hasCrossRoad = false + + override fun onRoadIdInfo(roadId: String) { + Logger.d(TAG, "--- onRoadInfo --- roadId: $roadId") + val oldRoadId = this.roadId + if (oldRoadId != roadId) { + if (hasCrossRoad) { + hasCrossRoad = false + lastStopLine.set(curStopLine.get()) + } + } + this.roadId = roadId + } + override fun onStopLineInfo(info: StopLine) { + Logger.d(TAG, "--- onStopLineInfo --- info: $info") + curStopLine.set(info) + if (!hasCrossRoad) { + hasCrossRoad = true + } + } + } + + private val onLocationListener = object : IMoGoMapLocationListener { + + + override fun onLocationChanged(location: MogoLocation?, from: Int) { + if (location == null) { + return + } + try { + val loc = CoordinateUtils.transformGcj02toWgs84(location.latitude, location.longitude) + Logger.d(TAG, "x:${loc[0]}, y:${loc[1]}, angle: ${location.bearing}") + carLocation.set(Triple(loc[0], loc[1], location.bearing.toDouble())) + val marker = marker.get() ?: return + val isOutOfRange = isOutOfRange(marker.poi_lon, marker.poi_lat, carLocation.get().first, carLocation.get().second, carLocation.get().third) + Logger.d(TAG, "--- onLocationChanged: isOutOfRange: $isOutOfRange") + if (isOutOfRange) { + unMarker(marker) + } + } catch (t: Throwable) { + Logger.e(TAG, "error: ${t.message}") + } + } + } +// +// private fun drawBlueLine(points: List>, location: MogoLocation) { +// val line = blueLine.get() +// blueLineOptions.points(points.filter { +// DrivingDirectionUtils.getDegreeOfCar2Poi2(location.longitude, location.latitude, it.first, it.second, location.bearing.toDouble()) < 90L +// }.map { +// MogoLatLng(it.second, it.first) +// }) +// if (line == null || line.isDestroyed) { +// overlayManager.addPolyline(blueLineOptions) +// } else { +// line.setOption(blueLineOptions) +// } +// } + + private fun onCreate() { + CallerMapRoadListenerManager.registerRoadListener(TAG, onRoadListener) + CallerMapLocationListenerManager.addListener(TAG, onLocationListener) + } + + private fun onDestroy() { + CallerMapRoadListenerManager.unRegisterRoadListener(TAG) + CallerMapLocationListenerManager.removeListener(TAG) + pool.shutdownNow() + } + + + fun enqueue(marker: Marker) { + Logger.d(TAG, "--- enqueue --- 1 ---") + if (markerCache.contains(marker)) { + Logger.d(TAG, "--- enqueue --- cache hit ---") + return + } + Logger.d(TAG, "--- enqueue --- 2 ---") + markerCache += marker + pool.execute { + Logger.d(TAG, "--- enqueue --- 3 ---${Thread.currentThread().name}::${Thread.currentThread().id}") + queue.put(marker) + } + } + + private fun marker(marker: Marker) { + Logger.d(TAG, "--- marker --- 1 ---") + val location = carLocation.get() ?: return + Logger.d(TAG, "--- marker --- 2 ---") + removeRedLine() + //施工中心点前方的自车行驶方向上300米距离 + val l1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(marker.poi_lon, marker.poi_lat, location.third.toFloat(), 300f) + //施工中心点后方的自车行驶方向上300米距离 + Logger.d(TAG, "--- marker --- 3 --- l1: $l1") + val l2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(marker.poi_lon, marker.poi_lat, location.third.toFloat(), -300f) + Logger.d(TAG, "--- marker --- 4 --- l2: $l2") + val points = LinkedList() + if (l2 != null && l2.points.isNotEmpty()) { + points.addAll(l2.points.map { + MogoLatLng(it.second, it.first) + }) + } + val centerX= marker.poi_lon + val centerY = marker.poi_lat + Logger.d(TAG, "--- marker --- 5 --- marker: $marker") + val farthestPoint = marker.polygon?.let { + var find: Pair = Pair(centerX, centerY) + var min = Long.MAX_VALUE + for (p in it) { + val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(centerX, centerY, p.first, p.second, location.third) + if (angle < min) { + min = angle + find = p + } + } + MogoLatLng(find.second, find.second) + } ?: MogoLatLng(centerY, centerX) + marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat) + Logger.d(TAG, "--- marker --- 6 --- marker: $marker") + if (l1 != null && l1.points.isNotEmpty()) { + for (l in l1.points) { + if (DrivingDirectionUtils.getDegreeOfCar2Poi2(farthestPoint.lon, farthestPoint.lat, l.first, l.second, location.third) < 90L) { + points.add(l.let { MogoLatLng(it.second, it.first) }) + } + } + } + var line = redLine.get() + redLineOptions.points(points) + Logger.d(TAG, "--- marker --- 7 --- points: ${points.size}") + if (line == null || line.isDestroyed) { + val l = overlayManager.addPolyline(redLineOptions) + this.redLine.set(l) + line = l + } else { + line.setOption(redLineOptions) + } + if (!line.isVisible) { + line.isVisible = true + } + } + + private fun removeRedLine() { + val old = redLine.get() + Logger.d(TAG, "--- removeRedLine --- 1 ---") + if (old != null) { + Logger.d(TAG, "--- removeRedLine --- 2 ---") + redLine.set(null) + old.isVisible = false + old.remove() + } + } + +// private fun removeBlueLine() { +// val old = blueLine.get() +// Logger.d(TAG, "--- removeBlueLine --- 1 ---") +// if (old != null) { +// Logger.d(TAG, "--- removeBlueLine --- 2 ---") +// blueLine.set(null) +// old.isVisible = false +// old.remove() +// } +// } + + private fun unMarker(marker: Marker) { + markerCache -= marker + removeRedLine() + } + + private fun isOutOfRange(markerLon: Double, markerLat: Double, carLon: Double, carLat: Double, carAngle: Double): Boolean { + return !isFrontOfCar(markerLon, markerLat, carLon, carLat, carAngle) + } + + private fun isFrontOfCar(markerLon: Double, markerLat: Double, carLon: Double, carLat: Double, carAngle: Double): Boolean { + val degree = DrivingDirectionUtils.getDegreeOfCar2Poi2(carLon, carLat, markerLon, markerLat, carAngle) + return degree < 90 + } + + data class Marker( + val poi_lat: Double, + val poi_lon: Double, + val polygon: List>?, + var farthestPoint: Pair? = null + ) { + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + other as Marker + if (poi_lat != other.poi_lat) return false + if (poi_lon != other.poi_lon) return false + return true + } + + override fun hashCode(): Int { + var result = poi_lat.hashCode() + result = 31 * result + poi_lon.hashCode() + return result + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java index b2ea3362a4..e389c02ea2 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java @@ -91,34 +91,6 @@ public class V2XRoadEventMarker implements IV2XMarker { t.printStackTrace(); } } - -// if (polygons.size() > 1) { -// if (overlayManager == null) { -// overlayManager = MogoOverlayManager.getInstance(); -// } -// MogoPolylineOptions options = new MogoPolylineOptions(); -// List colors = new ArrayList<>(); -// colors.add(Color.argb(204, 237, 172, 21)); -// colors.add(Color.argb(0, 255, 255, 255)); -// options.colorValues(colors); -// List points = new ArrayList<>(); -// for (int i = 0; i < polygons.size(); i++) { -// Pair p = polygons.get(i); -// points.add(new MogoLatLng(p.second, p.first)); -// } -// if (points.size() > 2) { -// points.add(points.get(0)); -// } -// options.points(points); -// options.useGradient(true); -// options.useFacade(true); -// options.setGps(false); -// options.width(5f); -// options.zIndex(75000f); -// options.maxIndex(800000f); -// polyline = overlayManager.addPolyline(options); -// polyline.setVisible(true); -// } } } } diff --git a/gradle.properties b/gradle.properties index e160b93985..5fddde6d6b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -85,7 +85,7 @@ MOGO_LOCATION_VERSION=1.4.3.26 MOGO_TELEMATIC_VERSION=1.4.3.26 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=2.4.2.3 +MAP_SDK_VERSION=2.5.1.9 MAP_SDK_OPERATION_VERSION=1.1.2.4 # websocket WEBSOCKET_VERSION=1.1.7 diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java index 435d2a5fe7..e549b410a1 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java @@ -1,5 +1,6 @@ package com.mogo.map; +import com.mogo.map.center.CenterLine; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.overlay.IMogoPolyline; @@ -170,8 +171,18 @@ public interface IMogoMap { IMogoPolyline addPolyline( MogoPolylineOptions options ); /** - * 获取地图版本号 + * 获取地图版本 * @return */ String getMapVersion(); + + /** + * 获取行驶方向一定长度的中心线 + * @param lon 经度 + * @param lat 纬度 + * @param angle 航向角 + * @param distance 获取车道中心线的长度,> 0: 行驶方向前方距离, <0 行驶方向后方距离 + * @return 中心线相关数据 + */ + CenterLine getCenterLineRangeInfo(double lon, double lat, float angle, float distance); } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/center/CenterLine.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/center/CenterLine.kt new file mode 100644 index 0000000000..d17ed547ab --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/center/CenterLine.kt @@ -0,0 +1,13 @@ +package com.mogo.map.center + +import android.util.Pair + +data class CenterLine( + + var id: String = "", //id + var tile_id: String = "", //瓦片id + var road_id: String = "", //道路id + var lane_id: String = "", //车道id + var points: List> = emptyList(), + var angle: Double = 0.0 +) diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java index 135de98e90..6c490ccaa7 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java @@ -3,9 +3,12 @@ package com.mogo.map; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Point; +import android.util.Log; +import android.util.Pair; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.map.center.CenterLine; import com.mogo.map.marker.AMapInfoWindowAdapter; import com.mogo.map.marker.AMapMarkerWrapper; import com.mogo.map.marker.IMogoMarker; @@ -33,6 +36,7 @@ import com.zhidaoauto.map.sdk.open.view.MapAutoView; import com.zhidaoauto.map.sdk.open.view.MapAutoViewHelper; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -319,6 +323,27 @@ public class AMapWrapper implements IMogoMap { return singlePointRoadInfo != null ? singlePointRoadInfo.getLaneWidth() : 0; } + @Override + public CenterLine getCenterLineRangeInfo(double lon, double lat, float angle, float distance) { + com.zhidaoauto.map.sdk.open.road.CenterLine info = MapDataApi.INSTANCE.getCenterLineRangeInfo(lon, lat, angle, distance); + CenterLine ret = null; + if (info != null) { + ret = new CenterLine(info.id, info.tile_id, info.road_id, info.lane_id, convert(info.points), info.angle == null ? 0f : info.angle); + } + return ret; + } + + private List> convert(List points) { + if (points == null || points.isEmpty()) { + return Collections.emptyList(); + } + List> ret = new ArrayList<>(points.size()); + for (LonLatPoint p : points) { + ret.add(Pair.create(p.longitude, p.latitude)); + } + return ret; + } + private Context getContext() { return mMapView.getContext(); } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java index 0adacdbbc7..bf5d562033 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java @@ -26,7 +26,7 @@ public class DrivingDirectionUtils { return Math.sqrt(Math.pow(x1 - x2, 2.0) + Math.pow(y1 - y2, 2.0)); } - private static double getAngle(double sx, double sy, double x1, double y1, double x2, double y2) { + public static double getAngle(double sx, double sy, double x1, double y1, double x2, double y2) { x1 = x1 - sx; y1 = y1 - sy; x2 = x2 - sx; From b9660e287869ba5c9e219a500363f5b5fe1f9bdd Mon Sep 17 00:00:00 2001 From: zhongchao Date: Fri, 23 Sep 2022 20:09:22 +0800 Subject: [PATCH 077/226] remove test code --- .../funcconfig/network/FuncConfigNetWorkModel.kt | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) 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 d80756e1f8..484caf29b8 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,5 @@ package com.zhjt.mogo_core_function_devatools.funcconfig.network -import android.util.Log import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.network.MoGoRetrofitFactory @@ -34,13 +33,9 @@ class FuncConfigNetWorkModel { if (error == null) { error = onError } - //todo test -// map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["sn"] = "X20202203105S688HZ" -// map["mac"] = DeviceUtils.getMacAddress() - map["mac"] = "48:b0:2d:3a:bc:78" -// map["channelVersion"] = FuncConfigConst.getChannelCode() - map["channelVersion"] = 1 + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["mac"] = DeviceUtils.getMacAddress() + map["channelVersion"] = FuncConfigConst.getChannelCode() } loader { apiCall { From a3e71ce3f6a3270b4aacd676265135503a44391f Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 26 Sep 2022 14:03:32 +0800 Subject: [PATCH 078/226] =?UTF-8?q?[2110]=20bus=E4=B9=98=E5=AE=A2=E7=AB=AF?= =?UTF-8?q?=E5=88=B0=E7=AB=99=E5=B1=85=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/BusPassengerRouteFragment.java | 3 +- .../ui/layoutmanager/CenterLayoutManager.java | 42 +++++++++++++++++++ .../mogo/och/bus/ui/BusSwitchLineActivity.kt | 2 + 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java 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 3d14392c01..ffa4d7ad1b 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 @@ -24,6 +24,7 @@ import com.mogo.och.bus.passenger.bean.BusPassengerStation; import com.mogo.och.bus.passenger.callback.IBusPassengerMapViewCallback; import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.bus.passenger.presenter.BaseBusPassengerPresenter; +import com.mogo.och.bus.passenger.ui.layoutmanager.CenterLayoutManager; import com.mogo.och.bus.passenger.utils.BPRouteDataTestUtils; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; @@ -88,7 +89,7 @@ public class BusPassengerRouteFragment extends mRouteInfoView = findViewById(R.id.bus_p_line_cl); mStationsListRv = findViewById(R.id.bus_p_line_stations_rl); - LinearLayoutManager manager = new LinearLayoutManager(getContext()); + CenterLayoutManager manager = new CenterLayoutManager(getContext()); mStationsListRv.setLayoutManager(manager); mAdapter = new BusPassengerLineStationsAdapter(getContext(), mStationsList); mStationsListRv.setAdapter(mAdapter); diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java new file mode 100644 index 0000000000..42210cbcaf --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanager/CenterLayoutManager.java @@ -0,0 +1,42 @@ +package com.mogo.och.bus.passenger.ui.layoutmanager; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; + +public class CenterLayoutManager extends LinearLayoutManager { + public CenterLayoutManager(Context context) { + super(context); + } + + public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) { + super(context, orientation, reverseLayout); + } + + public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext()); + smoothScroller.setTargetPosition(position); + startSmoothScroll(smoothScroller); + } + + private static class CenterSmoothScroller extends LinearSmoothScroller { + + CenterSmoothScroller(Context context) { + super(context); + } + + @Override + public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { + return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2); + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt index 581690e7e4..7251642f32 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -10,6 +10,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.RecyclerView import com.mogo.commons.mvp.MvpActivity import com.mogo.eagle.core.utilcode.util.SharedPrefs @@ -70,6 +71,7 @@ class BusSwitchLineActivity : MvpActivity mLineCommitBtn.setOnClickListener(this) mLinesListView = findViewById(R.id.switch_line_rv) linearLayoutManager = LinearLayoutManager(this) + PagerSnapHelper().attachToRecyclerView(mLinesListView) mLinesListView.setLayoutManager(linearLayoutManager) mLinesListView.setItemAnimator(OpenItemAnimator()) mAdapter = SwitchLineAdapter(applicationContext, mData) From a69058476071bd0628e0c8251d121e4cecc0c5b3 Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 26 Sep 2022 15:00:41 +0800 Subject: [PATCH 079/226] fix bug of car color and biz config upper case --- app/build.gradle | 2 + .../autopilot/MoGoAutopilotProvider.kt | 1 + .../funcconfig/FuncConfigCenter.kt | 2 +- .../funcconfig/FuncConfigConst.kt | 10 ++-- .../funcconfig/FuncConfigImpl.kt | 28 +++++---- .../logcatch/MogoLogCatchManager.kt | 10 +++- .../hmi/ui/setting/DebugSettingView.kt | 15 ++++- .../function/map/identify/WarningHelper.kt | 3 + .../v2x/speedlimit/SpeedLimitDataManager.java | 59 +++++++++++-------- .../core/data/deva/bizconfig/FuncBizConfig.kt | 4 +- .../call/autopilot/CallerAutoPilotManager.kt | 4 ++ ...allerDevaToolsFuncConfigListenerManager.kt | 1 - gradle.properties | 4 +- .../java/com/mogo/map/AMapViewWrapper.java | 1 - .../main/java/com/mogo/map/AMapWrapper.java | 1 + .../com/mogo/map/CustomMapApiBuilder.java | 1 - .../java/com/mogo/map/utils/ObjectUtils.java | 2 + 17 files changed, 95 insertions(+), 53 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index afb3ab9496..2758e8edee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,6 +27,8 @@ if (!isAndroidTestBuild()) { enableTraceToServer false enableLoggerToLocal true } + + apply plugin: 'biz.config.hook' } if (!isAndroidTestBuild()) { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 0a8c633f83..8f783ae662 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -52,6 +52,7 @@ import com.zhidao.support.adas.high.common.CupidLogUtils import com.zhidao.support.adas.high.common.MogoReport import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants +import com.zhjt.service_biz.BizConfig import io.netty.channel.Channel import mogo.telematics.pad.MessagePad import java.util.* diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index 3b7572cea9..958cc1b152 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -69,7 +69,7 @@ class FuncConfigCenter : IMogoOnMessageListener { BizManager.updateBizConfigData(funcConfig) funcConfig.business.forEach { business -> CallerDevaToolsFuncConfigListenerManager.invokeDevaToolsFuncConfigBizUpdate( - business.biz, + business.biz.uppercase(), business.data ) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt index b071595ab0..b7a6c6728f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -54,7 +54,7 @@ class FuncConfigConst { v2nSubList.add(SubBiz(BIZ_VIP, lock = false, state = true, dependNode = "", data = "")) v2nSubList.add(SubBiz(BIZ_OPT_LINE, lock = false, state = false, dependNode = "", data = "")) v2nSubList.add(SubBiz(BIZ_VRU, lock = false, state = true, dependNode = "", data = "")) - v2nSubList.add(SubBiz(BIZ_VRU_RI, lock = false, state = true, dependNode = "", data = "")) + v2nSubList.add(SubBiz(BIZ_VRU_RI, lock = false, state = false, dependNode = "", data = "")) v2nSubList.add(SubBiz(BIZ_HLW, lock = false, state = true, dependNode = "", data = "")) businessList.add(Business(V2N, v2nSubList)) @@ -79,12 +79,12 @@ class FuncConfigConst { businessList.add(Business(V2V,v2vSubList)) val foundationSubList = mutableListOf() - foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = true, state = false, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = true, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = false, state = false, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = false, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_TRACE_LOG, lock = false, state = true, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = true, state = true, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = true, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = false, state = true, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_LIMIT_SPEED_SET, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_BYPASS, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_AUTOPILOT_LANE_SELECTION, lock = false, state = true, dependNode = "", data = "")) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt index 6f3d0524bd..f2c0e0c114 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigImpl.kt @@ -8,23 +8,29 @@ import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATIO import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager -object FuncConfigImpl : IMoGoDevaToolsFuncConfigListener { +object FuncConfigImpl { private const val TAG = "FuncConfigImpl" fun init() { - CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( - FOUNDATION, + CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(FOUNDATION, TAG, - this + object : IMoGoDevaToolsFuncConfigListener { + override fun updateBizData( + type: String, + state: Boolean, + lock: Boolean, + data: String? + ) { + when (type) { + BIZ_BEAUTY_MODE -> FunctionBuildConfig.isDemoMode = state + BIZ_RAIN_MODE -> FunctionBuildConfig.isRainMode = state + BIZ_WARNING_UPLOAD -> FunctionBuildConfig.isReportWarning = state + } + } + } ) + } - override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) { - when (type) { - BIZ_BEAUTY_MODE -> FunctionBuildConfig.isDemoMode = state - BIZ_RAIN_MODE -> FunctionBuildConfig.isRainMode = state - BIZ_WARNING_UPLOAD -> FunctionBuildConfig.isReportWarning = state - } - } } \ 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/logcatch/MogoLogCatchManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt index 7614bfc5e2..8cbc2c5abc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt @@ -12,6 +12,8 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION import com.mogo.eagle.core.function.api.map.deva.IMoGoMapDevaProvider import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager @@ -34,6 +36,7 @@ import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companio import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companion.LOG_PUSH_TYPE import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companion.START_CATCH_LOG import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchConst.Companion.STOP_CATCH_LOG +import com.zhjt.service_biz.BizConfig import java.io.File @SuppressLint("StaticFieldLeak") @@ -136,6 +139,7 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl return false } + @BizConfig(FOUNDATION, "", BIZ_FULL_LOG) fun startCatchLog(duration: Int = 10, logPrefixName: String? = null) { if (catchingList.contains(manualContent.pkgName + logPrefixName)) { TipToast.shortTip("已经在抓取日志了,请稍后再试") @@ -156,7 +160,7 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl private fun startCatchLog(content: RemoteLogPushContent, logPrefixName: String? = null) { CallerLogger.d("$M_DEVA$TAG", "startCatchLog path : ${content.pkgName + logPrefixName}") - if(MoGoAiCloudClientConfig.getInstance().sn == null){ + if (MoGoAiCloudClientConfig.getInstance().sn == null) { ThreadUtils.runOnUiThread { TipToast.shortTip("缺少设备唯一ID,请检查网络") } @@ -247,14 +251,14 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl } override fun uploadFile(filePath: String) { - if(!mapCacheUpload){ + if (!mapCacheUpload) { return } val file = File(filePath) if (file.isFile) { CallerLogger.d("$M_DEVA$TAG", "uploadFile path : $filePath") LogInfoManagerFactory.handleSingleUploadFile(filePath) - }else{ + } else { CallerLogger.d("$M_DEVA$TAG", "file absPath : ${file.absolutePath}") } } 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 adc7747c96..9a1a722122 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 @@ -9,7 +9,6 @@ import android.graphics.Color import android.os.Build import android.text.Html import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.* @@ -30,6 +29,7 @@ import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD import com.mogo.eagle.core.data.deva.chain.ChainConstant @@ -1868,6 +1868,19 @@ class DebugSettingView @JvmOverloads constructor( btnRecordBag.requestFocus() } } + BIZ_FULL_LOG -> { + if(state){ + tbLogCatch.visibility = View.VISIBLE + }else{ + tbLogCatch.visibility = View.GONE + } + if (lock) { + tbLogCatch.isClickable = false + } else { + tbLogCatch.isClickable = true + tbLogCatch.requestFocus() + } + } } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt index f7f70ccb05..fe6285a7f1 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/identify/WarningHelper.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.map.identify import android.annotation.SuppressLint +import android.util.Log import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.traffic.TrafficData import com.mogo.eagle.core.data.traffic.threatLevelColor @@ -96,6 +97,7 @@ object WarningHelper { return } if (exist) { + Log.i("EmArrow0926","obu color uuid : ${obuTrafficData.uuid}") obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData } else { obuWarningTrafficData.remove(obuTrafficData.uuid) @@ -115,6 +117,7 @@ object WarningHelper { if (pncWarningBeautyTrafficData.containsKey(uuid)) { val planningTrack = pncWarningBeautyTrafficData[uuid] if (planningTrack != null && !timeOut(planningTrack.time)) { + Log.i("EmArrow0926","pnc color uuid : $uuid") return planningTrack.color } else { pncWarningBeautyTrafficData.remove(uuid) diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/speedlimit/SpeedLimitDataManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/speedlimit/SpeedLimitDataManager.java index 5c236f86c7..bb2fd2e7b8 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/speedlimit/SpeedLimitDataManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/speedlimit/SpeedLimitDataManager.java @@ -1,5 +1,8 @@ package com.mogo.eagle.core.function.v2x.speedlimit; +import static com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.BIZ_SLW; +import static com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.V2I; + import android.location.Location; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; @@ -8,58 +11,64 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMapUIController; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; +import com.zhjt.service_biz.BizConfig; import java.util.Timer; import java.util.TimerTask; /** * 限速 + * * @author mogoauto */ public class SpeedLimitDataManager implements IMogoCarLocationChangedListener2 { - private static SpeedLimitDataManager instance ; + private static SpeedLimitDataManager instance; private Location mLocation; -// private static Context mContext; - private Timer mTimer; - private SpeedLimitDataManager(){ + + private SpeedLimitDataManager() { } - public static SpeedLimitDataManager getInstance(){ - if (instance == null){ - synchronized (SpeedLimitDataManager.class){ - if (instance == null){ + + public static SpeedLimitDataManager getInstance() { + if (instance == null) { + synchronized (SpeedLimitDataManager.class) { + if (instance == null) { instance = new SpeedLimitDataManager(); } } } return instance; } - private class SpeedTimerTask extends TimerTask{ + + private class SpeedTimerTask extends TimerTask { @Override public void run() { - if (mLocation != null){ + if (mLocation != null) { if (MogoMapUIController.getInstance() != null) { - int speedLimmit = MogoMapUIController.getInstance().getLimitSpeed(mLocation.getLongitude(), mLocation.getLatitude(), mLocation.getBearing()); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - if (speedLimmit > 0) { - CallerHmiManager.INSTANCE.showLimitingVelocity(speedLimmit); - CallLimitingVelocityListenerManager.INSTANCE.invokeOnLimitingVelocityChange(speedLimmit); - } - } - }); + getSpeedLimit(); } } } - }; - public void start(){ - MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerCarLocationChangedListener("SpeedLimitDataManager",this); - mTimer = new Timer(); - mTimer.schedule(new SpeedTimerTask(), 3000,1000); + @BizConfig(biz = V2I,dependentBizNode = "",bizNode = BIZ_SLW) + private void getSpeedLimit() { + int speedLimit = MogoMapUIController.getInstance().getLimitSpeed(mLocation.getLongitude(), mLocation.getLatitude(), mLocation.getBearing()); + UiThreadHandler.post(() -> { + if (speedLimit > 0) { + CallerHmiManager.INSTANCE.showLimitingVelocity(speedLimit); + CallLimitingVelocityListenerManager.INSTANCE.invokeOnLimitingVelocityChange(speedLimit); + } + }); + } + } + + public void start() { + MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerCarLocationChangedListener("SpeedLimitDataManager", this); + Timer mTimer = new Timer(); + mTimer.schedule(new SpeedTimerTask(), 3000, 1000); } + @Override public void onCarLocationChanged2(Location latLng) { mLocation = latLng; diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt index d371af2c24..50a3380fad 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/bizconfig/FuncBizConfig.kt @@ -33,8 +33,8 @@ class FuncBizConfig { // Foundation const val BIZ_BEAUTY_MODE = "BIZ_BEAUTY_MODE" // 美化模式 const val BIZ_RAIN_MODE = "BIZ_RAIN_MODE" // 雨天模式 - const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 todo - const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo + const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 + const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo 暂未有场景,未实现 const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制 const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报 const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 todo diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt index 85e8eb1663..56bb110906 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt @@ -4,6 +4,7 @@ import android.os.SystemClock import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_ADAS @@ -14,6 +15,7 @@ import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants +import com.zhjt.service_biz.BizConfig import kotlin.random.Random /** @@ -98,12 +100,14 @@ object CallerAutoPilotManager { /** * 开启域控制器录制bag包 */ + @BizConfig(FuncBizConfig.FOUNDATION,"", FuncBizConfig.BIZ_BAG_RECORD) fun recordPackage() { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { providerApi?.recordPackage(1, Random(SystemClock.elapsedRealtime()).nextInt()) } } + @BizConfig(FuncBizConfig.FOUNDATION,"", FuncBizConfig.BIZ_BAG_RECORD) fun recordPackage(duration: Int) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { providerApi?.recordPackage(1, Random(SystemClock.elapsedRealtime()).nextInt(), duration) diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt index d847a8f288..fc7254e0d7 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsFuncConfigListenerManager.kt @@ -1,6 +1,5 @@ package com.mogo.eagle.core.function.call.devatools -import android.util.Log import androidx.annotation.Nullable import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener import com.zhjt.service_biz.SubBiz diff --git a/gradle.properties b/gradle.properties index 5fddde6d6b..18446ff6a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -59,8 +59,8 @@ bytex.ASM_API=ASM7 HOOK_LOG_VERSION=1.6.1 SERVICE_CHAIN_VERSION=1.1.0 -BIZCONFIG_VERSION=1.2.7 -SERVICE_BIZ_VERSION=1.2.0 +BIZCONFIG_VERSION=1.2.8 +SERVICE_BIZ_VERSION=1.2.1 ################ 外部依赖引用 ################ # loglib LOGLIB_VERSION=1.3.38 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index 6a64322c93..e9e8b4e45d 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -677,7 +677,6 @@ public class AMapViewWrapper implements IMogoMapView, @Override public void changeMapViewAngle(int type) { - Log.d("XXXX", "--- 1 -----"); if (checkAMapView()) { //mMapView.getMapAutoViewHelper().testMapViewAngle(type); } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java index 6c490ccaa7..ee0e175877 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java @@ -116,6 +116,7 @@ public class AMapWrapper implements IMogoMap { optionsArrayList.forEach((s, trackedObject) -> { MarkerSimpleData markerOptions = ObjectUtils.fromTrafficData(trackedObject); if (markerOptions != null) { + Log.i("EmArrow0926","markerOpt : " + markerOptions.toString()); markerOptionsArrayList.add(markerOptions); } }); diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java b/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java index c327f9e862..9914ff80d3 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java @@ -54,7 +54,6 @@ public class CustomMapApiBuilder implements IMogoMapApiBuilder { @Override public IMogoMapView getMapView(Context context) { - Log.d(TAG, "setDebugMode==true"); MapParams mapParams = MapParams.Companion.init(); mapParams.setDebugMode(false) //todo 1-使用本地地图数据,0-使用在线地图数据 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java index 4b9327d7da..8b8c65d4a8 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java @@ -132,6 +132,8 @@ public class ObjectUtils { markerOptions.setLon(trafficData.getLongitude()); if(trafficData.getColor()!=null && !trafficData.getColor().isEmpty()){ markerOptions.setColor(trafficData.getColor()); + }else{ + markerOptions.setColor("#00000000"); } } catch (Exception e) { e.printStackTrace(); From 905416610d3f5919c4d8f472848870d1d048341a Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 26 Sep 2022 15:27:46 +0800 Subject: [PATCH 080/226] add note --- .../main/res/layout/view_auto_pilot_check.xml | 36 +++++++++---------- .../core/data/deva/bizconfig/FuncBizConfig.kt | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index fe20f404b3..fb2eaba745 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -22,8 +22,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="162px" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toEndOf="@+id/v_second_group" + app:layout_constraintTop_toTopOf="@+id/v_second_group" /> @@ -294,21 +295,20 @@ - + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/systemVersionView" + tools:visibility="visible" /> Date: Mon, 26 Sep 2022 15:32:09 +0800 Subject: [PATCH 081/226] =?UTF-8?q?[2.11.0/1.6.0]=201=E3=80=81bus=E5=8F=B8?= =?UTF-8?q?=E6=9C=BA=E7=AB=AF=E5=A2=9E=E5=8A=A0=E8=AF=AD=E9=9F=B3=E6=92=AD?= =?UTF-8?q?=E6=8A=A5=202=E3=80=81bus=E5=8F=B8=E6=9C=BA=E7=AB=AF+=E4=B9=98?= =?UTF-8?q?=E5=AE=A2=E5=B1=8F=E5=A2=9E=E5=8A=A0=E5=88=B0=E7=AB=99=E6=88=96?= =?UTF-8?q?=E5=8D=B3=E5=B0=86=E5=88=B0=E7=AB=99=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusPassengerLineStationsAdapter.java | 6 + .../ui/BusPassengerRouteFragment.java | 17 ++ .../res/layout/bus_p_stations_common_item.xml | 10 +- .../och/bus/callback/IPassengerCallback.java | 11 ++ .../com/mogo/och/bus/constant/BusConst.kt | 2 + .../och/bus/fragment/BaseBusTabFragment.java | 4 + .../mogo/och/bus/fragment/BusFragment.java | 8 + .../com/mogo/och/bus/model/BusOrderModel.java | 178 ++++-------------- .../mogo/och/bus/presenter/BusPresenter.java | 36 ++-- .../mogo/och/bus/ui/BusStationCommonItem.kt | 16 +- .../res/layout/bus_stations_common_item.xml | 8 + .../src/main/res/values/strings.xml | 2 + .../module/utils/BlinkAnimationUtil.java | 37 ++++ 13 files changed, 176 insertions(+), 159 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IPassengerCallback.java create mode 100644 OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java index 25ef3ead6d..9aab6be4d5 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.mogo.och.bus.passenger.R; import com.mogo.och.bus.passenger.bean.BusPassengerStation; +import com.mogo.och.common.module.utils.BlinkAnimationUtil; import java.util.List; @@ -55,6 +56,7 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter list) { if (mMapDirectionView != null) { UiThreadHandler.post(new Runnable() { @@ -222,6 +234,8 @@ public class BusPassengerRouteFragment extends mNoLineInfoView.setVisibility(View.VISIBLE); mRouteInfoView.setVisibility(View.GONE); updateArrivedStation(null,0,true); + clearPolyline(); + clearMapMarkers(); } } @@ -229,6 +243,9 @@ public class BusPassengerRouteFragment extends if (mNoLineInfoView.getVisibility() == View.GONE){ mNoLineInfoView.setVisibility(View.VISIBLE); mRouteInfoView.setVisibility(View.GONE); + updateArrivedStation(null,0,true); + clearPolyline(); + clearMapMarkers(); } emptyTv.setText(getString(R.string.bus_p_no_task)); } diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml index 5a70e82c9c..813b6ac051 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_common_item.xml @@ -21,6 +21,14 @@ app:layout_constraintRight_toLeftOf="@+id/bus_p_tag" app:layout_constraintTop_toBottomOf="@+id/bus_p_cur_arrow_bg"/> + + }); } + public void playDI(){ + SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(getContext(), R.raw.bus_di); + } /** * 改变自动驾驶状态 * diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 71e872104d..8addea4abd 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -33,6 +33,7 @@ import com.mogo.och.bus.ui.BusSwitchLineActivity; import com.mogo.och.bus.view.SlidePanelView; import com.mogo.och.common.module.biz.constant.OchCommonConst; import com.mogo.och.common.module.biz.provider.LoginService; +import com.mogo.och.common.module.utils.BlinkAnimationUtil; import com.mogo.och.common.module.utils.OCHThreadPoolManager; import com.mogo.och.common.module.wigets.OCHCommitDialog; @@ -149,6 +150,13 @@ public class BusFragment extends BaseBusTabFragment showOrHideSwitchLineBtn(true); hideStationsPanel(); hideSlidePanel(); + resetStationBlinkAnim(); + } + + private void resetStationBlinkAnim() { + firstStationItem.setStationPointBg(2); + secondStationItem.setStationPointBg(2); + thirdStationItem.setStationPointBg(2); } public void updateBusTaskStatus(String lineName, String lineTime, 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 ce6eafa0c5..88d6aee9d8 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 @@ -1,6 +1,7 @@ package com.mogo.och.bus.model; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS; +import static com.mogo.och.bus.constant.BusConst.DELAY_10S; import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_ARRIVING; import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_STOPPED; @@ -29,6 +30,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; 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; @@ -37,9 +39,9 @@ import com.mogo.och.bus.bean.BusRoutePlanningUpdateReqBean; import com.mogo.och.bus.bean.BusRoutesResponse; import com.mogo.och.bus.bean.BusRoutesResult; import com.mogo.och.bus.bean.BusStationBean; -import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse; import com.mogo.och.bus.bean.WriteOffPassenger; import com.mogo.och.bus.callback.IBusControllerStatusCallback; +import com.mogo.och.bus.callback.IPassengerCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; import com.mogo.och.bus.constant.BusConst; @@ -97,13 +99,12 @@ public class BusOrderModel { private static final long QUERY_BUS_STATION_DELAY = 5000; private IRefreshBusStationsCallback refreshBusStationsCallback; - private ISlidePannelHideCallback slidePannelHideCallback; + private ISlidePannelHideCallback slidePanelHideCallback; private IBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 + private IPassengerCallback mPassengerCallback; //乘客核销回调 List points = new ArrayList<>();//全路径信息 - private boolean hadQueryLeaveAwayPassager = false; - private volatile boolean isArrivedStation = false; private LoginService loginService; @@ -191,17 +192,18 @@ public class BusOrderModel { CallerLogger.INSTANCE.d(M_BUS + TAG,"Undeliverable exception"); } }); - - //2021/10/20 轮询小巴车订单,暂时用来播报 2022/9/23 乘客上车和下车的播报都去除,增加核销的乘客播报 -// startLoopBusOrders(); } public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){ this.refreshBusStationsCallback = callback; } - public void setSlidePannelHideCallback(ISlidePannelHideCallback callback){ - this.slidePannelHideCallback = callback; + public void setPassengerCallback(IPassengerCallback callback){ + this.mPassengerCallback = callback; + } + + public void setSlidePanelHideCallback(ISlidePannelHideCallback callback){ + this.slidePanelHideCallback = callback; } public void setControllerStatusCallback(IBusControllerStatusCallback callback) { @@ -271,59 +273,6 @@ public class BusOrderModel { updateOrderRoute(); } -// /** -// * 轮询bus待服务订单 -// */ -// private void startLoopBusOrders() { -// if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) { -// return; -// } -// mBusOrdersDisposable = Observable.interval(BusConst.LOOP_DELAY, -// BusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) -// .map((aLong -> aLong + 1)) -// .subscribeOn(Schedulers.io()) -// .observeOn(AndroidSchedulers.mainThread()) -// .subscribe(aLong -> queryBusOrders()); -// } - -// private void queryBusOrders() { -// BusServiceManager.getInstance().queryBusOrders(mContext, new IBusServiceCallback() { -// @Override -// public void onSuccess(BusOrdersResponse o) { -// if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) { -// CallerLogger.INSTANCE.d( M_BUS + TAG, "获取到bus订单数据: " + o.data.orders.toString() ); -// List busOrders = o.data.orders; -// for (int i = 0; i < busOrders.size(); i++) { -// BusOrderBean order = busOrders.get(i); -// if (order == null) return; -// if (TextUtils.isEmpty(order.getPassengerPhone())) return; -// if (prevBusOrderNos.contains(order.getOrderNo())) continue; -// try { -// String tailNum = null; -// try { -// tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4); -// } catch (Exception e) { -// e.printStackTrace(); -// tailNum = order.getPassengerPhone(); -// } -// CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + tailNum); -// AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum -// + " 上车站点为 " + order.getStartStationName()); -// prevBusOrderNos.add(order.getOrderNo()); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// } -// } -// -// @Override -// public void onFail(String failMsg) { -// -// } -// }); -// } - public void release(){ if (mBusOrdersDisposable != null) { mBusOrdersDisposable.dispose(); @@ -535,7 +484,7 @@ public class BusOrderModel { } isGoingToNextStation = true; - AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" ); +// AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" ); } /** @@ -617,11 +566,8 @@ public class BusOrderModel { CallerLogger.INSTANCE.e( M_BUS + TAG, "size = " + passenger.passengerSize+ " time = "+passenger.writeOffTime); prePassengerWriteOffTime = passenger.writeOffTime; - int passengerNum = passenger.passengerSize; - if (passengerNum > 1){ //多人播报 "x人" - AIAssist.getInstance(mContext).speakTTSVoice(passengerNum + "人"); - }else { //是 1 播放 "滴" - SoundPoolHelper.getSoundPoolHelper().playSoundWithRedId(mContext, R.raw.bus_di); + if (mPassengerCallback != null){ + mPassengerCallback.playPassenger(passenger); } } } @@ -677,6 +623,11 @@ public class BusOrderModel { */ public void leaveStation(boolean isRestart){ CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); + String nextStationName = ""; + if (backgroundCurrentStationIndex < stationList.size() - 1){ + nextStationName = stationList.get(backgroundCurrentStationIndex + 1).getName(); + } + String finalNextStationName = nextStationName; BusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq(), stationList.get(backgroundCurrentStationIndex).getSiteId(), @@ -690,6 +641,7 @@ public class BusOrderModel { leaveStationSuccess(isRestart); queryBusRoutes(); startOrStopQueryPassengerWriteOff(false); + leaveTTSTips(finalNextStationName); } @Override public void onFail(String failMsg) { @@ -702,30 +654,23 @@ public class BusOrderModel { }); } -// /** -// * 查询到站下车乘客 -// */ -// private void queryStationLeaveAwayPassengers() { -// CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客"); -// -// BusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext -// , stationList.get(backgroundCurrentStationIndex +1).getSeq(), stationList.get(backgroundCurrentStationIndex+1).getSiteId() -// , new IBusServiceCallback() { -// @Override -// public void onSuccess(QueryLeaveAwayPassengersResponse o) { -// hadQueryLeaveAwayPassager = true; -// arriveSiteStation(false); -// playLeavePassengersMsg( o ); -// queryBusOrders(); -// } -// -// @Override -// public void onFail(String failMsg) { -// hadQueryLeaveAwayPassager = true; -// arriveSiteStation(false); -// } -// }); -// } + //车站10s后播报 + private void leaveTTSTips(String nextStation) { + UiThreadHandler.postDelayed(new Runnable() { + @Override + public void run() { + ttsTips(String.format(mContext + .getString(R.string.bus_leave_station_tip), + nextStation)); + } + },DELAY_10S); + } + + private void ttsTips(String notice) { + UiThreadHandler.post(() ->{ + AIAssist.getInstance(mContext).speakTTSVoice(notice); + }); + } /** * 关闭美化模式 @@ -803,8 +748,8 @@ public class BusOrderModel { CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)"); } - if ( currentStation.isLeaving() && slidePannelHideCallback != null) { - slidePannelHideCallback.hideSlidePanel(); + if ( currentStation.isLeaving() && slidePanelHideCallback != null) { + slidePanelHideCallback.hideSlidePanel(); } //更新bus路线面板 @@ -835,49 +780,6 @@ public class BusOrderModel { autoDriveToNextStation(true); } - /** - * 播报下车乘客信息 - * - * @param awayPassengersResponse - */ - private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息currentStationIndex=" - + String.valueOf(backgroundCurrentStationIndex + 1)); - - if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { - return; - } - String station = stationList.get( backgroundCurrentStationIndex+1 ).getName(); - StringBuilder builder = new StringBuilder( "已到达" ); - builder.append( station ); - if ( !station.endsWith( "站" ) ) { - builder.append( "站" ); - } - if ( awayPassengersResponse == null || awayPassengersResponse.data == null - || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) { - CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息为null"); - } else { - builder.append( ",请尾号为 " ); - for ( QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders ) { - if ( leaveAwayPassenger == null ) { - continue; - } - String tailNum = null; - try { - tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4); - } catch (Exception e) { - e.printStackTrace(); - tailNum = leaveAwayPassenger.passengerPhone; - } - builder.append( tailNum ).append( "。" ); - } - builder.append( "的乘客下车" ); - } - builder.append(",带好随身物品,下车请注意安全"); - CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + builder.toString()); - AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() ); - } - /** * 行程结束 */ @@ -889,7 +791,6 @@ public class BusOrderModel { } CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" ); CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); - AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" ); endTask(); } @@ -909,6 +810,7 @@ public class BusOrderModel { backgroundCurrentStationIndex = 0; queryBusRoutes();// 重新获取任务 startOrStopQueryPassengerWriteOff(false); + ttsTips(mContext.getString(R.string.bus_end_task_tip)); } } 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 1eee88ad28..d60e2a20b1 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 @@ -16,8 +16,11 @@ 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; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusStationBean; +import com.mogo.och.bus.bean.WriteOffPassenger; import com.mogo.och.bus.callback.IBusControllerStatusCallback; +import com.mogo.och.bus.callback.IPassengerCallback; import com.mogo.och.bus.callback.IRefreshBusStationsCallback; import com.mogo.och.bus.callback.ISlidePannelHideCallback; import com.mogo.och.bus.fragment.BusFragment; @@ -25,6 +28,7 @@ import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BusTrajectoryManager; import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean; import com.mogo.och.common.module.biz.callback.ILoginCallback; +import com.mogo.och.common.module.utils.SoundPoolHelper; import com.zhidao.socket.utils.LoginStatusUtil; import org.jetbrains.annotations.NotNull; @@ -43,7 +47,7 @@ import system_master.SystemStatusInfo; */ public class BusPresenter extends Presenter implements IRefreshBusStationsCallback, ISlidePannelHideCallback - , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback { + , IMoGoAutopilotStatusListener, IBusControllerStatusCallback, ILoginCallback, IPassengerCallback { private static final String TAG = "BusPresenter"; @@ -75,14 +79,16 @@ public class BusPresenter extends Presenter public void initModelListener() { BusOrderModel.getInstance().setRefreshBusStationsCallback(this); - BusOrderModel.getInstance().setSlidePannelHideCallback(this); + BusOrderModel.getInstance().setSlidePanelHideCallback(this); BusOrderModel.getInstance().setControllerStatusCallback(this); + BusOrderModel.getInstance().setPassengerCallback(this); } public void releaseListener() { BusOrderModel.getInstance().setRefreshBusStationsCallback(null); - BusOrderModel.getInstance().setSlidePannelHideCallback(null); + BusOrderModel.getInstance().setSlidePanelHideCallback(null); BusOrderModel.getInstance().setControllerStatusCallback(null); + BusOrderModel.getInstance().setPassengerCallback(null); } public void queryBusRoutes() { @@ -112,20 +118,6 @@ public class BusPresenter extends Presenter BusOrderModel.getInstance().logout(); } -// @Override -// public void refreshBusStations(String lineName,List stationList -// , int currentStation, int nextStation, boolean isArrived) { -// mStationList.clear(); -// mStationList.addAll(stationList); -// mCurrentStation = currentStation; -//// functionDemoModeChange(); -// CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation); -// if (mView != null) { -// runOnUIThread(() -> mView.refreshBusStations(lineName, -// stationList, currentStation, nextStation, isArrived)); -// } -// } - @Override public void updateBusTaskStatus(String lineName,String lineTime, List stationList, @@ -328,4 +320,14 @@ public class BusPresenter extends Presenter public void loginFail(boolean isLogin) { } + + @Override + public void playPassenger(WriteOffPassenger passenger) { + int passengerNum = passenger.passengerSize; + if (passengerNum > 1){ //多人播报 "x人" + mView.showNotice(passengerNum + "人"); + }else { //是 1 播放 "滴" + mView.playDI(); + } + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt index 8ce6f38d16..4d2805dc88 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.widget.LinearLayout import com.mogo.och.bus.R +import com.mogo.och.common.module.utils.BlinkAnimationUtil import kotlinx.android.synthetic.main.bus_stations_common_item.view.* /** @@ -31,9 +32,18 @@ class BusStationCommonItem @JvmOverloads constructor( fun setStationPointBg(type: Int){ // 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 when(type){ - 0 -> busCircleIv.setImageResource(R.drawable.icon_point_grey_bus) - 1 -> busCircleIv.setImageResource(R.drawable.icon_point_green_bus) - 2 -> busCircleIv.setImageResource(R.drawable.icon_point_blue_bus) + 0 -> { + busCircleIv.setImageResource(R.drawable.icon_point_grey_bus) + BlinkAnimationUtil.clearAnimation(busCircleIv) + } + 1 -> { + busCircleIv.setImageResource(R.drawable.icon_point_green_bus) + BlinkAnimationUtil.setAnimation(busCircleIv) + } + 2 -> { + busCircleIv.setImageResource(R.drawable.icon_point_blue_bus) + BlinkAnimationUtil.clearAnimation(busCircleIv) + } } } diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml index 3d60449b26..9d224448db 100644 --- a/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_stations_common_item.xml @@ -21,6 +21,14 @@ app:layout_constraintRight_toRightOf="@+id/busTagTxt" app:layout_constraintTop_toTopOf="parent"/> + 取消 暂无任务 + 车辆起步,请扶稳坐好,前方到站是%1$s,请下车的乘客做好准备。 + 感谢您体验\'蘑菇车联\'无人驾驶小巴车,请您携带好随身物品,我们下次再见。 diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java new file mode 100644 index 0000000000..f1363e62d5 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java @@ -0,0 +1,37 @@ +package com.mogo.och.common.module.utils; + +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.widget.ImageView; + +/** + * @author: wangmingjun + * @date: 2022/9/23 + */ +public class BlinkAnimationUtil { + + //实现图片闪烁效果 + public static void setAnimation(ImageView imageView) { + AnimatorSet animationSet = new AnimatorSet(); + + ObjectAnimator valueAnimator = ObjectAnimator.ofFloat(imageView, "alpha",0f, 1.0f); + ObjectAnimator valueAnimatorDisappare = ObjectAnimator.ofFloat(imageView, "alpha",1.0f, 0f); + valueAnimator.setDuration(1000); + valueAnimatorDisappare.setDuration(800); + + valueAnimator.setRepeatCount(-1); + valueAnimatorDisappare.setRepeatCount(-1); + + animationSet.playTogether(valueAnimatorDisappare, valueAnimator); + animationSet.start(); + + } + + //消除动画 + public static void clearAnimation(ImageView imageView){ + if (imageView.getAnimation() != null){ + imageView.getAnimation().cancel(); + } + imageView.clearAnimation(); + } +} From bdb274fca245c653c65f9810e6b8a13aff75ccf6 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 26 Sep 2022 16:04:16 +0800 Subject: [PATCH 082/226] =?UTF-8?q?[2110]=20=E6=89=93=E5=BC=80=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=B8=8B=E8=87=AA=E5=8A=A8=E6=B8=85=E7=90=86=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E9=80=89=E4=B8=AD=E7=9A=84=E7=BA=BF=E8=B7=AF=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/bus/callback/IBusLinesCallback.java | 2 +- .../com/mogo/och/bus/model/BusLineModel.java | 6 +++--- .../och/bus/presenter/BusLinePresenter.java | 8 ++++---- .../mogo/och/bus/ui/BusSwitchLineActivity.kt | 17 +++++++++++++---- .../com/mogo/och/bus/ui/BusSwitchLineView.java | 2 +- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java index 74cac63aa3..8250b337c5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java @@ -10,5 +10,5 @@ import com.mogo.och.bus.bean.BusQueryLinesResponse; public interface IBusLinesCallback { void onBusLinesChange(BusQueryLinesResponse lines); void onChangeLineIdSuccess(); - void onBusLineTasks(BusQueryLineTaskResponse o, int position); + void onBusLineTasks(BusQueryLineTaskResponse o, int position,boolean autoRefresh); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java index 96e3308475..7110de8026 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusLineModel.java @@ -71,17 +71,17 @@ public class BusLineModel { * @param lineId * @param position 位置 */ - public void queryBusLineTasksById(int lineId, int position){ + public void queryBusLineTasksById(int lineId, int position,boolean autoRefresh){ BusServiceManager.getInstance().queryBusTaskByLineId(mContext, String.valueOf(lineId),new IBusServiceCallback() { @Override public void onSuccess(BusQueryLineTaskResponse data) { if (null == data && mBusLinesCallback != null) { - mBusLinesCallback.onBusLineTasks(null,position); + mBusLinesCallback.onBusLineTasks(null,position,autoRefresh); return; } if (mBusLinesCallback != null){ - mBusLinesCallback.onBusLineTasks(data,position); + mBusLinesCallback.onBusLineTasks(data,position,autoRefresh); } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java index 90ae07ae4d..512346c064 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java @@ -76,9 +76,9 @@ public class BusLinePresenter extends Presenter implements IB if(close){ return; } - BusLineModel.getInstance().queryBusLineTasksById(lineId,position); + BusLineModel.getInstance().queryBusLineTasksById(lineId,position,false); subscribe = Observable.interval(3, TimeUnit.MINUTES).subscribe(aLong -> { - BusLineModel.getInstance().queryBusLineTasksById(lineId,position); + BusLineModel.getInstance().queryBusLineTasksById(lineId,position,true); }); } @@ -104,7 +104,7 @@ public class BusLinePresenter extends Presenter implements IB @Override - public void onBusLineTasks(BusQueryLineTaskResponse o, int position) { - mView.onBusLineTasks(o,position); + public void onBusLineTasks(BusQueryLineTaskResponse o, int position,boolean autoRefresh) { + mView.onBusLineTasks(o,position,autoRefresh); } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt index 7251642f32..bc2ebdf0c3 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.kt @@ -71,7 +71,6 @@ class BusSwitchLineActivity : MvpActivity mLineCommitBtn.setOnClickListener(this) mLinesListView = findViewById(R.id.switch_line_rv) linearLayoutManager = LinearLayoutManager(this) - PagerSnapHelper().attachToRecyclerView(mLinesListView) mLinesListView.setLayoutManager(linearLayoutManager) mLinesListView.setItemAnimator(OpenItemAnimator()) mAdapter = SwitchLineAdapter(applicationContext, mData) @@ -144,7 +143,7 @@ class BusSwitchLineActivity : MvpActivity finish() } - override fun onBusLineTasks(lineTaskInfo: BusQueryLineTaskResponse?, position: Int) { + override fun onBusLineTasks(lineTaskInfo: BusQueryLineTaskResponse?, position: Int,autoRefresh:Boolean) { val result = mData[position] if (result.taskList == null) { result.taskList = ArrayList() @@ -161,10 +160,20 @@ class BusSwitchLineActivity : MvpActivity if (lineTaskInfo.data.size != result.taskList.size) { // 不相等有变动 重新赋值 result.taskList.clear() result.taskList.addAll(lineTaskInfo.data) + if(autoRefresh) { + mAdapter.checkTaskId = -1 + mAdapter.checkLineId = -1 + lineTaskInfo.data.forEach { + if (it.id == mAdapter.checkTaskId) { + mAdapter.checkTaskId = it.id + mAdapter.checkLineId = result.lineId + } + } + } // 打开操作 mAdapter.notifyItemChanged(position) linearLayoutManager.stackFromEnd = (position==mData.size-1||position==mData.size-2)&&mData.size>6 - mLinesListView.scrollToPosition(position) + mLinesListView.smoothScrollToPosition(position) }else if(lineTaskInfo.data.isEmpty()){ mAdapter.notifyItemChanged(position) } @@ -198,7 +207,7 @@ class BusSwitchLineActivity : MvpActivity if(mAdapter.checkLineId!=-1&&mAdapter.checkTaskId!=-1){ mPresenter?.commitSwitchLineId(mAdapter.checkTaskId,mAdapter.checkLineId) }else{ - ToastUtils.showLong("请选择时间") + ToastUtils.showLong("请选择任务") } } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java index e71474dcc7..6646068909 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -13,6 +13,6 @@ public interface BusSwitchLineView extends IView { void onBusLinesChange(BusQueryLinesResponse data); void onChangeLineIdSuccess(); - void onBusLineTasks(BusQueryLineTaskResponse o, int position); + void onBusLineTasks(BusQueryLineTaskResponse o, int position,boolean autoRefresh); } From 32c26e73f96f3bb6f4391015dca3ea5616252fb4 Mon Sep 17 00:00:00 2001 From: renwj Date: Mon, 26 Sep 2022 16:41:34 +0800 Subject: [PATCH 083/226] =?UTF-8?q?[V2X][Road]=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2x/events/scenario/scene/airoad/AiRoadMarker.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt index 411ab19fa7..fbd569d4c4 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt @@ -36,10 +36,6 @@ object AiRoadMarker { private val marker by lazy { AtomicReference() } - private val curStopLine by lazy { AtomicReference() } - - private val lastStopLine by lazy { AtomicReference() } - private val carLocation by lazy { AtomicReference>() } private val overlayManager by lazy { MogoOverlayManager.getInstance() } @@ -130,14 +126,12 @@ object AiRoadMarker { if (oldRoadId != roadId) { if (hasCrossRoad) { hasCrossRoad = false - lastStopLine.set(curStopLine.get()) } } this.roadId = roadId } override fun onStopLineInfo(info: StopLine) { Logger.d(TAG, "--- onStopLineInfo --- info: $info") - curStopLine.set(info) if (!hasCrossRoad) { hasCrossRoad = true } @@ -190,6 +184,7 @@ object AiRoadMarker { CallerMapRoadListenerManager.unRegisterRoadListener(TAG) CallerMapLocationListenerManager.removeListener(TAG) pool.shutdownNow() + removeRedLine() } From 01a245d37e3596a14ea7f4595cbd8e66169f8cec Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 26 Sep 2022 16:43:10 +0800 Subject: [PATCH 084/226] change the vip biz loc --- .../java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 998d98c934..204af67139 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 @@ -79,7 +79,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe return VipMessage::class.java } - @BizConfig(V2N, "", BIZ_VIP) override fun onMsgReceived(vipMessage: VipMessage?) { CallerLogger.d("$M_V2X$TAG", "onMsgReceived vipMessage : ${vipMessage.toString()}") vipMessage?.let { @@ -190,6 +189,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } } + @BizConfig(V2N, "", BIZ_VIP) private fun turnLight(controlTime: Int) { if (result == null || mContext == null) return val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) From b113afe827dd69d8321e129f74b974644bcfbc40 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Mon, 26 Sep 2022 17:43:22 +0800 Subject: [PATCH 085/226] Merge branch 'dev_robotaxi-d-app-module_2110_220915_2.11.0' of gitlab.zhidaoauto.com:zhjt/AndroidApp/MoGoEagleEye into dev_robotaxi-d-app-module_2110_220915_2.11.0 # Conflicts: # OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java --- .../BusPassengerLineStationsAdapter.java | 17 +++++++++++++++-- .../passenger/ui/BusPassengerRouteFragment.java | 5 ----- .../och/bus/fragment/BaseBusTabFragment.java | 10 ---------- .../com/mogo/och/bus/fragment/BusFragment.java | 7 ++++--- .../com/mogo/och/bus/ui/BusStationCommonItem.kt | 10 ++++++++-- .../common/module/utils/BlinkAnimationUtil.java | 7 +++++-- 6 files changed, 32 insertions(+), 24 deletions(-) diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java index 9aab6be4d5..c31988dfeb 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/adapter/BusPassengerLineStationsAdapter.java @@ -58,6 +58,7 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter private ImageView ctvAutopilotStatusIv; private TextView ctvAutopilotStatusTv; protected TextView tvArrived; -// protected TextView tvOperationStatus; protected RelativeLayout mSettingBtn; protected RelativeLayout mBadcaseBtn; protected RelativeLayout mAICollectBtn; - public boolean isOperationStatus;//false-收车,true-出车 private FrameLayout flStationPanelContainer; private Group groupTestPanel; - private FrameLayout flSpeed; -// private BusArcView mouduleArc; private TrafficDataView mTrafficDataView; - private ImageView mUpgradeTipIv; // private BusTrafficLightView mTrafficLightView; public static final String TYPE_ENTRANCE = "entrance"; @@ -127,7 +122,6 @@ public abstract class BaseBusTabFragment // tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status); tvArrived = findViewById(R.id.module_mogo_och_arrived_tv); - flSpeed = (FrameLayout) findViewById(R.id.fl_speed); mTrafficDataView = (TrafficDataView) findViewById(R.id.bus_arc); LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer); @@ -200,10 +194,6 @@ public abstract class BaseBusTabFragment ); findViewById(R.id.btnAutopilotRoute).setOnClickListener(view -> debugArrivedRoute()); - -// tvOperationStatus.setOnClickListener(view -> { -// onChangeOperationStatus(); -// }); tvArrived.setOnClickListener(view -> { onArriveStation(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 8addea4abd..1ecb1d6cbe 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -154,9 +154,9 @@ public class BusFragment extends BaseBusTabFragment } private void resetStationBlinkAnim() { - firstStationItem.setStationPointBg(2); - secondStationItem.setStationPointBg(2); - thirdStationItem.setStationPointBg(2); + BlinkAnimationUtil.clearAnimation(firstStationItem.getCircleImageView()); + BlinkAnimationUtil.clearAnimation(secondStationItem.getCircleImageView()); + BlinkAnimationUtil.clearAnimation(thirdStationItem.getCircleImageView()); } public void updateBusTaskStatus(String lineName, String lineTime, @@ -303,6 +303,7 @@ public class BusFragment extends BaseBusTabFragment firstStationItem.setStationPointBg(0); secondStationItem.setStationPointBg(1); thirdStationItem.setStationPointBg(2); + secondStationItem.setStationArrowBg(2); if (isArrived){ firstStationItem.setStationArrowBg(0); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt index 4d2805dc88..e60ee74e97 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusStationCommonItem.kt @@ -3,6 +3,7 @@ package com.mogo.och.bus.ui import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.widget.ImageView import android.widget.LinearLayout import com.mogo.och.bus.R import com.mogo.och.common.module.utils.BlinkAnimationUtil @@ -33,20 +34,25 @@ class BusStationCommonItem @JvmOverloads constructor( fun setStationPointBg(type: Int){ // 0:灰色 过站 1:绿色 到站或者即将到站 2:蓝色:未到站 when(type){ 0 -> { - busCircleIv.setImageResource(R.drawable.icon_point_grey_bus) BlinkAnimationUtil.clearAnimation(busCircleIv) + busCircleIv.setImageResource(R.drawable.icon_point_grey_bus) + } 1 -> { busCircleIv.setImageResource(R.drawable.icon_point_green_bus) BlinkAnimationUtil.setAnimation(busCircleIv) } 2 -> { - busCircleIv.setImageResource(R.drawable.icon_point_blue_bus) BlinkAnimationUtil.clearAnimation(busCircleIv) + busCircleIv.setImageResource(R.drawable.icon_point_blue_bus) } } } + fun getCircleImageView() : ImageView{ + return busCircleIv; + } + fun setStationArrowBg(type: Int){// 0:灰色 过站 1:绿色 前往下一站 2:蓝色 未到站 when(type){ 0 -> busArrowBg.setImageResource(R.drawable.icon_arrow_grey_bus) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java index f1363e62d5..3e86aacb1f 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/BlinkAnimationUtil.java @@ -2,6 +2,7 @@ package com.mogo.och.common.module.utils; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.view.animation.Animation; import android.widget.ImageView; /** @@ -29,9 +30,11 @@ public class BlinkAnimationUtil { //消除动画 public static void clearAnimation(ImageView imageView){ - if (imageView.getAnimation() != null){ - imageView.getAnimation().cancel(); + Animation animation = imageView.getAnimation(); + if (animation != null){ + animation.cancel(); } imageView.clearAnimation(); + imageView.setAnimation(null); } } From 4b07a4c98b68afb50d01d6df81eb590d3055d3db Mon Sep 17 00:00:00 2001 From: zhongchao Date: Mon, 26 Sep 2022 17:45:22 +0800 Subject: [PATCH 086/226] fix bug and add biz lock state of view --- .../funcconfig/FuncConfigConst.kt | 2 +- .../hmi/ui/setting/DebugSettingView.kt | 36 +++-- .../drawable/radio_button_lock_background.xml | 15 ++ .../main/res/layout/view_debug_setting.xml | 134 ++++++++---------- .../core/function/v2x/vip/VipCarManager.kt | 2 +- 5 files changed, 105 insertions(+), 84 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.xml diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt index b7a6c6728f..09fb1766d2 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigConst.kt @@ -81,7 +81,7 @@ class FuncConfigConst { val foundationSubList = mutableListOf() foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = false, state = false, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = false, state = false, dependNode = "", data = "")) - foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = false, dependNode = "", data = "")) + foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_TRACE_LOG, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = false, state = true, dependNode = "", data = "")) foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = false, state = true, dependNode = "", data = "")) 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 9a1a722122..c5d8aae365 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 @@ -1857,28 +1857,48 @@ class DebugSettingView @JvmOverloads constructor( override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) { when (type) { - BIZ_BEAUTY_MODE -> tbIsDemoMode.isClickable = !lock - BIZ_RAIN_MODE -> tbIsRainMode.isClickable = !lock - BIZ_WARNING_UPLOAD -> tbReportWarning.isClickable = !lock + BIZ_BEAUTY_MODE -> { + tbIsDemoMode.isClickable = !lock + if(lock){ + tbIsDemoMode.background = resources.getDrawable(R.drawable.radio_button_lock_background) + }else{ + tbIsDemoMode.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + BIZ_RAIN_MODE -> { + tbIsRainMode.isClickable = !lock + if(lock){ + tbIsRainMode.background = resources.getDrawable(R.drawable.radio_button_lock_background) + }else{ + tbIsRainMode.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } + BIZ_WARNING_UPLOAD -> { + tbReportWarning.isClickable = !lock + if(lock){ + tbReportWarning.background = resources.getDrawable(R.drawable.radio_button_lock_background) + }else{ + tbReportWarning.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) + } + } BIZ_BAG_RECORD -> { if (lock) { btnRecordBag.isClickable = false + btnRecordBag.background = resources.getDrawable(R.drawable.radio_button_lock_background) } else { btnRecordBag.isClickable = true btnRecordBag.requestFocus() + btnRecordBag.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) } } BIZ_FULL_LOG -> { - if(state){ - tbLogCatch.visibility = View.VISIBLE - }else{ - tbLogCatch.visibility = View.GONE - } if (lock) { tbLogCatch.isClickable = false + tbLogCatch.background = resources.getDrawable(R.drawable.radio_button_lock_background) } else { tbLogCatch.isClickable = true tbLogCatch.requestFocus() + tbLogCatch.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.xml new file mode 100644 index 0000000000..db91c70905 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/radio_button_lock_background.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/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 063ec5f432..dd2c4e65ea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -46,12 +46,12 @@ style="@style/DebugSettingText" android:layout_width="0dp" android:layout_height="0dp" + android:gravity="center_vertical" app:layout_constraintBottom_toBottomOf="@id/tbReportMore" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@id/tbReportMore" app:layout_constraintTop_toBottomOf="@id/vReportLine" - app:layout_constraintTop_toTopOf="@id/tbReportMore" - android:gravity="center_vertical"/> + app:layout_constraintTop_toTopOf="@id/tbReportMore" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:minLines="7" /> + android:textSize="@dimen/dp_24" /> + android:textSize="@dimen/dp_24" /> + android:textSize="@dimen/dp_24" /> @@ -273,10 +269,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/dp_10" - android:text="重启IPC节点" - android:textSize="@dimen/dp_24" android:background="@drawable/radio_button_normal_background_right" - /> + android:text="重启IPC节点" + android:textSize="@dimen/dp_24" /> + android:textSize="14sp" /> - + android:text="复制" + android:textColor="#0000FF" + android:textSize="14sp" /> @@ -624,13 +616,12 @@ + android:visibility="gone" /> + app:layout_constraintTop_toBottomOf="@id/tvIpcInfo" />