From c1752938a404c98376997dda8748e14199fac18c Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Tue, 15 Feb 2022 18:49:38 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[bus=202.5.2]=20bus=E5=8F=B8=E6=9C=BA?= =?UTF-8?q?=E7=AB=AF2.5.2=E9=9C=80=E6=B1=82=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 6b50477b07c7d8522da27c3746928d7e55b75841) (cherry picked from commit 6d41d6778f88dc395511f3f6e045f96f071a6c41) --- OCH/mogo-och-bus/src/main/AndroidManifest.xml | 4 + .../java/com/mogo/och/bus/OchBusProvider.java | 11 +- .../och/bus/bean/BusQueryLinesResponse.java | 23 ++ .../och/bus/callback/BusLinesCallback.java | 12 + .../bus/fragment/BaseOchBusTabFragment.java | 5 +- .../mogo/och/bus/fragment/OchBusFragment.java | 93 ++++-- .../mogo/och/bus/net/IOchBusApiService.java | 57 ++-- .../och/bus/net/OCHBusServiceManager.java | 67 +++- .../och/bus/presenter/OchBusLineModel.java | 78 +++++ .../bus/presenter/OchBusLinePresenter.java | 61 ++++ .../och/bus/presenter/OchBusOrderModel.java | 81 ++++- .../och/bus/presenter/OchBusPresenter.java | 14 +- .../och/bus/ui/BusSwitchLineActivity.java | 295 ++++++++++++++++++ .../mogo/och/bus/ui/BusSwitchLineView.java | 15 + .../bus_selected_btn.png | Bin 0 -> 5210 bytes .../bus_switch_line_close.png | Bin 0 -> 3825 bytes .../bus_unselect_btn.png | Bin 0 -> 2324 bytes .../bus_selected_btn.png | Bin 0 -> 5210 bytes .../bus_switch_line_close.png | Bin 0 -> 3825 bytes .../bus_unselect_btn.png | Bin 0 -> 2324 bytes .../main/res/drawable-xhdpi/no_order_data.png | Bin 0 -> 14403 bytes .../res/drawable/bus_autopilot_status_bg.xml | 24 +- .../res/drawable/bus_checkbox_selector.xml | 7 + .../src/main/res/drawable/bus_panel_bkg.xml | 4 +- .../main/res/drawable/bus_switch_line_btn.xml | 12 + .../drawable/bus_switch_line_btn_commit.xml | 16 + .../bus_switch_line_btn_un_commit.xml | 16 + .../res/layout/activity_bus_switch_line.xml | 74 +++++ .../res/layout/bus_no_data_common_view.xml | 31 ++ .../res/layout/bus_switch_line_list_item.xml | 83 +++++ .../src/main/res/layout/fragment_och_bus.xml | 69 ++-- .../res/values-xhdpi-2560x1440/dimens.xml | 10 +- .../res/values-xhdpi-2560x1600/dimens.xml | 7 +- .../src/main/res/values/attrs.xml | 1 + .../src/main/res/values/colors.xml | 5 + .../src/main/res/values/dimens.xml | 5 + .../src/main/res/values/strings.xml | 18 ++ .../src/main/res/values/style.xml | 23 ++ 38 files changed, 1089 insertions(+), 132 deletions(-) create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java create mode 100644 OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_selected_btn.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_switch_line_close.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_unselect_btn.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_selected_btn.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_switch_line_close.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_unselect_btn.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable-xhdpi/no_order_data.png create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_checkbox_selector.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml create mode 100644 OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/bus_no_data_common_view.xml create mode 100644 OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml create mode 100644 OCH/mogo-och-bus/src/main/res/values/style.xml diff --git a/OCH/mogo-och-bus/src/main/AndroidManifest.xml b/OCH/mogo-och-bus/src/main/AndroidManifest.xml index 8f40dcf1a5..b0136c57cc 100644 --- a/OCH/mogo-och-bus/src/main/AndroidManifest.xml +++ b/OCH/mogo-och-bus/src/main/AndroidManifest.xml @@ -10,6 +10,10 @@ + /> \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java index 4154e95528..0571097163 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java @@ -24,7 +24,9 @@ import org.jetbrains.annotations.Nullable; */ @Route(path = OchBusConst.PATH) public class OchBusProvider implements IMogoOCH { + private static final String TAG = "OchBusProvider"; + private OchBusFragment busFragment; private int containerId; private FragmentActivity activity; @@ -43,8 +45,10 @@ public class OchBusProvider implements IMogoOCH { @Override public void init(Context context) { - MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus", StatusDescriptor.VR_MODE, statusChangedListener); - MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus", StatusDescriptor.TOP_VIEW, statusChangedListener); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" + , StatusDescriptor.VR_MODE, statusChangedListener); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" + , StatusDescriptor.TOP_VIEW, statusChangedListener); } private void showFragment() { @@ -74,7 +78,8 @@ public class OchBusProvider implements IMogoOCH { } else { hideFragment(); } - } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() && descriptor == StatusDescriptor.TOP_VIEW) { + } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() + && descriptor == StatusDescriptor.TOP_VIEW) { // topView进行展示时推出网约车界面,但是不隐藏整个fragment if (busFragment != null && isTrue) { busFragment.hideOchBus(); 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 new file mode 100644 index 0000000000..99ead6ee0e --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLinesResponse.java @@ -0,0 +1,23 @@ +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 BusQueryLinesResponse extends BaseData { + public List data; + + public static class Result { + + public int lineId;//线路id + public String name;//线路名字 + public int choose; // 1:绑定 2:未被绑定 + public String startSiteName;//始发站名称 + public String endSiteName;//终点名称 + + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java new file mode 100644 index 0000000000..9f35270323 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java @@ -0,0 +1,12 @@ +package com.mogo.och.bus.callback; + +import com.mogo.och.bus.bean.BusQueryLinesResponse; + +/** + * @author: wangmingjun + * @date: 2022/2/9 + */ +public interface BusLinesCallback { + void onBusLinesChange(BusQueryLinesResponse lines); + void onChangeLineIdSuccess(); +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java index 5423cd0db1..feef74103b 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java @@ -67,6 +67,7 @@ public abstract class BaseOchBusTabFragment implements SlidePanelView.OnSlidePanelMoveToEndListener { +public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBusPresenter > + implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener { private static final String TAG = "OchBusFragment"; private TextView mCurrentStationName; private TextView mStartStationFlag; private TextView mNextStationName; private TextView mEndStationFlag; - private TextView mDebugArrive; +// private TextView mDebugArrive; + private TextView mSwitchLine; //切换路线 + private int mCurrentStation = 0; private View mBus; @@ -58,8 +66,8 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu mStartStationFlag = findViewById( R.id.module_och_bus_start_station_tag ); mNextStationName = findViewById( R.id.module_och_bus_order_end_station ); mEndStationFlag = findViewById( R.id.module_och_bus_end_station_tag ); - - mDebugArrive = findViewById(R.id.module_och_bus_arrive_station); + mSwitchLine = findViewById(R.id.switch_line_btn); +// mDebugArrive = findViewById(R.id.module_och_bus_arrive_station); if ( DebugConfig.isDebug() ) { mBus.setOnClickListener( view -> { @@ -73,23 +81,6 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu } ); } - mCurrentStationName.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { -// if (DebugConfig.isDebug()){ - if (mDebugArrive.getVisibility() == View.VISIBLE){ - mDebugArrive.setVisibility(View.GONE); - }else { - mDebugArrive.setVisibility(View.VISIBLE); - } -// } - return false; - } - }); - - findViewById(R.id.module_och_bus_arrive_station).setOnClickListener(view ->{ //到站 - mPresenter.onAutopilotArriveAtStation(null); - }); Logger.d( TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); // 初始化的时候设置 UI 按钮状态 @@ -108,6 +99,7 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu default: break; } + mSwitchLine.setOnClickListener(this); } @Override @@ -132,8 +124,10 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu * @param stationList 车站列表信息 * @param currentStation 当前站点 * @param nextStation 下个站点 + * @param isArrived 是否都站 */ public void refreshBusStations( List< OchBusStation > stationList, int currentStation, int nextStation ,boolean isArrived) { + mCurrentStation = currentStation; if ( getActivity() == null ) { return; } @@ -149,9 +143,10 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu } /** - * 重新刷新站点信息 + * 重新刷新站点信息 isArrived 是否到站 */ - private void renderCurrentStationStatus( List< OchBusStation > stationList, int currentStation, int nextStation ,boolean isArrived) { + private void renderCurrentStationStatus( List< OchBusStation > stationList, int currentStation + , int nextStation ,boolean isArrived) { Log.d("MapMaker= ","currentStation="+currentStation+",nextStation="+nextStation+"isArrived="+isArrived); String currentStationName = null; String nextStationName = null; @@ -172,27 +167,35 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu if ( currentStation == 0 ) { startStationFlagVisibility = View.VISIBLE; isArriveAtStartStation = true; - mStartStationFlag.setText( "始" ); + mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start)); // Log.d("MapMaker= ","起点="); - setOrRemoveMapMaker(true, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat(),startStation.getLon(),R.drawable.icon_station_start_end); - setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(true, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() + ,startStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() + ,endStation.getLon(),R.drawable.icon_station_start_end); } else if ( currentStation > 0 && currentStation < stationList.size() - 1 ) {// 是否到达站点 // Log.d("MapMaker= ","中间="); isArriveAtStation = true; - setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat(),startStation.getLon(),R.drawable.icon_station_start_end); - setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end); +// mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start1)); + setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() + ,startStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() + ,endStation.getLon(),R.drawable.icon_station_start_end); } else if ( currentStation == stationList.size() - 1 ) {// 是否到达终点 // Log.d("MapMaker= ","终点="); isArriveEndStation = true; nextStationName = "--"; - mStartStationFlag.setText( "终" ); + mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); startStationFlagVisibility = View.VISIBLE; endStationFlagVisibility = View.INVISIBLE; - setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat(),startStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() + ,startStation.getLon(),R.drawable.icon_station_start_end); if (isArrived){ - setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() + ,endStation.getLon(),R.drawable.icon_station_start_end); }else { - setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() + ,endStation.getLon(),R.drawable.icon_station_start_end); } } @@ -302,6 +305,7 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE); } } + /** * 绘制地图起点终点 * @param isAdd @@ -319,13 +323,34 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu options.icon(bitmap); options.latitude(lat); options.longitude(longi); - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).addMarker(uuid, options); + MogoApisHandler.getInstance().getApis().getMapServiceApi() + .getMarkerManager(AbsMogoApplication.getApp()).addMarker(uuid, options); }else { Log.d("RemoveMapMaker=",uuid+"=latitude="+lat+",longitude="+longi); - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(uuid); + MogoApisHandler.getInstance().getApis().getMapServiceApi() + .getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(uuid); } } + public void debugAutoPilotStatus(int status){ mPresenter.debugAutoPilotStatus(status); } + + @Override + public void onClick(View v) { + if (v.getId() == R.id.switch_line_btn ){//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线 + //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线 + if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() + == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ + TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning1)); + return; + } + if (mCurrentStation > 0){ + TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning2)); + return; + } + Intent intent = new Intent(getContext(), BusSwitchLineActivity.class); + startActivity(intent); + } + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java index 8c0ab8181a..d3a65f66b1 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java @@ -1,5 +1,6 @@ package com.mogo.och.bus.net; import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; import com.mogo.och.bus.bean.OchBusOperationStatusRequest; import com.mogo.och.bus.bean.OchBusQueryLineStationsRequest; @@ -14,6 +15,7 @@ import com.mogo.och.bus.bean.OchBusUpdateSiteStatusRequest; 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; @@ -26,7 +28,6 @@ import retrofit2.http.Query; * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072 */ public interface IOchBusApiService { - /** * 根据车机坐标获取所在区域全部站点信息 * @@ -34,9 +35,10 @@ public interface IOchBusApiService { * @return 接口返回数据 */ @Headers( {"Content-Type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/bus/api/lineDataWithDriver/query" ) +// @POST( "/autopilot-car-hailing/bus/api/lineDataWithDriver/query" ) + @POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" ) // @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" ) - Observable< OchBusRoutesResponse > querySiteByCoordinate(@Body OchBusQueryLineStationsRequest request); + Observable< OchBusRoutesResponse > querySiteByCoordinate(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusQueryLineStationsRequest request); /** * 重置巴士路线: 点击小巴车tab 或者出车后会使用 @@ -45,9 +47,10 @@ public interface IOchBusApiService { * @return 返回值是重置后的车站列表 */ @Headers( {"Content-Type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/bus/api/drivingLine/reset" ) +// @POST( "/autopilot-car-hailing/bus/api/drivingLine/reset" ) + @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" ) // @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" ) - Observable< OchBusRoutesResponse > debugResetStationStatus(@Body OchBusResetDrivingLineRequest request); + Observable< OchBusRoutesResponse > resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body OchBusResetDrivingLineRequest request); /** * 离站,通知服务器 @@ -55,9 +58,10 @@ public interface IOchBusApiService { * @return */ @Headers({"Content-Type:application/json;charset=UTF-8"}) - @POST("/autopilot-car-hailing/bus/api/driving/away") +// @POST("/autopilot-car-hailing/bus/api/driving/away") + @POST("/autopilot-car-hailing/car/v2/bus/driving/away") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away") - Observable< OchBusRoutesResponse > leaveStation(@Body OchBusUpdateSiteStatusRequest request); + Observable< OchBusRoutesResponse > leaveStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusUpdateSiteStatusRequest request); /** * 到站 更新到站信息 @@ -65,9 +69,10 @@ public interface IOchBusApiService { * @return */ @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/autopilot-car-hailing/bus/api/driving/attachSite") +// @POST("/autopilot-car-hailing/bus/api/driving/attachSite") + @POST("/autopilot-car-hailing/order/v2/bus/driving/attachSite") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite") - Observable< BaseData > arriveSiteStation(@Body OchBusUpdateSiteStatusRequest request); + Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusUpdateSiteStatusRequest request); /** @@ -76,9 +81,10 @@ public interface IOchBusApiService { * @return */ @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/autopilot-car-hailing/bus/api/driving/siteArrivedOrders") +// @POST("/autopilot-car-hailing/bus/api/driving/siteArrivedOrders") + @POST("/autopilot-car-hailing/order/v2/bus/driving/siteArrivedOrders") // @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders") - Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Body QueryLeaveAwayPassengersRequest request); + Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request); /** * 出车 @@ -86,9 +92,10 @@ public interface IOchBusApiService { * @return */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST("/autopilot-car-hailing/bus/api/startTakeOrder") +// @POST("/autopilot-car-hailing/bus/api/startTakeOrder") + @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder") // @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder") - Observable startTakeOrder(@Body OchBusOperationStatusRequest request); + Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusOperationStatusRequest request); /** * 收车 @@ -96,9 +103,10 @@ public interface IOchBusApiService { * @return */ @Headers({"Content-type:application/json;charset=UTF-8"}) - @POST("/autopilot-car-hailing/bus/api/stopTakeOrder") +// @POST("/autopilot-car-hailing/bus/api/stopTakeOrder") + @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder") // @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder") - Observable stopTakeOrder(@Body OchBusOperationStatusRequest request); + Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusOperationStatusRequest request); /** * 查询小巴出车/收车状态 @@ -106,14 +114,16 @@ public interface IOchBusApiService { * @return */ @Headers({"Content-type:application/json;charset=UTF-8"}) - @GET("/autopilot-car-hailing/bus/api/takeOrderStatus/query") +// @GET("/autopilot-car-hailing/bus/api/takeOrderStatus/query") + @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query") // @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query") - Observable queryOperationStatus(@Query("sn") String sn); + 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/bus/api/servicingOrders/query") +// @GET("/autopilot-car-hailing/bus/api/servicingOrders/query") + @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query") // @GET("/mock/268/autopilot-car-hailing/bus/api/servicingOrders/query") - Observable queryBusOrders(@Query("sn") String sn); + Observable queryBusOrders(@Header ("appId") String appId,@Header("ticket") String ticket,@Query("sn") String sn); /** * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 @@ -121,6 +131,11 @@ public interface IOchBusApiService { * @return */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" ) - Observable runCarHeartbeat(@Body CarHeartbeatReqBean data); +// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" ) + @POST( "/autopilot-car-hailing/location/v2/driver/heartbeat" ) + Observable runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket,@Body CarHeartbeatReqBean data); + + @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query") + Observable queryBusLines(@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/net/OCHBusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java index b5de475b95..3fc23505e5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java @@ -8,6 +8,7 @@ import com.mogo.eagle.core.network.RequestOptions; import com.mogo.eagle.core.network.SubscribeImpl; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.bus.bean.BusQueryLinesResponse; import com.mogo.och.bus.bean.CarHeartbeatReqBean; import com.mogo.och.bus.bean.OchBusOperationStatusRequest; import com.mogo.och.bus.bean.OchBusOperationStatusResponse; @@ -29,18 +30,22 @@ import io.reactivex.schedulers.Schedulers; * @date: 2021/10/20 */ public class OCHBusServiceManager { - private static final String TAG = OCHBusServiceManager.class.getSimpleName(); - private IOchBusApiService mService; + private static final String TAG = OCHBusServiceManager.class.getSimpleName(); + + private IOchBusApiService mService; private String baseUrl = OchBusConst.getBaseUrl(); + private static final class SingletonHolder { private static final OCHBusServiceManager INSTANCE = new OCHBusServiceManager(); } + public static OCHBusServiceManager getInstance(){ return SingletonHolder.INSTANCE; } + private OCHBusServiceManager(){ - mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); + mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } /** @@ -54,7 +59,10 @@ public class OCHBusServiceManager { } //获取当前高德坐标 - mService.querySiteByCoordinate( new OchBusQueryLineStationsRequest(OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude,true)) + mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + , new OchBusQueryLineStationsRequest(OchBusOrderModel.getInstance().mLongitude + ,OchBusOrderModel.getInstance().mLatitude,true)) .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() ) .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate")); } @@ -65,11 +73,12 @@ public class OCHBusServiceManager { * @param lineId * @param callback */ - public void debugResetStationStatus(Context context,int lineId,OCHServiceCallback callback){ + public void resetStationStatus(Context context, int lineId, OCHServiceCallback callback){ if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.debugResetStationStatus(new OchBusResetDrivingLineRequest(lineId)) + mService.resetStationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken(),new OchBusResetDrivingLineRequest(lineId)) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus")); } @@ -85,7 +94,10 @@ public class OCHBusServiceManager { if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.leaveStation(new OchBusUpdateSiteStatusRequest(seq,siteId,OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude)) + mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new OchBusUpdateSiteStatusRequest(seq,siteId,OchBusOrderModel.getInstance().mLongitude + ,OchBusOrderModel.getInstance().mLatitude)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"leaveStation")); @@ -102,7 +114,10 @@ public class OCHBusServiceManager { if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.arriveSiteStation(new OchBusUpdateSiteStatusRequest(seq,siteId,OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude)) + mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new OchBusUpdateSiteStatusRequest(seq,siteId + ,OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"leaveStation")); @@ -115,11 +130,13 @@ public class OCHBusServiceManager { * @param siteId * @param callback */ - public void queryStationLeaveAwayPassengers(Context context,int seq,int siteId,OCHServiceCallback callback){ + public void queryStationLeaveAwayPassengers(Context context,int seq,int siteId + ,OCHServiceCallback callback){ if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.queryStationLeaveAwayPassengers( new QueryLeaveAwayPassengersRequest(seq,siteId)) + mService.queryStationLeaveAwayPassengers( MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken(),new QueryLeaveAwayPassengersRequest(seq,siteId)) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers")); @@ -134,7 +151,10 @@ public class OCHBusServiceManager { if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.stopTakeOrder(new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude)) + mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude + ,OchBusOrderModel.getInstance().mLatitude)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder")); @@ -149,7 +169,10 @@ public class OCHBusServiceManager { if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.startTakeOrder(new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude)) + mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude + ,OchBusOrderModel.getInstance().mLatitude)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getSubscribeImpl(context,callback,"startTakeOrder")); @@ -164,7 +187,8 @@ public class OCHBusServiceManager { if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getSn()) + mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) .subscribeOn( Schedulers.io() ) .observeOn( AndroidSchedulers.mainThread() ) .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus")); @@ -179,12 +203,24 @@ public class OCHBusServiceManager { if (mService == null){ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl); } - mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getSn()) + mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(getSubscribeImpl(context,callback,"queryBusOrders")); } + public void queryBusLines(Context context, OCHServiceCallback callback){ + if (mService == null){ + mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create(IOchBusApiService.class,baseUrl); + } + mService.queryBusLines(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"queryBusLines")); + } + /** * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 * @param context @@ -198,7 +234,8 @@ public class OCHBusServiceManager { mService = MogoApisHandler.getInstance().getApis().getNetworkApi() .create(IOchBusApiService.class, baseUrl); } - mService.runCarHeartbeat(new CarHeartbeatReqBean( + mService.runCarHeartbeat(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken(),new CarHeartbeatReqBean( MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java new file mode 100644 index 0000000000..c176a5eab2 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java @@ -0,0 +1,78 @@ +package com.mogo.och.bus.presenter; + +import android.content.Context; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; +import com.mogo.och.bus.bean.BusQueryLinesResponse; +import com.mogo.och.bus.bean.OchBusRoutesResponse; +import com.mogo.och.bus.callback.BusLinesCallback; +import com.mogo.och.bus.net.OCHBusServiceManager; +import com.mogo.och.bus.net.OCHServiceCallback; + +/** + * @author: wangmingjun + * @date: 2022/2/9 + */ +public class OchBusLineModel { + private static volatile OchBusLineModel sInstance; + private Context mContext; + private BusLinesCallback mBusLinesCallback; + public static OchBusLineModel getInstance() { + if ( sInstance == null ) { + synchronized ( OchBusLineModel.class ) { + if ( sInstance == null ) { + sInstance = new OchBusLineModel(); + } + } + } + return sInstance; + } + private OchBusLineModel() { + + } + public void init() { + mContext = AbsMogoApplication.getApp(); + } + public void setBusLinesCallback(BusLinesCallback callback){ + mBusLinesCallback = callback; + } + public void queryBusLines(){ + OCHBusServiceManager.getInstance().queryBusLines(mContext, new OCHServiceCallback() { + @Override + public void onSuccess(BusQueryLinesResponse data) { + if (null == data && mBusLinesCallback != null) { + mBusLinesCallback.onBusLinesChange(null); + return; + } + + if (mBusLinesCallback != null){ + mBusLinesCallback.onBusLinesChange(data); + } + } + + @Override + public void onFail(String failMsg) { + + } + }); + } + + public void commitSwitchLineId(int lineId){ + OCHBusServiceManager.getInstance().resetStationStatus(mContext,lineId, new OCHServiceCallback() { + @Override + public void onSuccess(OchBusRoutesResponse o) { + if (mBusLinesCallback != null){ + mBusLinesCallback.onChangeLineIdSuccess(); + } + } + + @Override + public void onFail(String failMsg) { + TipToast.longTip("切换路线失败"); + } + }); + } + +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java new file mode 100644 index 0000000000..de2289284a --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java @@ -0,0 +1,61 @@ +package com.mogo.och.bus.presenter; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; + +import com.mogo.commons.mvp.Presenter; +import com.mogo.och.bus.bean.BusQueryLinesResponse; +import com.mogo.och.bus.callback.BusLinesCallback; +import com.mogo.och.bus.ui.BusSwitchLineActivity; +import com.mogo.och.bus.ui.BusSwitchLineView; + +/** + * @author: wangmingjun + * @date: 2022/2/9 + */ +public class OchBusLinePresenter extends Presenter implements BusLinesCallback { + + public OchBusLinePresenter(BusSwitchLineView view) { + super(view); + OchBusLineModel.getInstance().init(); + OchBusOrderModel.getInstance().init(); + } + + @Override + public void onCreate(@NonNull LifecycleOwner owner) { + super.onCreate(owner); + initListener(); + } + + private void initListener() { + OchBusLineModel.getInstance().setBusLinesCallback(this); + } + + @Override + public void onBusLinesChange(BusQueryLinesResponse lines) { + mView.onBusLinesChange(lines); + } + + @Override + public void onChangeLineIdSuccess() { + mView.onChangeLineIdSuccess(); + } + + public void queryBusLines(){ + OchBusLineModel.getInstance().queryBusLines(); + } + + public void commitSwitchLineId(int lineId){ + OchBusLineModel.getInstance().commitSwitchLineId(lineId); + } + + public void queryBusRoutes(){ + OchBusOrderModel.getInstance().queryBusRoutes(); + } + + @Override + public void onDestroy(@NonNull LifecycleOwner owner) { + super.onDestroy(owner); + OchBusLineModel.getInstance().setBusLinesCallback(null); + } +} diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java index 28ffdba68d..3fb034c010 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java @@ -107,6 +107,7 @@ public class OchBusOrderModel { return false; } }); + public static OchBusOrderModel getInstance() { if ( sInstance == null ) { synchronized ( OchBusOrderModel.class ) { @@ -121,6 +122,7 @@ public class OchBusOrderModel { private OchBusOrderModel() { } + public void init() { mContext = AbsMogoApplication.getApp(); // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传 @@ -138,7 +140,8 @@ public class OchBusOrderModel { //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 - // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with + // The exception could not be delivered to the consumer because it has already canceled/disposed + // the flow or the excTeption has nowhere to go to begin with RxJavaPlugins.setErrorHandler(new Consumer() { @Override public void accept(Throwable e) { @@ -179,15 +182,19 @@ public class OchBusOrderModel { public void setCarOperationStatusCallback(CarOperationStatusCallback callback){ this.carOperationStatusCallback = callback; } + public void setRefreshBusStationsCallback(RefreshBusStationsCallback callback){ this.refreshBusStationsCallback = callback; } + public void setSlidePannelHideCallback(SlidePannelHideCallback callback){ this.slidePannelHideCallback = callback; } + public void setControllerStatusCallback(IOCHBusControllerStatusCallback callback) { this.mControllerStatusCallback = callback; } + /** * 轮询bus待服务订单 */ @@ -224,7 +231,8 @@ public class OchBusOrderModel { tailNum = order.getPassengerPhone(); } Logger.d(TAG, "TTS:" + tailNum); - AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum + " 上车站点为 " + order.getStartStationName()); + AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum + + " 上车站点为 " + order.getStartStationName()); prevBusOrderIds.add(order.getOrderId()); } catch (Exception e) { e.printStackTrace(); @@ -256,10 +264,12 @@ public class OchBusOrderModel { .getRegisterCenterApi() .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); } + private Object readResolve() { // 阻止反序列化,必须实现 Serializable 接口 return sInstance; } + private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() { // VR mode变更回调 @Override @@ -271,6 +281,7 @@ public class OchBusOrderModel { } } }; + // 自车定位 private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { @@ -303,6 +314,7 @@ public class OchBusOrderModel { } } }; + /** * 查询小巴路线 */ @@ -334,7 +346,8 @@ public class OchBusOrderModel { */ public void debugResetStationStatus() { Logger.d( TAG, "测试、重置站点状态"); - OCHBusServiceManager.getInstance().debugResetStationStatus(mContext, currentLineId, new OCHServiceCallback() { + OCHBusServiceManager.getInstance().resetStationStatus(mContext, currentLineId + , new OCHServiceCallback() { @Override public void onSuccess(OchBusRoutesResponse o) { Logger.d(TAG, "获取到小巴路线数据: " + o); @@ -353,12 +366,14 @@ public class OchBusOrderModel { }); } + /** * 离站上报 */ public void leaveStation(boolean isOneWayOver,boolean isRestart){ Log.d(TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex); - OCHBusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq(), stationList.get(backgroundCurrentStationIndex).getSiteId(), new OCHServiceCallback() { + OCHBusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq() + , stationList.get(backgroundCurrentStationIndex).getSiteId(), new OCHServiceCallback() { @Override public void onSuccess(OchBusRoutesResponse o) { if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) { @@ -385,6 +400,7 @@ public class OchBusOrderModel { } }); } + /** * 离站上报成功后渲染站点 * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, @@ -405,6 +421,10 @@ public class OchBusOrderModel { AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" ); } + /** + * 开启自动驾驶 + * @param isRestart + */ private void startAutopilot(boolean isRestart) { OchBusStation currentStation = stationList.get( currentStationIndex -1); OchBusStation nextStation = stationList.get( currentStationIndex); @@ -417,8 +437,10 @@ public class OchBusOrderModel { currentAutopilot.isSpeakVoice = !isRestart; currentAutopilot.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()); currentAutopilot.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName()); - currentAutopilot.startLatLon = new AutopilotControlParameters.AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() ); - currentAutopilot.endLatLon = new AutopilotControlParameters.AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() ); + currentAutopilot.startLatLon = new AutopilotControlParameters + .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() ); + currentAutopilot.endLatLon = new AutopilotControlParameters + .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() ); currentAutopilot.vehicleType = VEHICLE_TYPE; Logger.d( TAG, "开启自动驾驶====" + currentAutopilot.toString() +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName()); @@ -433,7 +455,8 @@ public class OchBusOrderModel { */ private void arriveSiteStation(boolean isRestart) { Log.d(TAG,"arriveSiteStation-currentStationIndex = "+currentStationIndex); - OCHBusServiceManager.getInstance().arriveSiteStation(mContext, stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId() + OCHBusServiceManager.getInstance().arriveSiteStation(mContext + , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId() , new OCHServiceCallback() { @Override public void onSuccess(BaseData o) { @@ -457,7 +480,8 @@ public class OchBusOrderModel { if (site != null && site.size() > 0){ backgroundCurrentStationIndex = currentStationIndex; if (refreshBusStationsCallback != null){ - refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex, getNextStopStation(),true); + refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex + , getNextStopStation(),true); } } } @@ -468,7 +492,8 @@ public class OchBusOrderModel { private void queryStationLeaveAwayPassengers() { Logger.d( TAG, "查询到站下车乘客"); - OCHBusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext, stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId() + OCHBusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext + , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId() , new OCHServiceCallback() { @Override public void onSuccess(QueryLeaveAwayPassengersResponse o) { @@ -485,6 +510,7 @@ public class OchBusOrderModel { } }); } + /** * 收车 */ @@ -506,6 +532,7 @@ public class OchBusOrderModel { } }); } + /** * 出车 */ @@ -516,7 +543,8 @@ public class OchBusOrderModel { mIsWorking = !mIsWorking; startOrStopOrderLoop(mIsWorking); if ( stationList != null && stationList.size() > 0 ) { - AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往" + stationList.get( currentStationIndex ).getName() + "站点" ); + AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往" + + stationList.get( currentStationIndex ).getName() + "站点" ); } carOperationStatusCallback.changeOperationStatus(isWorking()); queryBusRoutes(); @@ -531,12 +559,14 @@ public class OchBusOrderModel { } }); } + /** * 查询运营状态 */ public void queryOperationStatus() { Logger.d( TAG, "查询运营状态"); - OCHBusServiceManager.getInstance().queryOperationStatus(mContext, new OCHServiceCallback() { + OCHBusServiceManager.getInstance().queryOperationStatus(mContext + , new OCHServiceCallback() { @Override public void onSuccess(OchBusOperationStatusResponse o) { if ( o.data != null ) { @@ -554,6 +584,7 @@ public class OchBusOrderModel { } }); } + /** * 开启自动驾驶到下一站 */ @@ -565,6 +596,7 @@ public class OchBusOrderModel { } leaveStation(false,isRestart); } + /** * 渲染站点信息 * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站, @@ -592,12 +624,16 @@ public class OchBusOrderModel { } backgroundCurrentStationIndex = currentStationIndex; OchBusStation currentStation = stationList.get(currentStationIndex); - Logger.d( TAG, "渲染站点信息服务端currentStationIndex="+currentStationIndex+" isLeaving()="+currentStation.isLeaving()); - if (currentStationIndex == 0 && !currentStation.isLeaving()){//当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态,订单开始站下在始发站的状态流转有问题 + Logger.d( TAG, "渲染站点信息服务端currentStationIndex="+currentStationIndex + +" isLeaving()="+currentStation.isLeaving()); + //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态 + // ,订单开始站下在始发站的状态流转有问题 + if (currentStationIndex == 0 && !currentStation.isLeaving()){ arriveSiteStation(true); } // 美化是否开始 - if (FunctionBuildConfig.isDemoMode && ((currentStationIndex > 0 && currentStationIndex < stationList.size()-1) + if (FunctionBuildConfig.isDemoMode && ((currentStationIndex > 0 + && currentStationIndex < stationList.size()-1) || (stationList.get(0).isLeaving() || stationList.get(stationList.size() -1).isLeaving()))){//行驶过程中设置美化 FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; Logger.d(TAG, "美化模式-ignore:置为true(每次滑动出发)"); @@ -605,9 +641,11 @@ public class OchBusOrderModel { if (refreshBusStationsCallback != null){ if (currentStation.isLeaving()){//如果服务端的当前站是leaving状态,展示当前站需要+1 currentStationIndex ++; - refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex, getNextStopStation(),false); + refreshBusStationsCallback.refreshBusStations(stationList + , currentStationIndex, getNextStopStation(),false); }else{ - refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex, getNextStopStation(),true); + refreshBusStationsCallback.refreshBusStations(stationList + , currentStationIndex, getNextStopStation(),true); } } if ( currentStation.isLeaving() && slidePannelHideCallback != null) { @@ -635,6 +673,7 @@ public class OchBusOrderModel { autoDriveToNextStation( true ); } } + /** * 根据订单状态、获取下一站靠站的的站点 * @@ -653,6 +692,7 @@ public class OchBusOrderModel { } return nextStationIndex; } + /** * 延时查询站点信心 */ @@ -669,6 +709,7 @@ public class OchBusOrderModel { autoDriveToNextStation( true ); } } + /** * 播报下车乘客信息 * @@ -686,7 +727,8 @@ public class OchBusOrderModel { if ( !station.endsWith( "站" ) ) { builder.append( "站" ); } - if ( awayPassengersResponse == null || awayPassengersResponse.data == null || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) { + if ( awayPassengersResponse == null || awayPassengersResponse.data == null + || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) { Logger.d( TAG, "播报下车乘客信息为null"); } else { builder.append( ",请尾号为 " ); @@ -709,6 +751,7 @@ public class OchBusOrderModel { Logger.d(TAG, "TTS:" + builder.toString()); AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() ); } + /** * 修改小巴运营状态 */ @@ -720,6 +763,7 @@ public class OchBusOrderModel { startTakeOrder(); } } + /** * 行程结束 */ @@ -735,9 +779,11 @@ public class OchBusOrderModel { AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" ); leaveStation(true,true); } + public boolean isWorking() { return mIsWorking; } + /** * 到站 * @param data @@ -766,6 +812,7 @@ public class OchBusOrderModel { } },1500); } + public boolean isGoingToNextStation() { return isGoingToNextStation; } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java index f5a0301b04..6b741f08cf 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java @@ -33,8 +33,12 @@ import java.util.List; * * @author tongchenfei */ -public class OchBusPresenter extends Presenter< OchBusFragment > implements CarOperationStatusCallback, RefreshBusStationsCallback, SlidePannelHideCallback, IMoGoAutopilotStatusListener, IOCHBusControllerStatusCallback { +public class OchBusPresenter extends Presenter< OchBusFragment > + implements CarOperationStatusCallback, RefreshBusStationsCallback, SlidePannelHideCallback + , IMoGoAutopilotStatusListener, IOCHBusControllerStatusCallback { + private static final String TAG = "OchBusPresenter"; + private int currentAutopilotStatus = -1; private boolean isAnimateRunning = false; private List mStationList = new ArrayList<>(); @@ -54,38 +58,46 @@ public class OchBusPresenter extends Presenter< OchBusFragment > implements CarO OchBusOrderModel.getInstance().queryBusRoutes(); initModelListener(); } + @Override public void onDestroy(@NonNull LifecycleOwner owner) { super.onDestroy(owner); OchBusOrderModel.getInstance().release(); releaseListener(); } + public void initModelListener(){ OchBusOrderModel.getInstance().setCarOperationStatusCallback(this); OchBusOrderModel.getInstance().setRefreshBusStationsCallback(this); OchBusOrderModel.getInstance().setSlidePannelHideCallback(this); OchBusOrderModel.getInstance().setControllerStatusCallback(this); } + public void releaseListener(){ OchBusOrderModel.getInstance().setCarOperationStatusCallback(null); OchBusOrderModel.getInstance().setRefreshBusStationsCallback(null); OchBusOrderModel.getInstance().setSlidePannelHideCallback(null); OchBusOrderModel.getInstance().setControllerStatusCallback(null); } + public void queryBusRoutes(){ OchBusOrderModel.getInstance().queryBusRoutes(); } + public void debugResetStationStatus(){ OchBusOrderModel.getInstance().debugResetStationStatus(); } + public void autoDriveToNextStation(boolean isRestart){ currentAutopilotStatus = -1; OchBusOrderModel.getInstance().autoDriveToNextStation(isRestart); } + public void restartAutopilot(){ currentAutopilotStatus = -1; OchBusOrderModel.getInstance().restartAutopilot(); } + public void onChangeOperationStatus(){ OchBusOrderModel.getInstance().onChangeOperationStatus(); } 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 new file mode 100644 index 0000000000..6dc465f911 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java @@ -0,0 +1,295 @@ +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; +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.mogo.toast.TipToast; +import com.mogo.och.bus.R; +import com.mogo.och.bus.bean.BusQueryLinesResponse; +import com.mogo.och.bus.presenter.OchBusLinePresenter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author: wangmingjun + * @date: 2022/2/8 + */ +public class BusSwitchLineActivity extends MvpActivity + implements 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; + + @Override + protected int getLayoutId() { + return R.layout.activity_bus_switch_line; + } + + @NonNull + @Override + protected OchBusLinePresenter createPresenter() { + return new OchBusLinePresenter(this); + } + + @Override + protected void initViews() { + initWH(); + initView(); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + 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)); + mAdapter = new SwitchLineAdapter(this,mData); + mLinesListView.setAdapter(mAdapter); + //设置item 点击事件 + mAdapter.setOnLineItemClickListener(new LineItemClickListener() { + @Override + public void onItemClick(int position) { + if (mData.size() > position && !TextUtils.isEmpty(mData.get(position).startSiteName ) + && !TextUtils.isEmpty(mData.get(position).endSiteName)){ + mSelectLineId = mData.get(position).lineId; + }else { + mSelectLineId = -1; + } + } + }); + } + + /** + * 设置布局宽高 + */ + 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 void initDatas() { + mPresenter.queryBusLines(); + } + + /** + * 查询返回绑定路线集合 + * @param data + */ + @Override + public void onBusLinesChange(BusQueryLinesResponse data){ + 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); + } + } + + /** + * 根据路线选中情况设置提交按钮样式 + */ + private void changeCommitBtnBg() { + for (int i=0; i -1){ + mPresenter.commitSwitchLineId(mSelectLineId); + }else { + finish(); + } + return; + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mAdapter != null){ + mAdapter.setOnLineItemClickListener(null); + } + } + + /** + * 路线列表adapter + */ + static class SwitchLineAdapter extends RecyclerView.Adapter{ + + private Context mContext; + private List mData; + // RecyclerView设置点击事件 + private LineItemClickListener mItemClickListener ; + private int clickPos = -1; + + public SwitchLineAdapter(Context context, List data){ + mContext = context; + mData = data; + } + + @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:未绑定 默认绑定 + 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 new file mode 100644 index 0000000000..febd6429b1 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineView.java @@ -0,0 +1,15 @@ +package com.mogo.och.bus.ui; + +import com.mogo.commons.mvp.IView; +import com.mogo.och.bus.bean.BusQueryLinesResponse; + +/** + * @author: wangmingjun + * @date: 2022/2/10 + */ +public interface BusSwitchLineView extends IView { + + void onBusLinesChange(BusQueryLinesResponse data); + void onChangeLineIdSuccess(); +} + diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_selected_btn.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_selected_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..3f05565483f1ed36e55a0bb6a1b197dda2aa6fe4 GIT binary patch literal 5210 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 UOE75RMF0Q*07*qoM6N<$g1qb~*8l(j literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_switch_line_close.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_switch_line_close.png new file mode 100644 index 0000000000000000000000000000000000000000..370b61de38f35e5da73f6c3a98eeebc45b0bbeea GIT binary patch literal 3825 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 UOE75RMF0Q*07*qoM6N<$g1qb~*8l(j literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_switch_line_close.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_switch_line_close.png new file mode 100644 index 0000000000000000000000000000000000000000..370b61de38f35e5da73f6c3a98eeebc45b0bbeea GIT binary patch literal 3825 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 literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml index a830539009..9a276b035d 100644 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml @@ -2,43 +2,43 @@ - + - - - - - - + + + + + + - + - + - + - + - + diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_checkbox_selector.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_checkbox_selector.xml new file mode 100644 index 0000000000..d95e931160 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_checkbox_selector.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml index 204c5fc692..d7937835a0 100644 --- a/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml @@ -2,7 +2,7 @@ - + @@ -12,7 +12,7 @@ android:right="3px" android:top="3px"> - + diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml new file mode 100644 index 0000000000..8062bcf093 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml new file mode 100644 index 0000000000..324b9ece10 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_commit.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000000..d0ea7fa041 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_line_btn_un_commit.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ 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 new file mode 100644 index 0000000000..0c04f9c833 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/activity_bus_switch_line.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_no_data_common_view.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_no_data_common_view.xml new file mode 100644 index 0000000000..b5a80553d0 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_no_data_common_view.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000000..273b53d516 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/layout/bus_switch_line_list_item.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + \ 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 84e1495b9c..558429d9ec 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 @@ -1,24 +1,35 @@ - - + android:background="@drawable/bus_panel_bkg"> + + + + + + + + + + + + + + + + + + + + + + + + + + android:textStyle="bold" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintRight_toRightOf="parent"/> + android:paddingBottom="@dimen/module_och_bus_order_status_stationInfo_paddingBottom" + app:layout_constraintTop_toBottomOf="@+id/module_och_bus_tag" + app:layout_constraintLeft_toLeftOf="parent"> - - \ No newline at end of file + + \ 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 0a257a4014..3ef9d9d932 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 @@ -87,7 +87,7 @@ 30px 466px - 414px + 446px 36px @@ -116,4 +116,12 @@ 50px 60px + + 46px + 700px + 120px + 86px + + 20px + \ 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 b4b6ec1da2..8f068b0633 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 @@ -87,7 +87,7 @@ 30px 466px - 414px + 446px 36px @@ -116,4 +116,9 @@ 50px 60px + 46px + 700px + 120px + 86px + 50px \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/res/values/attrs.xml b/OCH/mogo-och-bus/src/main/res/values/attrs.xml index 33fc037d9c..396db92f74 100644 --- a/OCH/mogo-och-bus/src/main/res/values/attrs.xml +++ b/OCH/mogo-och-bus/src/main/res/values/attrs.xml @@ -9,4 +9,5 @@ + \ 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 d00508078d..a702d05967 100644 --- a/OCH/mogo-och-bus/src/main/res/values/colors.xml +++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml @@ -32,5 +32,10 @@ #3E77F6 #323C6F + #2966EC + #F0151D41 + + #19FFFFFF + #FFFFFF \ 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 6fcc61920c..49e258a5e0 100644 --- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml @@ -132,4 +132,9 @@ 35px 822px + 30px + 450px + 72px + 52px + 20px \ 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 7c837211af..8ebaa40023 100644 --- a/OCH/mogo-och-bus/src/main/res/values/strings.xml +++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml @@ -5,4 +5,22 @@ 启动成功 启动失败 自动驾驶 + 路线列表 + 路线: + 起点: + 终点: + 确认 + 切换路线 + 自动驾驶中,不可切换路线 + 当前行程未完成,不可切换路线 + 当前车辆无路线\n请联系运营人员绑定 + 起点: + 终点: + 更换路线成功 + 更换路线失败 + + + + + diff --git a/OCH/mogo-och-bus/src/main/res/values/style.xml b/OCH/mogo-och-bus/src/main/res/values/style.xml new file mode 100644 index 0000000000..36d7ef0d93 --- /dev/null +++ b/OCH/mogo-och-bus/src/main/res/values/style.xml @@ -0,0 +1,23 @@ + + + + From ade923dd9919bf406de46717ebc633fde1ac4ccc Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Tue, 22 Feb 2022 19:10:46 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[Bus=20Driver=202.5.2]=20bus=E6=8F=90?= =?UTF-8?q?=E6=B5=8B=20versionName=20=3D=202.5.2?= 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 0867e40c63..3ba92872d8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -89,7 +89,7 @@ applicationId=com.mogo.launcer applicationName=IntelligentPilot # RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0 versionCode=80008 -versionName=2.5.1 +versionName=2.5.2 ################# 新架构模块Maven版本管理 ################# MOGO_CORE_FUNCTION_AUTOPILOT_VERSION=0.0.58.8 From 899b826b5b270d6be065dd3856a44fbb30d7b264 Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Fri, 25 Feb 2022 16:14:28 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[Bus=20Driver=202.5.2]=20bus=20=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E6=8C=89=E9=92=AE"=E5=88=B0=E7=AB=99"=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=20=E6=81=A2=E5=A4=8D=E5=88=B0=E9=95=BF=E6=8C=89?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=AB=99=E7=82=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bus/fragment/BaseOchBusTabFragment.java | 29 ++++++++++++------- .../mogo/och/bus/fragment/OchBusFragment.java | 6 +++- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java index feef74103b..3b7f99d334 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java @@ -148,17 +148,13 @@ public abstract class BaseOchBusTabFragment { - if (groupTestPanel.getVisibility() == View.VISIBLE) { - groupTestPanel.setVisibility(View.GONE); - } else { - groupTestPanel.setVisibility(View.VISIBLE); - } - return true; - }); - } + // debug下调用测试面板 2022.2.25修改到 长按当前站点名字 +// if (DebugConfig.isDebug()) { +// ctvAutopilotStatus.setOnLongClickListener(v -> { +// debugTestBar(); +// return true; +// }); +// } onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState(),false); // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接 findViewById(R.id.btnAutopilotDisable).setOnClickListener(view -> @@ -447,4 +443,15 @@ public abstract class BaseOchBusTabFragment { + debugTestBar(); + return true; + }); } Logger.d( TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); From fa972e7843216f7279a194f20a7eb9b291e577da Mon Sep 17 00:00:00 2001 From: lianglihui Date: Mon, 28 Feb 2022 14:47:24 +0800 Subject: [PATCH 4/4] =?UTF-8?q?apm=20=E7=94=A8tag=E7=AE=A1=E7=90=86=20hdma?= =?UTF-8?q?p=20sdk=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/test/crashreport/apm/ApmCrashReportProvider.java | 3 +++ 1 file changed, 3 insertions(+) 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 8446c6d2e7..0512916291 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 @@ -31,6 +31,7 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { private static final String BYTEAMP_APPID = "302368"; private static final String TAG = "ApmCrashReportProvider"; + private static final String MAP_SDK_VERSION = "MAP_SDK_VERSION"; @Override public void init(Context context) { @@ -53,6 +54,8 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider { }); crash.config().setChannel("eagle"); crash.config().setDeviceId(MoGoAiCloudClientConfig.getInstance().getSn());//可选,可以设置自定义did,不设置会使用内部默认的 + String mapSDKVersion = AppUtils.getCustomMapSDKVersion(context); + crash.addTags(MAP_SDK_VERSION,mapSDKVersion); // crash.setReportUrl("www.xxx.com"); // 私有化部署:私有化部署才配置上报地址 // crash.addTags("key", "value"); // 自定义筛选tag, 按需添加、可多次覆盖 }