[2.12.0] 根据自驾轨迹绘制前往目的地路线

This commit is contained in:
wangmingjun
2022-10-20 19:21:07 +08:00
parent 7c5805a412
commit 96111fe9cd
11 changed files with 247 additions and 59 deletions

View File

@@ -0,0 +1,15 @@
package com.mogo.och.taxi.callback;
import com.amap.api.maps.model.LatLng;
import java.util.List;
/**
* @author: wangmingjun
* @date: 2021/11/1
*/
public interface IOCHTaxiAutopilotPlanningCallback {
void setLineMarker(List<LatLng> models);
void routeResult(List<LatLng> models, int haveArrivedIndex);
}

View File

@@ -49,6 +49,10 @@ public interface ITaxiOrderStatusCallback {
// 司机已确认开启自动驾驶环境
void onDriverHasCheckedPilotCondition(boolean isSafe);
//高德导航到达目的地
void onNaviToEndAmap(boolean isVoicePlay);
/**
* 导航到目的地
* @param isAmap 是否是高德导航
* @param isVoicePlay 是否播报声音
*/
void onNaviToEnd(boolean isAmap, boolean isVoicePlay);
}

View File

@@ -54,6 +54,7 @@ import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
import com.mogo.och.taxi.bean.QueryOrderRouteResp;
import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
import com.mogo.och.taxi.callback.ITaxiCarStatusCallback;
import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
@@ -117,6 +118,7 @@ public class TaxiModel {
private ITaxiCarStatusCallback mCarStatusCallback; //Model->Presenter接单状态、登录状态和司机今日接单状态
private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->PresenterVR mode等
private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter订单变更
private IOCHTaxiAutopilotPlanningCallback mAutopilotPlanningCallback;
private volatile boolean isRestartAutopilot = false;
@@ -129,6 +131,11 @@ public class TaxiModel {
private TaxiModel() {
}
public void setMoGoAutopilotPlanningListener(IOCHTaxiAutopilotPlanningCallback
moGoAutopilotPlanningCallback) {
this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
}
public void setADASStatusCallback(ITaxiADASStatusCallback callback) {
this.mADASStatusCallback = callback;
}
@@ -1360,6 +1367,18 @@ public class TaxiModel {
}
reportOrderRemain((long) lastSumLength, (long) lastTime);
routeAndWipe();
}
}
private void routeAndWipe() {
if (mRoutePoints != null && mRoutePoints.size() > 0){
int haveArrivedIndex = CoordinateCalculateRouteUtil
.getArrivedPointIndex(mRoutePoints,mLongitude,mLatitude);
if (mAutopilotPlanningCallback != null){
mAutopilotPlanningCallback.routeResult(mRoutePoints,haveArrivedIndex);
}
}
}
@@ -1547,10 +1566,12 @@ public class TaxiModel {
//导航去订单终点目的地
public void startNaviToEndStation(boolean isVoicePlay){
if (mRoutePoints.size() > 0 ){ //使用自驾轨迹
if (mOrderStatusCallback != null){
mOrderStatusCallback.onNaviToEnd(false,isVoicePlay);
}
}else {//使用高的导航
if (mOrderStatusCallback != null){
mOrderStatusCallback.onNaviToEndAmap(isVoicePlay);
mOrderStatusCallback.onNaviToEnd(true,isVoicePlay);
}
}
}

View File

@@ -0,0 +1,79 @@
package com.mogo.och.taxi.presenter;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import com.amap.api.maps.model.LatLng;
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.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
import com.mogo.och.taxi.model.TaxiModel;
import com.mogo.och.taxi.ui.TaxiRottingNaviFragment;
import java.util.List;
/**
* @author congtaowang
* @since 2021/1/18
*
* 描述
*/
public class NaviPresenter extends Presenter<TaxiRottingNaviFragment> implements IOCHTaxiAutopilotPlanningCallback {
private static final String TAG = NaviPresenter.class.getSimpleName();
public NaviPresenter(TaxiRottingNaviFragment view) {
super(view);
TaxiModel.getInstance().init(AbsMogoApplication.getApp());
initListeners();
}
@Override
public void onCreate( @NonNull LifecycleOwner owner ) {
super.onCreate( owner );
CallerLogger.INSTANCE.d( M_TAXI + TAG, " onCreate" );
}
@Override
public void onDestroy( @NonNull LifecycleOwner owner ) {
super.onDestroy( owner );
releaseListeners();
TaxiModel.getInstance().release();
}
private void initListeners() {
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this);
}
private void releaseListeners() {
TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
}
private void runOnUIThread( Runnable executor ) {
if ( executor == null ) {
return;
}
if ( Looper.myLooper() != Looper.getMainLooper() ) {
UiThreadHandler.post( executor );
} else {
executor.run();
}
}
@Override
public void setLineMarker(List<LatLng> models) {
}
@Override
public void routeResult(List<LatLng> models, int haveArrivedIndex) {
mView.routeResult(models,haveArrivedIndex);
}
}

