From 04a0970d901aa616da319a35fa6e0a8a2f6d6b5a Mon Sep 17 00:00:00 2001 From: wangmingjun Date: Tue, 21 Jun 2022 14:09:00 +0800 Subject: [PATCH] [Taxi-d 280 Taxi-p 130] opt --- .../bean/TaxiPassengerStartReqBean.java | 23 +++ .../IOCHTaxiPassengerOrderStatusCallback.java | 2 + .../passenger/constant/TaxiPassengerConst.kt | 16 ++ .../passenger/model/TaxiPassengerModel.java | 121 ++++++++++-- .../model/TaxiPassengerModelLoopManager.java | 30 ++- .../network/TaxiPassengerServiceApi.java | 24 +++ .../network/TaxiPassengerServiceManager.java | 25 ++- .../presenter/BaseTaxiPassengerPresenter.java | 31 ++- .../ui/TaxiPassengerBaseFragment.java | 37 ++-- .../ui/TaxiPassengerStartAutopilotView.java | 92 ++++++++- .../utils/TaxiPassengerAnalyticsManager.java | 77 ++++++++ .../taxi_p_ic_autopilot_loading.png | Bin 0 -> 2380 bytes .../taxi_p_ic_autopilot_loading.png | Bin 0 -> 2380 bytes .../src/main/res/drawable/anmi_flow.xml | 65 +++++++ .../layout/taxi_p_start_autopilot_view.xml | 9 + .../src/main/res/values/strings.xml | 1 + .../TaxiCheckPhoneUpdateOrderReqBean.java | 17 -- ...espBean.java => TaxiDataBaseRespBean.java} | 2 +- .../bean/TaxiOrPassengerReadyReqBean.java | 23 +++ .../callback/ITaxiOrderStatusCallback.java | 3 + .../com/mogo/och/taxi/model/TaxiModel.java | 177 ++++++++++++------ .../och/taxi/network/TaxiServiceApiNew.java | 47 ++++- .../och/taxi/network/TaxiServiceManager.java | 53 +++++- .../och/taxi/presenter/TaxiPresenter.java | 18 +- .../mogo/och/taxi/ui/BaseTaxiTabFragment.java | 53 ++---- .../ui/TaxiBeingServerdOrdersFragment.java | 27 ++- .../com/mogo/och/taxi/ui/TaxiFragment.java | 16 +- .../src/main/res/layout/taxi_panel.xml | 10 +- .../src/main/res/values/strings.xml | 1 + 29 files changed, 806 insertions(+), 194 deletions(-) create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_ic_autopilot_loading.png create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_ic_autopilot_loading.png create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml delete mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java rename OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/{TaxiCheckPhoneBaseRespBean.java => TaxiDataBaseRespBean.java} (75%) create mode 100644 OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java new file mode 100644 index 0000000000..741c9c2b69 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java @@ -0,0 +1,23 @@ +package com.mogo.och.taxi.passenger.bean; + +/** + * Created by pangfan on 2021/8/19 + * 司机端准备好或者乘客已验证上车请求参数 + */ +public class TaxiPassengerStartReqBean { + + public String orderNo; + public String sn; + public TaxiPassengerStartReqBean.Result loc; + + public static class Result { + public Double lat; + public Double lon; + } + + public TaxiPassengerStartReqBean(String sn, String orderNo, TaxiPassengerStartReqBean.Result point) { + this.sn = sn; + this.orderNo = orderNo; + this.loc = point; + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java index 4f82627a0c..9d147d1ca4 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java @@ -22,4 +22,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback { //当前路名字 void onCurrentRoadName(String currentRoadName); + // 司机已确认开启自动驾驶环境 + void onDriverHasCheckedPilotCondition(boolean isBoarded); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt index a17c9add6c..d3270cb212 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt @@ -42,5 +42,21 @@ class TaxiPassengerConst { //实时查询订单剩余时间 和 剩余里程 轮询间隔2s const val LOOP_CALCULATEROUTE_2S = 2 * 1000L + + // 开始服务启动自动驾驶等待时间(埋点上传) + const val LOOP_PERIOD_15S = 15 * 1000L + + // 埋点key:接管后点击'自动驾驶'按钮启动 + const val EVENT_KEY_RESTART_AUTOPILOT = "event_key_och_taxi_restart_autopilot" + // 埋点key:开始服务开启自动驾驶(成功/失败) + const val EVENT_KEY_START_SERVICE = "event_key_och_taxi_start_service" + const val EVENT_PARAM_SN = "sn" + const val EVENT_PARAM_TIME = "time" + const val EVENT_PARAM_START_NAME = "start_name" + const val EVENT_PARAM_END_NAME = "end_name" + const val EVENT_PARAM_ORDER_NUMBER = "order_num" + const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 + const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index 07f7366656..994cb543c1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -14,12 +14,13 @@ import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.v2x.LimitingVelocityListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager; @@ -32,11 +33,13 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; +import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback; @@ -50,6 +53,7 @@ import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceCallback; import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager; import com.mogo.aicloud.services.socket.IMogoLifecycleListener; +import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -69,7 +73,6 @@ import io.reactivex.plugins.RxJavaPlugins; import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; /** @@ -157,31 +160,31 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void accept(Throwable e) { if (e instanceof UndeliverableException) { e = e.getCause(); - CallerLogger.INSTANCE.d(M_TAXI + TAG, "UndeliverableException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "UndeliverableException"); } if ((e instanceof IOException)) {// // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.INSTANCE.d(M_TAXI + TAG, "IOException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IOException"); return; } if (e instanceof InterruptedException) { // fine, some blocking code was interrupted by a dispose call - CallerLogger.INSTANCE.d(M_TAXI + TAG, "InterruptedException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "InterruptedException"); return; } if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { // that's likely a bug in the application - CallerLogger.INSTANCE.d(M_TAXI + TAG, "NullPointerException or IllegalArgumentException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException"); Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } if (e instanceof IllegalStateException) { // that's a bug in RxJava or in a custom operator - CallerLogger.INSTANCE.d(M_TAXI + TAG, "IllegalStateException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IllegalStateException"); Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"Undeliverable exception"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"Undeliverable exception"); } }); @@ -504,11 +507,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); if (mCurrentOCHOrder != null - && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtStart + && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.UserArriveAtStart && state != mPrevAPStatus) { // 当高频返回autopilot 2时,不重复调用订单状态变更 mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态 -// updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation); + startServicePilotDone(); } } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { mPrevAPStatus = state; @@ -596,9 +599,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback */ public void startOrStopRouteAndWipe(boolean isStart){ if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startOrStopRouteAndWipe(); + TaxiPassengerModelLoopManager.getInstance().startRouteAndWipe(); }else { - TaxiPassengerModelLoopManager.getInstance().stopOrStopRouteAndWipe(); + TaxiPassengerModelLoopManager.getInstance().stopRouteAndWipe(); } } @@ -781,6 +784,100 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback }); } + public void loopQueryPilotStatus(){ + if (mCurrentOCHOrder == null) return; + TaxiPassengerServiceManager.getInstance().queryPilotStatus(mContext, mCurrentOCHOrder.orderNo, + new TaxiPassengerServiceCallback() { + @Override + public void onSuccess(TaxiPassengerBaseRespBean data) { + updateAutopilotStatus(data.code == 0); + startOrStopReadyToAutopilotoop(false); + } + + @Override + public void onFail(int code, String msg) { + updateAutopilotStatus(false); + } + }); + } + + public void updateAutopilotStatus(boolean isBoarded){ + if (mOrderStatusCallbackMap.size() > 0) { + for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ + callback.onDriverHasCheckedPilotCondition(isBoarded); + } + } + } + + public void startDriverReadyToAutopilotLoop(){ + if (NetworkUtils.isConnected(mContext)) { + startOrStopReadyToAutopilotoop(true); + } + } + + public void startOrStopReadyToAutopilotoop(boolean isStart) { + if (isStart){ + TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot(); + }else { + TaxiPassengerModelLoopManager.getInstance().stopReadyToAutopilot(); + } + } + + public void startServicePilotDone(){ + if (mCurrentOCHOrder == null) return; + TaxiPassengerStartReqBean.Result result = new TaxiPassengerStartReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiPassengerServiceManager.getInstance().startServicePilotDone(mContext, + mCurrentOCHOrder.orderNo, result, + new TaxiPassengerServiceCallback(){ + + @Override + public void onSuccess(TaxiPassengerBaseRespBean data) { + + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + + public void startAutopilot() { + if (!checkCurrentOCHOrder()) { + CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "no order or order is empty."); + ToastUtils.showShort("当前订单不存在或异常!"); + return; + } + + if (mCurrentOCHOrder.orderStatus != TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode()) { + ToastUtils.showShort("当前订单状态异常!"); + return; + } + + double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0); + double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1); + double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0); + double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1); + + AutopilotControlParameters parameters = new AutopilotControlParameters(); + parameters.vehicleType = mCurrentOCHOrder.businessType; + parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) + parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) + parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon); + parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon); + CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "start autopilot with parameter: %s" + , GsonUtil.jsonFromObject(parameters) + + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); + + TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, false, + mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); + } + + private void runOnUIThread(Runnable executor) { if (executor == null) { return; diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java index da3b5e5f48..30be0829b1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java @@ -32,12 +32,34 @@ public class TaxiPassengerModelLoopManager { private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询 private Disposable mQueryOrderRemainingDisposable; //心跳轮询 private Disposable mRouteWipeDisposable; //轨迹擦除 + private Disposable mReadyToAutopilotDisposable; //轨迹擦除 - public void startOrStopRouteAndWipe() { + public void startReadyToAutopilot() { + if (mReadyToAutopilotDisposable != null && !mReadyToAutopilotDisposable.isDisposed()) { + return; + } + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startReadyToAutopilot()"); + mReadyToAutopilotDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, + TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) + .map((aLong -> aLong + 1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> TaxiPassengerModel.getInstance().loopQueryPilotStatus()); + } + + public void stopReadyToAutopilot() { + if (mReadyToAutopilotDisposable != null) { + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopReadyToAutopilot()"); + mReadyToAutopilotDisposable.dispose(); + mReadyToAutopilotDisposable = null; + } + } + + public void startRouteAndWipe() { if (mRouteWipeDisposable != null && !mRouteWipeDisposable.isDisposed()) { return; } - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startOrStopRouteWipe()"); + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startRouteAndWipe()"); mRouteWipeDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) .map((aLong -> aLong + 1)) @@ -46,9 +68,9 @@ public class TaxiPassengerModelLoopManager { .subscribe(aLong -> TaxiPassengerModel.getInstance().loopRouteAndWipe()); } - public void stopOrStopRouteAndWipe() { + public void stopRouteAndWipe() { if (mRouteWipeDisposable != null) { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopOrStopRouteWipe()"); + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()"); mRouteWipeDisposable.dispose(); mRouteWipeDisposable = null; } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java index a8e84f6b69..6dbbb3046d 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java @@ -7,6 +7,7 @@ import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; import io.reactivex.Observable; import retrofit2.http.Body; @@ -85,4 +86,27 @@ interface TaxiPassengerServiceApi { @POST( "/autopilot-car-hailing/evaluation/vehicle/taxi/passenger/add" ) Observable arrivedAndScore(@Header ("appId") String appId, @Header("ticket") String ticket, @Body TaxiPassengerScoreUpdateOrderReqBean data); + /** + * 查询司机是否已确认可开启自动驾驶 + * @param appId + * @param ticket + * @param orderNo + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" ) + Observable queryPilotStatus(@Header ("appId") String appId + , @Header("ticket") String ticket,@Query("orderNo") String orderNo); + + /** + * 乘客屏启动自动驾驶成功 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/startServicePilot" ) + Observable startServicePilotDone(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiPassengerStartReqBean data); } 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 d5349b69ed..f0bb1e881d 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 @@ -20,6 +20,7 @@ import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; import com.mogo.commons.debug.DebugConfig; @@ -167,6 +168,28 @@ public class TaxiPassengerServiceManager { ,new TaxiPassengerScoreUpdateOrderReqBean(orderNo,star)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); + .subscribe(getSubscribeImpl(context, callback, "arrivedAndScore")); + } + + public void queryPilotStatus(Context context, String orderNo + ,TaxiPassengerServiceCallback callback){ + mOCHTaxiServiceApi.queryPilotStatus( + MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryPilotStatus")); + } + + public void startServicePilotDone(Context context,String orderNo,TaxiPassengerStartReqBean.Result loc + ,TaxiPassengerServiceCallback callback){ + mOCHTaxiServiceApi.startServicePilotDone(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiPassengerStartReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"startServicePilotDone")); } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 44d635ab52..1a8a22c2e2 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -141,19 +141,25 @@ public class BaseTaxiPassengerPresenter extends Presenter{ + //开启轮询司机是否已准备好开启自动驾驶的环境 + TaxiPassengerModel.getInstance().startDriverReadyToAutopilotLoop(); + mView.showOrHideStartAutopilotView(true,false); + }); } if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){ -// mView.showOrHideStartAutopilotView(false); + runOnUIThread(() ->{ + mView.showOrHideStartAutopilotView(false,false); + }); + TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotoop(false); } // 30 用户到达上车点 并通过了手机号后四位验证 // 40 服务中 @@ -221,4 +235,11 @@ public class BaseTaxiPassengerPresenter extends Presenter mView.showArrivedEndLayout2Thank(aBoolean)); } + /** + * 开启自动驾驶 + */ + public void startAutopilot(){ + TaxiPassengerModel.getInstance().startAutopilot(); + } + } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index 08214a7499..db9837d8eb 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -1,8 +1,10 @@ package com.mogo.och.taxi.passenger.ui; +import android.animation.ObjectAnimator; import android.os.Handler; import android.os.Looper; import android.view.View; +import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; @@ -172,29 +174,21 @@ public class TaxiPassengerBaseFragment extends MvpFragment { -// if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) { -// // 1. 主动开启自动驾驶中,不为2(为0、1)则继续loading -// return; -// } -// if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status -// && mPrevAPStatus != status) { -// // 2. 主动开启自动驾驶中,为2则停止loading,并isStarting = false -// startAutopilotDone(true); -// return; -// } + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) { + // 1. 主动开启自动驾驶中,不为2(为0、1)则继续loading + return; + } + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status + && mPrevAPStatus != status) { + // 2. 主动开启自动驾驶中,为2则停止loading,并isStarting = false + if ( mStartAutopilotView != null && mStartAutopilotView.get() != null){ + mStartAutopilotView.get().startOrStopLoadingAnim(false); + } + } // 3. 其他过程直接更新 if (mPrevAPStatus != status){ autopilotStatusAnimchanged(status); } -// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == mPrevAPStatus) { -// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) { -// // 2->1 -//// AIAssist.getInstance(getContext()).speakTTSVoice("已进入人工驾驶模式"); -// } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == status) { -// // 2->0 -//// AIAssist.getInstance(getContext()).speakTTSVoice("自动驾驶已停止,请人工接管"); -// } -// } mPrevAPStatus = status; }); } @@ -276,8 +270,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment mStartAutopilotParams = new HashMap<>(); + + private Runnable startAutopilotRunnable = () -> { + // 15s内未开启,上报失败埋点 + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_RESULT, false); + AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); + }; + + /** + * 触发'开启自动驾驶'埋点流程 + * 开启自动驾驶,15s内成功则发送成功埋点,否则发送失败埋点 + * @param restart false(点击'开始服务'启动)/true(接管后点击'自动驾驶'按钮启动) + * @param send 是否直接发送埋点(15s内开启成功则直接发送成功埋点) + */ + public void triggerStartAutopilotEvent( + boolean restart, boolean send, String startName, String endName, String orderNo) { + mStartAutopilotKey = restart ? + TaxiPassengerConst.EVENT_KEY_RESTART_AUTOPILOT : TaxiPassengerConst.EVENT_KEY_START_SERVICE; + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String plateNum = AppConfigInfo.INSTANCE.getPlateNumber(); + String dateTime = DateTimeUtils.getTimeText( + System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss); + + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_SN, sn); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_ENV_ONLINE, + DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_TIME, dateTime); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_NAME, startName); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_END_NAME, endName); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_ORDER_NUMBER, orderNo); + + if (send) { + // 开启成功,上报埋点 + if (startAutopilotRunnable != null && + UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + UiThreadHandler.removeCallbacks(startAutopilotRunnable); + } + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_RESULT, true); + AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); + } else { + UiThreadHandler.postDelayed(startAutopilotRunnable, TaxiPassengerConst.LOOP_PERIOD_15S); + } + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_ic_autopilot_loading.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_ic_autopilot_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..a71cf9a4f94e5832ad5b13671249da4686d58ab4 GIT binary patch literal 2380 zcmV-S3A6TzP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91L7)Qw1ONa40RR91K>z>%0Q{GrLjV8>wn;=mRCodHntiO6a~Q{qG!&9U z-YVs!LNsa;;g7Tsf7r|zWAnC|e~>Lf5*PE_}CIw}=4oAw+#8m;ok&e&F8(xU}4s zl;vI4IM;Vm{tUbe-b9eC_=a0UMS%PSBAg8_1p5IKGbsyEtKEGXE3+udm}THu#Q0bp zjk1P_0Qpt|dH`GwOhWz-uo)=bcY=d~E`g(gvqR(JoLWM8+$YR=0x>?qciFlm0_2Y( zf_uRYV1KY0ya$%5Opu%K6~;UXZ~{0LOabSCBY{udWTQY?eQz`8VfOh2U$@mQ0z{^> z>+?Y5=Yi)4=1Y91jkR>?oCB@`QsK;MZjaV)rfZ4$0Erz|? zWx7Pv_6%{qs)kxt^Pa$_dimL01OY^XINri70FiXO6x413RK6Y#XX0yGRS}qc7&Aw* z@xq!b?EB8g*>VlA5ca-7sxDZJJK-{zdR40`0y8FqIaOyise?n&Z;1QBHsCCXmxst( z0JZC}ejTW4nIfRvaAvGxLoHS~BQE{qeiZ1$qY#mN>^mDydI`(4Oc5B_%0`**{h6yY zr*SFU>f1xi0uz_FASw%2fK00p0mUXTvguEP%xFU+ha_V2LCge~Oad^xXF1k&UXI)5!6&_n9_NpI5j<(Go%BjBnZgsG(>(9*vL-4Ig(N#S$6NybdD zAo7NOFSRD~+Fid;(HmI1q0~tfCW0~Gd+<2|eTXll5!-LXypiCBftdO(my0o!ar(L4 zZc&5-Sm*#+XMr34?@m+fU;6ZNGK&qjBz;A5-x1L9z?q=c(?k`&V>g%RkBkJO2$#|^Jz28wTdSEOP4 zh*)Q~`HR7hU0#RgOTym$y7#3PGeI9wJh@ywPxfNRrYjVu@C%`29hzb{%xgysJBpwV zku>4Bpvk-Mptwju%0Cmw&MNVni{cj-J@!*87r`W}c`sJDCj^gf#jJN3ADB-)dY4zH z3Q&k5=xdEhdT^|}tj&hRMG91Yjac-Q@F6BTU$D1y>Nr(aIm#4U{Ktt`~SqPim&(uhrmDrA{>rWP-UPid7xB5T4f$GR_* zv(i<1P=UkKlTCb5OGQ9Ay>aQ|giqdNErjdt?~x+FZy;PtE{9ZvM3%*PlNMPMb~)D1 zKvn%Om7ZoLZ;J}PT!eRMlS(G*)3-44?o(P#0zJk!G`-*aULJ6X2&9Rgu^#}D_vuFg zRJJhczlMcN9yhcV*#^Mz&+-6EL`XX4<3%u%jTsQd8Ns--lX-=9Nfu=Bt+*WYmlr)H z^vzCW%d^1sDA3hCBpZgnE%U2brZSL!IuXD^*jt2HAI?~PbtNi5P4xFxE2(~IFvC2vkfl0YXwzR1WjVHexJ_; z@#JIKg1BuO8=tSa%{JoD&wV`-zwRiOnj&a2i!8+H{@@cA;jFR+(f#3K#x%{?U!VWR z5c?;2g6L3$WRb`4UjdW1cLum_ev#Fx zpcO>&MIFXvyBx4$4#5kFS^aA%Pd+G;aF3T-~R$~+0{cizNR0SfO!yeMa9n zM}t#|i?jvE>f6SgbwFQ!H-W7X(YOj@AN@ZgrTi#x zB9QPRzY45mp8noYw{=Mb?@ExmBVPs-pb5*nY%%0xIgZ&wpI&YC#aK5|eX!9zNN=O^ z$|BF#lWIBSb-(GdHADnQffy%Io(go0Ds3Z43u0eQjMyH_5@7>a0r@TXhFL>Ja8yb9 zor>l literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_ic_autopilot_loading.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_ic_autopilot_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..a71cf9a4f94e5832ad5b13671249da4686d58ab4 GIT binary patch literal 2380 zcmV-S3A6TzP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91L7)Qw1ONa40RR91K>z>%0Q{GrLjV8>wn;=mRCodHntiO6a~Q{qG!&9U z-YVs!LNsa;;g7Tsf7r|zWAnC|e~>Lf5*PE_}CIw}=4oAw+#8m;ok&e&F8(xU}4s zl;vI4IM;Vm{tUbe-b9eC_=a0UMS%PSBAg8_1p5IKGbsyEtKEGXE3+udm}THu#Q0bp zjk1P_0Qpt|dH`GwOhWz-uo)=bcY=d~E`g(gvqR(JoLWM8+$YR=0x>?qciFlm0_2Y( zf_uRYV1KY0ya$%5Opu%K6~;UXZ~{0LOabSCBY{udWTQY?eQz`8VfOh2U$@mQ0z{^> z>+?Y5=Yi)4=1Y91jkR>?oCB@`QsK;MZjaV)rfZ4$0Erz|? zWx7Pv_6%{qs)kxt^Pa$_dimL01OY^XINri70FiXO6x413RK6Y#XX0yGRS}qc7&Aw* z@xq!b?EB8g*>VlA5ca-7sxDZJJK-{zdR40`0y8FqIaOyise?n&Z;1QBHsCCXmxst( z0JZC}ejTW4nIfRvaAvGxLoHS~BQE{qeiZ1$qY#mN>^mDydI`(4Oc5B_%0`**{h6yY zr*SFU>f1xi0uz_FASw%2fK00p0mUXTvguEP%xFU+ha_V2LCge~Oad^xXF1k&UXI)5!6&_n9_NpI5j<(Go%BjBnZgsG(>(9*vL-4Ig(N#S$6NybdD zAo7NOFSRD~+Fid;(HmI1q0~tfCW0~Gd+<2|eTXll5!-LXypiCBftdO(my0o!ar(L4 zZc&5-Sm*#+XMr34?@m+fU;6ZNGK&qjBz;A5-x1L9z?q=c(?k`&V>g%RkBkJO2$#|^Jz28wTdSEOP4 zh*)Q~`HR7hU0#RgOTym$y7#3PGeI9wJh@ywPxfNRrYjVu@C%`29hzb{%xgysJBpwV zku>4Bpvk-Mptwju%0Cmw&MNVni{cj-J@!*87r`W}c`sJDCj^gf#jJN3ADB-)dY4zH z3Q&k5=xdEhdT^|}tj&hRMG91Yjac-Q@F6BTU$D1y>Nr(aIm#4U{Ktt`~SqPim&(uhrmDrA{>rWP-UPid7xB5T4f$GR_* zv(i<1P=UkKlTCb5OGQ9Ay>aQ|giqdNErjdt?~x+FZy;PtE{9ZvM3%*PlNMPMb~)D1 zKvn%Om7ZoLZ;J}PT!eRMlS(G*)3-44?o(P#0zJk!G`-*aULJ6X2&9Rgu^#}D_vuFg zRJJhczlMcN9yhcV*#^Mz&+-6EL`XX4<3%u%jTsQd8Ns--lX-=9Nfu=Bt+*WYmlr)H z^vzCW%d^1sDA3hCBpZgnE%U2brZSL!IuXD^*jt2HAI?~PbtNi5P4xFxE2(~IFvC2vkfl0YXwzR1WjVHexJ_; z@#JIKg1BuO8=tSa%{JoD&wV`-zwRiOnj&a2i!8+H{@@cA;jFR+(f#3K#x%{?U!VWR z5c?;2g6L3$WRb`4UjdW1cLum_ev#Fx zpcO>&MIFXvyBx4$4#5kFS^aA%Pd+G;aF3T-~R$~+0{cizNR0SfO!yeMa9n zM}t#|i?jvE>f6SgbwFQ!H-W7X(YOj@AN@ZgrTi#x zB9QPRzY45mp8noYw{=Mb?@ExmBVPs-pb5*nY%%0xIgZ&wpI&YC#aK5|eX!9zNN=O^ z$|BF#lWIBSb-(GdHADnQffy%Io(go0Ds3Z43u0eQjMyH_5@7>a0r@TXhFL>Ja8yb9 zor>l literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml new file mode 100644 index 0000000000..611cde2035 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml index c24b844553..bbf51e38a4 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml @@ -33,6 +33,15 @@ android:textColor="@android:color/white" android:elevation="5dp" android:background="@drawable/taxi_p_start_autopilot_txt_btn_bg"/> + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml index b5043ad377..3e266b4394 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml @@ -33,4 +33,5 @@ 删除 点击开始 + 启动中 \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java deleted file mode 100644 index 91045acfc2..0000000000 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mogo.och.taxi.bean; - -/** - * Created by pangfan on 2021/8/19 - * - * 验证手机号后四位同时流转订单状态 - */ -public class TaxiCheckPhoneUpdateOrderReqBean { - - public String orderNo; - public String phone; - - public TaxiCheckPhoneUpdateOrderReqBean(String orderNo, String phone) { - this.orderNo = orderNo; - this.phone = phone; - } -} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneBaseRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java similarity index 75% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneBaseRespBean.java rename to OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java index 4a4c0da7b1..8d6ca6d4df 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneBaseRespBean.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java @@ -7,6 +7,6 @@ import com.mogo.eagle.core.data.BaseData; * * 查询订单返回数据结构 */ -public class TaxiCheckPhoneBaseRespBean extends BaseData { +public class TaxiDataBaseRespBean extends BaseData { public Object data; } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java new file mode 100644 index 0000000000..5bb888fcc9 --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java @@ -0,0 +1,23 @@ +package com.mogo.och.taxi.bean; + +/** + * Created by pangfan on 2021/8/19 + * 司机端准备好或者乘客已验证上车请求参数 + */ +public class TaxiOrPassengerReadyReqBean { + + public String orderNo; + public String sn; + public TaxiOrPassengerReadyReqBean.Result loc; + + public static class Result { + public Double lat; + public Double lon; + } + + public TaxiOrPassengerReadyReqBean(String sn, String orderNo, TaxiOrPassengerReadyReqBean.Result point) { + this.sn = sn; + this.orderNo = orderNo; + this.loc = point; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java index b4dd23a2eb..f565aa23dd 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java @@ -45,4 +45,7 @@ public interface ITaxiOrderStatusCallback { // 未抢到预约单 void onGrabOrderFailed(OrderQueryRespBean.Result order); + + // 司机已确认开启自动驾驶环境 + void onDriverHasCheckedPilotCondition(boolean isBoarded); } 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 2047065e57..8e3cfef5cb 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 @@ -17,7 +17,6 @@ import com.amap.api.maps.model.LatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.cloud.commons.utils.CoordinateUtils; -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; @@ -31,7 +30,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen 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.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; @@ -50,7 +48,8 @@ import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean; 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.TaxiCheckPhoneBaseRespBean; +import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; +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; @@ -77,11 +76,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import io.reactivex.android.schedulers.AndroidSchedulers; 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; import mogo_msg.MogoReportMsg; @@ -183,12 +180,12 @@ public class TaxiModel { Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"Undeliverable exception"); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception"); } }); if (NetworkUtils.isConnected(mContext)) { -// startOrStopOrderLoop(mOCHCarStatus == 1); + queryAutopilotStatus(); queryCarStatus(); } } @@ -267,13 +264,13 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + mOCHCarStatus); startOrStopOrderLoop(mOCHCarStatus == 1); String role = ""; - if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose){ + if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { role = TaxiConst.DEMO_USER; - }else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose){ + } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { role = TaxiConst.TEST_USER; } if (mCarStatusCallback != null) { - mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1 , role); + mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1, role); } } @@ -283,7 +280,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } // queryCarStatus(); @@ -318,7 +315,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -496,7 +493,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -525,7 +522,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -579,7 +576,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -602,10 +599,10 @@ public class TaxiModel { @Override public void onSuccess(OrdersNewBookingQueryRespBean data) { if (data != null && data.code == 0 - && data.data != null && data.data.orders !=null + && data.data != null && data.data.orders != null && data.data.orders.size() > 0) { // 本地无新到单,且本次新到单id与上次收到的新单id不同时:显示本次新到单 - if (mNewBookingOrder == null ) { + if (mNewBookingOrder == null) { for (String orderNo : data.data.orders) { if (!mPrevOrderNo.equals(orderNo)) { queryNewBookingContent(orderNo); @@ -673,7 +670,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -767,7 +764,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -779,6 +776,53 @@ public class TaxiModel { }); } + /** + * 司机端确认可开始自动驾驶 + */ + public void confirmAutopilotConditionByDriver() { + if (mCurrentOCHOrder == null) return; + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().confirmAutopilotConditionByDriver(mContext, + mCurrentOCHOrder.orderNo, + result, + new TaxiServiceCallback(){ + + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + updateAutopilotStatus(data.code == 0); + } + + @Override + public void onFail(int code, String msg) { + updateAutopilotStatus(false); + } + }); + } + + public void updateAutopilotStatus(boolean isBoarded){ + if (mOrderStatusCallback != null){ + mOrderStatusCallback.onDriverHasCheckedPilotCondition(isBoarded); + } + } + + public void queryAutopilotStatus(){ + if (mCurrentOCHOrder == null) return; + TaxiServiceManager.getInstance().queryAutopilotStatus(mContext, mCurrentOCHOrder.orderNo, + new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + updateAutopilotStatus(data.code == 0); + } + + @Override + public void onFail(int code, String msg) { + updateAutopilotStatus(false); + } + }); + } + // 取消当前新到预约单 public void cancelNewBookingOrder() { mNewBookingOrder = null; @@ -837,6 +881,7 @@ public class TaxiModel { /** * 以当前订单为基础,开启自动驾驶 + * * @param isRestart 开启自动驾驶 */ @ChainLog( @@ -914,9 +959,6 @@ public class TaxiModel { } CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeStartStation() distance = " + distance); -// if (mOrderStatusCallback != null && distance >= 0) { -// mOrderStatusCallback.onCurrentOrderDistToStartChanged((long) distance, 0); -// } if (distance > TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { distance = CoordinateUtils.calculateLineDistance(startLon, startLat, @@ -998,9 +1040,6 @@ public class TaxiModel { if (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToStart) { judgeStartStation(location); } -// else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) { -// calculateTravelDistance(location); -// } } mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); @@ -1066,7 +1105,9 @@ public class TaxiModel { && state != mPrevAPStatus) { // 当高频返回autopilot 2时,不重复调用订单状态变更 mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态 - updateOCHOrderStatus(TaxiOrderStatusEnum.OnTheWayToEnd); + +// updateOCHOrderStatus(TaxiOrderStatusEnum.OnTheWayToEnd); + startServicePilotDone(); TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, true, mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); @@ -1138,7 +1179,7 @@ public class TaxiModel { @Override public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { - if (null != routeList && routeList.getWayPointsList().size() > 0){ + if (null != routeList && routeList.getWayPointsList().size() > 0) { updateOrderRoute(routeList.getWayPointsList()); updateOrderRouteInfo(routeList.getWayPointsList()); } @@ -1148,11 +1189,12 @@ public class TaxiModel { /** * 上报订单全路径规划数据 + * * @param models */ public void updateOrderRoute(List models) { if (null == mCurrentOCHOrder) return; - List points = coordinateConverterWgsToGcjList(mContext,models); + List points = coordinateConverterWgsToGcjList(mContext, models); TaxiServiceManager.getInstance().updateOrderRoute(mContext, mCurrentOCHOrder.orderNo , points, new TaxiServiceCallback() { @Override @@ -1186,6 +1228,7 @@ public class TaxiModel { /** * 计算全路径长度,以及实时更新剩余距离,剩余时间,预计时间 + * * @param models */ public void updateOrderRouteInfo(List models) { @@ -1194,14 +1237,14 @@ public class TaxiModel { Logger.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); //转换成高德坐标系 - mRoutePoints = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,models); + mRoutePoints = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext, models); startDynamicCalculateRouteInfo(); } - public void startDynamicCalculateRouteInfo(){ - Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- "+mCurrentOCHOrder); + public void startDynamicCalculateRouteInfo() { + Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder); - if (mCurrentOCHOrder != null && mRoutePoints.size() == 0){//根据orderNo去查询 + if (mCurrentOCHOrder != null && mRoutePoints.size() == 0) {//根据orderNo去查询 queryOrderRouteList(mCurrentOCHOrder.orderNo); } @@ -1212,30 +1255,30 @@ public class TaxiModel { /** * 实时计算当前剩余里程和时间 */ - public void dynamicCalculateRouteInfo(){ + public void dynamicCalculateRouteInfo() { List lastPoints = CoordinateCalculateRouteUtil - .getRemainPointListByCompare(mRoutePoints,mLongitude,mLatitude); + .getRemainPointListByCompare(mRoutePoints, mLongitude, mLatitude); float lastSumLength = 0; - if (lastPoints.size() == 1){ //只是最后一个点,计算当前位置和最后一个点的距离 + if (lastPoints.size() == 1) { //只是最后一个点,计算当前位置和最后一个点的距离 lastSumLength = CoordinateUtils.calculateLineDistance( lastPoints.get(0).longitude, lastPoints.get(0).latitude, mLongitude, mLatitude); - }else { + } else { lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); } - double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6 ; //秒 + double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 Logger.d(M_TAXI + "dynamicCalculateRouteInfo" - , "---lastSumLength: "+lastSumLength+"----lastTime : "+lastTime); + , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime); mCurrentOCHOrder.decreaseTravelDistance(lastSumLength); if (mOrderStatusCallback != null) { mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime); } - reportOrderRemain((long)lastSumLength,(long)lastTime); + reportOrderRemain((long) lastSumLength, (long) lastTime); } /** @@ -1268,6 +1311,7 @@ public class TaxiModel { /** * 开始轮询计算剩余里程和时间 + * * @param isStart */ public void startOrStopCalculateRouteInfo(boolean isStart) { @@ -1282,6 +1326,7 @@ public class TaxiModel { /** * 上报订单剩余里程和时间 单位:KM, M, 单位:分钟 + * * @param lastSumLength * @param duration */ @@ -1289,33 +1334,57 @@ public class TaxiModel { if (mCurrentOCHOrder == null) return; TaxiServiceManager.getInstance().reportOrderRemain(mContext, mCurrentOCHOrder.orderNo , lastSumLength, duration, new TaxiServiceCallback() { - @Override - public void onSuccess(BaseData data) { + @Override + public void onSuccess(BaseData data) { - } + } - @Override - public void onFail(int code, String msg) { + @Override + public void onFail(int code, String msg) { - } - }); + } + }); } /** - * 调试使用,没有乘客屏时可使用此按钮跳过乘客验证 + * 司机端可确认乘客已上车,调用后,后台将订单置为乘客已上车状态 */ public void jumpPassengerCheckDone() { if (mCurrentOCHOrder == null - || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.ArriveAtStart.getCode() - || mCurrentOCHOrder.passengerPhone == null || mCurrentOCHOrder.passengerPhone.length() < 5) { - ToastUtils.showShort("订单状态不匹配该操作或者手机号有误!"); + || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.ArriveAtStart.getCode()) { + ToastUtils.showShort("订单状态不匹配该操作或者订单为空!"); return; } - TaxiServiceManager.getInstance().checkPhoneAndUpdateOrderStatus(mContext - , mCurrentOCHOrder.orderNo, mCurrentOCHOrder.passengerPhone.substring(mCurrentOCHOrder.passengerPhone.length() -4) - , new TaxiServiceCallback() { + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().updatePassengerHasBoardedStatus(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { @Override - public void onSuccess(TaxiCheckPhoneBaseRespBean data) { + public void onSuccess(TaxiDataBaseRespBean data) { + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + + public void startServicePilotDone(){ + if (mCurrentOCHOrder == null) return; + + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().updatePassengerHasBoardedStatus(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { } 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 e57b349243..11c283ef95 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 @@ -19,8 +19,8 @@ import com.mogo.och.taxi.bean.OrdersListQueryReqBean; 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.TaxiCheckPhoneBaseRespBean; -import com.mogo.och.taxi.bean.TaxiCheckPhoneUpdateOrderReqBean; +import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; +import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import io.reactivex.Observable; @@ -227,13 +227,48 @@ interface TaxiServiceApiNew { , @Header("ticket") String ticket, @Query("orderNo") String orderNo); /** - * 提交用户输入的手机后4位、并进行状态扭转 用于调试跳过乘客屏使用 + * 司机端跳过乘客验证,订单状态流转为乘客已上车 * @param data * @return */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/order/v2/vehicle/taxi/passenger/verification/phone" ) - Observable checkPhoneAndUpdateOrderStatus(@Header ("appId") String appId - , @Header("ticket") String ticket, @Body TaxiCheckPhoneUpdateOrderReqBean data); + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/passenger" ) + Observable updatePassengerHasBoardedStatus(@Header ("appId") String appId + , @Header("ticket") String ticket, @Body TaxiOrPassengerReadyReqBean 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/ready/pilot" ) + Observable confirmAutopilotConditionByDriver(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); + + /** + * 查询司机是否已确认可开启自动驾驶 + * @param appId + * @param ticket + * @param orderNo + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" ) + Observable queryPilotStatus(@Header ("appId") String appId + , @Header("ticket") String ticket,@Query("orderNo") String orderNo); + + /** + * 开启自动驾驶成功 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startServicePilot" ) + Observable startServicePilotDone(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); } 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 2634838a10..723860bef6 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 @@ -29,8 +29,8 @@ import com.mogo.och.taxi.bean.OrdersListQueryReqBean; 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.TaxiCheckPhoneBaseRespBean; -import com.mogo.och.taxi.bean.TaxiCheckPhoneUpdateOrderReqBean; +import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; +import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import com.mogo.och.taxi.constant.TaxiConst; @@ -347,16 +347,53 @@ public class TaxiServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryOrderRoute")); } - public void checkPhoneAndUpdateOrderStatus(Context context, String orderNo,String phone - ,TaxiServiceCallback callback){ - - mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus( + public void confirmAutopilotConditionByDriver(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.confirmAutopilotConditionByDriver( MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new TaxiCheckPhoneUpdateOrderReqBean(orderNo,phone)) + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); + .subscribe(getSubscribeImpl(context,callback,"confirmAutopilotConditionByDriver")); + } + + public void queryAutopilotStatus(Context context, String orderNo, + TaxiServiceCallback callback){ + mOCHTaxiServiceApi.queryPilotStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"queryAutopilotStatus")); + } + + public void updatePassengerHasBoardedStatus(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + + mOCHTaxiServiceApi.updatePassengerHasBoardedStatus( + MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "updatePassengerHasBoardedStatus")); + } + + public void startServicePilotDone(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.startServicePilotDone(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "startServicePilotDone")); } private SubscribeImpl getSubscribeImpl( 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 7050ba9d19..f17f34d912 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 @@ -65,7 +65,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().setCarStatusCallback(this); TaxiModel.getInstance().setControllerStatusCallback(this); TaxiModel.getInstance().setOrderStatusCallback(this); -// TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this); } private void releaseListeners() { @@ -73,7 +72,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().setCarStatusCallback(null); TaxiModel.getInstance().setControllerStatusCallback(null); TaxiModel.getInstance().setOrderStatusCallback(null); -// TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null); } private void runOnUIThread( Runnable executor ) { @@ -102,6 +100,13 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().jumpPassengerCheckDone(); } + /** + * 司机确认车辆环境可开启自动驾驶 + */ + public void confirmAutopilotConditionByDriver() { + TaxiModel.getInstance().confirmAutopilotConditionByDriver(); + } + // 更新出车/收车状态 public void updateCarStatus() { TaxiModel.getInstance().updateCarStatus(); @@ -260,6 +265,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS runOnUIThread(() -> mView.onGrabOrderFailed(order)); } + @Override + public void onDriverHasCheckedPilotCondition(boolean isBoarded) { + runOnUIThread(() -> mView.onPassengerBoardedStatus(isBoarded)); + } + @Override public void onVRModeChanged(boolean isVRMode) { runOnUIThread(() -> mView.switchVRFlatMode(isVRMode)); @@ -274,8 +284,4 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS }); } } -// @Override -// public void routeResult(List models) { -// if (models != null && models.size() > 0) mView.routeResult(models); -// } } 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 e574dcf909..637f3c4df0 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 @@ -92,6 +92,7 @@ public abstract class BaseTaxiTabFragment { // onShow() -// return mBadcaseBtn; }, -// () -> { // onHide() -// return null; }); - if (mBadcaseBtn != null) { CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn, null, null); if (!HmiBuildConfig.isShowBadCaseView) { CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this); } } + //设置升级小红点提示 默认隐藏 mUpgradeTipIv = findViewById(R.id.module_och_taxi_upgrade_red_tip); CallerHmiManager.INSTANCE.registerUpgradeTipsCallback(() -> mUpgradeTipIv); @@ -176,14 +172,14 @@ public abstract class BaseTaxiTabFragment { -// ctvAutopilotStatus.setVisibility(View.GONE); -// slidePanelView.setVisibility(View.GONE); - }); - } - - /** - * 展示【自动驾驶】按钮 - */ - public void showAutopilotBiz() { - getActivity().runOnUiThread(() -> { - ctvAutopilotStatus.setVisibility(View.VISIBLE); - }); - } - public void hidPanel() { getActivity().runOnUiThread(() -> { flStationPanelContainer.setVisibility(View.GONE); @@ -484,16 +465,6 @@ public abstract class BaseTaxiTabFragment里程 " + "" + dis + "" + " "+disUnit+"" - + ",剩余 " + "" + (int)Math.ceil((double)timeInSecond/ 60f) + "" + " 分钟"; + + ",剩余 " + "" + min + "" + " 分钟"; if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) { //前往上车点 @@ -343,6 +345,12 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement speekVoice200mTipsOnce(); } mDistanceAndTime2.setText(Html.fromHtml(strHtml2)); + if (isFirstStartAutopilotDone){ + showNotice(String.format(getResources() + .getString(R.string.module_och_taxi_order_server_start_auto_tip), + dis,min)); + isFirstStartAutopilotDone = false; + } } } @@ -381,16 +389,13 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement private void startOrEndService() { if (mCurrentOrder == null) return; - if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == mCurrentOrder.orderStatus) {//点击了完成服务,结束订单并更新订单信息 + if (TaxiOrderStatusEnum.ArriveAtStart.getCode() == mCurrentOrder.orderStatus){ //到达乘客上车点,司机可跳过乘客屏认证 + mTaxiFragment.jumpPassengerCheckDone(); + }else if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == mCurrentOrder.orderStatus) {//点击此按钮,说明车辆已准备好开始自动驾驶 + mTaxiFragment.confirmAutopilotConditionByDriver(); + }else if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == mCurrentOrder.orderStatus) {//点击了完成服务,结束订单并更新订单信息 mTaxiFragment.completeOrderService(TaxiOrderStatusEnum.JourneyCompleted); showNotice(getResources().getString(R.string.module_och_taxi_order_server_completed_tip)); - return; - } else if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == mCurrentOrder.orderStatus) {//点击服务,开启自动驾驶 - mTaxiFragment.startAutoPilot(); - showNotice(getResources().getString(R.string.module_och_taxi_order_server_start_auto_tip)); - return; - }else if (TaxiOrderStatusEnum.ArriveAtStart.getCode() == mCurrentOrder.orderStatus){ //到达乘客上车点,司机可跳过乘客屏认证 - mTaxiFragment.jumpPassengerCheckDone(); } } @@ -412,6 +417,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_new_order)); mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng); showOrHideNavi(true); setOrRemoveMapMaker(true, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker); @@ -420,6 +426,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement case Cancel: mCurrentOrder = null; mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel)); showOrHideNavi(false); @@ -430,6 +437,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement case ArriveAtStart: case UserArriveAtStart: mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.VISIBLE); if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == ochStatus.getCode()){ showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text_check_success)); @@ -458,6 +466,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement case JourneyCompleted: mCurrentOrder = null; mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.GONE); showNotice("感谢您使用蘑菇智行,再见~"); showOrHideNavi(false); 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 29f01e6f71..3576d7bd96 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 @@ -59,8 +59,10 @@ public class TaxiFragment extends BaseTaxiTabFragment { TaxiModel.getInstance().setArriveAtEndStation(); }); + findViewById(R.id.test_bar_on_the_way_to_end1).setOnClickListener(v -> { + TaxiModel.getInstance().confirmAutopilotConditionByDriver(); + }); findViewById(R.id.test_bar_on_the_way_to_end).setOnClickListener(v -> { - showNotice("自动驾驶已启动,请系好安全带"); +// showNotice("自动驾驶已启动,请系好安全带"); if (!isStarting){ mPresenter.startAutoPilot(false); startOrStopLoadingAnim(true); @@ -382,5 +391,4 @@ public class TaxiFragment extends BaseTaxiTabFragment +