[Taxi-d 280 Taxi-p 130] opt

This commit is contained in:
wangmingjun
2022-06-21 14:09:00 +08:00
parent 6ffd5155da
commit 04a0970d90
29 changed files with 806 additions and 194 deletions

View File

@@ -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;
}
}

View File

@@ -22,4 +22,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback {
//当前路名字
void onCurrentRoadName(String currentRoadName);
// 司机已确认开启自动驾驶环境
void onDriverHasCheckedPilotCondition(boolean isBoarded);
}

View File

@@ -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
}
}

View File

@@ -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<TaxiPassengerBaseRespBean>() {
@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<TaxiPassengerBaseRespBean>(){
@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;

View File

@@ -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;
}

View File

@@ -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<TaxiPassengerBaseRespBean> 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<TaxiPassengerBaseRespBean> 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<TaxiPassengerBaseRespBean> startServicePilotDone(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiPassengerStartReqBean data);
}

View File

@@ -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<TaxiPassengerBaseRespBean> 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<TaxiPassengerBaseRespBean> 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"));
}
}

View File

@@ -141,19 +141,25 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
}
@Override
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
mView.showOrHideStartAutopilotView(true,true);
}
private void updateOrderView(TaxiPassengerOrderQueryRespBean.Result order) {
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"updateOrderView = "+order.orderStatus);
// 70 取消订单
if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == order.orderStatus){
runOnUIThread(() -> {
mView.showOrHideServingOrderFragment(false);
// mView.showOrHideStartAutopilotView(false);
mView.showOrHideStartAutopilotView(false,false);
mView.showOrHidePressengerCheckPager(false, "",
"", "", "", "");
mView.showOrHideArrivedEndLayout(false,"","");
});
TaxiPassengerModel.getInstance().recoverNaviInfo();
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotoop(false);
return;
}
// 20 司机到达上车点
@@ -165,13 +171,21 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
return;
}
// TODO: 2022/6/10 若乘客端确认已经上车,则显示开始行程按钮 并且不可点击 暗
// TODO: 2022/6/10 若司机端已经确认,则显示开始行程按钮 并且可点击
//TODO: 2022/6/10 若订单取消或者隐藏则隐藏开始行程按钮
// TODO: 2022/6/10 乘客已上车 需要开启轮询司机确认可以开启自动驾驶的接口
// TODO: 2022/6/10 若司机端已经确认,则显示开始行程按钮 并且可点击,第二步的轮询停止
//TODO: 2022/6/10 若订单取消或者隐藏则关掉开始行程界面,轮询也要取消
if (TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus){
// mView.showOrHideStartAutopilotView(true);
runOnUIThread(() ->{
//开启轮询司机是否已准备好开启自动驾驶的环境
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<TaxiPassengerBaseFragm
TaxiPassengerModel.getInstance().arrivedAndScore(score,orderNo, aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean));
}
/**
* 开启自动驾驶
*/
public void startAutopilot(){
TaxiPassengerModel.getInstance().startAutopilot();
}
}

View File