View File

@@ -10,6 +10,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.lifecycle.LifecycleOwner;
import com.amap.api.maps.model.LatLng;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.mvp.Presenter;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
@@ -19,6 +20,7 @@ import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
import com.mogo.och.common.module.biz.callback.ILoginCallback;
import com.mogo.och.common.module.biz.constant.LoginStatusManager;
import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
import com.mogo.och.taxi.constant.TaxiConst;
import com.mogo.och.taxi.constant.TaxiDriverRoleEnum;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
@@ -314,8 +316,8 @@ public class TaxiPresenter extends Presenter<TaxiFragment> implements ITaxiADASS
}
@Override
public void onNaviToEndAmap(boolean isVoicePlay) {
runOnUIThread( () -> mView.onNaviToEndAmap(isVoicePlay));
public void onNaviToEnd(boolean isAmap, boolean isVoicePlay) {
runOnUIThread( () -> mView.onNaviToEnd(isAmap,isVoicePlay));
}
@Override

View File

@@ -76,7 +76,8 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
protected RelativeLayout mSettingBtn;
protected LinearLayout mBadcaseBtn;
protected LinearLayout mAICollectBtn;
protected TaxiAmapNaviFragment ochNaviFragment = null;
protected TaxiAmapNaviFragment ochAmapNaviFragment = null;
protected TaxiRottingNaviFragment taxiRottingNaviFragment = null;
// protected TaxiTrafficLightView mTrafficLightView;
private Handler mHandler = new Handler(Looper.getMainLooper());
@@ -289,7 +290,7 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
onChangeOperationStatus();
});
mCloseNaviIcon.setOnClickListener(v -> {
showNaviToStationFragment(false);
showAmapNaviToStationFragment(false);
});
}
@@ -562,26 +563,26 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
//todo ui 切换
}
protected void showNaviToStationFragment(boolean isShow) {
protected void showAmapNaviToStationFragment(boolean isShow) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (isShow) {
// if (ochNaviFragment == null){
ochNaviFragment = TaxiAmapNaviFragment.newInstance();
ochAmapNaviFragment = TaxiAmapNaviFragment.newInstance();
// }
if (ochNaviFragment.isAdded()) {
if (ochAmapNaviFragment.isAdded()) {
return;
}
transaction.add(R.id.module_mogo_och_navi_panel_container, ochNaviFragment).show(ochNaviFragment);
transaction.add(R.id.module_mogo_och_navi_panel_container, ochAmapNaviFragment).show(ochAmapNaviFragment);
transaction.commitAllowingStateLoss();
mCloseNaviIcon.setVisibility(View.VISIBLE);
flNaviPanelContainer.setVisibility(View.VISIBLE);
CallerSmpManager.hidePanel();//隐藏小地图
} else {
if (ochNaviFragment != null) {
ochNaviFragment.onDestroy();
transaction.remove(ochNaviFragment);
if (ochAmapNaviFragment != null) {
ochAmapNaviFragment.onDestroy();
transaction.remove(ochAmapNaviFragment);
transaction.commitAllowingStateLoss();
ochNaviFragment = null;
ochAmapNaviFragment = null;
}
mCloseNaviIcon.setVisibility(View.GONE);
flNaviPanelContainer.setVisibility(View.GONE);
@@ -589,5 +590,34 @@ public abstract class BaseTaxiTabFragment<V extends IView, P extends Presenter<V
}
}
protected void showRottingToStationFragment(boolean isShow) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (isShow) {
// if (ochNaviFragment == null){
taxiRottingNaviFragment = TaxiRottingNaviFragment.newInstance();
// }
if (taxiRottingNaviFragment.isAdded()) {
return;
}
transaction.add(R.id.module_mogo_och_navi_panel_container, taxiRottingNaviFragment).show(taxiRottingNaviFragment);
transaction.commitAllowingStateLoss();
mCloseNaviIcon.setVisibility(View.VISIBLE);
flNaviPanelContainer.setVisibility(View.VISIBLE);
CallerSmpManager.hidePanel();//隐藏小地图
} else {
if (taxiRottingNaviFragment != null) {
taxiRottingNaviFragment.onDestroy();
transaction.remove(taxiRottingNaviFragment);
transaction.commitAllowingStateLoss();
taxiRottingNaviFragment = null;
}
mCloseNaviIcon.setVisibility(View.GONE);
flNaviPanelContainer.setVisibility(View.GONE);
CallerSmpManager.showPanel();//显示小地图
}
}
public abstract void startNaviToEndStation(boolean isVoicePlay);
}

