diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java index 83725660cb..2dc69f3322 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java @@ -11,6 +11,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.map.MogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.bus.passenger.constant.BusPassengerConst; +import com.mogo.och.bus.passenger.ui.BusPassengerBaseFragment; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -30,6 +31,7 @@ public class MogoOCHBusPassenger implements IMogoOCH, IMogoStatusChangedListener private FragmentActivity mActivity; private int mContainerId; + private BusPassengerBaseFragment mBusPassengerFragment; @Override public void createCoverage(FragmentActivity activity, int containerId) { @@ -63,17 +65,15 @@ public class MogoOCHBusPassenger implements IMogoOCH, IMogoStatusChangedListener public void init(Context context) { MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" , StatusDescriptor.VR_MODE, this); - MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" - , StatusDescriptor.TOP_VIEW, this); } @Override public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { - if (descriptor == StatusDescriptor.VR_MODE){ + if (descriptor == StatusDescriptor.VR_MODE) { if (isTrue){ - + showFragment(); }else { - + hideFragment(); } } } @@ -86,4 +86,21 @@ public class MogoOCHBusPassenger implements IMogoOCH, IMogoStatusChangedListener MogoMapUIController.getInstance() .openVrMode( false ); } + + private void showFragment() { + if (mBusPassengerFragment == null) { + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "准备add fragment======"); + mBusPassengerFragment = new BusPassengerBaseFragment(); + mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, mBusPassengerFragment).commitAllowingStateLoss(); + return; + } + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "准备show fragment"); + mActivity.getSupportFragmentManager().beginTransaction().show(mBusPassengerFragment).commitAllowingStateLoss(); + } + + private void hideFragment(){ + if (mBusPassengerFragment != null){ + mActivity.getSupportFragmentManager().beginTransaction().hide(mBusPassengerFragment).commitAllowingStateLoss(); + } + } } diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerADASStatusCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerADASStatusCallback.java new file mode 100644 index 0000000000..4dbf53010c --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerADASStatusCallback.java @@ -0,0 +1,20 @@ +package com.mogo.och.bus.passenger.callback; + +/** + * Created on 2022/3/31 + * + * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等) + */ +public interface IBusPassengerADASStatusCallback { + // 自动驾驶触发的已到达目的地:暂未用到 + void onAutopilotArriveEnd(); + + // 自动驾驶可用状态 + void onAutopilotEnable(); + + // 自动驾驶不可用状态 + void onAutopilotDisable(); + + // 自动驾驶运行中 + void onAutopilotRunning(); +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java new file mode 100644 index 0000000000..ac5b26d05c --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java @@ -0,0 +1,15 @@ +package com.mogo.och.bus.passenger.callback; + +import com.amap.api.maps.model.LatLng; + +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +/** + * Created on 2022/3/31 + */ +public interface IBusPassengerAutopilotPlanningCallback { + void routeResult(List models); + void routeResultByServer(List models); +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java new file mode 100644 index 0000000000..3263ade5b3 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/callback/IBusPassengerControllerStatusCallback.java @@ -0,0 +1,15 @@ +package com.mogo.och.bus.passenger.callback; + +import android.location.Location; + +/** + * Created on 2022/3/31 + * + * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等) + */ +public interface IBusPassengerControllerStatusCallback { + // 是否vr map模式 + void onVRModeChanged(boolean isVRMode); + // 自车定位 + void onCarLocationChanged(Location location); +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java new file mode 100644 index 0000000000..7d71a9c5a9 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -0,0 +1,260 @@ +package com.mogo.och.bus.passenger.model; + +import android.content.Context; +import android.content.Intent; +import android.location.Location; +import android.net.ConnectivityManager; + +import androidx.annotation.Nullable; + +import com.mogo.aicloud.services.socket.IMogoLifecycleListener; +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo; +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; +import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.map.navi.IMogoCarLocationChangedListener2; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback; +import com.mogo.och.bus.passenger.callback.IBusPassengerAutopilotPlanningCallback; +import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback; +import com.mogo.service.intent.IMogoIntentListener; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.StatusDescriptor; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; + +/** + * Created on 2022/3/31 + */ +public class BusPassengerModel { + private static final String TAG = BusPassengerModel.class.getSimpleName(); + + private static final class SingletonHolder { + private static final BusPassengerModel INSTANCE = new BusPassengerModel(); + } + + public static BusPassengerModel getInstance() { + return SingletonHolder.INSTANCE; + } + + private Context mContext; + private IBusPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 + private IBusPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 + private Map mControllerStatusCallbackMap = new ConcurrentHashMap<>(); + + private double mLongitude, mLatitude; + + private BusPassengerModel() { + } + + public void init( Context context ) { + mContext = context.getApplicationContext(); + initListeners(); + // TODO: 2022/3/31 + } + + public void release() { + releaseListeners(); + } + + public void setMoGoAutopilotPlanningListener(IBusPassengerAutopilotPlanningCallback + moGoAutopilotPlanningCallback) { + this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback; + } + + public void setADASStatusCallback(IBusPassengerADASStatusCallback callback) { + this.mADASStatusCallback = callback; + } + + public void setControllerStatusCallback(String tag, IBusPassengerControllerStatusCallback callback) { + if (tag == null || "".equals(tag)) return; + + if (callback == null) { + mControllerStatusCallbackMap.remove(tag); + return; + } + + mControllerStatusCallbackMap.put(tag,callback); + + } + + private void initListeners() { + MogoAiCloudSocketManager.getInstance(mContext) + .registerLifecycleListener(10010, mSocketLifeCycleLisnter); + + // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 + CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); + MogoApisHandler.getInstance() + .getApis() + .getIntentManagerApi() + .registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); + MogoApisHandler.getInstance() + .getApis() + .getStatusManagerApi() + .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener ); + // 达到起始站围栏监听 + MogoApisHandler.getInstance() + .getApis() + .getRegisterCenterApi() + .registerCarLocationChangedListener( TAG, mCarLocationChangedListener2); + + //2021.11.1 自动驾驶路线规划接口 + CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); + } + + private void releaseListeners() { + MogoApisHandler.getInstance() + .getApis() + .getStatusManagerApi() + .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); + + // 注销到达起始站围栏监听 + MogoApisHandler.getInstance() + .getApis() + .getRegisterCenterApi() + .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); + + MogoAiCloudSocketManager.getInstance(mContext) + .unregisterLifecycleListener(10010); + + CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener); + CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); + } + + //监听网络变化,避免启动机器时无网导致无法更新订单信息 + private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { + @Override + public void onIntentReceived( String intentStr, Intent intent ) { + CallerLogger.INSTANCE.d( M_BUS_P + TAG, "onIntentReceived = %s", intentStr ); + if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) { + if ( NetworkUtils.isConnected( mContext ) ) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // TODO: 2022/3/31 + } + } + } + } + }; + + private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() { + // VR mode变更回调 + @Override + public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { + if (StatusDescriptor.VR_MODE == descriptor) { + if (mControllerStatusCallbackMap.size() > 0) { + for (IBusPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ + callback.onVRModeChanged(isTrue); + } + } + } + } + }; + + private final IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() { + @Override + public void onConnectFailure() { CallerLogger.INSTANCE.e(M_BUS_P + TAG,"socket onConnectFailure"); } + + @Override + public void onConnectSuccess() { CallerLogger.INSTANCE.e(M_BUS_P + TAG,"socket onConnectSuccess"); } + + @Override + public void onConnectLost() { CallerLogger.INSTANCE.e(M_BUS_P + TAG,"socket onConnectLost"); } + }; + + // 自车定位 + private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { + + @Override + public void onCarLocationChanged2( Location location ) { + //位置变化时,通过围栏判断是否到达x点 + // TODO: 2022/3/31 + mLongitude = location.getLongitude(); + mLatitude = location.getLatitude(); + for (IBusPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ + callback.onCarLocationChanged(location); + } + } + }; + + private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + + @Override + public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { + + } + + private boolean arriveAtEnd = false; //乘客app专用字段 + + @Override + public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { + if (autopilotStatusInfo == null) return; + int state = autopilotStatusInfo.getState(); + CallerLogger.INSTANCE.d( M_BUS_P + TAG, "state = %s", state ); + if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); + // TODO: 2022/3/31 + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + // TODO: 2022/3/31 + + if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + // TODO: 2022/3/31 + + if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); + } + } + + @Override + public void onAutopilotSNRequest() { + + } + + @Override + public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) { + if (FunctionBuildConfig.isDemoMode + && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { + arriveAtEnd = true; + } + + // TODO: 2022/3/31 + if (DebugConfig.isDebug()) { + // TipToast.shortTip("到达目的地"); + } + } + + }; + + private final IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){ + + @Override + public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { + if (null != routeList && routeList.getWayPointsList().size() > 0){ + // TODO: 2022/3/31 + mAutopilotPlanningCallback.routeResult(routeList.getWayPointsList()); + } + } + + @Override + public void onAutopilotTrajectory(ArrayList trajectoryInfos) { + + } + }; + +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java new file mode 100644 index 0000000000..8ccb8dbc0d --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceApi.java @@ -0,0 +1,9 @@ +package com.mogo.och.bus.passenger.network; + +/** + * Created on 2022/3/31 + * + * Bus乘客端接口定义 + */ +interface BusPassengerServiceApi { +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceCallback.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceCallback.java new file mode 100644 index 0000000000..fb53106dcd --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceCallback.java @@ -0,0 +1,15 @@ +package com.mogo.och.bus.passenger.network; + +/** + * Created on 2022/3/31 + */ +public interface BusPassengerServiceCallback { + + void onSuccess(T data); + + void onFail(int code, String msg); + + default void onError() { + + } +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.java new file mode 100644 index 0000000000..459cbeb2d7 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/network/BusPassengerServiceManager.java @@ -0,0 +1,81 @@ +package com.mogo.och.bus.passenger.network; + +import android.content.Context; + +import com.mogo.eagle.core.data.BaseData; +import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager; +import com.mogo.eagle.core.network.MoGoRetrofitFactory; +import com.mogo.eagle.core.network.RequestOptions; +import com.mogo.eagle.core.network.SubscribeImpl; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.och.bus.passenger.constant.BusPassengerConst; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; + +/** + * Created on 2022/3/31 + */ +public class BusPassengerServiceManager { + private static final String TAG = BusPassengerServiceManager.class.getSimpleName(); + + private static final class SingletonHolder { + private static final BusPassengerServiceManager INSTANCE = new BusPassengerServiceManager(); + } + + public static BusPassengerServiceManager getInstance() { + return SingletonHolder.INSTANCE; + } + + private BusPassengerServiceApi mBusPassengerServiceApi; + + private BusPassengerServiceManager() { + if (mBusPassengerServiceApi == null){ + mBusPassengerServiceApi = MoGoRetrofitFactory.getInstance( + BusPassengerConst.getBaseUrl()).create(BusPassengerServiceApi.class); + } + } + + /** + * 获取Bus司机端的sn + * @return + */ + private String getDriverAppSn(){ + return CallerTelematicManager.INSTANCE.getServerToken(); +// return "X2020210525EFA93B5946FA38D4"; + } + + private SubscribeImpl getSubscribeImpl( + Context context, BusPassengerServiceCallback callback, String apiName) { + return new SubscribeImpl(RequestOptions.create(context)) { + @Override + public void onSuccess(T o) { + super.onSuccess(o); + CallerLogger.INSTANCE.e(M_BUS_P + TAG,apiName + + ": onSuccess() " + o.msg); + if (callback != null) { + callback.onSuccess(o); + } + } + + @Override + public void onError(Throwable e) { + super.onError(e); + CallerLogger.INSTANCE.e(M_BUS_P + TAG,apiName + + ": onError() " + e.getMessage()); + if (callback != null) { + callback.onError(); + } + } + + @Override + public void onError(String message, int code) { + super.onError(message, code); + CallerLogger.INSTANCE.e(M_BUS_P + TAG,String.format(apiName + + ": onError() code = %d; message = %s;", code, message)); + if (callback != null) { + callback.onFail(code, message); + } + } + }; + } +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java new file mode 100644 index 0000000000..e23b3e8f1f --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java @@ -0,0 +1,98 @@ +package com.mogo.och.bus.passenger.presenter; + +import android.location.Location; +import android.os.Looper; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; + +import com.mogo.commons.AbsMogoApplication; +import com.mogo.commons.mvp.Presenter; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback; +import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback; +import com.mogo.och.bus.passenger.model.BusPassengerModel; +import com.mogo.och.bus.passenger.ui.BusPassengerBaseFragment; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; + +/** + * Created on 2022/3/31 + */ +public class BaseBusPassengerPresenter extends Presenter implements + IBusPassengerADASStatusCallback, IBusPassengerControllerStatusCallback { + private static final String TAG = BaseBusPassengerPresenter.class.getSimpleName(); + + public BaseBusPassengerPresenter(BusPassengerBaseFragment view) { + super(view); + BusPassengerModel.getInstance().init(AbsMogoApplication.getApp()); + initListeners(); + } + + @Override + public void onCreate( @NonNull LifecycleOwner owner ) { + super.onCreate( owner ); + CallerLogger.INSTANCE.d( M_BUS_P + TAG, "Bus乘客端Presenter onCreate()" ); + } + + @Override + public void onDestroy( @NonNull LifecycleOwner owner ) { + super.onDestroy( owner ); + + releaseListeners(); + BusPassengerModel.getInstance().release(); + } + + private void initListeners() { + BusPassengerModel.getInstance().setADASStatusCallback(this); + BusPassengerModel.getInstance().setControllerStatusCallback(TAG, this); + } + + private void releaseListeners() { + BusPassengerModel.getInstance().setADASStatusCallback(null); + BusPassengerModel.getInstance().setControllerStatusCallback(TAG, null); + } + + private void runOnUIThread( Runnable executor ) { + if ( executor == null ) { + return; + } + if ( Looper.myLooper() != Looper.getMainLooper() ) { + UiThreadHandler.post( executor ); + } else { + executor.run(); + } + } + + + @Override + public void onAutopilotArriveEnd() { + + } + + @Override + public void onAutopilotEnable() { + + } + + @Override + public void onAutopilotDisable() { + + } + + @Override + public void onAutopilotRunning() { + + } + + @Override + public void onVRModeChanged(boolean isVRMode) { + + } + + @Override + public void onCarLocationChanged(Location location) { + + } +} diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java new file mode 100644 index 0000000000..be21df01b4 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java @@ -0,0 +1,46 @@ +package com.mogo.och.bus.passenger.ui; + +import android.os.Handler; +import android.os.Looper; + +import androidx.annotation.NonNull; + +import com.mogo.commons.mvp.MvpFragment; +import com.mogo.och.bus.passenger.R; +import com.mogo.och.bus.passenger.presenter.BaseBusPassengerPresenter; + +import org.jetbrains.annotations.NotNull; + +/** + * Created on 2022/3/31 + * + * Bus乘客端基础Fragment + */ +public class BusPassengerBaseFragment extends MvpFragment { + private static final String TAG = BusPassengerBaseFragment.class.getSimpleName(); + + private Handler mHandler = new Handler(Looper.getMainLooper()); + + @NonNull + @NotNull + @Override + protected BaseBusPassengerPresenter createPresenter() { + return new BaseBusPassengerPresenter(this); + } + + @Override + protected int getLayoutId() { + return R.layout.bus_p_base_fragment; + } + + @Override + public String getTagName() { + return TAG; + } + + @Override + protected void initViews() { + + } + +} diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml new file mode 100644 index 0000000000..77d9ef65f8 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java index a70b54a1e6..3491e3fbac 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java @@ -47,8 +47,6 @@ public class OchBusProvider implements IMogoOCH { public void init(Context context) { MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" , StatusDescriptor.VR_MODE, statusChangedListener); - MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus" - , StatusDescriptor.TOP_VIEW, statusChangedListener); } private void showFragment() { @@ -78,8 +76,7 @@ public class OchBusProvider implements IMogoOCH { } else { hideFragment(); } - } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() - && descriptor == StatusDescriptor.TOP_VIEW) { + } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { // topView进行展示时推出网约车界面,但是不隐藏整个fragment if (busFragment != null && isTrue) { busFragment.hideOchBus(); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java index 65df5450fa..c62af56dd5 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java @@ -150,16 +150,12 @@ public abstract class BaseOchBusTabFragment { - // 如果能自动驾驶,就自动驾驶,不能就提示 -// if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){ -// return; -// } -// if (autopilotLoadingAnimator != null){ -// TipToast.shortTip("正在开启自动驾驶。。。"); -// return; -// } - restartAutopilot(); + ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener(){ + + @Override + public void onClickImpl(View v) { + restartAutopilot(); + } }); // debug下调用测试面板 2022.2.25修改到 长按当前站点名字 diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java index 5675c85b9c..8778a3763e 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java @@ -38,7 +38,6 @@ class MogoOCHTaxiPassenger implements IMogoOCH, IMogoStatusChangedListener { public void init( Context context ) { CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "init" ); MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.VR_MODE,this); - MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.TOP_VIEW,this); } /** diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRemainingResp.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRemainingResp.java new file mode 100644 index 0000000000..3ff370d2c2 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRemainingResp.java @@ -0,0 +1,20 @@ +package com.mogo.och.taxi.passenger.bean; + +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; +import java.util.Objects; + +/** + * Created by pangfan on 2021/8/19 + * + * 查询订单返回数据结构 + */ +public class TaxiPassengerOrderQueryRemainingResp extends BaseData { + public Result data; + + public static class Result { + public long distance; + public long duration; + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerQueryOrderRouteResp.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerQueryOrderRouteResp.java new file mode 100644 index 0000000000..48ee6c654b --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerQueryOrderRouteResp.java @@ -0,0 +1,13 @@ +package com.mogo.och.taxi.passenger.bean; + +import com.amap.api.maps.model.LatLng; +import com.mogo.eagle.core.data.BaseData; + +import java.util.List; + +/** + * Created by pangfan on 2021/8/19 + */ +public class TaxiPassengerQueryOrderRouteResp extends BaseData { + public List data; +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java index e6b6ca23ae..3f1cb1bac3 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java @@ -1,6 +1,8 @@ package com.mogo.och.taxi.passenger.callback; +import com.amap.api.maps.model.LatLng; + import java.util.List; import mogo.telematics.pad.MessagePad; @@ -10,4 +12,5 @@ import mogo.telematics.pad.MessagePad; */ public interface IOCHTaxiPassengerAutopilotPlanningCallback { void routeResult(List models); + void routeResultByServer(List models); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerNaviChangedCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerNaviChangedCallback.java index fdd93e1015..c7060e2aaf 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerNaviChangedCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerNaviChangedCallback.java @@ -6,6 +6,6 @@ package com.mogo.och.taxi.passenger.callback; */ public interface IOCHTaxiPassengerNaviChangedCallback { // 当前位置距离上车点的距离(米)、预估时间(秒) 、当前路的名称 - void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond, String currentRoadName); + void onCurrentRoadName(String currentRoadName); void reInitNaviAmap(boolean isPlay,boolean isRestart); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java index be5cf3c550..4f82627a0c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java @@ -17,6 +17,9 @@ public interface IOCHTaxiPassengerOrderStatusCallback { void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order); // 当前位置距离上车点的距离(米)、预估时间(秒) - void onCurrentOrderDistToEndChanged(int meters, int timeInSecond, String currentRoadName); + void onCurrentOrderDistToEndChanged(long meters, long timeInSecond); + + //当前路名字 + void onCurrentRoadName(String currentRoadName); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt index b44508e49c..a17c9add6c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt @@ -39,5 +39,8 @@ class TaxiPassengerConst { // 订单总里程 const val SP_KEY_ORDER_SUM_DIS = "SP_KEY_ORDER_SUM_DIS" + + //实时查询订单剩余时间 和 剩余里程 轮询间隔2s + const val LOOP_CALCULATEROUTE_2S = 2 * 1000L } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index a873785d54..2579d0b312 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -8,11 +8,12 @@ import android.os.Looper; import androidx.annotation.Nullable; +import com.amap.api.maps.model.LatLng; import com.amap.api.navi.model.NaviLatLng; 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.commons.voice.AIAssist; import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; @@ -29,9 +30,10 @@ import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; -import com.mogo.och.taxi.passenger.R; +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.callback.IOCHTaxiPassengerADASStatusCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback; @@ -42,22 +44,29 @@ import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; 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.service.cloud.socket.IMogoLifecycleListener; +import com.mogo.aicloud.services.socket.IMogoLifecycleListener; +import com.mogo.och.taxi.passenger.utils.TPCoordinateCalculateRouteUtil; +import com.mogo.service.IMogoServiceApis; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; import org.jetbrains.annotations.NotNull; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import io.reactivex.exceptions.UndeliverableException; +import io.reactivex.functions.Consumer; +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; /** @@ -83,12 +92,6 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private volatile List mInServiceList = Collections.emptyList(); //进行中订单 private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单 - public void setmTtsLessThan200Tip(int ttsLessThan200Tip) { - this.mTtsLessThan200Tip = ttsLessThan200Tip; - } - - private volatile int mTtsLessThan200Tip = 0;//离终点200米提示播报 - private IOCHTaxiPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 private IOCHTaxiPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 @@ -142,13 +145,41 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback mContext = context.getApplicationContext(); initListeners(); -// IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); -// apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId()); - // TODO: 2021/8/27 因需要通过此回调的location进行坐标上传,暂改为全程监听,退出后再反注册, - // 待后续整体调整location获取来源 -// if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { -// apis.getLocationInfoApi().start(); -// } + // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 + // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with + RxJavaPlugins.setErrorHandler(new Consumer() { + @Override + public void accept(Throwable e) { + if (e instanceof UndeliverableException) { + e = e.getCause(); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "UndeliverableException"); + } + if ((e instanceof IOException)) {// + // fine, irrelevant network problem or API that throws on cancellation + CallerLogger.INSTANCE.d(M_TAXI + TAG, "IOException"); + return; + } + if (e instanceof InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + CallerLogger.INSTANCE.d(M_TAXI + 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"); + 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"); + Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); + return; + } + CallerLogger.INSTANCE.d(M_TAXI + TAG,"Undeliverable exception"); + } + }); + startOrStopOrderLoop(); } @@ -163,13 +194,12 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void release() { startOrStopOrderLoop(false); + startOrStopQueryOrderRemaining(false); releaseListeners(); } private void initListeners() { - MogoApisHandler.getInstance() - .getApis() - .getSocketManagerApi(mContext) + MogoAiCloudSocketManager.getInstance(mContext) .registerLifecycleListener(10010,mSocketLifeCycleLisnter); // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 @@ -207,9 +237,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback .getRegisterCenterApi() .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); - MogoApisHandler.getInstance() - .getApis() - .getSocketManagerApi(mContext) + MogoAiCloudSocketManager.getInstance(mContext) .unregisterLifecycleListener(10010); CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener); @@ -531,6 +559,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback @Override public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { if (null != routeList && routeList.getWayPointsList().size() > 0){ + calculateRouteLineSum(TPCoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,routeList.getWayPointsList())); mAutopilotPlanningCallback.routeResult(routeList.getWayPointsList()); } } @@ -568,16 +597,62 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } } - @Override - public void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond, String currentRoadName) { - if (mTtsLessThan200Tip == 0 && meters <= 200){ - mTtsLessThan200Tip = 1; - runOnUIThread(() -> { - AIAssist.getInstance(mContext).speakTTSVoice(mContext.getString(R.string.taxi_p_arrive_end_tts_200)); - }); + public void startOrStopQueryOrderRemaining(boolean isStart){ + if (isStart){ + TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingtLoop(); + }else { + TaxiPassengerModelLoopManager.getInstance().stopQueryOrderRemainingLoop(); } + } + + public void queryOrderRemaining(){ + if (mCurrentOCHOrder == null) return; + TaxiPassengerServiceManager.getInstance().queryOrderRemaining(mContext, mCurrentOCHOrder.orderNo, new TaxiPassengerServiceCallback() { + @Override + public void onSuccess(TaxiPassengerOrderQueryRemainingResp data) { + if (data != null && data.data!=null){ + CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"distance = "+data.data.distance+" ,duration = "+data.data.duration); + for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ + callback.onCurrentOrderDistToEndChanged(data.data.distance,data.data.duration); + } + } + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + + public void queryOrderRouteList() { + if (mCurrentOCHOrder == null) return; + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route--- queryOrderRouteList"); + TaxiPassengerServiceManager.getInstance().queryOrderRouteList(mContext, mCurrentOCHOrder.orderNo, new TaxiPassengerServiceCallback() { + @Override + public void onSuccess(TaxiPassengerQueryOrderRouteResp data) { + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route---"+GsonUtil.jsonFromObject(data)); + if (data != null && data.data != null && data.data != null && data.data.size() > 0){ + if (mAutopilotPlanningCallback != null){ + calculateRouteLineSum(data.data); + mAutopilotPlanningCallback.routeResultByServer(data.data); + } + }else { + queryOrderRouteList(); + } + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + + @Override + public void onCurrentRoadName(String currentRoadName) { for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderDistToEndChanged(meters,timeInSecond,currentRoadName); + callback.onCurrentRoadName(currentRoadName); } } @@ -594,6 +669,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback TaxiPassengerNaviToDestinationModel.getInstance(mContext).setFirstcalculateDriveRoute(0); } + public void calculateRouteLineSum(List points){ + float sumLength = TPCoordinateCalculateRouteUtil.calculateRouteSumLength(points); + SharedPrefsMgr.getInstance(mContext).putInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,(int) sumLength); + } + private void runOnUIThread(Runnable executor) { if (executor == null) { return; diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java index c7546b3554..eacf0496b3 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java @@ -30,7 +30,7 @@ public class TaxiPassengerModelLoopManager { } private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询 - private Disposable mHeartbeatDisposable; //心跳轮询 + private Disposable mQueryOrderRemainingDisposable; //心跳轮询 public void startInAndWaitOrdersLoop() { if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) { @@ -54,24 +54,24 @@ public class TaxiPassengerModelLoopManager { } -// public void startHeartbeatLoop() { -// if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) { -// return; -// } -// CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startHeartbeatLoop()"); -// mHeartbeatDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, -// TaxiPassengerConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS) -// .map((aLong -> aLong + 1)) -// .subscribeOn(Schedulers.io()) -// .observeOn(AndroidSchedulers.mainThread()) -// .subscribe(aLong -> TaxiPassengerModel.getInstance().runCarHeartbeat()); -// } + public void startQueryOrderRemainingtLoop() { + if (mQueryOrderRemainingDisposable != null && !mQueryOrderRemainingDisposable.isDisposed()) { + return; + } + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startQueryOrderRemainingtLoop()"); + mQueryOrderRemainingDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, + TaxiPassengerConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS) + .map((aLong -> aLong + 1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> TaxiPassengerModel.getInstance().queryOrderRemaining()); + } -// public void stopHeartbeatLoop() { -// if (mHeartbeatDisposable != null) { -// CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopHeartbeatLoop()"); -// mHeartbeatDisposable.dispose(); -// mHeartbeatDisposable = null; -// } -// } + public void stopQueryOrderRemainingLoop() { + if (mQueryOrderRemainingDisposable != null) { + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopQueryOrderRemainingLoop()"); + mQueryOrderRemainingDisposable.dispose(); + mQueryOrderRemainingDisposable = null; + } + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerNaviToDestinationModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerNaviToDestinationModel.java index e691431c75..3f7367b404 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerNaviToDestinationModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerNaviToDestinationModel.java @@ -140,8 +140,7 @@ public class TaxiPassengerNaviToDestinationModel implements AMapNaviListener { SharedPrefsMgr.getInstance(mContext).putInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,naviinfo.getPathRetainDistance()); } if (null != mNaviChangedCallback){ - mNaviChangedCallback.onCurrentNaviDistAndTimeChanged(naviinfo.getPathRetainDistance() - ,naviinfo.getPathRetainTime(),naviinfo.getCurrentRoadName());// 米、秒 + mNaviChangedCallback.onCurrentRoadName(naviinfo.getCurrentRoadName());//当前路的名字 } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java index 96ba82cacc..7e3d423755 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java @@ -1,9 +1,9 @@ package com.mogo.och.taxi.passenger.network; -import com.mogo.eagle.core.data.BaseData; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerCarHeartbeatReqBean; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean; 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 io.reactivex.Observable; import retrofit2.http.Body; @@ -42,11 +42,25 @@ interface TaxiPassengerServiceApi { Observable queryOrderById(@Header ("appId") String appId,@Header("ticket") String ticket,@Body TaxiPassengerOrderQueryReqBean data); /** - * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度 - * @param data + * 查询订单剩余里程和时间 + * @param appId + * @param ticket + * @param orderNo * @return */ -// @Headers( {"Content-type:application/json;charset=UTF-8"} ) -// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" ) -// Observable runCarHeartbeat(@Body TaxiPassengerCarHeartbeatReqBean data); + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @GET("/autopilot-car-hailing/order/v2/driver/taxi/queryOrderRemaining") + Observable queryOrderRemaining(@Header("appId") String appId, @Header("ticket") String ticket, @Query("orderNo") String orderNo); + + /** + * 查询订单全路径 + * @param appId + * @param ticket + * @param orderNo + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) + @GET( "/autopilot-car-hailing/order/v2/driver/taxi/passenger/orderRoute" ) + Observable queryOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("orderNo") String orderNo); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java index ed8dfdae7d..d1e111635d 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java @@ -11,9 +11,12 @@ import com.mogo.eagle.core.network.MoGoRetrofitFactory; import com.mogo.eagle.core.network.RequestOptions; import com.mogo.eagle.core.network.SubscribeImpl; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean; 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.constant.TaxiPassengerConst; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -47,7 +50,7 @@ public class TaxiPassengerServiceManager { */ private String getDriverAppSn(){ return CallerTelematicManager.INSTANCE.getServerToken(); -// return "X2020211111NG0XNFK"; +// return "X2020210525EFA93B5946FA38D4"; } /** @@ -65,6 +68,31 @@ public class TaxiPassengerServiceManager { .subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService")); } + /** + * 查询订单剩余里程和时间 + * @param context + * @param orderNo + * @param callback + */ + public void queryOrderRemaining(Context context, String orderNo, TaxiPassengerServiceCallback callback){ + mOCHTaxiServiceApi.queryOrderRemaining(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryOrderRemaining")); + } + + public void queryOrderRouteList(Context context, String orderNo, TaxiPassengerServiceCallback callback){ + + mOCHTaxiServiceApi.queryOrderRoute(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryOrderRouteList")); + } + /** * 通过orderId查询订单信息(用于本地已经有orderId时) * @param context diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index d060812f85..7cadee404a 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -12,6 +12,7 @@ import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -121,7 +122,7 @@ public class BaseTaxiPassengerPresenter extends Presenter models) { + if (models == null) return; + mView.routeResultByServer(models); + } + @Override public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) { + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, GsonUtil.jsonFromObject(order)); + if (mCurrentPassengerOrder == null){ mCurrentPassengerOrder = order; //当前无订单 + if (TaxiPassengerOrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus){ + TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(true); + TaxiPassengerModel.getInstance().queryOrderRouteList(); + } + mView.updateOrderStatusView(order); }else if (mCurrentPassengerOrder.orderStatus != order.orderStatus) { mView.updateOrderStatusView(order); + + if (TaxiPassengerOrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus){ + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "-----OnTheWayToEndStation----"); + TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(true); + } + if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == mCurrentPassengerOrder.orderStatus - || TaxiPassengerOrderStatusEnum.ArriveAtStartStation.getCode() == mCurrentPassengerOrder.orderStatus){ - TaxiPassengerModel.getInstance().setmTtsLessThan200Tip(0); + || TaxiPassengerOrderStatusEnum.ArriveAtEndStation.getCode() == mCurrentPassengerOrder.orderStatus){ + TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(false); } mCurrentPassengerOrder = order; } @@ -91,8 +115,13 @@ public class TaxiPassengerServingOrderPresenter extends Presenter latLngs){ + mCoordinatesLatLng.clear(); + mCoordinatesLatLng.addAll(latLngs); + } + @Override public void onCameraChange(CameraPosition cameraPosition) { mITaxiPassengerMapViewCallback.onCameraChange(cameraPosition.bearing); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java index 88efec1c08..02d8819ea9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java @@ -12,12 +12,14 @@ import android.view.View; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.widget.AppCompatSeekBar; +import com.amap.api.maps.model.LatLng; import com.mogo.commons.mvp.MvpFragment; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -61,6 +63,7 @@ public class TaxiPassengerServingOrderFragment extends private TextView mTPOrderStartStation; private TextView mTPOrderEndStation; private TextView mTPOrderRemainDis; + private TextView mTPOrderRemainDisUnit; private TextView mTPOrderRemainTime; private TextView mTPOrderRemainArriveTime; private ImageView mMapArrowIcon; @@ -109,6 +112,7 @@ public class TaxiPassengerServingOrderFragment extends mTPOrderStartStation = findViewById(R.id.taxi_p_order_status_start_station_tv); mTPOrderEndStation = findViewById(R.id.taxi_p_order_status_end_station_tv); mTPOrderRemainDis = findViewById(R.id.taxi_p_order_remain_distance); + mTPOrderRemainDisUnit = findViewById(R.id.taxi_p_order_remain_distance_unit); mTPOrderRemainTime = findViewById(R.id.taxi_p_order_remain_time); mTPOrderRemainArriveTime = findViewById(R.id.taxi_p_order_remain_arrive_time); @@ -346,9 +350,9 @@ public class TaxiPassengerServingOrderFragment extends * 行驶进度值更新 */ @RequiresApi(api = Build.VERSION_CODES.N) - private void updateDriveProcessLoading(int progressLoading,String currentRoadName) { - mProgessDes.setText(currentRoadName); - int progressInt = SharedPrefsMgr.getInstance(getContext()).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,0) - progressLoading; + private void updateDriveProcessLoading(int progressLoading) { + int progressInt = SharedPrefsMgr.getInstance(getContext()) + .getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,0) - progressLoading; CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"progressInt = "+progressInt); mProgressSeekBar.setProgress( progressInt @@ -356,6 +360,9 @@ public class TaxiPassengerServingOrderFragment extends mProgressSeekBar.jumpDrawablesToCurrentState(); } + private void updateDriveRoadName(String currentRoadName){ + mProgessDes.setText(currentRoadName); + } @Override public void onResume() { @@ -405,6 +412,15 @@ public class TaxiPassengerServingOrderFragment extends } } + public void routeResultByServer(List latLngList) { + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "routeResultByServer:" + latLngList.size()); + if (latLngList.size() > 0) { + drawablePolylineByServerRoute(latLngList); + } else { + clearPolyline(); + } + } + /** * 绘制 * @@ -422,6 +438,17 @@ public class TaxiPassengerServingOrderFragment extends } } + public void drawablePolylineByServerRoute(List mCoordinatesLatLng){ + if (mMapDirectionView != null){ + mMapDirectionView.setCoordinatesLatLng(mCoordinatesLatLng); + UiThreadHandler.post(new Runnable() { + @Override + public void run() { + mMapDirectionView.drawablePolyline(); + } + }); + } + } private void clearPolyline() { if (mMapDirectionView != null) { UiThreadHandler.post(new Runnable() { @@ -439,6 +466,9 @@ public class TaxiPassengerServingOrderFragment extends if (TaxiPassengerOrderStatusEnum.ArriveAtStartStation.getCode() == order.orderStatus) { mTPOrderStatus.setText(getString(R.string.taxi_p_arrive_to_start)); + mTPOrderRemainDis.setText("--"); + mTPOrderRemainTime.setText("--"); + mTPOrderRemainArriveTime.setText("--"); setSeekBarMax(); return; } @@ -452,26 +482,43 @@ public class TaxiPassengerServingOrderFragment extends /** * 剩余里程,剩余时间,当前定位点所在道路 - * @param meters - * @param timeInSecond - * @param currentRoadName + * @param meters 单位 米 + * @param remainTime 单位 秒 */ @RequiresApi(api = Build.VERSION_CODES.N) - public void onCurrentOrderDistToEndChanged(int meters, int timeInSecond, String currentRoadName) { - DecimalFormat fnum = new DecimalFormat("##0.00"); - String remainDis = fnum.format((float) meters / 1000); - int remainTime = (int) timeInSecond / 60; + public void onCurrentOrderDistToEndChanged(long meters, long remainTime) { + String disUnit = "公里"; + String remainDis = "0"; + + if (meters > 0){ + if (meters / 1000 < 1){ + disUnit = "米"; + remainDis = String.valueOf(Math.round(meters)); + }else { + disUnit = "公里"; + remainDis = TaxiPassengerUtils.formatLong((double) meters / 1000); + } + } + + int time = (int)Math.ceil((double)remainTime/ 60f); + Calendar beforeTime = Calendar.getInstance(); - beforeTime.add(Calendar.MINUTE,remainTime); + beforeTime.add(Calendar.MINUTE,time); String arriveTime = TaxiPassengerUtils.formatCalendarToString(beforeTime,TaxiPassengerUtils.TAXI_HH_mm); - updateOrderDisAndTimeView(remainDis, remainTime, arriveTime); - updateDriveProcessLoading(meters,currentRoadName); + updateOrderDisAndTimeView(remainDis, disUnit,time, arriveTime); + updateDriveProcessLoading(new Long(meters).intValue()); } - private void updateOrderDisAndTimeView(String remainDis, int remainTime, String arriveTime) { + public void onCurrentRoadName(String roadName){ + updateDriveRoadName(roadName); + } + + private void updateOrderDisAndTimeView(String remainDis, String remainDisUnit, int remainTime, String arriveTime) { mTPOrderRemainDis.setText(remainDis); + mTPOrderRemainDisUnit.setText(remainDisUnit); mTPOrderRemainTime.setText(String.valueOf(remainTime)); mTPOrderRemainArriveTime.setText(arriveTime); + } public void onCarLocationChanged(Location location) { @@ -537,12 +584,4 @@ public class TaxiPassengerServingOrderFragment extends lastBearing = bearing; } - public void setGradientText(int startColor, int endColor){ - Shader shader = new LinearGradient( - 0, 0, 0, mTPSpeedTv.getLineHeight(), - getResources().getColor(startColor), - getResources().getColor(endColor), - Shader.TileMode.REPEAT); - mTPSpeedTv.getPaint().setShader(shader); - } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPCoordinateCalculateRouteUtil.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPCoordinateCalculateRouteUtil.java new file mode 100644 index 0000000000..2208db23a8 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPCoordinateCalculateRouteUtil.java @@ -0,0 +1,55 @@ +package com.mogo.och.taxi.passenger.utils; + +import android.content.Context; + +import com.amap.api.maps.CoordinateConverter; +import com.amap.api.maps.model.LatLng; +import com.mogo.cloud.commons.utils.CoordinateUtils; + +import java.util.ArrayList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +/** + * @author: wangmingjun + * @date: 2022/3/28 + */ +public class TPCoordinateCalculateRouteUtil { + + public static float calculateRouteSumLength(List points){ + if (null == points || points.size() == 0) return 0; + + float sumLength = 0; + + //计算全路径总距离 + for (int i = 0;i + 1< points.size();i++){ + double preLat = points.get(i).latitude; + double preLon = points.get(i).longitude; + double laLat = points.get(i+1).latitude; + double laLon = points.get(i+1).longitude; + + float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); + sumLength += length; + } + return sumLength; + } + + public static List coordinateConverterWgsToGcjListCommon(Context mContext, List models) { + //转成MogoLatLng集合 + List list = new ArrayList<>(); + for (MessagePad.Location m : models) { + LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m); + list.add(mogoLatLng); + } + return list; + } + + public static LatLng coordinateConverterWgsToGcj(Context mContext, MessagePad.Location mogoLatLng) { + CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); + mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); + mCoordinateConverter.coord(new LatLng(mogoLatLng.getLatitude(), mogoLatLng.getLongitude())); + LatLng latLng = mCoordinateConverter.convert(); + return latLng; + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerUtils.java index b29ab8f48f..bc463ee054 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerUtils.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerUtils.java @@ -1,6 +1,9 @@ package com.mogo.och.taxi.passenger.utils; import com.mogo.eagle.core.utilcode.util.DateTimeUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -89,4 +92,18 @@ public class TaxiPassengerUtils { int minute = (int)(seconds % 3600)/60; return String.valueOf(minute); } + + /** + * 有小数两位, 没有小数保留整数 + * @param d + * @return + */ + public static String formatLong(double d) { + BigDecimal bg = new BigDecimal(d).setScale(2, RoundingMode.UP); + double num = bg.doubleValue(); + if (Math.round(num) - num == 0) { + return String.valueOf((long) num); + } + return String.valueOf(num); + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml index 6a8924c351..a97b800357 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_activity_serving_order_view.xml @@ -119,6 +119,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:gravity="center_vertical" app:layout_constraintRight_toLeftOf="@+id/taxi_p_order_rl2" app:layout_constraintTop_toTopOf="parent"> @@ -134,7 +135,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:includeFontPadding="false" - android:text="0" + android:text="--" android:textColor="#84D4FF" android:textSize="42px" android:textStyle="bold" /> @@ -147,7 +148,7 @@ android:layout_marginLeft="@dimen/dp_6" android:layout_toRightOf="@+id/taxi_p_order_remain_distance" android:includeFontPadding="false" - android:text="KM" + android:text="公里" android:textColor="#FFFFFF" android:textSize="20px" /> @@ -171,6 +172,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:gravity="center_vertical" app:layout_constraintRight_toLeftOf="@+id/taxi_p_order_rl3" app:layout_constraintTop_toTopOf="parent"> @@ -186,7 +188,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:includeFontPadding="false" - android:text="0" + android:text="--" android:textColor="#84D4FF" android:textSize="42px" android:textStyle="bold" /> @@ -223,6 +225,7 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" + android:gravity="center_vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -232,7 +235,7 @@ android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:includeFontPadding="false" - android:text="0" + android:text="--" android:textColor="#84D4FF" android:textSize="42px" android:textStyle="bold" /> @@ -259,6 +262,7 @@ android:layout_height="@dimen/taxi_p_order_map_height" android:background="@color/taxi_p_map_bg" app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@+id/taxi_p_order_remain" app:layout_constraintLeft_toLeftOf="parent" /> data; +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/UpdateOrderDisAndTimeReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/UpdateOrderDisAndTimeReqBean.java new file mode 100644 index 0000000000..29e7e2b0e8 --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/UpdateOrderDisAndTimeReqBean.java @@ -0,0 +1,14 @@ +package com.mogo.och.taxi.bean; + + +public class UpdateOrderDisAndTimeReqBean { + public String orderNo; //订单号(必须) + public long distance; //剩余里程 单位米(必须) + public long duration; //剩余时间 单位秒(必须) + + public UpdateOrderDisAndTimeReqBean(String orderNo, long distance, long duration) { + this.orderNo = orderNo; + this.distance = distance; + this.duration = duration; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java index f7c35b49cc..cc3117acc7 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java @@ -6,6 +6,6 @@ package com.mogo.och.taxi.callback; */ public interface IOCHTaxiNaviChangedCallback { // 当前位置距离上车点的距离(米)、预估时间(秒) - void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond); + void onCurrentNaviDistAndTimeChanged(int meters, long timeInSecond); void reInitNaviAmap(boolean isPlay,boolean isRestart); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt index edb45a2521..4cc818228d 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt @@ -59,5 +59,10 @@ class OCHTaxiConst { const val EVENT_PARAM_ORDER_NUMBER = "order_num" const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + // 实时计算当前剩余里程和时间 间隔 2秒 + const val LOOP_CALCULATEROUTE_2S = 2 * 1000L + + //总里程/平均车速。(bus的平均里程:25km/h,taxi的平均里程:38km/h),单位为:分钟,不足1分钟时,显示1分钟。 + const val TAXI_AVERAGE_SPEED = 38 } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java index b44baa66a8..6ed4484f70 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java @@ -9,9 +9,9 @@ import android.net.ConnectivityManager; import androidx.annotation.Nullable; -import com.amap.api.maps.CoordinateConverter; 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.commons.debug.DebugConfig; import com.mogo.eagle.core.data.BaseData; @@ -25,9 +25,11 @@ 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.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.SharedPrefs; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.taxi.bean.DriverServiceDataRespBean; @@ -40,6 +42,7 @@ import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean; 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.callback.IOCHTaxiADASStatusCallback; import com.mogo.och.taxi.callback.IOCHTaxiCarStatusCallback; import com.mogo.och.taxi.callback.IOCHTaxiControllerStatusCallback; @@ -50,10 +53,11 @@ import com.mogo.och.taxi.constant.OrderStatusEnum; import com.mogo.och.taxi.constant.OrderTypeEnum; import com.mogo.och.taxi.network.OCHTaxiServiceCallback; import com.mogo.och.taxi.network.OCHTaxiServiceManagerNew; +import com.mogo.och.taxi.utils.CoordinateCalculateRouteUtil; import com.mogo.och.taxi.utils.OchTaxiAnalyticsUtil; import com.mogo.och.taxi.utils.OrderUtil; import com.mogo.och.taxi.utils.PinYinUtil; -import com.mogo.service.cloud.socket.IMogoLifecycleListener; +import com.mogo.aicloud.services.socket.IMogoLifecycleListener; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -102,16 +106,13 @@ public class MogoOCHTaxiModelNew { private IOCHTaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 private IOCHTaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更 -// private IOCHTaxiAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 + private List mRoutePoints = new ArrayList<>(); private double mLongitude, mLatitude; private MogoOCHTaxiModelNew() { } -// public void setMoGoAutopilotPlanningListener(IOCHTaxiAutopilotPlanningCallback -// moGoAutopilotPlanningCallback) { -// this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback; -// } + public void setADASStatusCallback(IOCHTaxiADASStatusCallback callback) { this.mADASStatusCallback = callback; } @@ -190,13 +191,12 @@ public class MogoOCHTaxiModelNew { public void release() { startOrStopOrderLoop(false); + startOrStopCalculateRouteInfo(false); releaseListeners(); } private void initListeners() { - MogoApisHandler.getInstance() - .getApis() - .getSocketManagerApi(mContext) + MogoAiCloudSocketManager.getInstance(mContext) .registerLifecycleListener(10010, mSocketLifeCycleLisnter); // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 @@ -231,9 +231,7 @@ public class MogoOCHTaxiModelNew { .getRegisterCenterApi() .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2); - MogoApisHandler.getInstance() - .getApis() - .getSocketManagerApi(mContext) + MogoAiCloudSocketManager.getInstance(mContext) .unregisterLifecycleListener(10010); CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener); @@ -263,7 +261,7 @@ public class MogoOCHTaxiModelNew { mOCHCarStatus = data.data.serviceStatus == 1 ? 1 : 0; //更新view CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + mOCHCarStatus); - startOrStopOrderLoop(mOCHCarStatus == 1); +// startOrStopOrderLoop(mOCHCarStatus == 1); todo 只从一个入口开始订单轮询 String role = ""; if (DriverRoleEnum.DEMO.getCode() == data.data.purpose){ role = OCHTaxiConst.DEMO_USER; @@ -931,9 +929,10 @@ public class MogoOCHTaxiModelNew { if (location != null && checkCurrentOCHOrder()) { if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToStartStation) { judgeStartStation(location); - } else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) { - calculateTravelDistance(location); } +// else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) { +// calculateTravelDistance(location); +// } } mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); @@ -1052,6 +1051,7 @@ public class MogoOCHTaxiModelNew { public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { if (null != routeList && routeList.getWayPointsList().size() > 0){ updateOrderRoute(routeList.getWayPointsList()); + updateOrderRouteInfo(routeList.getWayPointsList()); } } @@ -1068,8 +1068,8 @@ public class MogoOCHTaxiModelNew { */ public void updateOrderRoute(List models) { if (null == mCurrentOCHOrder) return; - List points = CoordinateConverterFrom84ForList(mContext,models); - + List points = + CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjList(mContext,models); OCHTaxiServiceManagerNew.getInstance().updateOrderRoute(mContext, mCurrentOCHOrder.orderNo , points, new OCHTaxiServiceCallback() { @Override @@ -1084,24 +1084,116 @@ public class MogoOCHTaxiModelNew { }); } - private List CoordinateConverterFrom84ForList(Context mContext, List mogoLatLngList) { - List points = new ArrayList<>(); - for (MessagePad.Location m : mogoLatLngList) { - LatLng mogoLatLng = CoordinateConverterFrom84(mContext, m); - OrderRouteUpdateReqBean.Result result = new OrderRouteUpdateReqBean.Result(); - result.latitude = mogoLatLng.latitude; - result.longitude = mogoLatLng.longitude; - points.add(result); - } - return points; + /** + * 计算全路径长度,以及实时更新剩余距离,剩余时间,预计时间 + * @param models + */ + public void updateOrderRouteInfo(List models) { + if (null == models || models.size() == 0) return; + if (mCurrentOCHOrder == null) return; + Logger.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); + + //转换成高德坐标系 + mRoutePoints = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,models); + startDynamicCalculateRouteInfo(); } - private LatLng CoordinateConverterFrom84(Context mContext, MessagePad.Location mogoLatLng) { - CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); - mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); - mCoordinateConverter.coord(new LatLng(mogoLatLng.getLatitude(), mogoLatLng.getLongitude())); - LatLng latLng = mCoordinateConverter.convert(); - return latLng; + public void startDynamicCalculateRouteInfo(){ + Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- "+mCurrentOCHOrder); + + if (mCurrentOCHOrder != null && mRoutePoints.size() == 0){//根据orderNo去查询 + queryOrderRouteList(mCurrentOCHOrder.orderNo); + } + + //开启实时计算剩余距离,剩余时间,预计时间 + startOrStopCalculateRouteInfo(true); + } + + /** + * 实时计算当前剩余里程和时间 + */ + public void dynamicCalculateRouteInfo(){ + List lastPoints = CoordinateCalculateRouteUtil + .getRemainPointListByCompare(mRoutePoints,mLongitude,mLatitude); + + float lastSumLength = 0; + + if (lastPoints.size() == 1){ //只是最后一个点,计算当前位置和最后一个点的距离 + lastSumLength = CoordinateUtils.calculateLineDistance( + lastPoints.get(0).longitude, lastPoints.get(0).latitude, + mLongitude, mLatitude); + }else { + lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); + } + + double lastTime = lastSumLength / OCHTaxiConst.TAXI_AVERAGE_SPEED * 3.6 ; //秒 + Logger.d(M_TAXI + "dynamicCalculateRouteInfo" + , "---lastSumLength: "+lastSumLength+"----lastTime : "+lastTime); + + mCurrentOCHOrder.decreaseTravelDistance(lastSumLength); + if (mOrderStatusCallback != null) { + mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime); + } + + reportOrderRemain((long)lastSumLength,(long)lastTime); + } + + /** + * 查询当前订单的全局路径 (当自动驾驶开启后,订单前往乘客上车点,杀掉应用再次进来时候) + */ + private void queryOrderRouteList(String orderNo) { + if (mCurrentOCHOrder != null){ + OCHTaxiServiceManagerNew.getInstance().queryOrderRoute(mContext, orderNo, + new OCHTaxiServiceCallback() { + @Override + public void onSuccess(QueryOrderRouteResp data) { + if (data != null && data.data != null){ + mRoutePoints.clear(); + mRoutePoints.addAll(data.data); + } + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + } + + /** + * 开始轮询计算剩余里程和时间 + * @param isStart + */ + public void startOrStopCalculateRouteInfo(boolean isStart) { + CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + isStart); + if (isStart) { + OCHTaxiModelLoopManager.getInstance().startCalculateRouteInfoLoop(); + } else { + mRoutePoints.clear(); + OCHTaxiModelLoopManager.getInstance().stopCalculateRouteInfLoop(); + } + } + + /** + * 上报订单剩余里程和时间 单位:KM, M, 单位:分钟 + * @param lastSumLength + * @param duration + */ + private void reportOrderRemain(long lastSumLength, long duration) {// 米/分钟 + if (mCurrentOCHOrder == null) return; + OCHTaxiServiceManagerNew.getInstance().reportOrderRemain(mContext, mCurrentOCHOrder.orderNo + , lastSumLength, duration, new OCHTaxiServiceCallback() { + @Override + public void onSuccess(BaseData data) { + + } + + @Override + public void onFail(int code, String msg) { + + } + }); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java index d8cc82276e..b0bac1f31f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java @@ -1,6 +1,7 @@ package com.mogo.och.taxi.model; 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; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.och.taxi.constant.OCHTaxiConst; @@ -33,6 +34,7 @@ public class OCHTaxiModelLoopManager { private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询 private Disposable mGrabResultDisposable; //抢单结果轮询 private Disposable mHeartbeatDisposable; //心跳轮询 + private Disposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 public void startInAndWaitOrdersLoop() { if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) { @@ -117,4 +119,25 @@ public class OCHTaxiModelLoopManager { mHeartbeatDisposable = null; } } + + public void startCalculateRouteInfoLoop() { + if (mCalculateRouteDisposable != null && !mCalculateRouteDisposable.isDisposed()) { + return; + } + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startCalculateRouteInfoLoop()"); + mCalculateRouteDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY, + OCHTaxiConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS) + .map((aLong -> aLong + 1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().dynamicCalculateRouteInfo()); + } + + public void stopCalculateRouteInfLoop() { + if (mCalculateRouteDisposable != null) { + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopCalculateRouteInfLoop()"); + mCalculateRouteDisposable.dispose(); + mCalculateRouteDisposable = null; + } + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java index 2be844639f..b47fd6aadd 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java @@ -18,6 +18,8 @@ import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean; 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.UpdateOrderDisAndTimeReqBean; import io.reactivex.Observable; import retrofit2.http.Body; @@ -186,4 +188,21 @@ interface OCHTaxiServiceApiNew { @POST("/autopilot-car-hailing/order/v2/driver/taxi/orderRoute") // @POST("/mock/268/autopilot-car-hailing/order/v2/driver/taxi/orderRoute") Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body OrderRouteUpdateReqBean data); + + /** + * 上报订单剩余里程和剩余时间 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST("/autopilot-car-hailing/order/v2/driver/taxi/reportOrderRemain") + Observable reportOrderRemain(@Header ("appId") String appId, @Header("ticket") String ticket, @Body UpdateOrderDisAndTimeReqBean data); + + + @Headers( {"Content-type:application/json;charset=UTF-8"} ) +// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" ) + @GET( "/autopilot-car-hailing/order/v2/driver/taxi/orderRoute" ) + Observable queryOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("orderNo") String orderNo); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java index 49629bf737..86ee65d526 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java @@ -28,6 +28,8 @@ import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean; 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.UpdateOrderDisAndTimeReqBean; import com.mogo.och.taxi.constant.OCHTaxiConst; import java.util.List; @@ -309,6 +311,40 @@ public class OCHTaxiServiceManagerNew { .subscribe(getSubscribeImpl(context,callback,"updateOrderRoute")); } + /** + * 上报剩余里程,时间 + * @param context + * @param orderNo + * @param distance + * @param duration + * @param callback + */ + public void reportOrderRemain(Context context, String orderNo,long distance, long duration + ,OCHTaxiServiceCallback callback){ + + mOCHTaxiServiceApi.reportOrderRemain(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new UpdateOrderDisAndTimeReqBean(orderNo,distance,duration)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"reportOrderRemain")); + } + + /** + * 查询订单全路径 + * @param context + * @param orderNo + * @param callback + */ + public void queryOrderRoute(Context context, String orderNo,OCHTaxiServiceCallback callback) { + mOCHTaxiServiceApi.queryOrderRoute(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"queryOrderRoute")); + } + private SubscribeImpl getSubscribeImpl( Context context, OCHTaxiServiceCallback callback, String apiName) { return new SubscribeImpl(RequestOptions.create(context)) { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java index 399a72513d..e606ec5dd6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java @@ -186,6 +186,14 @@ public class OCHTaxiPresenter extends Presenter implements IOCH @Override public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) { CallerLogger.INSTANCE.d(M_TAXI + TAG,"order = "+order.toString()); + if (OrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus){ + MogoOCHTaxiModelNew.getInstance().startDynamicCalculateRouteInfo(); + } + if (OrderStatusEnum.ArriveAtEndStation.getCode() == order.orderStatus || + OrderStatusEnum.Cancel.getCode() == order.orderStatus || + OrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){ + MogoOCHTaxiModelNew.getInstance().startOrStopCalculateRouteInfo(false); + } mView.updateCurrentOrderStatusChanged(order); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java index 47692ff70b..9049284df8 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java @@ -3,8 +3,6 @@ package com.mogo.och.taxi.ui; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import android.app.Activity; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.os.Build; @@ -41,7 +39,6 @@ import com.mogo.och.taxi.model.MogoOCHTaxiModelNew; import com.mogo.och.taxi.model.NaviToDestinationModel; import com.mogo.och.taxi.utils.OchTaxiUtils; -import java.text.DecimalFormat; import java.util.Calendar; import java.util.List; @@ -58,6 +55,7 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem private String mOrderNo; private double mOrderStartStationLat = 0; private double mOrderStartStationLng = 0; + private volatile int mTtsLessThan200Tip = 0;//离终点200米提示播报 public static OCHTaxiBeingServerdOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment) { mActivity = activity; @@ -148,8 +146,6 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem mNaviIcon.setOnClickListener(this); } - private boolean isSpeakedEndingNotice = false; - /** * 初始化订单信息 */ @@ -297,30 +293,59 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem } } + /** + * 剩余里程和剩余时间 + * @param meters m + * @param timeInSecond 秒 + */ public void updateDistanceAndTime(long meters, long timeInSecond) { -// CallerLogger.INSTANCE.d(M_TAXI + TAG,"meters = "+meters); - if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) { - DecimalFormat fnum = new DecimalFormat("##0.0"); - String dis = fnum.format((float) meters / 1000); - String strHtml2 = "里程 " + "" + dis + "" + " 公里" - + ",剩余 " + "" + (int) timeInSecond / 60 + "" + " 分钟"; +// CallerLogger.INSTANCE.d(M_TAXI + TAG,"meters = "+meters+"timeInSecond ="+timeInSecond); + String dis = "0"; + String disUnit = "公里"; + if (meters > 0){ + if (meters / 1000 < 1){ + disUnit = "米"; + dis = String.valueOf(Math.round(meters)); + }else { + disUnit = "公里"; + dis = OchTaxiUtils.formatLong((double)meters / 1000); + } + } + String strHtml2 = "里程 " + "" + dis + "" + " "+disUnit+"" + + ",剩余 " + "" + (int)Math.ceil((double)timeInSecond/ 60f) + "" + " 分钟"; + + if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) { //前往上车点 + mDistanceAndTime3.setText(Html.fromHtml(strHtml2)); mNaviIcon.setVisibility(View.VISIBLE); - } else if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) { - DecimalFormat fnum = new DecimalFormat("##0.0"); - String dis = fnum.format((float) meters / 1000); - String strHtml2 = "距离 " + "" + dis + "" + " 公里"; -// + ",用时 " + ""+(int)timeInSecond/60+"" + " 分钟"; + } else if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) { //前往终点 时间单位是分钟 + if (mTtsLessThan200Tip < 1 && meters <= 250 && meters > 150){ + speekVoice200mTipsOnce(); + } mDistanceAndTime2.setText(Html.fromHtml(strHtml2)); } + } - public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) { - CallerLogger.INSTANCE.d(M_TAXI + TAG, "meters = " + routeInfo.durationToEnd); - DecimalFormat fnum = new DecimalFormat("##0.0"); - String dis = fnum.format((float) routeInfo.distanceToEnd / 1000); + private void speekVoice200mTipsOnce() { + mTtsLessThan200Tip = 1; + showNotice(getResources().getString(R.string.module_och_taxi_order_arrive_end_200m_tip)); + } + + public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {// 单位 米, 秒 + CallerLogger.INSTANCE.d(M_TAXI + TAG, "durationToEnd = " + routeInfo.durationToEnd); + + String dis = "0"; + long distance = routeInfo.distanceToEnd; + long duration = routeInfo.durationToEnd; + + if (routeInfo.distanceToEnd > 0){ + + dis = OchTaxiUtils.formatLong( (double) distance/ 1000); + } + String strHtml2 = "距离 " + "" + dis + "" + " 公里" - + ",用时 " + "" + (int) routeInfo.durationToEnd / 60 + "" + " 分钟"; + + ",用时 " + "" + (int)Math.ceil( (double) duration/ 60) + "" + " 分钟"; if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) { mDistanceAndTime2.setText(Html.fromHtml(strHtml2)); } else if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) { @@ -328,13 +353,6 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem } } - public synchronized void SpeakNoticeOnce() { - if (!isSpeakedEndingNotice) { - isSpeakedEndingNotice = true; - showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1)); - } - } - @Override public void onDestroyView() { super.onDestroyView(); @@ -342,14 +360,14 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem } private void startOrEndService(String step) { - if (step.equals("服务完成")) {//点击了完成服务,结束订单并更新订单信息 + if (step.equals(getResources().getString(R.string.module_och_taxi_order_server_end))) {//点击了完成服务,结束订单并更新订单信息 // isHaveBeingOrder(false); mTaxiFragment.completeOrderService(OrderStatusEnum.JourneyCompleted); - showNotice("车辆已停稳,请携带好随身物品,下车请注意安全"); + showNotice(getResources().getString(R.string.module_och_taxi_order_server_completed_tip)); return; - } else if (step.equals("开始服务")) {//点击服务,开启自动驾驶 + } else if (step.equals(getResources().getString(R.string.module_och_taxi_order_server_start))) {//点击服务,开启自动驾驶 mTaxiFragment.startAutoPilot(); - showNotice("自动驾驶已启动,请系好安全带"); + showNotice(getResources().getString(R.string.module_och_taxi_order_server_start_auto_tip)); } } @@ -358,7 +376,6 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem CallerLogger.INSTANCE.d(M_TAXI + TAG, "status==" + status); mActivity.runOnUiThread(() -> { if (status == OrderStatusEnum.None.getCode() || status == OrderStatusEnum.Cancel.getCode() || status == OrderStatusEnum.JourneyCompleted.getCode()) { - isSpeakedEndingNotice = false; isHaveBeingOrder(false); } else { isHaveBeingOrder(true); @@ -369,12 +386,14 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem case OnTheWayToStartStation: mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_new_order)); + mTtsLessThan200Tip = 0; startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng); showOrHideNavi(true); setOrRemoveMapMaker(true, OCHTaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint); setOrRemoveMapMaker(true,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint); break; case Cancel: + mTtsLessThan200Tip = 0; mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel)); showOrHideNavi(false); @@ -382,6 +401,7 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem setOrRemoveMapMaker(false,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint); break; case ArriveAtStartStation: + mTtsLessThan200Tip = 0; mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text)); showOrHideNavi(false); @@ -396,13 +416,15 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem setOrRemoveMapMaker(true,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint); break; case ArriveAtEndStation: + mTtsLessThan200Tip = 0; mOrderCancel.setVisibility(View.GONE); - showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1)); + showNotice(mActivity.getString(R.string.module_och_taxi_order_auto_arrive_end_tip)); showOrHideNavi(false); setOrRemoveMapMaker(false, OCHTaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint); setOrRemoveMapMaker(false,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint); break; case JourneyCompleted: + mTtsLessThan200Tip = 0; mOrderCancel.setVisibility(View.GONE); showNotice("感谢您使用蘑菇智行,再见~"); showOrHideNavi(false); @@ -488,7 +510,7 @@ public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implem } @Override - public void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond) { + public void onCurrentNaviDistAndTimeChanged(int meters, long timeInSecond) { updateDistanceAndTime(meters, timeInSecond); } 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 972360a8ae..a26ad569f5 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 @@ -357,203 +357,205 @@ public class OCHTaxiFragment extends BaseOchTaxiTabFragment { showNotice("自动驾驶已启动,请系好安全带"); MogoOCHTaxiModelNew.getInstance().setOnTheWayToEndStation(); + testRouteInfoUpload(); }); - findViewById(R.id.test_bar_send_route).setOnClickListener(v -> { + } - String listStr = "{\"models\":[{\n" + - "\t\t\"lat\": 40.19927810144466,\n" + - "\t\t\"lon\": 116.73527259387767\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19927836356079,\n" + - "\t\t\"lon\": 116.73513114732762\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19927759500293,\n" + - "\t\t\"lon\": 116.73497660879111\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.199264819842284,\n" + - "\t\t\"lon\": 116.73480063747202\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1992510141554,\n" + - "\t\t\"lon\": 116.73463922037767\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.199245872804,\n" + - "\t\t\"lon\": 116.73445960685193\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19924673374912,\n" + - "\t\t\"lon\": 116.73427704009703\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19924747108264,\n" + - "\t\t\"lon\": 116.7340707102972\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19924828745573,\n" + - "\t\t\"lon\": 116.73385916927226\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19924941093133,\n" + - "\t\t\"lon\": 116.73364048294795\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19924939253381,\n" + - "\t\t\"lon\": 116.73340837408566\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19924949105934,\n" + - "\t\t\"lon\": 116.73317368725336\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19925040039033,\n" + - "\t\t\"lon\": 116.73296532811216\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1992515355653,\n" + - "\t\t\"lon\": 116.73277787366743\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1992512720328,\n" + - "\t\t\"lon\": 116.73263377253741\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.199205174954606,\n" + - "\t\t\"lon\": 116.73249773114644\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1991015743076,\n" + - "\t\t\"lon\": 116.7324219601283\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.198971862686285,\n" + - "\t\t\"lon\": 116.73239393296355\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19883883071582,\n" + - "\t\t\"lon\": 116.73237676435652\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19870171355796,\n" + - "\t\t\"lon\": 116.73236052150362\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1985491853193,\n" + - "\t\t\"lon\": 116.73234157857011\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1983890047355,\n" + - "\t\t\"lon\": 116.73232167996464\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1982209877466,\n" + - "\t\t\"lon\": 116.73230101645792\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.198037574138326,\n" + - "\t\t\"lon\": 116.73227735486083\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19787327856243,\n" + - "\t\t\"lon\": 116.73225676816314\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19771917207499,\n" + - "\t\t\"lon\": 116.73223814728027\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.197548305175935,\n" + - "\t\t\"lon\": 116.73221624705808\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19739568979691,\n" + - "\t\t\"lon\": 116.73219618210774\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19724703821575,\n" + - "\t\t\"lon\": 116.73217598293311\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1970956560885,\n" + - "\t\t\"lon\": 116.73215773721505\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19697703483188,\n" + - "\t\t\"lon\": 116.73214337172284\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19687000725696,\n" + - "\t\t\"lon\": 116.73210037067965\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.196833449601726,\n" + - "\t\t\"lon\": 116.73196646708011\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19685833847804,\n" + - "\t\t\"lon\": 116.73181315361103\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.196889170203264,\n" + - "\t\t\"lon\": 116.73164355747393\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19692242860347,\n" + - "\t\t\"lon\": 116.7314555399657\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19696431701069,\n" + - "\t\t\"lon\": 116.7312261834129\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19700025925464,\n" + - "\t\t\"lon\": 116.73102774016093\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19703414798773,\n" + - "\t\t\"lon\": 116.73084270562073\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19707287604138,\n" + - "\t\t\"lon\": 116.73062835248406\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19710951629977,\n" + - "\t\t\"lon\": 116.73041744082339\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19714593807105,\n" + - "\t\t\"lon\": 116.73021414314803\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.197183297026285,\n" + - "\t\t\"lon\": 116.7300057066447\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.1972247359487,\n" + - "\t\t\"lon\": 116.7297751515664\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19726518822745,\n" + - "\t\t\"lon\": 116.72954958923812\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19730538240706,\n" + - "\t\t\"lon\": 116.72932440756041\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19734272112662,\n" + - "\t\t\"lon\": 116.72911631453036\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.197379191549075,\n" + - "\t\t\"lon\": 116.72890982812105\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.197417565369314,\n" + - "\t\t\"lon\": 116.72869447869044\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19746052080799,\n" + - "\t\t\"lon\": 116.72845641541247\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19750040582118,\n" + - "\t\t\"lon\": 116.72823569991117\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19753999704064,\n" + - "\t\t\"lon\": 116.72801998373052\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19757796882569,\n" + - "\t\t\"lon\": 116.72781280504363\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.197617062364586,\n" + - "\t\t\"lon\": 116.72759949431683\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19765391602761,\n" + - "\t\t\"lon\": 116.72739776789756\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19768973009218,\n" + - "\t\t\"lon\": 116.72719980764646\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.197726191028785,\n" + - "\t\t\"lon\": 116.72699719861669\n" + - "\t}, {\n" + - "\t\t\"lat\": 40.19776233489642,\n" + - "\t\t\"lon\": 116.72679516155276\n" + - "\t}]}\n"; + private void testRouteInfoUpload() { + String listStr = "{\"models\":[{\n" + + "\t\t\"lat\": 40.19927810144466,\n" + + "\t\t\"lon\": 116.73527259387767\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19927836356079,\n" + + "\t\t\"lon\": 116.73513114732762\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19927759500293,\n" + + "\t\t\"lon\": 116.73497660879111\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.199264819842284,\n" + + "\t\t\"lon\": 116.73480063747202\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1992510141554,\n" + + "\t\t\"lon\": 116.73463922037767\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.199245872804,\n" + + "\t\t\"lon\": 116.73445960685193\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19924673374912,\n" + + "\t\t\"lon\": 116.73427704009703\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19924747108264,\n" + + "\t\t\"lon\": 116.7340707102972\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19924828745573,\n" + + "\t\t\"lon\": 116.73385916927226\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19924941093133,\n" + + "\t\t\"lon\": 116.73364048294795\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19924939253381,\n" + + "\t\t\"lon\": 116.73340837408566\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19924949105934,\n" + + "\t\t\"lon\": 116.73317368725336\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19925040039033,\n" + + "\t\t\"lon\": 116.73296532811216\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1992515355653,\n" + + "\t\t\"lon\": 116.73277787366743\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1992512720328,\n" + + "\t\t\"lon\": 116.73263377253741\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.199205174954606,\n" + + "\t\t\"lon\": 116.73249773114644\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1991015743076,\n" + + "\t\t\"lon\": 116.7324219601283\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.198971862686285,\n" + + "\t\t\"lon\": 116.73239393296355\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19883883071582,\n" + + "\t\t\"lon\": 116.73237676435652\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19870171355796,\n" + + "\t\t\"lon\": 116.73236052150362\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1985491853193,\n" + + "\t\t\"lon\": 116.73234157857011\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1983890047355,\n" + + "\t\t\"lon\": 116.73232167996464\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1982209877466,\n" + + "\t\t\"lon\": 116.73230101645792\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.198037574138326,\n" + + "\t\t\"lon\": 116.73227735486083\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19787327856243,\n" + + "\t\t\"lon\": 116.73225676816314\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19771917207499,\n" + + "\t\t\"lon\": 116.73223814728027\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.197548305175935,\n" + + "\t\t\"lon\": 116.73221624705808\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19739568979691,\n" + + "\t\t\"lon\": 116.73219618210774\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19724703821575,\n" + + "\t\t\"lon\": 116.73217598293311\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1970956560885,\n" + + "\t\t\"lon\": 116.73215773721505\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19697703483188,\n" + + "\t\t\"lon\": 116.73214337172284\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19687000725696,\n" + + "\t\t\"lon\": 116.73210037067965\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.196833449601726,\n" + + "\t\t\"lon\": 116.73196646708011\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19685833847804,\n" + + "\t\t\"lon\": 116.73181315361103\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.196889170203264,\n" + + "\t\t\"lon\": 116.73164355747393\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19692242860347,\n" + + "\t\t\"lon\": 116.7314555399657\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19696431701069,\n" + + "\t\t\"lon\": 116.7312261834129\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19700025925464,\n" + + "\t\t\"lon\": 116.73102774016093\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19703414798773,\n" + + "\t\t\"lon\": 116.73084270562073\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19707287604138,\n" + + "\t\t\"lon\": 116.73062835248406\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19710951629977,\n" + + "\t\t\"lon\": 116.73041744082339\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19714593807105,\n" + + "\t\t\"lon\": 116.73021414314803\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.197183297026285,\n" + + "\t\t\"lon\": 116.7300057066447\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.1972247359487,\n" + + "\t\t\"lon\": 116.7297751515664\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19726518822745,\n" + + "\t\t\"lon\": 116.72954958923812\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19730538240706,\n" + + "\t\t\"lon\": 116.72932440756041\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19734272112662,\n" + + "\t\t\"lon\": 116.72911631453036\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.197379191549075,\n" + + "\t\t\"lon\": 116.72890982812105\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.197417565369314,\n" + + "\t\t\"lon\": 116.72869447869044\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19746052080799,\n" + + "\t\t\"lon\": 116.72845641541247\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19750040582118,\n" + + "\t\t\"lon\": 116.72823569991117\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19753999704064,\n" + + "\t\t\"lon\": 116.72801998373052\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19757796882569,\n" + + "\t\t\"lon\": 116.72781280504363\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.197617062364586,\n" + + "\t\t\"lon\": 116.72759949431683\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19765391602761,\n" + + "\t\t\"lon\": 116.72739776789756\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19768973009218,\n" + + "\t\t\"lon\": 116.72719980764646\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.197726191028785,\n" + + "\t\t\"lon\": 116.72699719861669\n" + + "\t}, {\n" + + "\t\t\"lat\": 40.19776233489642,\n" + + "\t\t\"lon\": 116.72679516155276\n" + + "\t}]}\n"; - List list = new ArrayList<>(); + List list = new ArrayList<>(); - try { - JSONObject jsonObject = new JSONObject(listStr); - JSONArray jsonElements = jsonObject.getJSONArray("models"); - for (int i = 0; i < jsonElements.length(); i++) { - JSONObject s = jsonElements.getJSONObject(i); - MessagePad.Location.Builder builder = MessagePad.Location.newBuilder(); - builder.setLatitude(s.getDouble("lat")); - builder.setLongitude(s.getDouble("lon")); - list.add(builder.build()); - } - MogoOCHTaxiModelNew.getInstance().updateOrderRoute(list); - } catch (JSONException e) { - e.printStackTrace(); + try { + JSONObject jsonObject = new JSONObject(listStr); + JSONArray jsonElements = jsonObject.getJSONArray("models"); + for (int i = 0; i < jsonElements.length(); i++) { + JSONObject s = jsonElements.getJSONObject(i); + MessagePad.Location.Builder builder = MessagePad.Location.newBuilder(); + builder.setLatitude(s.getDouble("lat")); + builder.setLongitude(s.getDouble("lon")); + list.add(builder.build()); } - }); + MogoOCHTaxiModelNew.getInstance().updateOrderRoute(list); + MogoOCHTaxiModelNew.getInstance().updateOrderRouteInfo(list); + } catch (JSONException e) { + e.printStackTrace(); + } } public void clickTestBar() { diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/CoordinateCalculateRouteUtil.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/CoordinateCalculateRouteUtil.java new file mode 100644 index 0000000000..b58aa5e08f --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/CoordinateCalculateRouteUtil.java @@ -0,0 +1,177 @@ +package com.mogo.och.taxi.utils; + +import android.content.Context; + +import com.amap.api.maps.CoordinateConverter; +import com.amap.api.maps.model.LatLng; +import com.mogo.cloud.commons.utils.CoordinateUtils; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean; + +import java.util.ArrayList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + +/** + * @author: wangmingjun + * @date: 2022/3/28 + */ +public class CoordinateCalculateRouteUtil { + + public static float calculateRouteSumLength(List points){ + if (null == points || points.size() == 0) return 0; + + float sumLength = 0; + + //计算全路径总距离 + for (int i = 0;i + 1< points.size();i++){ + double preLat = points.get(i).latitude; + double preLon = points.get(i).longitude; + double laLat = points.get(i+1).latitude; + double laLon = points.get(i+1).longitude; + + float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); + sumLength += length; + } + return sumLength; + } + + public static List coordinateConverterWgsToGcjListCommon(Context mContext, List models) { + //转成MogoLatLng集合 + List list = new ArrayList<>(); + for (MessagePad.Location m : models) { + LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m); + list.add(mogoLatLng); + } + return list; + } + + public static LatLng coordinateConverterWgsToGcj(Context mContext, MessagePad.Location mogoLatLng) { + CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); + mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); + mCoordinateConverter.coord(new LatLng(mogoLatLng.getLatitude(), mogoLatLng.getLongitude())); + LatLng latLng = mCoordinateConverter.convert(); + return latLng; + } + + + public static List coordinateConverterWgsToGcjList(Context mContext, List mogoLatLngList) { + List points = new ArrayList<>(); + for (MessagePad.Location m : mogoLatLngList) { + LatLng mogoLatLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(mContext, m); + OrderRouteUpdateReqBean.Result result = new OrderRouteUpdateReqBean.Result(); + result.latitude = mogoLatLng.latitude; + result.longitude = mogoLatLng.longitude; + points.add(result); + } + return points; + } + + /** + * 根据实时定位的坐标确定出已行驶到那个坐标点 todo 有问题 暂不使用 + * @param mRoutePoints + * @param realLon + * @param realLat + * @return 返回剩余路径集合 + */ + @Deprecated + public static List getCurrentPoinByCompare(List mRoutePoints,double realLon,double realLat) { + // 疑似坐标 先以坐标中间1/2为第一个比对点 + int currentIndex = Math.round(mRoutePoints.size()/2); + LatLng currentLatLng = mRoutePoints.get(currentIndex); + + //差值初始化 + float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat + ,currentLatLng.longitude,currentLatLng.latitude);// lon,lat, prelon, prelat + + List latePoints = new ArrayList<>(); + //与选中点左右比较 + if (currentIndex -1 >= 0 && currentIndex+1<= mRoutePoints.size()-1){ + LatLng leftCurrentLatLng = mRoutePoints.get(currentIndex -1); + LatLng rightCurentLatLng = mRoutePoints.get(currentIndex + 1); + float leftDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat + ,leftCurrentLatLng.longitude,leftCurrentLatLng.latitude); + float rightDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat,rightCurentLatLng.longitude,rightCurentLatLng.latitude); + + if (rightDiffDis < leftDiffDis){ //靠近了右半边 + baseDiffDis = rightDiffDis; + for (int i = currentIndex +1; i+1 -