@@ -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<TaxiPassengerBaseFrag
private int mPrevAPStatus = -1;
public void onAutopilotStatusChanged(int status) {
getActivity().runOnUiThread(() -> {
// 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<TaxiPassengerBaseFrag
}
}
/**
* 显示或者隐藏乘客可点击自动驾驶页面
* 乘客验证成功,页面显示,按钮置于不可点击
@@ -383,6 +375,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
@Override
public void onClickCallback() {
//todo 点击开始自动驾驶按钮
mPresenter.startAutopilot();
}
}

View File

@@ -1,14 +1,17 @@
package com.mogo.och.taxi.passenger.ui;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.common.module.wigets.OCHBorderShadowLayout;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.passenger.R;
import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
@@ -19,7 +22,12 @@ import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
public class TaxiPassengerStartAutopilotView extends RelativeLayout implements View.OnClickListener {
private TextView mStartAutopilotBtn;
private ImageView mAutopilotImage;
private ITPClickStartAutopilotCallback mClickCallback;
public boolean isStarting = false;
private ObjectAnimator autopilotLoadingAnimator;
private AnimationDrawable animationDrawable;
private static final long TIMER_START_AUTOPILOT_INTERVAL = 10 * 1000L;
public TaxiPassengerStartAutopilotView(Context context) {
super(context);
@@ -37,6 +45,7 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
private void initView(Context context) {
LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this, true);
mStartAutopilotBtn = findViewById(R.id.taxi_p_start_autopilot);
mAutopilotImage = findViewById(R.id.taxi_p_autopilot_iv);
mStartAutopilotBtn.setOnClickListener(this);
}
@@ -47,11 +56,88 @@ public class TaxiPassengerStartAutopilotView extends RelativeLayout implements V
@Override
public void onClick(View v) {
if (v.getId() == R.id.taxi_p_start_autopilot){
ToastUtils.showShort("等待接口。。。。");
//开启动画和自动驾驶
if (mClickCallback != null) mClickCallback.onClickCallback();
}
}
public void updateStartAutopilotBtnStatus(boolean isClickable){
if (mStartAutopilotBtn == null) return;
mStartAutopilotBtn.setClickable(isClickable);
mAutopilotImage.setVisibility(GONE);
mStartAutopilotBtn.setText(getResources().getString(R.string.taxi_p_start_autopilot_txt));
if (isClickable){ //可点击状态下UI
startAutopilotAnimatorDrawable(true);
}else {// 不可点击状态下 UI
startAutopilotAnimatorDrawable(false);
}
}
public void startAutopilotAnimatorDrawable(boolean isStart){
if (isStart){
if (animationDrawable == null) {
mStartAutopilotBtn.setBackground(getResources().getDrawable(R.drawable.anmi_flow));
animationDrawable = (AnimationDrawable) mStartAutopilotBtn.getBackground();
}
if (animationDrawable.isRunning()) {
return;
}
animationDrawable.selectDrawable(0);
animationDrawable.start();
}else {
if (animationDrawable != null) {
animationDrawable.selectDrawable(0);
animationDrawable.stop();
}
mStartAutopilotBtn.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
animationDrawable = null;
}
}
public void startOrStopLoadingAnim(boolean start) {
if (start) {
isStarting = true;
mStartAutopilotBtn.setText(getResources().getString(R.string.taxi_p_start_autopilot_loading));
mStartAutopilotBtn.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
mAutopilotImage.setImageResource(R.drawable.taxi_p_ic_autopilot_loading);
if (autopilotLoadingAnimator == null) {
autopilotLoadingAnimator = ObjectAnimator.ofFloat(mAutopilotImage,
"rotation", 0f, 360f);
}
autopilotLoadingAnimator.setInterpolator(new LinearInterpolator());
autopilotLoadingAnimator.setRepeatCount(-1);//无限循环
autopilotLoadingAnimator.setStartDelay(100);
autopilotLoadingAnimator.setDuration(1000);//设置持续时间
autopilotLoadingAnimator.start();//动画开始
startingAutopilotCountDown();
} else {
isStarting = false;
if (autopilotLoadingAnimator != null) {
autopilotLoadingAnimator.end();
mAutopilotImage.clearAnimation();
autopilotLoadingAnimator = null;
}
updateStartAutopilotBtnStatus(true);
}
}
public void onAutopilotStatusSuccess(){
startOrStopLoadingAnim(false);
}
public void onAutopilotStatusFailure(){
startOrStopLoadingAnim(false);
}
private void startingAutopilotCountDown() {
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() { //未启动成功10s后做处理
if (isStarting){ //判断动画是否在进行
startOrStopLoadingAnim(false);
}
}
},TIMER_START_AUTOPILOT_INTERVAL);
}
}

View File

@@ -0,0 +1,77 @@
package com.mogo.och.taxi.passenger.utils;
import android.text.TextUtils;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.eagle.core.data.app.AppConfigInfo;
import com.mogo.eagle.core.function.call.analytics.AnalyticsManager;
import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
import java.util.HashMap;
/**
* OCH Taxi埋点工具
*
* Created on 2022/3/24
*/
public class TaxiPassengerAnalyticsManager {
private static final class SingletonHolder {
private static final TaxiPassengerAnalyticsManager INSTANCE = new TaxiPassengerAnalyticsManager();
}
public static TaxiPassengerAnalyticsManager getInstance() {
return TaxiPassengerAnalyticsManager.SingletonHolder.INSTANCE;
}
private String mStartAutopilotKey;
private HashMap<String, Object> 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);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/anim_flow_00000" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00001" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00002" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00003" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00004" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00005" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00006" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00007" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00008" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00009" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00010" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00011" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00012" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00013" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00014" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00015" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00016" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00017" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00018" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00019" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00020" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00021" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00022" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00023" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00024" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00025" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00026" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00027" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00028" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00029" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00030" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00031" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00032" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00033" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00034" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00035" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00036" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00037" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00038" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00039" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00040" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00041" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00042" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00043" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00044" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00045" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00046" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00047" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00048" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00049" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00050" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00051" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00052" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00053" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00054" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00055" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00056" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00057" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00058" android:duration="100"></item>
<item android:drawable="@drawable/anim_flow_00059" android:duration="100"></item>
</animation-list>

View File

@@ -33,6 +33,15 @@
android:textColor="@android:color/white"
android:elevation="5dp"
android:background="@drawable/taxi_p_start_autopilot_txt_btn_bg"/>
<ImageView
android:id="@+id/taxi_p_autopilot_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dp_16"
android:layout_marginLeft="@dimen/dp_16"
android:src="@drawable/taxi_p_ic_autopilot_loading"
/>
</com.mogo.och.common.module.wigets.OCHBorderShadowLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -33,4 +33,5 @@
<string name="tv_delete">删除</string>
<string name="taxi_p_start_autopilot_txt">点击开始</string>
<string name="taxi_p_start_autopilot_loading">启动中</string>
</resources>

View File

@@ -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;
}
}

