Merge remote-tracking branch 'origin/dev_robotaxi-d-app-module_280_220608_2.8.0' into dev_robotaxi-d-app-module_280_220608_2.8.0
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -22,4 +22,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback {
|
||||
//当前路名字
|
||||
void onCurrentRoadName(String currentRoadName);
|
||||
|
||||
// 司机已确认开启自动驾驶环境
|
||||
void onDriverHasCheckedPilotCondition(boolean isBoarded);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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,102 @@ 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) {
|
||||
if (data != null && data.code == 0 && data.data.equals(true)) {
|
||||
updateAutopilotStatus(true);
|
||||
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) {
|
||||
ToastUtils.showShort(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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,19 +141,28 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
|
||||
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"isBoarded = "+isBoarded);
|
||||
runOnUIThread(() -> {
|
||||
mView.updateStartAutopilotBtnStatus(isBoarded);
|
||||
});
|
||||
}
|
||||
|
||||
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 +174,23 @@ 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(() ->{
|
||||
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"UserArriveAtStart");
|
||||
mView.showOrHideStartAutopilotView(true,false);
|
||||
});
|
||||
//开启轮询司机是否已准备好开启自动驾驶的环境
|
||||
TaxiPassengerModel.getInstance().startDriverReadyToAutopilotLoop();
|
||||
}
|
||||
if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
|
||||
// mView.showOrHideStartAutopilotView(false);
|
||||
runOnUIThread(() ->{
|
||||
mView.showOrHideServingOrderFragment(true);
|
||||
mView.showOrHideStartAutopilotView(false,false);
|
||||
});
|
||||
TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotoop(false);
|
||||
}
|
||||
// 30 用户到达上车点 并通过了手机号后四位验证
|
||||
// 40 服务中
|
||||
@@ -181,7 +200,6 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
|
||||
mView.showOrHideArrivedEndLayout(false,"","");
|
||||
mView.showOrHidePressengerCheckPager(false, "",
|
||||
"", "", "", "");
|
||||
mView.showOrHideServingOrderFragment(true);
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -221,4 +239,11 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
|
||||
TaxiPassengerModel.getInstance().arrivedAndScore(score,orderNo, aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean));
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启自动驾驶
|
||||
*/
|
||||
public void startAutopilot(){
|
||||
TaxiPassengerModel.getInstance().startAutopilot();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -120,6 +120,11 @@ public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerS
|
||||
runOnUIThread(() -> mView.onCurrentRoadName(currentRoadName));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVRModeChanged(boolean isVRMode) {
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -152,6 +154,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
super.onResume();
|
||||
// mPresenter.startOrStopOrderLoop();
|
||||
// showOrHideServingOrderFragment(true);
|
||||
// showOrHideStartAutopilotView(true,true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,29 +175,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 +271,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 显示或者隐藏乘客可点击自动驾驶页面
|
||||
* 乘客验证成功,页面显示,按钮置于不可点击
|
||||
@@ -286,20 +279,27 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
* @param isShow
|
||||
*/
|
||||
public void showOrHideStartAutopilotView(boolean isShow, boolean isClickable){
|
||||
if (isShow){
|
||||
if (mStartAutopilotView == null || mStartAutopilotView.get() == null){
|
||||
mStartAutopilotView = new WeakReference<>(new TaxiPassengerStartAutopilotView(getContext()));
|
||||
}
|
||||
OverlayViewUtils.showOverlayView(getActivity(),mStartAutopilotView.get());
|
||||
mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(this);
|
||||
mStartAutopilotView.get().updateStartAutopilotBtnStatus(isClickable);
|
||||
}else {
|
||||
if (mStartAutopilotView == null || mStartAutopilotView.get() == null){
|
||||
return;
|
||||
}
|
||||
mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(null);
|
||||
OverlayViewUtils.dismissOverlayView(mStartAutopilotView.get());
|
||||
// if (isShow){
|
||||
// if (mStartAutopilotView == null || mStartAutopilotView.get() == null){
|
||||
// mStartAutopilotView = new WeakReference<>(new TaxiPassengerStartAutopilotView(getContext()));
|
||||
// mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(this);
|
||||
// }
|
||||
// OverlayViewUtils.showOverlayView(getActivity(),mStartAutopilotView.get());
|
||||
// updateStartAutopilotBtnStatus(isClickable);
|
||||
// }else {
|
||||
// if (mStartAutopilotView == null || mStartAutopilotView.get() == null){
|
||||
// return;
|
||||
// }
|
||||
// mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(null);
|
||||
// OverlayViewUtils.dismissOverlayView(mStartAutopilotView.get());
|
||||
// }
|
||||
}
|
||||
|
||||
public void updateStartAutopilotBtnStatus(boolean isClickable){
|
||||
if (mStartAutopilotView == null || mStartAutopilotView.get() == null){
|
||||
return;
|
||||
}
|
||||
mStartAutopilotView.get().updateStartAutopilotBtnStatus(isClickable);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -383,6 +383,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
|
||||
|
||||
@Override
|
||||
public void onClickCallback() {
|
||||
//todo 点击开始自动驾驶按钮
|
||||
|
||||
mPresenter.startAutopilot();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.graphics.drawable.AnimationDrawable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
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,24 +20,25 @@ import com.mogo.och.taxi.passenger.callback.ITPClickStartAutopilotCallback;
|
||||
public class TaxiPassengerStartAutopilotView extends RelativeLayout implements View.OnClickListener {
|
||||
|
||||
private TextView mStartAutopilotBtn;
|
||||
private ImageView mAutopilotStartingImage;
|
||||
private ITPClickStartAutopilotCallback mClickCallback;
|
||||
public boolean isStarting = false;
|
||||
private AnimationDrawable mAnimationBtnDrawable;
|
||||
private AnimationDrawable mAnimationStartingDrawable;
|
||||
private static final long TIMER_START_AUTOPILOT_INTERVAL = 10 * 1000L;
|
||||
private Context mContext;
|
||||
private View view;
|
||||
|
||||
public TaxiPassengerStartAutopilotView(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public TaxiPassengerStartAutopilotView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public TaxiPassengerStartAutopilotView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
mContext = context;
|
||||
initView(context);
|
||||
}
|
||||
|
||||
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);
|
||||
view = LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this,true);
|
||||
mStartAutopilotBtn = view.findViewById(R.id.taxi_p_start_autopilot);
|
||||
mAutopilotStartingImage = view.findViewById(R.id.taxi_p_autopilot_starting);
|
||||
mStartAutopilotBtn.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@@ -47,11 +49,108 @@ 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 (!isStarting){
|
||||
startOrStopLoadingAnim(true);
|
||||
if (mClickCallback != null) mClickCallback.onClickCallback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void updateStartAutopilotBtnStatus(boolean isClickable){
|
||||
if (mStartAutopilotBtn == null) return;
|
||||
mStartAutopilotBtn.setClickable(isClickable);
|
||||
mStartAutopilotBtn.setText(
|
||||
mContext.getResources().getString(R.string.taxi_p_start_autopilot_txt));
|
||||
if (isClickable){ //可点击状态下UI
|
||||
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mStartAutopilotBtn.getLayoutParams();
|
||||
params.bottomMargin = 0;
|
||||
mStartAutopilotBtn.setLayoutParams(params);
|
||||
mStartAutopilotBtn.setTextColor(
|
||||
mContext.getResources().getColor(R.color.taxi_p_start_autopilot_txt_color));
|
||||
mStartAutopilotBtn.setBackground(mContext.getResources().getDrawable(R.drawable.anmi_flow));
|
||||
startAutopilotBgAnimatorDrawable(true);
|
||||
}else {// 不可点击状态下 UI
|
||||
LayoutParams params = (LayoutParams) mStartAutopilotBtn.getLayoutParams();
|
||||
params.bottomMargin = 294;
|
||||
mStartAutopilotBtn.setLayoutParams(params);
|
||||
mStartAutopilotBtn.setBackground(
|
||||
mContext.getResources().getDrawable(R.drawable.taxi_p_start_autopilot_txt_btn_bg));
|
||||
mStartAutopilotBtn.setTextColor(
|
||||
mContext.getResources().getColor(R.color.taxi_p_start_autopilot_txt_un_color));
|
||||
startAutopilotBgAnimatorDrawable(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void startAutopilotBgAnimatorDrawable(boolean isStart){
|
||||
if (isStart){
|
||||
if (mAnimationBtnDrawable == null) {
|
||||
mAnimationBtnDrawable = (AnimationDrawable) mStartAutopilotBtn.getBackground();
|
||||
}
|
||||
if (mAnimationBtnDrawable.isRunning()) {
|
||||
return;
|
||||
}
|
||||
mAnimationBtnDrawable.selectDrawable(0);
|
||||
mAnimationBtnDrawable.start();
|
||||
}else {
|
||||
if (mAnimationBtnDrawable != null) {
|
||||
mAnimationBtnDrawable.stop();
|
||||
}
|
||||
mAnimationBtnDrawable = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void startingAutopilotAnimatorDrawable(boolean isStart){
|
||||
if (isStart){
|
||||
if (mAnimationStartingDrawable == null) {
|
||||
mAnimationStartingDrawable = (AnimationDrawable) mAutopilotStartingImage.getBackground();
|
||||
}
|
||||
if (mAnimationStartingDrawable.isRunning()) {
|
||||
return;
|
||||
}
|
||||
mAnimationStartingDrawable.selectDrawable(0);
|
||||
mAnimationStartingDrawable.start();
|
||||
}else {
|
||||
if (mAnimationStartingDrawable != null) {
|
||||
mAnimationStartingDrawable.selectDrawable(0);
|
||||
mAnimationStartingDrawable.stop();
|
||||
}
|
||||
mAnimationStartingDrawable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startOrStopLoadingAnim(boolean start) {
|
||||
startingAutopilotAnimatorDrawable(start);
|
||||
if (start) {
|
||||
isStarting = true;
|
||||
|
||||
mStartAutopilotBtn.setText(getResources().getString(R.string.taxi_p_start_autopilot_loading));
|
||||
mStartAutopilotBtn.setTextColor(getResources().getColor(R.color.taxi_p_start_autopilot_txt_un_color));
|
||||
|
||||
startingAutopilotCountDown();
|
||||
} else {
|
||||
isStarting = false;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 930 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 930 KiB |
230
OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml
Normal file
@@ -0,0 +1,230 @@
|
||||
<?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/image_00000"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00001"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00002"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00003"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00004"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00005"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00006"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00007"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00008"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00009"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00010"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00011"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00012"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00013"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00014"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00015"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00016"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00017"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00018"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00019"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00020"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00021"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00022"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00023"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00024"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00025"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00026"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00027"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00028"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00029"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00030"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00031"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00032"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00033"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00034"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00035"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00036"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00037"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00038"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00039"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00040"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00041"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00042"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00043"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00044"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00045"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00046"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00047"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00048"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00049"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00050"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00051"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00052"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00053"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00054"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00055"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00056"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00057"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00058"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00059"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00060"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00061"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00062"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00063"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00064"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00065"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00066"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00067"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00068"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00069"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00070"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00071"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00072"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00073"
|
||||
android:duration="100"></item>
|
||||
<item
|
||||
android:drawable="@drawable/image_00074"
|
||||
android:duration="100"></item>
|
||||
</animation-list>
|
||||
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 121 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00000.png
Executable file
|
After Width: | Height: | Size: 28 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00001.png
Executable file
|
After Width: | Height: | Size: 31 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00002.png
Executable file
|
After Width: | Height: | Size: 34 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00003.png
Executable file
|
After Width: | Height: | Size: 37 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00004.png
Executable file
|
After Width: | Height: | Size: 39 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00005.png
Executable file
|
After Width: | Height: | Size: 38 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00006.png
Executable file
|
After Width: | Height: | Size: 39 KiB |
BIN
OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00007.png
Executable file
|
After Width: | Height: | Size: 39 KiB |