diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxiModel.java index 72f3883b6e..48d78c9713 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxiModel.java @@ -1,7 +1,9 @@ package com.mogo.och.taxi; import android.content.Context; +import android.content.Intent; import android.location.Location; +import android.net.ConnectivityManager; import android.text.TextUtils; import com.mogo.commons.data.BaseData; @@ -16,7 +18,10 @@ import com.mogo.service.adas.IMogoAdasOCHCallback; import com.mogo.service.adas.RemoteControlAutoPilotParameters; import com.mogo.service.adas.entity.AdasOCHData; import com.mogo.service.connection.IMogoOnMessageListener; +import com.mogo.service.intent.IMogoIntentListener; import com.mogo.utils.CoordinateUtils; +import com.mogo.utils.NetworkUtils; +import com.mogo.utils.TipToast; import com.mogo.utils.logger.Logger; import com.mogo.utils.network.RequestOptions; import com.mogo.utils.network.utils.GsonUtil; @@ -112,25 +117,43 @@ class MogoOCHTaxiModel { .getApis() .getAdasControllerApi() .addAdasOCHCallback( mNotifyCallback = new OCHArriveNotifyCallback() ); - - // 订单恢复 - String orderInfo = SharedPrefsMgr.getInstance( mContext ).getString( SP_KEY_OCH_TAXI_ORDER ); - if ( !TextUtils.isEmpty( orderInfo ) ) { - mCurrentOCHOrder = GsonUtil.objectFromJson( orderInfo, OCHTaxiOrderResponse.class ); - if ( mCurrentOCHOrder == null ) { - clearCurrentOCHOrder(); - return; - } - mRetryCounter = 0; - queryOldOrder2RestoreOrderStatus( mCurrentOCHOrder.orderNo ); - } else { - // 解决本地没有缓存订单号的问题 - queryOldOrder2RestoreOrderStatus( null ); + MogoApisHandler.getInstance() + .getApis() + .getIntentManagerApi() + .registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); + if ( NetworkUtils.isConnected( mContext ) ) { + restoreOrderInfo(); } } /** - * 查询订单状态,来恢复旧订单(因crash导致应用重启等)状态 + * 重新恢复订单状态 + */ + private void restoreOrderInfo() { + Logger.d( TAG, "重新查询订单状态" ); + mRetryCounter = 0; + if ( mCurrentOCHOrder == null ) { + // 订单恢复 + String orderInfo = SharedPrefsMgr.getInstance( mContext ).getString( SP_KEY_OCH_TAXI_ORDER ); + if ( !TextUtils.isEmpty( orderInfo ) ) { + mCurrentOCHOrder = GsonUtil.objectFromJson( orderInfo, OCHTaxiOrderResponse.class ); + if ( mCurrentOCHOrder == null ) { + // 解决本地没有缓存订单号的问题 + query2RestoreOrderStatus( null ); + } else { + query2RestoreOrderStatus( mCurrentOCHOrder.orderNo ); + } + } else { + // 解决本地没有缓存订单号的问题 + query2RestoreOrderStatus( null ); + } + } else { + query2RestoreOrderStatus( mCurrentOCHOrder.orderNo ); + } + } + + /** + * 查询订单状态,来恢复旧订单(因crash导致应用重启、断网没收到推送等)状态 *

* 已结束、已取消:清除订单状态 * 已到达目的地:更新UI,显示到达目的地状态 @@ -141,26 +164,34 @@ class MogoOCHTaxiModel { * * @param orderNo */ - private void queryOldOrder2RestoreOrderStatus( String orderNo ) { + private void query2RestoreOrderStatus( String orderNo ) { queryOCHOrderStatus( orderNo, new OCHOrderStatusCallback< OCHTaxiOrderResponse2 >() { @Override public void onSuccess( OCHTaxiOrderResponse2 data ) { if ( data == null || data.result == null ) { + TipToast.shortTip( "订单已取消或已完成" ); clearCurrentOCHOrder(); + OCHTaxiUiController.getInstance().removeFragment(); return; } convertCurrentOrder( data ); OCHOrderStatus status = OCHOrderStatus.valueOf( data.result.orderDispatchType ); switch ( status ) { case Completed: - case Cancel: + TipToast.shortTip( "订单已完成" ); clearCurrentOCHOrder(); + OCHTaxiUiController.getInstance().removeFragment(); + break; + case Cancel: + TipToast.shortTip( "订单已取消" ); + clearCurrentOCHOrder(); + OCHTaxiUiController.getInstance().removeFragment(); break; case ArriveAtEndStation: mIsArriveAtEndStation = true; - mIsArriveAtStartStation = true; + mIsArriveAtStartStation = false; mIsOnTheWay2EndStation = false; - mIsUserArriveAtStartStation = true; + mIsUserArriveAtStartStation = false; OCHTaxiUiController.getInstance().addFragment(); break; case ArriveAtStartStation: @@ -178,10 +209,10 @@ class MogoOCHTaxiModel { OCHTaxiUiController.getInstance().addFragment(); break; case OnTheWayToEndStation: - mIsArriveAtStartStation = true; + mIsArriveAtStartStation = false; mIsArriveAtEndStation = false; mIsOnTheWay2EndStation = true; - mIsUserArriveAtStartStation = true; + mIsUserArriveAtStartStation = false; OCHTaxiUiController.getInstance().addFragment(); break; case OnTheWayToStartStation: @@ -200,7 +231,7 @@ class MogoOCHTaxiModel { if ( mRetryCounter++ > 3 ) { return; } - queryOldOrder2RestoreOrderStatus( orderNo ); + query2RestoreOrderStatus( orderNo ); } @Override @@ -237,6 +268,21 @@ class MogoOCHTaxiModel { cacheOrderInfo2Native( mCurrentOCHOrder ); } + /** + * 监听网络变化,避免启动机器时无网导致无法更新订单信息 + */ + private IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { + @Override + public void onIntentReceived( String intentStr, Intent intent ) { + Logger.d( TAG, "onIntentReceived = %s", intentStr ); + if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) { + if ( NetworkUtils.isConnected( mContext ) ) { + restoreOrderInfo(); + } + } + } + }; + /** * 自车定位 */ diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java index e1b2568e92..c68ebdb444 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java @@ -62,7 +62,10 @@ class OCHTaxiFragment extends BaseOchFragment< OCHTaxiView, OCHTaxiPresenter > i @Override public void restartAutopilot() { - MogoOCHTaxiModel.getInstance().startAutoPilot(); + // 在自动驾驶中,才会有重新开启自动驾驶的操作 + if ( MogoOCHTaxiModel.getInstance().isOnTheWay2EndStation() ) { + MogoOCHTaxiModel.getInstance().startAutoPilot(); + } } @Override @@ -170,6 +173,9 @@ class OCHTaxiFragment extends BaseOchFragment< OCHTaxiView, OCHTaxiPresenter > i mStartStationName.setText( MogoOCHTaxiModel.getInstance().getCurrentOCHOrder().startStation ); mEndStationName.setText( MogoOCHTaxiModel.getInstance().getCurrentOCHOrder().endStation ); double distance = MogoOCHTaxiModel.getInstance().getCurrentOCHOrder().travelDistance; + if ( MogoOCHTaxiModel.getInstance().isArriveAtEndStation() ) { + distance = 0; + } if ( distance * 1000 >= 1000 ) { mDistance.setText( String.format( "%.1f km", distance ) ); } else { @@ -194,8 +200,8 @@ class OCHTaxiFragment extends BaseOchFragment< OCHTaxiView, OCHTaxiPresenter > i @Override public void onArriveAtEndStation() { Logger.d( TAG, "通知达到终点" ); - onAutopilotStatusChanged( false ); updateOrderStatus(); + showNotice( "请携带好随身物品,注意侧后\n方来车,感谢体验蘑菇智行自\n动驾驶车" ); MogoOCHTaxiModel.getInstance().updateOCHOrderStatus( OCHOrderStatus.ArriveAtEndStation, new OCHOrderStatusCallback() { @Override public void onSuccess( Object data ) { @@ -222,7 +228,6 @@ class OCHTaxiFragment extends BaseOchFragment< OCHTaxiView, OCHTaxiPresenter > i @Override public void onTheWay2EndStation() { Logger.d( TAG, "通知去往终点" ); - onAutopilotStatusChanged( true ); updateOrderStatus(); } @@ -285,10 +290,10 @@ class OCHTaxiFragment extends BaseOchFragment< OCHTaxiView, OCHTaxiPresenter > i @Override public void onAutoPilotStatusChanged( int status, String reason ) { Logger.d( TAG, "status = %s, reason = %s", status, reason ); + onAutopilotStatusChanged( status == IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING ); if ( status == IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING ) { resetOCHTaxiOrderAutopilotStatus(); } else { - TipToast.shortTip( reason ); updateOrderStatus(); } } @@ -343,6 +348,9 @@ class OCHTaxiFragment extends BaseOchFragment< OCHTaxiView, OCHTaxiPresenter > i if ( !MogoOCHTaxiModel.getInstance().isOnTheWay2EndStation() ) { return; } + if ( MogoOCHTaxiModel.getInstance().isArriveAtEndStation() ) { + return; + } if ( mLocation == null ) { mLocation = location; } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/LogWriter.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/LogWriter.java index 5f13ae7ed5..652f39ea53 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/LogWriter.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/LogWriter.java @@ -8,7 +8,7 @@ import com.mogo.utils.network.utils.GsonUtil; import java.io.File; import java.io.FileWriter; -import java.io.IOException; +import java.util.Random; public /** @@ -38,7 +38,7 @@ class LogWriter { e.printStackTrace(); } } - writeHandler = new Handler( WorkThreadHandler.newInstance( "Logger-Writer" ).getLooper() ) { + writeHandler = new Handler( WorkThreadHandler.newInstance( "Logger-Writer" + new Random().nextLong() ).getLooper() ) { @Override public void handleMessage( Message msg ) { super.handleMessage( msg ); diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/intent/IntentManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/intent/IntentManager.java index f3431b6918..d001579a19 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/intent/IntentManager.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/intent/IntentManager.java @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; /** * @author congtaowang @@ -45,7 +46,7 @@ public class IntentManager implements IMogoIntentManager { sInstance = null; } - private Map< String, List< IMogoIntentListener > > mListeners = new ConcurrentHashMap<>(); + private Map< String, CopyOnWriteArrayList< IMogoIntentListener > > mListeners = new ConcurrentHashMap<>(); @Override public void registerIntentListener( String intent, IMogoIntentListener listener ) { @@ -53,7 +54,7 @@ public class IntentManager implements IMogoIntentManager { return; } if ( !mListeners.containsKey( intent ) ) { - mListeners.put( intent, new ArrayList<>() ); + mListeners.put( intent, new CopyOnWriteArrayList<>() ); } mListeners.get( intent ).add( listener ); }