View File

@@ -7,6 +7,6 @@ import com.mogo.eagle.core.data.BaseData;
*
* 查询订单返回数据结构
*/
public class TaxiCheckPhoneBaseRespBean extends BaseData {
public class TaxiDataBaseRespBean extends BaseData {
public Object data;
}

View File

@@ -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;
}
}

View File

@@ -45,4 +45,7 @@ public interface ITaxiOrderStatusCallback {
// 未抢到预约单
void onGrabOrderFailed(OrderQueryRespBean.Result order);
// 司机已确认开启自动驾驶环境
void onDriverHasCheckedPilotCondition(boolean isBoarded);
}

View File

@@ -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<TaxiDataBaseRespBean>(){
@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<TaxiDataBaseRespBean>() {
@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<MessagePad.Location> models) {
if (null == mCurrentOCHOrder) return;
List<OrderRouteUpdateReqBean.Result> points = coordinateConverterWgsToGcjList(mContext,models);
List<OrderRouteUpdateReqBean.Result> points = coordinateConverterWgsToGcjList(mContext, models);
TaxiServiceManager.getInstance().updateOrderRoute(mContext, mCurrentOCHOrder.orderNo
, points, new TaxiServiceCallback<BaseData>() {
@Override
@@ -1186,6 +1228,7 @@ public class TaxiModel {
/**
* 计算全路径长度,以及实时更新剩余距离,剩余时间,预计时间
*
* @param models
*/
public void updateOrderRouteInfo(List<MessagePad.Location> 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<LatLng> 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<BaseData>() {
@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<TaxiCheckPhoneBaseRespBean>() {
TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result();
result.lat = mLatitude;
result.lon = mLongitude;
TaxiServiceManager.getInstance().updatePassengerHasBoardedStatus(mContext
, mCurrentOCHOrder.orderNo
, result
, new TaxiServiceCallback<TaxiDataBaseRespBean>() {
@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<TaxiDataBaseRespBean>() {
@Override
public void onSuccess(TaxiDataBaseRespBean data) {
}

View File

@@ -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<TaxiCheckPhoneBaseRespBean> checkPhoneAndUpdateOrderStatus(@Header ("appId") String appId
, @Header("ticket") String ticket, @Body TaxiCheckPhoneUpdateOrderReqBean data);
@POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/passenger" )
Observable<TaxiDataBaseRespBean> 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<TaxiDataBaseRespBean> 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<TaxiDataBaseRespBean> 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<TaxiDataBaseRespBean> startServicePilotDone(@Header ("appId") String appId
, @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data);
}

View File

@@ -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<TaxiCheckPhoneBaseRespBean> callback){
mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus(
public void confirmAutopilotConditionByDriver(Context context, String orderNo
, TaxiOrPassengerReadyReqBean.Result loc
, TaxiServiceCallback<TaxiDataBaseRespBean> 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<TaxiDataBaseRespBean> 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<TaxiDataBaseRespBean> 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<TaxiDataBaseRespBean> 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 <T extends BaseData> SubscribeImpl getSubscribeImpl(

View File

@@ -65,7 +65,6 @@ public class TaxiPresenter extends Presenter<TaxiFragment> 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<TaxiFragment> 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<TaxiFragment> 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<TaxiFragment> 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<TaxiFragment> implements ITaxiADASS
});
}
}
// @Override
// public void routeResult(List<AutopilotRouteInfo.RouteModels> models) {
// if (models != null && models.size() > 0) mView.routeResult(models);
// }
}

View File

@@ -92,6 +92,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
groupTestPanel = findViewById(R.id.groupTestPanel);
ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
ctvAutopilotStatus.setTag(false);
mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
mAutopilotTv = findViewById(R.id.module_och_autopilot_tv);
flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
@@ -155,18 +156,13 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
// mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
mBadcaseBtn = findViewById(R.id.module_och_taxi_badcase_iv);
// CallerHmiManager.INSTANCE.registerBadCaseCallback(
// () -> { // 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<V extends IView, P extends Presenter<V
@Override
public void onClickImpl(View v) {
// 如果能自动驾驶,就自动驾驶,不能就提示
if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() !=
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
restartAutopilot();
}else {
if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() ==
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
ToastUtils.showShort(getResources().getString(R.string.module_och_taxi_auto_disable_tip));
}else if (!(boolean)ctvAutopilotStatus.getTag()){
ToastUtils.showShort(getResources().getString(R.string.module_och_taxi_auto_disable_tip1));
}else {
restartAutopilot();
}
// TODO: 2021/11/27 通过开启结果更新ui
// onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
}
});
@@ -301,6 +297,10 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
});
}
public void onPassengerBoardedStatus(boolean isBoarded){
ctvAutopilotStatus.setTag(isBoarded);
}
private AnimationDrawable animationDrawable;
public void AutopilotStatusAnimchanged(int status) {
@@ -418,25 +418,6 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
},TIMER_START_AUTOPILOT_INTERVAL);
}
/**
* 隐藏【自动驾驶】按钮
*/
public void hideAutopilotBiz() {
getActivity().runOnUiThread(() -> {
// 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<V extends IView, P extends Presenter<V
public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
//todo ui 切换
}
// private void hideHMI() {
// // 控制 脉速表 显示状态
// CallerHmiManager.INSTANCE.setSpeedChartViewVisibility(View.GONE);
// // 控制 自动驾驶按钮 显示状态
// CallerHmiManager.INSTANCE.setAutopilotStatusViewVisibility(View.GONE);
// // 控制 切换视角按钮 显示状态
// CallerHmiManager.INSTANCE.setPerspectiveSwitchViewVisibility(View.GONE);
// // 控制 车辆检检测按钮 示状态
// CallerHmiManager.INSTANCE.setCheckStatusViewVisibility(View.GONE);
// }
protected void showNaviToStartStationFragment(boolean isShow) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();

View File

@@ -60,6 +60,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement
private double mOrderStartStationLng = 0;
private volatile int mTtsLessThan200Tip = 0;//离终点200米提示播报
private OrderQueryRespBean.Result mCurrentOrder = null;
private boolean isFirstStartAutopilotDone = true;
public static TaxiBeingServerdOrdersFragment newInstance(Activity activity, TaxiFragment taxiFragment) {
mActivity = activity;
@@ -331,8 +332,9 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement
dis = NumberFormatUtil.formatLong((double)meters / 1000);
}
}
int min = (int)Math.ceil((double)timeInSecond/ 60f);
String strHtml2 = "<font color=\"#CAD6FF\">里程 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> "+disUnit+"</font>"
+ "<font color=\"#CAD6FF\">,剩余 </font>" + "<b><font color=\"#FFFFFF\">" + (int)Math.ceil((double)timeInSecond/ 60f) + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
+ "<font color=\"#CAD6FF\">,剩余 </font>" + "<b><font color=\"#FFFFFF\">" + min + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
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);