View File

@@ -355,7 +355,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement
mNaviStartIcon.setVisibility(View.GONE);
mNaviToEndIcon.setVisibility(View.GONE);
NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
mTaxiFragment.showNaviToStationFragment(false);
mTaxiFragment.showAmapNaviToStationFragment(false);
}
}
@@ -600,7 +600,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement
mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.getCode()){
double orderStartStationLat = mCurrentOrder.startSiteGcjPoint.get(1);
double orderStartStationLng = mCurrentOrder.startSiteGcjPoint.get(0);
mTaxiFragment.showNaviToStationFragment(isShow);
mTaxiFragment.showAmapNaviToStationFragment(isShow);
startNaviToStation(isShow, orderStartStationLat, orderStartStationLng);
}
}
@@ -611,7 +611,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement
* @param isShow
*/
private void showNaviToEndStationFragment(boolean isShow) {
mTaxiFragment.showNaviToStationFragment(isShow);
mTaxiFragment.showAmapNaviToStationFragment(isShow);
mTaxiFragment.startNaviToEndStation(isShow);
}
@@ -663,10 +663,10 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement
public void reInitNaviAmap(boolean isPlay, boolean isRestart) {
CallerLogger.INSTANCE.d(M_TAXI + TAG, "isPlay = " + isPlay + ", isRestart=" + isRestart);
if (!isRestart) {
mTaxiFragment.showNaviToStationFragment(false);
mTaxiFragment.showAmapNaviToStationFragment(false);
return;
}
mTaxiFragment.showNaviToStationFragment(false);
mTaxiFragment.showAmapNaviToStationFragment(false);
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() {

View File

@@ -312,9 +312,13 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
grabOrderFragment.onGrabOrderFailed();
}
public void onNaviToEndAmap(boolean isVoicePlay){
if (null == serverOrdersFragment) return;
serverOrdersFragment.onNaviToEndAmap(isVoicePlay);
public void onNaviToEnd(boolean isAmap , boolean isVoicePlay){
if (isAmap){
if (null == serverOrdersFragment) return;
serverOrdersFragment.onNaviToEndAmap(isVoicePlay);
}else { //使用rotting数据
showRottingToStationFragment(true);
}
}
/**

View File

@@ -40,7 +40,7 @@ import java.util.ArrayList;
import java.util.List;
/**
* 乘客屏小地图
* taxi司机端前往目的地小地图导航
*/
public class TaxiMapDirectionView
extends RelativeLayout
@@ -208,11 +208,14 @@ public class TaxiMapDirectionView
@Override
public void setLineMarker() {
if (mStartMarker != null) {
mStartMarker.setVisible(false);
}
if (mEndMarker != null) {
mEndMarker.setVisible(false);
// if (mStartMarker != null) {
// mStartMarker.setVisible(false);
// }
// if (mEndMarker != null) {
// mEndMarker.setVisible(false);
// }
if (mStartMarker.isVisible() && mStartMarker.isVisible()){
return;
}
if (mCoordinatesLatLng.size() > 2) {
// 设置开始结束Marker位置
@@ -228,6 +231,7 @@ public class TaxiMapDirectionView
@Override
public void drawablePolyline() {
setLineMarker();
if (mPolyline != null) {
mPolyline.remove();
}

View File

@@ -1,30 +1,26 @@
package com.mogo.och.taxi.ui;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import com.amap.api.maps.AMap;
import com.amap.api.maps.model.CustomMapStyleOptions;
import com.amap.api.navi.AMapNaviView;
import com.amap.api.navi.AMapNaviViewListener;
import com.amap.api.navi.AMapNaviViewOptions;
import com.amap.api.navi.model.RouteOverlayOptions;
import com.mogo.eagle.core.utilcode.mogo.MapAssetStyleUtils;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import androidx.annotation.NonNull;
import com.amap.api.maps.model.LatLng;
import com.mogo.commons.mvp.MvpFragment;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.R;
import com.mogo.och.taxi.callback.ITaxiNaviChangedCallback;
import com.mogo.och.taxi.model.NaviToDestinationModel;
import com.mogo.och.taxi.presenter.NaviPresenter;
import java.util.List;
/**
* @author: wangmingjun
* @date: 2021/11/30
*/
public class TaxiRottingNaviFragment extends BaseTaxiUIFragment{
public class TaxiRottingNaviFragment extends MvpFragment<TaxiRottingNaviFragment, NaviPresenter> {
private TaxiMapDirectionView mAMapNaviView;
private final String TAG = TaxiRottingNaviFragment.class.getSimpleName();
private TaxiMapDirectionView mMapDirectionView;
public static TaxiRottingNaviFragment newInstance() {
Bundle args = new Bundle();
@@ -40,15 +36,13 @@ public class TaxiRottingNaviFragment extends BaseTaxiUIFragment{
}
@Override
protected void initViews(View view) {
view.bringToFront();
initMapView(view);
public String getTagName() {
return TAG;
}
private void initMapView(View view) {
mAMapNaviView = view.findViewById(R.id.rotting_navi_view);
@Override
protected void initViews() {
mMapDirectionView = findViewById(R.id.rotting_navi_view);
}
@Override
@@ -59,22 +53,57 @@ public class TaxiRottingNaviFragment extends BaseTaxiUIFragment{
@Override
public void onResume() {
super.onResume();
mAMapNaviView.onResume();
mMapDirectionView.onResume();
}
@Override
public void onPause() {
super.onPause();
mAMapNaviView.onPause();
mMapDirectionView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(false);
if (mAMapNaviView != null){
mAMapNaviView.onDestroy();
if (mMapDirectionView != null){
mMapDirectionView.onDestroy();
}
}
@NonNull
@Override
protected NaviPresenter createPresenter() {
return new NaviPresenter(this);
}
public void routeResult(List<LatLng> latLngList, int haveArrivedIndex){
if (latLngList.size() > 0) {
drawablePolylineByRoute(latLngList,haveArrivedIndex);
} else {
clearPolyline();
}
}
public void drawablePolylineByRoute(List<LatLng> mCoordinatesLatLng,int haveArrivedIndex){
if (mMapDirectionView != null){
mMapDirectionView.setCoordinatesLatLng(mCoordinatesLatLng,haveArrivedIndex);
UiThreadHandler.post(new Runnable() {
@Override
public void run() {
mMapDirectionView.drawablePolyline();
}
});
}
}
private void clearPolyline() {
if (mMapDirectionView != null) {
UiThreadHandler.post(new Runnable() {
@Override
public void run() {
mMapDirectionView.clearPolyline();
}
});
}
}
}

View File

@@ -37,7 +37,7 @@ public class TPRouteDataTestUtils {
builder.setLongitude(s.getDouble("lon"));
list.add(builder.build());
}
TaxiModel.getInstance().updateOrderRoute(list);
// TaxiModel.getInstance().updateOrderRoute(list);
TaxiModel.getInstance().updateOrderRouteInfo(list);
} catch (JSONException e) {
e.printStackTrace();