View File

@@ -59,8 +59,10 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
@Override
public void restartAutopilot() {
// 在自动驾驶中,才会有重新开启自动驾驶的操作
if (mPresenter.getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd && !isStarting) {
// 在自动驾驶中,或者自己确认车辆环境可开启自动驾驶 则可点击
if ((mPresenter.getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd ||
mPresenter.getCurOrderStatus() == TaxiOrderStatusEnum.UserArriveAtStart)
&& !isStarting) {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "restartAutopilot");
mPresenter.startAutoPilot(true);
startOrStopLoadingAnim(true);
@@ -225,6 +227,10 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
}
}
public void confirmAutopilotConditionByDriver(){
mPresenter.confirmAutopilotConditionByDriver();
}
public void jumpPassengerCheckDone(){
mPresenter.jumpPassengerCheckDone();
}
@@ -351,8 +357,11 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
findViewById(R.id.test_bar_to_end).setOnClickListener(v -> {
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<TaxiFragment, TaxiPresente
testBar.setVisibility(View.VISIBLE);
}
}
}

View File

@@ -47,13 +47,21 @@
android:onClick="testToStart"
android:text="到达上车点"
android:textSize="12sp" />
<Button
android:id="@+id/test_bar_on_the_way_to_end1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:onClick="testWayToEnd"
android:text="确认可开启服务"/>
<Button
android:id="@+id/test_bar_on_the_way_to_end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:onClick="testWayToEnd"
android:text="开始服务"/>
android:text="开启自动驾驶按钮"/>
<Button
android:id="@+id/test_bar_to_end"

View File

@@ -26,6 +26,7 @@
<string name="module_och_taxi_order_arrive_end_200m_tip">即将到达目的地,请拿好随身物品,准备下车</string>
<string name="module_och_taxi_order_auto_arrive_end_tip">您好,我们已到达目的地,本次体验结束。车辆停稳,请带好随身物品,谨防遗漏。感谢您的乘坐</string>
<string name="module_och_taxi_auto_disable_tip">自动驾驶状态为0不可用</string>
<string name="module_och_taxi_auto_disable_tip1">司机端未确认可以开启自动驾驶</string>
<string name="network_error_tip">网络异常,请稍后重试</string>
<string name="request_error_tip">请求出现异常,请稍后重试</string>