models) {
+ runOnUIThread(() -> mView.routeResult(models));
+ }
+
+ @Override
+ public void routePlanningToNextStationChanged(long meters, long timeInSecond) {
+ runOnUIThread(() -> mView.updateRoutePlanningToNextStation(meters, timeInSecond));
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusBorderShadowLayout.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusBorderShadowLayout.java
new file mode 100644
index 0000000000..6bde93ce05
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusBorderShadowLayout.java
@@ -0,0 +1,359 @@
+package com.mogo.och.bus.passenger.ui;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.BlurMaskFilter;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.widget.LinearLayout;
+
+import com.mogo.och.bus.passenger.R;
+import com.mogo.och.bus.passenger.utils.DimenUtil;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ * 边框阴影
+ */
+public class BusBorderShadowLayout extends LinearLayout {
+
+
+ private static final String TAG = "ShadowLayout";
+
+ //默认阴影半径
+ public static final float SHADOW_DEFAULT_RADIUS = DimenUtil.INSTANCE.dp2px(5);
+
+ //阴影最大偏移量
+ public static final float SHADOW_MAX_OFFSET = DimenUtil.INSTANCE.dp2px(20);
+
+ //阴影最大模糊半径
+ public static final float SHADOW_MAX_BLUR = DimenUtil.INSTANCE.dp2px(20);
+
+
+
+ //默认模糊半径
+ public static final float SHADOW_DEFAULT_BLUR_RADIUS = DimenUtil.INSTANCE.dp2px(5);
+
+
+ //阴影颜色
+ private int shadowColor = Color.parseColor("#333333");
+
+ //阴影类型,0:默认为单边 1:单边 2:邻边 3:四边所有
+ private int shadowType;
+
+ //阴影半径
+ private float shadowRadius = 0f;
+
+ //模糊度半径
+ private float blurRadius = SHADOW_DEFAULT_BLUR_RADIUS ;
+
+ //水平位移
+ private float xOffset = DimenUtil.INSTANCE.dp2px(10);
+
+
+ //竖直方向位移
+ private float yOffset = DimenUtil.INSTANCE.dp2px(0);
+
+ //背景色
+ private int bgColor = Color.WHITE;
+
+ //是否有点击效果
+ private boolean hasEffect = false ;
+
+
+ int left =0 ,right =0,top = 0,bottom = 0 ;
+
+ //代理方式
+ private IShadow shadow = new BusBorderShadowLayout.ShadowConfig(this);
+
+ private float mWidthMode;
+ private float mHeightMode;
+ private Paint mPaint = new Paint();
+ private Paint locationPaint = new Paint();
+
+ public BusBorderShadowLayout(Context context) {
+ super(context,null);
+ }
+
+ public BusBorderShadowLayout(Context context, AttributeSet attrs) {
+ this(context, attrs,0);
+ }
+
+ public BusBorderShadowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShadowLayout);
+ shadowColor = typedArray.getColor(R.styleable.ShadowLayout_shadowColor, Color.BLUE);
+ blurRadius = typedArray.getDimension(R.styleable.ShadowLayout_blurRadius, SHADOW_DEFAULT_BLUR_RADIUS);
+ shadowRadius = typedArray.getDimension(R.styleable.ShadowLayout_shadowRadius,0);
+ hasEffect = typedArray.getBoolean(R.styleable.ShadowLayout_hasEffect, false);
+ xOffset = typedArray.getDimension(R.styleable.ShadowLayout_xOffset,DimenUtil.INSTANCE.dp2px(10));
+ yOffset = typedArray.getDimension(R.styleable.ShadowLayout_yOffset,DimenUtil.INSTANCE.dp2px(10));
+ bgColor = typedArray.getColor(R.styleable.ShadowLayout_bgColor,Color.WHITE);
+ typedArray.recycle();
+
+ if (shadowRadius<0){
+ shadowRadius = -shadowRadius;
+ }
+ if (blurRadius < 0) {
+ blurRadius = -blurRadius;
+ }
+
+ blurRadius = Math.min(SHADOW_MAX_BLUR,blurRadius);
+
+ if (Math.abs(xOffset)> SHADOW_MAX_OFFSET){
+ xOffset = xOffset/Math.abs(xOffset) * SHADOW_MAX_OFFSET;
+ }
+
+ if (Math.abs(yOffset) > SHADOW_MAX_OFFSET){
+ yOffset = yOffset/Math.abs(yOffset) * SHADOW_MAX_OFFSET;
+ }
+
+ init();
+ }
+
+ private void init(){
+ setBackgroundColor(Color.parseColor("#00ffffff"));
+ if (xOffset>0){
+ //水平偏移量为正数,右侧有阴影,阴影长度为blurRadius+|xOffset|
+ right = (int)(blurRadius + Math.abs(xOffset));
+ }else if (xOffset==0){
+ //水平偏移为0,水平间距为blurRadius
+ left = (int)blurRadius;
+ right = (int)blurRadius;
+ }else {
+ //水平偏移为负数,左侧有阴影,阴影长度为blurRadius+|xOffset|
+ left = (int)(blurRadius + Math.abs(xOffset));
+ }
+ if (yOffset>0){
+ //竖直偏移量为正数,底部有阴影,阴影长度为blurRadius+|yOffset|
+ bottom = (int)(blurRadius + Math.abs(yOffset));
+ }else if (yOffset==0){
+ //竖直偏移量为0,竖直间距为blurRadius
+ top = (int)blurRadius;
+ bottom = (int)blurRadius;
+ }else {
+ //竖直偏移量为负数,顶部有阴影,阴影长度为blurRadius+|yOffset|
+ top = (int)(blurRadius + Math.abs(yOffset));
+ }
+ setPadding(left,top,right,bottom);
+ }
+
+
+
+
+
+ /**
+ * 获取阴影设置
+ * @return 返回阴影设置配置
+ */
+ public IShadow getShadowConfig(){
+ return shadow;
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed,l,t,r,b);
+ }
+
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+ }
+
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ drawBackground(canvas);//放在super前是后景,相反是前景,前景会覆盖子布局
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+
+
+ //绘制背景色(在子view底部)
+ private void drawBackground(Canvas canvas){
+
+ mWidthMode = getMeasuredWidth();
+ mHeightMode = getMeasuredHeight();
+ float startX = 0;
+ float startY = 0;
+ float endX = 0;
+ float endY = 0;
+
+ if (xOffset==0){
+ startX = right;
+ endX = mWidthMode-blurRadius;
+ }else {
+ startX = right+blurRadius;
+ endX = mWidthMode-left-blurRadius;
+ }
+
+ if (yOffset==0){
+ startY = bottom;
+ endY = mHeightMode-blurRadius;
+ }else {
+ startY = bottom+blurRadius;
+ endY = mHeightMode-top-blurRadius;
+ }
+// mPaint.setShadowLayer(blurRadius,0,0,shadowColor);
+ if (blurRadius>0){
+ mPaint.setMaskFilter(new BlurMaskFilter(blurRadius,BlurMaskFilter.Blur.NORMAL));
+ }
+ mPaint.setColor(shadowColor);
+ mPaint.setAntiAlias(true);
+
+ RectF shadowRect = new RectF(startX,startY,endX,endY);
+
+ RectF locationRectF = new RectF(left,top,mWidthMode-right,mHeightMode-bottom);
+ if (shadowRadius==0){
+ //不是圆角
+ canvas.drawRect(shadowRect,mPaint);
+ }else {
+ //圆角,角度为shadowRadius
+ canvas.drawRoundRect(shadowRect,shadowRadius,shadowRadius,mPaint);
+ }
+
+ locationPaint.setColor(bgColor);
+ locationPaint.setAntiAlias(true);
+
+ if (shadowRadius==0){
+ //不是圆角
+ canvas.drawRect(locationRectF,locationPaint);
+ }else {
+ //圆角,角度为shadowRadius
+ canvas.drawRoundRect(locationRectF,shadowRadius,shadowRadius,locationPaint);
+ }
+ }
+
+
+
+ /**
+ * 阴影配置
+ */
+ class ShadowConfig implements IShadow {
+
+ //代理
+ private BusBorderShadowLayout shadow;
+
+ private ShadowConfig(BusBorderShadowLayout shadow) {
+ this.shadow = shadow;
+ }
+
+ @Override
+ public IShadow setShadowRadius(float radius) {
+ return setShadowRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
+ }
+
+ @Override
+ public IShadow setShadowRadius(int unit, float radius) {
+ Context c = getContext();
+ Resources r;
+
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+ shadow.shadowRadius = Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics()));
+ return this;
+ }
+
+ @Override
+ public IShadow setShadowColor(int color) {
+ shadow.shadowColor = color;
+ return this;
+ }
+
+ @Override
+ public IShadow setShadowColorRes(int colorRes) {
+ shadow.shadowColor = shadow.getResources().getColor(colorRes);
+ return this;
+ }
+
+ @Override
+ public IShadow setBlurRadius(float radius) {
+ return setBlurRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
+ }
+
+ @Override
+ public IShadow setBlurRadius(int unit, float radius) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+ shadow.blurRadius = Math.min(SHADOW_MAX_BLUR,Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics())));
+ return this;
+ }
+
+ @Override
+ public IShadow setXOffset(float offset) {
+ return setXOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
+ }
+
+ @Override
+ public IShadow setXOffset(int unit, float offset) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+
+ float x = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
+ if (Math.abs(x)> SHADOW_MAX_OFFSET){
+ x = x/Math.abs(x) * SHADOW_MAX_OFFSET;
+ }
+ shadow.xOffset = x;
+ return this;
+ }
+
+ @Override
+ public IShadow setYOffset(float offset) {
+ return setYOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
+ }
+
+ @Override
+ public IShadow setYOffset(int unit, float offset) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+
+ float y = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
+ if (Math.abs(y)> SHADOW_MAX_OFFSET){
+ y = y/Math.abs(y) * SHADOW_MAX_OFFSET;
+ }
+ shadow.yOffset = y;
+ return this;
+ }
+
+ @Override
+ public void commit() {
+ shadow.init();
+ shadow.requestLayout();
+ shadow.postInvalidate();
+ }
+ }
+
+
+}
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..2de8fb267d
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java
@@ -0,0 +1,142 @@
+package com.mogo.och.bus.passenger.ui;
+
+import android.os.Bundle;
+import android.text.Html;
+import android.view.LayoutInflater;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.map.CallerSmpManager;
+import com.mogo.och.bus.passenger.R;
+import com.mogo.och.bus.passenger.utils.BPDateTimeUtil;
+
+/**
+ * Created on 2022/3/31
+ *
+ * Bus乘客端基础Fragment
+ */
+public abstract class BusPassengerBaseFragment> extends MvpFragment {
+ private static final String TAG = BusPassengerBaseFragment.class.getSimpleName();
+
+ private TextView mCurrentArriveStation;
+ private TextView mCurrentArriveStationTitle;
+ private TextView mCurrentArriveTip;
+ private ImageView mAutopilotIv;
+ private FrameLayout flContainer;
+
+
+ /**
+ * 改变自动驾驶状态
+ *
+ * @param status 2 - running 1 - enable 2 - disable
+ */
+ private int mPrevAPStatus = -1;
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.bus_p_base_fragment;
+ }
+
+ @Override
+ public String getTagName() {
+ return TAG;
+ }
+
+
+ @Override
+ protected void initViews() {
+ //隐藏小地图
+ CallerSmpManager.INSTANCE.hidePanel();
+
+ mCurrentArriveStation = findViewById(R.id.bus_p_cur_station_name);
+ mCurrentArriveStationTitle = findViewById(R.id.bus_p_cur_station_title);
+ mCurrentArriveTip = findViewById(R.id.bus_p_cur_station_tip);
+ mAutopilotIv = findViewById(R.id.bus_p_autopilot_iv);
+
+ showRouteFragment();
+ }
+
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 显示线路信息
+ */
+ public void showRouteFragment() {
+ flContainer = findViewById(R.id.bus_p_route_panel);
+ LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flContainer);
+ }
+
+ public void updateArrivedStation(String station,int currentIndex,boolean isArrived){
+ if (null == station){
+ mCurrentArriveStation.setText("----");
+ }else {
+ mCurrentArriveStation.setText(station);
+ if (currentIndex == 0){
+ mCurrentArriveStationTitle.setText(getResources().getString(R.string.bus_p_cur_station_title_init));
+ mCurrentArriveTip.setText(getResources().getString(R.string.bus_p_cur_station_arrived_tip_init));
+ return;
+ }
+ if (isArrived){
+ mCurrentArriveStationTitle.setText(getResources().getString(R.string.bus_p_cur_station_title));
+ mCurrentArriveTip.setText(getResources().getString(R.string.bus_p_cur_station_arrived_tip));
+ }else {
+ mCurrentArriveStationTitle.setText(getResources().getString(R.string.bus_p_cur_next_station_title));
+ }
+ }
+
+ }
+
+ public void updateRoutePlanningToNextStation(long meters, long timeInSecond){
+ String dis = "0";
+ String disUnit = "公里";
+ if (meters > 0){
+ if (meters / 1000 < 1){
+ disUnit = "米";
+ dis = String.valueOf(Math.round(meters));
+ }else {
+ disUnit = "公里";
+ dis = BPDateTimeUtil.formatLong((double)meters / 1000);
+ }
+ }
+ String strHtml2 = "距离 " + "" + dis + "" + " "+disUnit+""
+ + "   剩余 " + "" + (int)Math.ceil((double)timeInSecond/ 60f) + "" + " 分钟";
+ mCurrentArriveTip.setText(Html.fromHtml(strHtml2));
+ }
+
+ public void onAutopilotStatusChanged(int status) {
+ getActivity().runOnUiThread(() -> {
+ // 3. 其他过程直接更新
+ if (mPrevAPStatus != status){
+ AutopilotStatusChanged(status);
+ }
+ mPrevAPStatus = status;
+ });
+ }
+
+ public void AutopilotStatusChanged(int status) {
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
+ mAutopilotIv.setImageResource(R.drawable.bus_p_auto_nor);
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status){
+ mAutopilotIv.setImageResource(R.drawable.bus_p_un_auto_nor);
+ } else {
+ mAutopilotIv.setImageResource(R.drawable.bus_p_un_auto_nor);
+ }
+
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.java
new file mode 100644
index 0000000000..117e3a3c85
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.java
@@ -0,0 +1,352 @@
+package com.mogo.och.bus.passenger.ui;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+import androidx.annotation.Nullable;
+
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.CameraUpdate;
+import com.amap.api.maps.CameraUpdateFactory;
+import com.amap.api.maps.TextureMapView;
+import com.amap.api.maps.UiSettings;
+import com.amap.api.maps.model.BitmapDescriptorFactory;
+import com.amap.api.maps.model.CameraPosition;
+import com.amap.api.maps.model.CustomMapStyleOptions;
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.maps.model.LatLngBounds;
+import com.amap.api.maps.model.Marker;
+import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.maps.model.Polyline;
+import com.amap.api.maps.model.PolylineOptions;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener;
+import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.bus.passenger.R;
+import com.mogo.och.bus.passenger.callback.IBusPassengerMapViewCallback;
+import com.mogo.och.bus.passenger.utils.BusPassengerMapAssetStyleUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P;
+
+/**
+ * 乘客屏小地图
+ */
+public class BusPassengerMapDirectionView
+ extends RelativeLayout
+ implements IMoGoMapLocationListener, IBusPassengerMapDirectionView, AMap.OnCameraChangeListener {
+
+ //小地图名称
+ public static final String TAG = "TPMapDirectionView";
+
+ private TextureMapView mAMapNaviView;
+ private AMap mAMap;
+ private Marker mCarMarker;
+ private Marker mStartMarker;
+ private Marker mEndMarker;
+
+ private int mCurrentIndex = -1;
+
+ private int zoomLevel = 13;
+ private List mCoordinatesLatLng = new ArrayList<>();
+ private List mLinePointsLatLng = new ArrayList<>();
+ private Polyline mPolyline;
+ private CameraUpdate mCameraUpdate;
+ private Context mContext;
+
+ private List colorList = new ArrayList<>();
+ private List mLineMarkers = new ArrayList<>();
+
+ private IBusPassengerMapViewCallback mIBusPassengerMapViewCallback;
+
+ public BusPassengerMapDirectionView(Context context) {
+ this(context, null);
+ }
+
+ public BusPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public BusPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ try {
+ initView(context);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setTaxiPassengerMapViewCallback(IBusPassengerMapViewCallback iBusPassengerMapViewCallback) {
+ this.mIBusPassengerMapViewCallback = iBusPassengerMapViewCallback;
+ }
+
+ private void initView(Context context) {
+ CallerLogger.INSTANCE.d(M_BUS_P + TAG, "initView");
+
+ mContext = context;
+
+ View smpView = LayoutInflater.from(context).inflate(R.layout.bus_p_map_view, this);
+
+ mAMapNaviView = (TextureMapView) smpView.findViewById(R.id.bus_p_line_amap_view);
+
+ initAMapView();
+
+ // 注册定位监听
+ CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ // 注册定位监听
+ CallerMapLocationListenerManager.INSTANCE.removeListener(TAG);
+ }
+
+ private void initAMapView() {
+// mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel);
+ mAMap = mAMapNaviView.getMap();
+ // 设置导航地图模式,aMap是地图控制器对象。
+ mAMap.setMapType(AMap.MAP_TYPE_NIGHT);
+
+ // 关闭显示实时路况图层,aMap是地图控制器对象。
+ mAMap.setTrafficEnabled(false);
+
+ // 设置 锚点 图标
+ mCarMarker = mAMap.addMarker(new MarkerOptions()
+ .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_car))
+ .anchor(0.5f, 0.5f));
+ mStartMarker = mAMap.addMarker(new MarkerOptions()
+ .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_way_point)));
+ mEndMarker = mAMap.addMarker(new MarkerOptions()
+ .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_end_point)));
+
+ // 加载自定义样式
+ CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(BusPassengerMapAssetStyleUtil.getAssetsStyle(getContext(), "map_style.data"))
+ .setStyleExtraData(BusPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(), "map_style_extra.data"));
+ // 设置自定义样式
+ mAMap.setCustomMapStyle(customMapStyleOptions);
+
+ //设置希望展示的地图缩放级别
+// mAMap.moveCamera(mCameraUpdate);
+
+ // 设置地图的样式
+ UiSettings uiSettings = mAMap.getUiSettings();
+ uiSettings.setZoomControlsEnabled(false);// 地图缩放级别的交换按钮
+ uiSettings.setAllGesturesEnabled(false);// 所有手势
+ uiSettings.setMyLocationButtonEnabled(false); // 显示默认的定位按钮
+ uiSettings.setLogoBottomMargin(-150); //设置Logo下边界距离屏幕底部的边距,设置为负值即可
+
+ mAMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {
+ @Override
+ public void onMapLoaded() {
+ CallerLogger.INSTANCE.d(M_BUS_P + TAG, "smp---onMapLoaded");
+ // 加载自定义样式
+ CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(BusPassengerMapAssetStyleUtil.getAssetsStyle(getContext(), "map_style.data"))
+ .setStyleExtraData(BusPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(), "map_style_extra.data"));
+ // 设置自定义样式
+ mAMap.setCustomMapStyle(customMapStyleOptions);
+ mAMapNaviView.getMap().setPointToCenter(mAMapNaviView.getWidth() / 2, mAMapNaviView.getHeight() / 2);
+ }
+ });
+
+ //设置地图状态的监听接口
+ mAMap.setOnCameraChangeListener(this);
+ }
+
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ return true;
+ }
+
+
+ @Override
+ public void onLocationChanged(@Nullable MogoLocation location, int from) {
+ if (location == null) {
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS_P + TAG, "onCarLocationChanged2 :" + location.getLatitude() + ":" + location.getLongitude());
+ LatLng currentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
+
+ //更新车辆位置
+ if (mCarMarker != null) {
+ CallerLogger.INSTANCE.d(M_BUS_P + TAG, "location.getBearing() = " + location.getBearing());
+ mCarMarker.setRotateAngle(360 - location.getBearing());
+ mCarMarker.setPosition(currentLatLng);
+ mCarMarker.setToTop();
+ }
+
+ if (mLinePointsLatLng.size() > 1){
+ //圈定地图显示范围
+ //存放经纬度
+ LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder();
+ for (int i = 0; i < mLinePointsLatLng.size(); i++) {
+ boundsBuilder.include(mLinePointsLatLng.get(i));
+ }
+ boundsBuilder.include(currentLatLng);
+ //第二个参数为四周留空宽度
+ mAMap.animateCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(),100,100,100,100));
+
+ }else {
+ //设置希望展示的地图缩放级别
+ CameraPosition cameraPosition = new CameraPosition.Builder()
+ .target(mCarMarker.getPosition()).tilt(0).bearing(location.getBearing()).zoom(zoomLevel).build();
+ mAMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
+ }
+ }
+
+ @Override
+ public void drawablePolyline() {
+ clearPolyline();
+ if (mAMap != null) {
+
+ addRouteColorList();
+
+ if (mCoordinatesLatLng.size() > 2) {
+ // 设置开始结束Marker位置
+
+ LatLng startLatLng = mCoordinatesLatLng.get(0);
+ LatLng endLatLng = mCoordinatesLatLng.get(mCoordinatesLatLng.size() - 1);
+
+ mStartMarker.setPosition(startLatLng);
+ mEndMarker.setPosition(endLatLng);
+ mStartMarker.setVisible(true);
+ mEndMarker.setVisible(true);
+
+ //设置线段纹理
+ PolylineOptions polylineOptions = new PolylineOptions();
+ polylineOptions.addAll(mCoordinatesLatLng);
+ polylineOptions.colorValues(colorList);
+ polylineOptions.useGradient(true);
+ polylineOptions.width(10); //线段宽度
+ polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound);
+
+ // 绘制线
+ mPolyline = mAMap.addPolyline(polylineOptions);
+
+ }
+ }
+ }
+
+ /**
+ * 添加画线颜色值
+ */
+ private void addRouteColorList() {
+ for (int i = 0; i < mCoordinatesLatLng.size(); i++) {
+ colorList.add(Color.argb(255, 70, 147, 253));//路线颜色
+ }
+ }
+
+ @Override
+ public void clearPolyline() {
+ if (mPolyline != null) {
+ mPolyline.remove();
+ }
+ if (mStartMarker != null) {
+ mStartMarker.setVisible(false);
+ }
+ if (mEndMarker != null) {
+ mEndMarker.setVisible(false);
+ }
+ }
+
+ public void clearCoordinatesLatLng(){
+ mCoordinatesLatLng.clear();
+ }
+
+ public void onCreateView(Bundle savedInstanceState) {
+ if (mAMapNaviView != null) {
+ mAMapNaviView.onCreate(savedInstanceState);
+ }
+ }
+
+ public void onResume() {
+ if (mAMapNaviView != null) {
+ mAMapNaviView.onResume();
+ }
+ }
+
+ public void onPause() {
+ if (mAMapNaviView != null) {
+ mAMapNaviView.onPause();
+ }
+ mCurrentIndex = -1;
+ }
+
+ public void onDestroy() {
+ if (mAMapNaviView != null) {
+ mAMapNaviView.onDestroy();
+ }
+ mCurrentIndex = -1;
+ }
+
+ public void setCoordinatesLatLng(List latLngs) {
+ mCoordinatesLatLng.clear();
+ mCoordinatesLatLng.addAll(latLngs);
+ }
+
+ public void clearLineMarkers(){
+ for (int i =0; i< mLineMarkers.size();i++){
+ mLineMarkers.get(i).setVisible(false);
+ }
+ mLineMarkers.clear();
+ }
+
+ public void setLineMarkersAndDraw(List lineineLatLngs){
+ clearLineMarkers();
+ for (int i = 0; i < lineineLatLngs.size(); i++) {
+ Marker mWayPointMarker = mAMap.addMarker(new MarkerOptions()
+ .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_way_point)));
+ mLineMarkers.add(mWayPointMarker);
+ }
+ if (mCoordinatesLatLng.size() == 0) {
+ for (int i = 0; i < mLineMarkers.size(); i++) {
+ mLineMarkers.get(i).setPosition(lineineLatLngs.get(i));
+ mLineMarkers.get(i).setVisible(true);
+ }
+ mCurrentIndex = -1;
+ }
+ }
+
+ public void setLinePointMarkerAndDraw(List routeLineLatLngs, int currentIndex) {
+ mLinePointsLatLng.clear();
+ mLinePointsLatLng.addAll(routeLineLatLngs);
+
+ if (mCoordinatesLatLng.size() > 0 && mCurrentIndex != currentIndex) {
+ if (mAMap != null && mLineMarkers.size() > 0) {
+ mCurrentIndex = currentIndex;
+ for (int i = 0; i < mLineMarkers.size(); i++) {
+ if (i != currentIndex && i + 1 != currentIndex) {
+ mLineMarkers.get(i).setPosition(mLinePointsLatLng.get(i));
+ mLineMarkers.get(i).setVisible(true);
+ } else {
+ mLineMarkers.get(i).setVisible(false);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onCameraChange(CameraPosition cameraPosition) {
+ mIBusPassengerMapViewCallback.onCameraChange(cameraPosition.bearing);
+ }
+
+ @Override
+ public void onCameraChangeFinish(CameraPosition cameraPosition) {
+
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java
new file mode 100644
index 0000000000..8a7bf168df
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java
@@ -0,0 +1,285 @@
+package com.mogo.och.bus.passenger.ui;
+
+import android.location.Location;
+import android.os.Bundle;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.RotateAnimation;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.amap.api.maps.model.LatLng;
+import com.mogo.eagle.core.data.app.AppConfigInfo;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.bus.passenger.R;
+import com.mogo.och.bus.passenger.adapter.BusPassengerLineStationsAdapter;
+import com.mogo.och.bus.passenger.bean.BusPassengerStation;
+import com.mogo.och.bus.passenger.callback.IBusPassengerMapViewCallback;
+import com.mogo.och.bus.passenger.presenter.BaseBusPassengerPresenter;
+import com.mogo.och.bus.passenger.utils.BPCoordinateCalculateRouteUtil;
+import com.mogo.och.bus.passenger.utils.BPRouteDataTestUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/4/12
+ */
+public class BusPassengerRouteFragment extends
+ BusPassengerBaseFragment implements IBusPassengerMapViewCallback {
+
+ private final String TAG = "BusPassengerRouteFragment";
+
+ private BusPassengerTrafficLightView mTrafficLightView;
+ private List mStationsList = new ArrayList<>();
+ private List mLinePointsList = new ArrayList<>();
+
+ private TextView mSpeedTv;
+ private ConstraintLayout mNoLineInfoView;
+ private TextView mCarPlateNum;
+ private TextView mLineName;
+ private TextView mOperationTime;
+ private ConstraintLayout mRouteInfoView;
+ private RecyclerView mStationsListRv;
+ private BusPassengerMapDirectionView mMapDirectionView;
+ private ImageView mMapArrowIcon;
+ private RotateAnimation rotateAnimation;
+ private float lastBearing = 0;
+ private BusPassengerLineStationsAdapter mAdapter;
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.bus_p_route_fragment;
+ }
+
+ @NonNull
+ @Override
+ protected BaseBusPassengerPresenter createPresenter() {
+ return new BaseBusPassengerPresenter(this);
+ }
+
+ @Override
+ protected void initViews() {
+ super.initViews();
+ mTrafficLightView = findViewById(R.id.bus_p_traffic_light_view);
+ CallerHmiManager.INSTANCE.setProxyTrafficLightView(mTrafficLightView);
+
+ mSpeedTv = findViewById(R.id.bus_p_speed_tv);
+
+ mNoLineInfoView =findViewById(R.id.bus_p_no_order_data_view);
+
+ mCarPlateNum = findViewById(R.id.bus_p_driver_num_plate_tv);
+ mLineName = findViewById(R.id.bus_p_line_name_tv);
+ mOperationTime = findViewById(R.id.line_operation_time_tv);
+
+ mRouteInfoView = findViewById(R.id.bus_p_line_cl);
+ mStationsListRv = findViewById(R.id.bus_p_line_stations_rl);
+ LinearLayoutManager manager = new LinearLayoutManager(getContext());
+ mStationsListRv.setLayoutManager(manager);
+ mAdapter = new BusPassengerLineStationsAdapter(getContext(), mStationsList);
+ mStationsListRv.setAdapter(mAdapter);
+
+ mMapArrowIcon = findViewById(R.id.bus_p_arrow_nor);
+
+ //测试
+ mSpeedTv.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ BPRouteDataTestUtils.converToRouteData();
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ updateWayPointList(mStationsList,1);
+ }
+ },1000);
+ return false;
+ }
+ });
+ }
+
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ mMapDirectionView = findViewById(R.id.bus_p_line_map_view);
+ mMapDirectionView.onCreateView(savedInstanceState);
+ mMapDirectionView.setTaxiPassengerMapViewCallback(this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mMapDirectionView != null) {
+ mMapDirectionView.onResume();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (mMapDirectionView != null) {
+ mMapDirectionView.onPause();
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mMapDirectionView != null) {
+ mMapDirectionView.onDestroy();
+ }
+ }
+
+ public void routeResult(List latLngList) {
+ CallerLogger.INSTANCE.d(M_BUS_P + TAG, "routeResult:" + latLngList.size());
+ if (latLngList.size() > 0) {
+ drawablePolyline(latLngList);
+ } else {
+ clearPolyline();
+ }
+ }
+
+ /**
+ * 绘制
+ *
+ * @param coordinates
+ */
+ private void drawablePolyline(List coordinates) {
+ if (mMapDirectionView != null) {
+ mMapDirectionView.setCoordinatesLatLng(coordinates);
+ UiThreadHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mMapDirectionView.drawablePolyline();
+ }
+ });
+ }
+ }
+
+ public void clearPolyline() {
+ if (mMapDirectionView != null) {
+ UiThreadHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mMapDirectionView.clearPolyline();
+
+ }
+ });
+ }
+ }
+
+ public void setLineMarkers(List list) {
+ if (mMapDirectionView != null) {
+ UiThreadHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mMapDirectionView.setLineMarkersAndDraw(list);
+
+ }
+ });
+ }
+ }
+
+ public void changeOperationStatus(boolean status) {
+ if (status) {
+ mNoLineInfoView.setVisibility(View.GONE);
+ mRouteInfoView.setVisibility(View.VISIBLE);
+ } else {
+ mNoLineInfoView.setVisibility(View.VISIBLE);
+ mRouteInfoView.setVisibility(View.GONE);
+ }
+ }
+
+ public void updatePlateNum(String plateNum){
+ if ("".equals(plateNum) || null == plateNum) {
+ mCarPlateNum.setText("-- --");
+ }else {
+ mCarPlateNum.setText((plateNum));
+ }
+ }
+
+ public void updateLineInfo(String lineName, String lineDurTime) {
+ mLineName.setText(lineName);
+ mOperationTime.setText(lineDurTime);
+ }
+
+ /**
+ *
+ * @param stations
+ * @param currentStationIndex
+ * @param isArrived 是否到站并离开,true 到达当前站 currentStationIndex 未离开, false 正在前往此站 currentStationIndex
+ */
+ public void updateStationsInfo(List stations, int currentStationIndex,boolean isArrived) {
+ updateArrivedStation(stations.get(currentStationIndex).getName(),currentStationIndex,isArrived);
+ mStationsList.clear();
+ mStationsList.addAll(stations);
+ mAdapter.notifyDataSetChanged();
+
+ if (currentStationIndex == 0 && isArrived){ //到达始发站且并未出发, 恢复站点marker 清楚路径 清空路径点
+ clearPolyline();
+ if (mMapDirectionView != null) mMapDirectionView.clearCoordinatesLatLng();
+ }
+
+ if (stations.size() > 0){
+ updateWayPointList(stations,currentStationIndex);
+ }
+ }
+
+ private void updateWayPointList(List stations,int currentStationIndex) {
+ mLinePointsList.clear();
+ for (int i = 0; i< stations.size(); i++) {//站点集合
+ LatLng latLng = BPCoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(getContext()
+ ,stations.get(i).getLon(),stations.get(i).getLat());// lat,lon
+ mLinePointsList.add(latLng);
+ }
+ setLineMarkers(mLinePointsList);
+
+ if (mMapDirectionView != null) {
+ UiThreadHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mMapDirectionView.setLinePointMarkerAndDraw(mLinePointsList,currentStationIndex);
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onCameraChange(float bearing) {
+ startIvCompass(bearing);
+ }
+
+ /**
+ * 设置指南针旋转
+ *
+ * @param bearing
+ */
+ private void startIvCompass(float bearing) {
+ bearing = 360 - bearing;
+ CallerLogger.INSTANCE.d(M_BUS_P + TAG, "startIvCompass: " + bearing);
+ rotateAnimation = new RotateAnimation(lastBearing, bearing, Animation.RELATIVE_TO_SELF
+ , 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+ rotateAnimation.setFillAfter(true);
+
+ mMapArrowIcon.startAnimation(rotateAnimation);
+ lastBearing = bearing;
+ }
+
+ public void onCarLocationChanged(Location location) {
+ updateSpeedView(location.getSpeed());
+ }
+
+ public void updateSpeedView(float speed){
+ int speedKM = (int) (Math.abs(speed) * 3.6F);
+ mSpeedTv.setText(String.valueOf(speedKM));
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerTrafficLightView.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerTrafficLightView.java
new file mode 100644
index 0000000000..16cda08315
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/BusPassengerTrafficLightView.java
@@ -0,0 +1,157 @@
+package com.mogo.och.bus.passenger.ui;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.bus.passenger.R;
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * bus乘客端:红绿灯view
+ *
+ * Created on 2022/3/14
+ */
+public class BusPassengerTrafficLightView extends IViewTrafficLight {
+
+ private ImageView mLightIconIV;
+ private TextView mLightTimeTV;
+ private int mCurrentLightId;
+
+ public BusPassengerTrafficLightView(@Nullable Context context) {
+ this(context, null, 0);
+ }
+
+ public BusPassengerTrafficLightView(@Nullable Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public BusPassengerTrafficLightView(@Nullable Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context);
+ }
+
+ private void init(Context context) {
+ LayoutInflater.from(context).inflate(R.layout.bus_p_traffic_light_view, this, true);
+ mLightIconIV = findViewById(R.id.bus_p_traffic_light_iv);
+ mLightTimeTV = findViewById(R.id.bus_p_traffic_light_time_tv);
+ }
+
+ /**
+ * 展示红绿灯预警
+ *
+ * @param checkLightId 0-都是默认,1-红,2-黄,3-绿
+ */
+ @Override
+ public void showWarningTrafficLight(int checkLightId) {
+ super.showWarningTrafficLight(checkLightId);
+ mCurrentLightId = checkLightId;
+ updateTrafficLightIcon(checkLightId);
+ }
+
+ /**
+ * 关闭红绿灯预警展示,并重制灯态
+ */
+ @Override
+ public void disableWarningTrafficLight() {
+ super.disableWarningTrafficLight();
+ UiThreadHandler.post(() -> {
+ mCurrentLightId = 0;
+ BusPassengerTrafficLightView.this.setVisibility(GONE);
+ });
+ }
+
+ /**
+ * @param redNum 红灯倒计时
+ * @param yellowNum 黄灯倒计时
+ * @param greenNum 绿灯倒计时
+ */
+ @Override
+ public void changeCountdownTrafficLightNum(int redNum, int yellowNum, int greenNum) {
+ super.changeCountdownTrafficLightNum(redNum, yellowNum, greenNum);
+ switch (mCurrentLightId) {
+ case 1:
+ changeCountdownRed(redNum);
+ break;
+ case 2:
+ changeCountdownYellow(yellowNum);
+ break;
+ case 3:
+ changeCountdownGreen(greenNum);
+ break;
+ default:
+ UiThreadHandler.post(() -> {
+ mLightTimeTV.setText("");
+ });
+ break;
+ }
+ }
+
+ @Override
+ public void changeCountdownRed(int redNum) {
+ super.changeCountdownRed(redNum);
+ UiThreadHandler.post(() -> {
+ if (redNum > 0) {
+ mLightTimeTV.setText(String.valueOf(redNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ @Override
+ public void changeCountdownGreen(int greenNum) {
+ super.changeCountdownGreen(greenNum);
+ UiThreadHandler.post(() -> {
+ if (greenNum > 0) {
+ mLightTimeTV.setText(String.valueOf(greenNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ @Override
+ public void changeCountdownYellow(int yellowNum) {
+ super.changeCountdownYellow(yellowNum);
+ UiThreadHandler.post(() -> {
+ if (yellowNum > 0) {
+ mLightTimeTV.setText(String.valueOf(yellowNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ /**
+ * 更新红绿灯icon
+ *
+ * @param lightId 0-都是默认,1-红,2-黄,3-绿
+ */
+ private void updateTrafficLightIcon(int lightId) {
+ UiThreadHandler.post(() -> {
+ switch (lightId) {
+ case 1:
+ mLightIconIV.setBackgroundResource(R.drawable.bus_p_light_red_nor);
+ BusPassengerTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ case 2:
+ mLightIconIV.setBackgroundResource(R.drawable.bus_p_light_yellow_nor);
+ BusPassengerTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ case 3:
+ mLightIconIV.setBackgroundResource(R.drawable.bus_p_light_green_nor);
+ BusPassengerTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ default:
+ BusPassengerTrafficLightView.this.setVisibility(GONE);
+ break;
+ }
+ });
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/IBusPassengerMapDirectionView.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/IBusPassengerMapDirectionView.java
new file mode 100644
index 0000000000..e3d42204d7
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/IBusPassengerMapDirectionView.java
@@ -0,0 +1,18 @@
+package com.mogo.och.bus.passenger.ui;
+
+/**
+ * @author xiaoyuzhou
+ * @date 2021/6/24 11:33 上午
+ */
+public interface IBusPassengerMapDirectionView {
+
+ /**
+ * 绘制路径线
+ */
+ void drawablePolyline();
+
+ /**
+ * 清除路径线
+ */
+ void clearPolyline();
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/IShadow.kt b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/IShadow.kt
new file mode 100644
index 0000000000..ef5d8fd4eb
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/ui/IShadow.kt
@@ -0,0 +1,65 @@
+package com.mogo.och.bus.passenger.ui
+
+import androidx.annotation.ColorRes
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ */
+interface IShadow {
+ //设置阴影半径
+ fun setShadowRadius(radius:Float):IShadow
+
+ //添加单位设置
+ fun setShadowRadius(unit:Int,radius: Float):IShadow
+
+ //设置应用颜色
+ fun setShadowColor(color:Int):IShadow
+
+ //设置阴影颜色资源文件id
+ fun setShadowColorRes(@ColorRes color: Int):IShadow
+ /**
+ * 设置模糊半径
+ * @param radius
+ */
+ fun setBlurRadius(radius:Float):IShadow
+
+ /**
+ *
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param radius 模糊半径
+ */
+ fun setBlurRadius(unit:Int,radius:Float):IShadow
+
+ /**
+ * 设置水平方向的偏移量
+ * @param offset x轴偏移
+ */
+ fun setXOffset(offset:Float):IShadow
+
+
+ /**
+ * 设置x方向的偏移量,设置单位
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param offset x轴偏移
+ */
+ fun setXOffset(unit:Int,offset:Float):IShadow
+
+ /**
+ * 设置竖直方向的偏移量
+ * @param offset y轴偏移
+ */
+ fun setYOffset(offset:Float):IShadow
+
+ /**
+ * 设置竖直方向的偏移量,带单位
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param offset y轴偏移
+ */
+ fun setYOffset(unit:Int,offset:Float):IShadow
+
+ /**
+ * 更新绘制
+ */
+ fun commit();
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPCoordinateCalculateRouteUtil.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPCoordinateCalculateRouteUtil.java
new file mode 100644
index 0000000000..077db0ec52
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPCoordinateCalculateRouteUtil.java
@@ -0,0 +1,103 @@
+package com.mogo.och.bus.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 com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+
+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_BUS_P;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/3/28
+ */
+public class BPCoordinateCalculateRouteUtil {
+
+ 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, double lon, double lat) {
+ CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext);
+ mCoordinateConverter.from(CoordinateConverter.CoordType.GPS);
+ mCoordinateConverter.coord(new LatLng(lat,lon));
+ LatLng latLng = mCoordinateConverter.convert();
+ return latLng;
+ }
+
+ 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;
+ }
+
+ /**
+ * 简单粗暴 直接比较 todo 需要优化
+ * @param mRoutePoints
+ * @param realLon
+ * @param realLat
+ * @return
+ */
+ public static List getRemainPointListByCompare(List mRoutePoints,double realLon,double realLat) {
+ List latePoints = new ArrayList<>();
+ int currentIndex = 0; //记录疑似点
+ if (mRoutePoints.size() > 0){
+ //基础点
+ LatLng baseLatLng = mRoutePoints.get(0);
+ float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat
+ ,baseLatLng.longitude,baseLatLng.latitude);// lon,lat, prelon, prelat
+
+ for (int i= 1; i < mRoutePoints.size(); i++){
+ LatLng latLng = mRoutePoints.get(i);
+ float diff = CoordinateUtils.calculateLineDistance(realLon,realLat
+ ,latLng.longitude,latLng.latitude);
+ if (baseDiffDis > diff){
+// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- ");
+ baseDiffDis = diff;
+ currentIndex = i;
+ }
+ }
+ Logger.d(M_BUS_P + "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ ");
+ if (currentIndex == mRoutePoints.size()-1){
+ latePoints.add(mRoutePoints.get(currentIndex));
+ }else {
+ latePoints.addAll(mRoutePoints.subList(currentIndex,mRoutePoints.size()-1));
+ }
+ return latePoints;
+ }
+ return latePoints;
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPDateTimeUtil.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPDateTimeUtil.java
new file mode 100644
index 0000000000..2dc37cd2ed
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPDateTimeUtil.java
@@ -0,0 +1,109 @@
+package com.mogo.och.bus.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;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/20
+ */
+public class BPDateTimeUtil {
+
+ public static final String TAXI_HH_mm = "HH:mm";
+ public static final String TAXI_MM_dd = "MM-dd";
+ public static final String TAXI_MM_dd_HH_mm = "MM-dd HH:mm";
+ public static final String TAXI_yyyy_MM_dd = "yyyy-MM-dd";
+ public static final String TAXI_yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
+
+ public static String formatCalendarToString(Calendar calendar, String format){
+ if (calendar == null) return "";
+ try {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.format(calendar.getTime());
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static boolean compareDateIsCurrentDay(Calendar targetCalendar){
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ String currentDay = formatCalendarToString(currentCale, TAXI_yyyy_MM_dd);
+ if (currentDay.equals(formatCalendarToString(targetCalendar, TAXI_yyyy_MM_dd))){
+ return true;
+ }else {
+ return false;
+ }
+ }
+
+ public static Calendar formatLongToCalendar(long time){
+ Calendar calendar = null;
+ try {
+ calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return calendar;
+ }
+ public static String formatLongToString(long time, String format){
+ try {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.format(time);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+ public static String getYMDTime(long time){//格式为 2021.8.21
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ int month = calendar.get(Calendar.MONTH) + 1;
+ return calendar.get(Calendar.YEAR)+"."+month+"."+ calendar.get(Calendar.DAY_OF_MONTH);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ *
+ * @param seconds 60
+ * @return 1 时
+ */
+ public static String secondsToHourStr(long seconds){//秒数转成相应的 小时分钟数
+ if (seconds >= 3600){
+ int hours = (int)seconds/3600;
+ return String.valueOf(hours);
+ }
+ return "";
+ }
+ /**
+ *
+ * @param seconds 60
+ * @return 1 时
+ */
+ public static String secondsToMinuteStr(long seconds){//秒数转成相应的 小时分钟数
+ 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(1, RoundingMode.HALF_UP);
+ double num = bg.doubleValue();
+ if (Math.ceil(num) - num == 0) {
+ return String.valueOf((long) num);
+ }
+ return String.valueOf(num);
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java
new file mode 100644
index 0000000000..1e3f2e5366
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java
@@ -0,0 +1,222 @@
+package com.mogo.och.bus.passenger.utils;
+
+import com.mogo.och.bus.passenger.model.BusPassengerModel;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/4/13
+ */
+public class BPRouteDataTestUtils {
+
+ //13号路口起-13号路口终
+ static String jsonStr ="{\n" +
+ " \"models\": [\n" +
+ " {\n" +
+ " \"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927760268911,\"lon\":116.73512607061035,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927736555187,\"lon\":116.73498243020299,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927135941599,\"lon\":116.73482951462647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199260672670036,\"lon\":116.73468429259535,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199251260349946,\"lon\":116.73453933465,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924691997577,\"lon\":116.7343756435551,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199247953493625,\"lon\":116.73421240809087,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924986849947,\"lon\":116.73400425509712,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199249431152175,\"lon\":116.73378579041055,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199248921305724,\"lon\":116.73357811807278,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925012387371,\"lon\":116.73337650020184,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252270195075,\"lon\":116.73318223781153,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992521615169,\"lon\":116.73298632625203,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925202633083,\"lon\":116.73279582043983,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199261230205735,\"lon\":116.73263403473568,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199327991681926,\"lon\":116.73251962434813,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19944850496711,\"lon\":116.73249661840195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199582026896415,\"lon\":116.73251038561487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199743326352014,\"lon\":116.73253087453938,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199908347167394,\"lon\":116.73255070500186,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200065950595445,\"lon\":116.7325720694418,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20022747460407,\"lon\":116.73259461416663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384057310536,\"lon\":116.73261575018056,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20053849777916,\"lon\":116.73263451936387,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200696919444624,\"lon\":116.7326540541723,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2008524952796,\"lon\":116.7326743511824,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20101429705625,\"lon\":116.73269393580199,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118279997041,\"lon\":116.73271564378308,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201342388452076,\"lon\":116.73273653366076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201476063822355,\"lon\":116.73275292393079,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163479199852,\"lon\":116.73277440686762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181243476041,\"lon\":116.7328052766508,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201991767093304,\"lon\":116.7328453845644,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20215573733484,\"lon\":116.73287624009339,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202313648759784,\"lon\":116.73289887933315,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434745374454,\"lon\":116.7329182210956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253164952098,\"lon\":116.73297539811277,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258043275509,\"lon\":116.73312335324984,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258233576585,\"lon\":116.73331077089557,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20257107560234,\"lon\":116.73351244039137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202561578580514,\"lon\":116.73370176209845,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20256256788661,\"lon\":116.73391325024126,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20255633158834,\"lon\":116.73413195000244,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202543311179575,\"lon\":116.73436614303907,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253067346457,\"lon\":116.73458032609663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20251776111356,\"lon\":116.73477082198242,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202503997557805,\"lon\":116.73498624001282,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20249129260376,\"lon\":116.73518976336872,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247877796589,\"lon\":116.73537786253135,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246651610268,\"lon\":116.73559239130266,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245754388014,\"lon\":116.73574239922202,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20244749208,\"lon\":116.73589674090469,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243806550113,\"lon\":116.73607057284322,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243550556816,\"lon\":116.73628106525871,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243654127756,\"lon\":116.7364949950665,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243738221016,\"lon\":116.7367061649993,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243672476754,\"lon\":116.73691115930336,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243590788176,\"lon\":116.73710722104272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202436434375336,\"lon\":116.73730688607075,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243749821501,\"lon\":116.73750140347998,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243625962803,\"lon\":116.73771330926793,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434515480725,\"lon\":116.73791895606205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024326561388,\"lon\":116.73815206945737,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243092086137,\"lon\":116.73838655528765,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202430876006126,\"lon\":116.73861890759498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242914053177,\"lon\":116.73882029918758,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242843336561,\"lon\":116.73904465495175,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242661219026,\"lon\":116.73922453252953,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426462811076,\"lon\":116.7393708046956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242687134937,\"lon\":116.73954685547025,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242694967377,\"lon\":116.73975021183773,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202424630601236,\"lon\":116.73999740812975,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202422502184625,\"lon\":116.74028266774337,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202419634158936,\"lon\":116.7405942561498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241975959762,\"lon\":116.7409069557092,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241920524113,\"lon\":116.74120156191647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241765540262,\"lon\":116.74149288504978,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241569149764,\"lon\":116.7418080096762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202414529497084,\"lon\":116.74210262897205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241419532155,\"lon\":116.74241767661879,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202413879360954,\"lon\":116.7427571218185,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241287045245,\"lon\":116.7431284691325,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241214965105,\"lon\":116.74343354359334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241141271715,\"lon\":116.7437220210538,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024080520075,\"lon\":116.74399113498052,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202391714280026,\"lon\":116.74427625698272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20238163805639,\"lon\":116.74452083315958,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379293010274,\"lon\":116.74475703837204,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379007817086,\"lon\":116.7449961645494,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20237814181231,\"lon\":116.7452036063558,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202375477619896,\"lon\":116.74539567654291,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2023632396621,\"lon\":116.74555457589031,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20229396554444,\"lon\":116.7456716047369,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20217800547467,\"lon\":116.74574081942625,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202047498095304,\"lon\":116.74573659255675,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20188573786706,\"lon\":116.74571018281719,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201738240263026,\"lon\":116.74568463148606,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20157507049073,\"lon\":116.74565525041498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20137985142042,\"lon\":116.745619970576,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201187335613575,\"lon\":116.74558631350607,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20098251429043,\"lon\":116.74555055587679,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2007748533628,\"lon\":116.74551426934663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20057082986032,\"lon\":116.74547749663195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20036944224329,\"lon\":116.74544156175533,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016365229035,\"lon\":116.74540577510051,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1999958572445,\"lon\":116.74537505807076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19984100521566,\"lon\":116.7453433678602,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1996863960282,\"lon\":116.74529675648621,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19953919567943,\"lon\":116.74525916493474,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19940587189373,\"lon\":116.74523402869453,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19929047792381,\"lon\":116.74518617038383,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922141745155,\"lon\":116.74506912884067,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920798885308,\"lon\":116.744896716334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920912644279,\"lon\":116.74467216715483,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199209186509314,\"lon\":116.74448257515108,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920910709997,\"lon\":116.74430613406223,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992100786082,\"lon\":116.74410888316238,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921081961254,\"lon\":116.74391968819582,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921040855518,\"lon\":116.7437082083402,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921085053439,\"lon\":116.74346931155634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921197237373,\"lon\":116.74325149697013,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921248248983,\"lon\":116.74301103786591,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992139724646,\"lon\":116.74277237066539,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215818352386,\"lon\":116.74253219408898,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216175018876,\"lon\":116.74228853120842,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215970354246,\"lon\":116.74204663206451,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216627492966,\"lon\":116.74183871233049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921789170398,\"lon\":116.74165788334192,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922000138535,\"lon\":116.74144512197054,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199221559127494,\"lon\":116.741249370491,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922287231889,\"lon\":116.7410525810756,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922229019589,\"lon\":116.74085266662037,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992216995901,\"lon\":116.74061957723823,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922263073874,\"lon\":116.74041638149129,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922478093337,\"lon\":116.7402123910757,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199227066091595,\"lon\":116.74003419421553,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199228634241756,\"lon\":116.73985841944678,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922951636012,\"lon\":116.7397079274105,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252095329484,\"lon\":116.73956265582487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199346162997905,\"lon\":116.73944690416265,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199470799628024,\"lon\":116.73941941053417,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19962513314346,\"lon\":116.7394280706812,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199780626058924,\"lon\":116.73944255215424,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199961525343376,\"lon\":116.73945856750177,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016196947193,\"lon\":116.73947572081121,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384479551936,\"lon\":116.7394949225795,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200595083817475,\"lon\":116.73951027963179,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200792203321086,\"lon\":116.73952526850614,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200985930701684,\"lon\":116.73954125209579,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20115978977055,\"lon\":116.73955610094161,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201321019536124,\"lon\":116.7395695239138,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20147117943043,\"lon\":116.7395823299481,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163699848565,\"lon\":116.73959633422596,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20178484338371,\"lon\":116.7396085776486,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201962185646316,\"lon\":116.73962351991214,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021018923927,\"lon\":116.7396354059821,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2022137620686,\"lon\":116.73964348380458,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20232600820075,\"lon\":116.73961190446633,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241090270993,\"lon\":116.73951649703137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245777783807,\"lon\":116.73937664238166,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246906634823,\"lon\":116.73920146119093,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470916682884,\"lon\":116.73898763065634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247034830421,\"lon\":116.73878158418357,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246978204673,\"lon\":116.73857680142473,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247082638905,\"lon\":116.73834517890637,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202471943178196,\"lon\":116.7381047689514,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247131648035,\"lon\":116.73787761484981,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470799473765,\"lon\":116.73766230702478,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247013054322,\"lon\":116.73743619407796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246999515433,\"lon\":116.73724916823292,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247199652478,\"lon\":116.73704888970806,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202473960263525,\"lon\":116.73684083235807,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202474504753205,\"lon\":116.73665462440796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247501354581,\"lon\":116.73650710371837,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246541231906,\"lon\":116.73635807696789,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426768984274,\"lon\":116.73622283382787,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20236638788854,\"lon\":116.73610589402243,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20227106919894,\"lon\":116.73600895001849,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021428343084,\"lon\":116.73596816020945,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20197815580698,\"lon\":116.73594623645097,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181789535303,\"lon\":116.73593148707488,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201667906886954,\"lon\":116.73591743008926,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201505897730755,\"lon\":116.7359002912543,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20135083580946,\"lon\":116.73588579696379,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118617904595,\"lon\":116.73586970398149,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20102374028594,\"lon\":116.73585314703226,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20085554043743,\"lon\":116.73583763953049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20069451888229,\"lon\":116.73582073901778,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200530837344964,\"lon\":116.73580314359012,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2003608457064,\"lon\":116.73578183888779,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20021770046798,\"lon\":116.73575292592922,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20003454701824,\"lon\":116.7357174959358,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19986125116602,\"lon\":116.73569499961796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19969408518737,\"lon\":116.73567725223492,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19955533048882,\"lon\":116.73566375985422,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19943174810538,\"lon\":116.73564927714162,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19933167546824,\"lon\":116.735595995086,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199280357603875,\"lon\":116.73546293260645,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927848361656,\"lon\":116.73531579486274,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19928127892504,\"lon\":116.73505848474375,\"speed\": 0.0\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+
+ //13号路口西-汇源果汁
+// static String jsonStr = "{\"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";
+ public static void converToRouteData(){
+ List list = new ArrayList<>();
+
+ try {
+ JSONObject jsonObject = new JSONObject(jsonStr);
+ 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());
+ }
+ BusPassengerModel.getInstance().updateRoutePoints(list);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java
new file mode 100644
index 0000000000..fb012b4143
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/BusPassengerMapAssetStyleUtil.java
@@ -0,0 +1,61 @@
+package com.mogo.och.bus.passenger.utils;
+
+
+import android.content.Context;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author donghongyu
+ * @date 12/18/20 5:37 PM
+ */
+public class BusPassengerMapAssetStyleUtil {
+
+ public static byte[] getAssetsStyle(Context context,String fileName) {
+ byte[] buffer1 = null;
+ InputStream is1 = null;
+ try {
+ is1 = context.getResources().getAssets().open(fileName); //eg. small_map_style.data
+ int lenght1 = is1.available();
+ buffer1 = new byte[lenght1];
+ is1.read(buffer1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (is1 != null) {
+ is1.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer1;
+ }
+
+
+ public static byte[] getAssetsExtraStyle(Context context, String fileName) {
+ byte[] buffer1 = null;
+ InputStream is1 = null;
+ try {
+ is1 = context.getResources().getAssets().open(fileName); //eg. small_map_style_extra.data
+ int lenght1 = is1.available();
+ buffer1 = new byte[lenght1];
+ is1.read(buffer1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (is1 != null) {
+ is1.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer1;
+ }
+
+
+}
diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/DimenUtil.kt b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/DimenUtil.kt
new file mode 100644
index 0000000000..4ad4e9a2ba
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/utils/DimenUtil.kt
@@ -0,0 +1,13 @@
+package com.mogo.och.bus.passenger.utils
+
+import android.content.res.Resources
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ */
+object DimenUtil{
+ fun dp2px(value:Float):Float{
+ return (0.5f + value * Resources.getSystem().displayMetrics.density)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bg_bus_p_arrived_station.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bg_bus_p_arrived_station.png
new file mode 100644
index 0000000000..f47f628224
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bg_bus_p_arrived_station.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_arrow_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_arrow_nor.png
new file mode 100644
index 0000000000..2964279c96
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_arrow_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_auto_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_auto_nor.png
new file mode 100644
index 0000000000..c9daea21c9
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_auto_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_green_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_green_nor.png
new file mode 100644
index 0000000000..939d5c0214
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_green_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_red_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_red_nor.png
new file mode 100644
index 0000000000..97d774140a
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_red_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_yellow_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_yellow_nor.png
new file mode 100644
index 0000000000..a782062c34
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_light_yellow_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_car.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_car.png
new file mode 100644
index 0000000000..17beb894a6
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_car.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_end_point.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_end_point.png
new file mode 100644
index 0000000000..1e64713481
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_end_point.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_start.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_start.png
new file mode 100644
index 0000000000..22d8f225c2
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_start.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_way_point.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_way_point.png
new file mode 100644
index 0000000000..ff04c01f13
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_map_view_dir_way_point.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_mogo_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_mogo_nor.png
new file mode 100644
index 0000000000..3f938990f6
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_mogo_nor.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/no_order_data.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_no_order_data.png
similarity index 100%
rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/no_order_data.png
rename to OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_no_order_data.png
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_un_auto_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_un_auto_nor.png
new file mode 100644
index 0000000000..528cd4dc66
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-sw320dp-xhdpi/bus_p_un_auto_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bg_bus_p_arrived_station.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bg_bus_p_arrived_station.png
new file mode 100644
index 0000000000..f47f628224
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bg_bus_p_arrived_station.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_arrow_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_arrow_nor.png
new file mode 100644
index 0000000000..2964279c96
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_arrow_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_auto_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_auto_nor.png
new file mode 100644
index 0000000000..c9daea21c9
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_auto_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_green_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_green_nor.png
new file mode 100644
index 0000000000..939d5c0214
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_green_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_red_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_red_nor.png
new file mode 100644
index 0000000000..97d774140a
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_red_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_yellow_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_yellow_nor.png
new file mode 100644
index 0000000000..a782062c34
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_light_yellow_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_car.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_car.png
new file mode 100644
index 0000000000..17beb894a6
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_car.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_view_dir_end_point.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_view_dir_end_point.png
new file mode 100644
index 0000000000..1e64713481
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_view_dir_end_point.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_view_dir_way_point.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_view_dir_way_point.png
new file mode 100644
index 0000000000..ff04c01f13
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_map_view_dir_way_point.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_mogo_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_mogo_nor.png
new file mode 100644
index 0000000000..3f938990f6
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_mogo_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_no_order_data.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_no_order_data.png
new file mode 100644
index 0000000000..0e61996d3f
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_no_order_data.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_un_auto_nor.png b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_un_auto_nor.png
new file mode 100644
index 0000000000..528cd4dc66
Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/main/res/drawable-xhdpi/bus_p_un_auto_nor.png differ
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_end_station_circle.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_end_station_circle.xml
new file mode 100644
index 0000000000..528233f84c
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_end_station_circle.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_end_tag_bg.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_end_tag_bg.xml
new file mode 100644
index 0000000000..ca8ad81fe2
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_end_tag_bg.xml
@@ -0,0 +1,14 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_start_station_circle.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_start_station_circle.xml
new file mode 100644
index 0000000000..97458b6d07
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_start_station_circle.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_start_tag_bg.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_start_tag_bg.xml
new file mode 100644
index 0000000000..7a6d44a4c8
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_start_tag_bg.xml
@@ -0,0 +1,14 @@
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_traffic_light_background.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_traffic_light_background.xml
new file mode 100644
index 0000000000..6382b0256a
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bg_bus_p_traffic_light_background.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_dividing_line_bg.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_dividing_line_bg.xml
new file mode 100644
index 0000000000..d5d41809d0
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_dividing_line_bg.xml
@@ -0,0 +1,12 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_route_bg.xml b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_route_bg.xml
new file mode 100644
index 0000000000..73fbe1f005
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/drawable/bus_p_route_bg.xml
@@ -0,0 +1,12 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
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..d60bc0ae92
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_map_view.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_map_view.xml
new file mode 100644
index 0000000000..d9fadd6ef5
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_map_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_no_data_common_view.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_no_data_common_view.xml
new file mode 100644
index 0000000000..c0174fc191
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_no_data_common_view.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml
new file mode 100644
index 0000000000..dc85f5d3b6
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_route_fragment.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml
new file mode 100644
index 0000000000..3468664cc3
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_end_item.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml
new file mode 100644
index 0000000000..85018cff68
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_middle_item.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml
new file mode 100644
index 0000000000..73d61aa690
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_stations_start_item.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_traffic_light_view.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_traffic_light_view.xml
new file mode 100644
index 0000000000..e62c37454f
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_traffic_light_view.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml b/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml
new file mode 100644
index 0000000000..a1fc427a76
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/values-sw320dp/dimens.xml
@@ -0,0 +1,55 @@
+
+
+ 700px
+ 40px
+ 40px
+ 40px
+ 110px
+ 224px
+ 510px
+ 3px
+
+ 158px
+ 90px
+ 45px
+ 158px
+ 90px
+ 45px
+ 90px
+ 90px
+ 3px
+
+ 224px
+ 50px
+ 50px
+ 44px
+ 130px
+ 38px
+
+ 36px
+
+ 110px
+ 42px
+
+ 4px
+ 10px
+ 20px
+ 60px
+ 30px
+ 20px
+ 50px
+ 6px
+ 50px
+ 36px
+ 80px
+ 100px
+ 50px
+ 6px
+
+ 638px
+ 316px
+ 50px
+ 44px
+ 55px
+ 40px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/attrs.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000..c2af65cc03
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/values/attrs.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/colors.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..06035c5d4b
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/values/colors.xml
@@ -0,0 +1,29 @@
+
+
+ #2D3E5F
+ #CCE9EFFC
+ #C7D2E1
+ #2D3E5F
+ #0043FF
+ #2D3E5F
+ #596A8A
+ #D8E5F8
+ #FFB327
+ #2D3E5F
+ #0043FF
+ #276AFE
+ #0043FF
+ #276AFE
+ #FFC125
+ #FF8131
+ #31BFF2
+ #3257E9
+ #FFFFFF
+ #CDDBF6
+ #2D3E5F
+ #0043FF
+ #2D3E5F
+ #E6E9EFFC
+ #33394C63
+ #2D3E5F
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..bb114661c1
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/values/dimens.xml
@@ -0,0 +1,56 @@
+
+
+ 700px
+ 40px
+ 40px
+ 40px
+ 40px
+ 110px
+ 224px
+ 510px
+ 3px
+
+ 158px
+ 90px
+ 45px
+ 158px
+ 90px
+ 45px
+ 90px
+ 90px
+ 3px
+
+ 224px
+ 50px
+ 50px
+ 44px
+ 130px
+ 38px
+
+ 36px
+
+ 110px
+ 42px
+
+ 4px
+ 10px
+ 20px
+ 60px
+ 30px
+ 20px
+ 50px
+ 6px
+ 50px
+ 36px
+ 80px
+ 100px
+ 50px
+ 6px
+
+ 638px
+ 316px
+ 50px
+ 44px
+ 55px
+ 40px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..d142ef29fc
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/main/res/values/strings.xml
@@ -0,0 +1,12 @@
+
+
+ KM/H
+ 您已收车
+ 起
+ 终
+ 到达站:
+ 下一站:
+ 始发站:
+ 请携带好随身物品下车。
+ 欢迎乘坐蘑菇车联无人驾驶车。
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus-passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java b/OCH/mogo-och-bus-passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java
new file mode 100644
index 0000000000..a0652d588f
--- /dev/null
+++ b/OCH/mogo-och-bus-passenger/src/test/java/com/mogo/och/bus/passenger/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.mogo.och.bus.passenger;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/AndroidManifest.xml b/OCH/mogo-och-bus/src/main/AndroidManifest.xml
index b0136c57cc..0e09e1a997 100644
--- a/OCH/mogo-och-bus/src/main/AndroidManifest.xml
+++ b/OCH/mogo-och-bus/src/main/AndroidManifest.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java
new file mode 100644
index 0000000000..02a9fc3d55
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/BusProvider.java
@@ -0,0 +1,115 @@
+package com.mogo.och.bus;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.MogoMapUIController;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.bus.constant.BusConst;
+import com.mogo.och.bus.fragment.BusFragment;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * 网约车小巴业务实现入口
+ *
+ * @author tongchenfei
+ */
+@Route(path = BusConst.PATH)
+public class BusProvider implements IMogoOCH {
+
+ private static final String TAG = "BusProvider";
+
+ private BusFragment busFragment;
+ private int containerId;
+ private FragmentActivity activity;
+
+ /**
+ * 进入鹰眼模式,设置手势缩放地图失效
+ */
+ private void stepIntoVrMode(){
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "进入vr模式" );
+ MogoMapUIController.getInstance()
+ .stepInVrMode(false);
+ }
+
+ @Override
+ public void init(Context context) {
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus"
+ , StatusDescriptor.VR_MODE, statusChangedListener);
+ }
+
+ private void showFragment() {
+ if (busFragment == null) {
+ CallerLogger.INSTANCE.d(TAG, "准备add fragment======");
+ busFragment = new BusFragment();
+ activity.getSupportFragmentManager().beginTransaction().add(containerId, busFragment).commitAllowingStateLoss();
+ return;
+ }
+ CallerLogger.INSTANCE.d(TAG, "准备show fragment");
+ activity.getSupportFragmentManager().beginTransaction().show(busFragment).commitAllowingStateLoss();
+ }
+
+ private void hideFragment() {
+ if (busFragment != null) {
+ CallerLogger.INSTANCE.d(TAG, "准备hide fragment");
+ activity.getSupportFragmentManager().beginTransaction().hide(busFragment).commitAllowingStateLoss();
+ }
+
+ }
+
+ private final IMogoStatusChangedListener statusChangedListener = (descriptor, isTrue) -> {
+ if (descriptor == StatusDescriptor.VR_MODE) {
+ // 进入vr模式默认显示网约车小巴fragment
+ if (isTrue) {
+ showFragment();
+ } else {
+ hideFragment();
+ }
+ } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
+ // topView进行展示时推出网约车界面,但是不隐藏整个fragment
+ if (busFragment != null && isTrue) {
+ busFragment.hideOchBus();
+ }
+ }
+ };
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
+
+ this.containerId = integer;
+ this.activity = fragmentActivity;
+
+// UiThreadHandler.postDelayed(this::stepIntoVrMode, 5_000L );
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+ //若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠
+ if (activity == null) return;
+ activity.finish();
+ }
+}
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
deleted file mode 100644
index 0571097163..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.mogo.och.bus;
-
-import android.content.Context;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-
-import com.alibaba.android.arouter.facade.annotation.Route;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.och.bus.constant.OchBusConst;
-import com.mogo.och.bus.fragment.OchBusFragment;
-import com.mogo.service.statusmanager.IMogoStatusChangedListener;
-import com.mogo.service.statusmanager.StatusDescriptor;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * 网约车小巴业务实现入口
- *
- * @author tongchenfei
- */
-@Route(path = OchBusConst.PATH)
-public class OchBusProvider implements IMogoOCH {
-
- private static final String TAG = "OchBusProvider";
-
- private OchBusFragment busFragment;
- private int containerId;
- private FragmentActivity activity;
-
- /**
- * 进入鹰眼模式,设置手势缩放地图失效
- */
- private void stepIntoVrMode(){
- Logger.d( TAG, "进入vr模式" );
- MogoApisHandler.getInstance()
- .getApis()
- .getMapServiceApi()
- .getMapUIController()
- .openVrMode(false);
- }
-
- @Override
- 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() {
- if (busFragment == null) {
- Logger.d(TAG, "准备add fragment======");
- busFragment = new OchBusFragment();
- activity.getSupportFragmentManager().beginTransaction().add(containerId, busFragment).commitAllowingStateLoss();
- return;
- }
- Logger.d(TAG, "准备show fragment");
- activity.getSupportFragmentManager().beginTransaction().show(busFragment).commitAllowingStateLoss();
- }
-
- private void hideFragment() {
- if (busFragment != null) {
- Logger.d(TAG, "准备hide fragment");
- activity.getSupportFragmentManager().beginTransaction().hide(busFragment).commitAllowingStateLoss();
- }
-
- }
-
- private final IMogoStatusChangedListener statusChangedListener = (descriptor, isTrue) -> {
- if (descriptor == StatusDescriptor.VR_MODE) {
- // 进入vr模式默认显示网约车小巴fragment
- if (isTrue) {
- showFragment();
- } else {
- hideFragment();
- }
- } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()
- && descriptor == StatusDescriptor.TOP_VIEW) {
- // topView进行展示时推出网约车界面,但是不隐藏整个fragment
- if (busFragment != null && isTrue) {
- busFragment.hideOchBus();
- }
- }
- };
-
- @Override
- public void createCoverage(FragmentActivity activity, int containerId) {
-
- }
-
- @NotNull
- @Override
- public String getFunctionName() {
- return null;
- }
-
- @Nullable
- @Override
- public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
-
- this.containerId = integer;
- this.activity = fragmentActivity;
-
- UiThreadHandler.postDelayed(this::stepIntoVrMode, 5_000L );
- return null;
- }
-
- @Override
- public void onDestroy() {
-
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java
deleted file mode 100644
index abaf285126..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package com.mogo.och.bus.adapter;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.mogo.och.bus.R;
-import com.mogo.och.bus.bean.OchBusStation;
-import com.mogo.och.bus.constant.OchBusConst;
-import com.mogo.och.bus.view.VerticalDashLineView;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Station Panel 中的车站列表adapter
- *
- * @author tongchenfei
- */
-public class OchBusStationAdapter extends RecyclerView.Adapter {
- private final Context context;
- private final List stationList = new ArrayList<>();
- private int currentStation;
-
- public OchBusStationAdapter(Context context) {
- this.context = context;
- }
-
- public void refreshStationList(List stationList) {
- this.stationList.clear();
- this.stationList.addAll(stationList);
- for (int i = 0; i < stationList.size(); i++) {
- OchBusStation station = stationList.get(i);
- if (station.getDrivingStatus() == OchBusConst.STATION_STATUS_ARRIVING || station.getDrivingStatus() == OchBusConst.STATION_STATUS_STOPPED ) {
- currentStation = i;
- break;
- }
- }
- notifyDataSetChanged();
- }
-
- @NonNull
- @Override
- public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_och_bus_station, parent, false));
- }
-
- @Override
- public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
-// Logger.d("OchBusStationAdapter", "position: " + position + " currPos: " + currentStation + " station: " + stationList.get(position));
- holder.tvStationName.setText(stationList.get(position).getName());
- if (position == currentStation) {
- if (currentStation == 0) {
- // 在起始点
- holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_arrived_station_name_text_color));
- holder.ivIcon.setImageResource(R.drawable.bus_icon_arrived_station);
- holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
- } else {
- holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_current_station_name_text_color));
- holder.ivIcon.setImageResource(R.drawable.bus_icon_arriving_station);
- holder.vDashTop.setGradient(context.getResources().getColor(R.color.bus_arriving_start_dash_color), context.getResources().getColor(R.color.bus_arriving_end_dash_color));
- holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
- }
- } else if (position < currentStation) {
- // 驶过
- holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_arrived_station_name_text_color));
- holder.ivIcon.setImageResource(R.drawable.bus_icon_arrived_station);
- if (position == currentStation - 1) {
- holder.vDashBottom.setGradient(context.getResources().getColor(R.color.bus_leaving_start_dash_color), context.getResources().getColor(R.color.bus_leaving_end_dash_color));
- holder.vDashTop.setColor(context.getResources().getColor(R.color.bus_arrived_dash_color));
- } else {
- holder.vDashTop.setColor(context.getResources().getColor(R.color.bus_arrived_dash_color));
- holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_arrived_dash_color));
- }
- } else {
- holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_not_arrive_station_name_text_color));
- holder.ivIcon.setImageResource(R.drawable.bus_icon_not_arrive_station);
- holder.vDashTop.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
- holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
- }
-
- if (position == 0) {
- holder.tvStationNotice.setText("起点");
- holder.tvStationNotice.setVisibility(View.VISIBLE);
- holder.vDashTop.setVisibility(View.GONE);
- holder.vDashBottom.setVisibility(View.VISIBLE);
- } else if (position == getItemCount() - 1) {
- holder.tvStationNotice.setText("终点");
- holder.tvStationNotice.setVisibility(View.VISIBLE);
- holder.vDashTop.setVisibility(View.VISIBLE);
- holder.vDashBottom.setVisibility(View.GONE);
- } else {
- holder.tvStationNotice.setVisibility(View.GONE);
- holder.vDashTop.setVisibility(View.VISIBLE);
- holder.vDashBottom.setVisibility(View.VISIBLE);
-
- }
-
- }
-
- @Override
- public int getItemCount() {
- return stationList.size();
- }
-
- static class ViewHolder extends RecyclerView.ViewHolder {
- ImageView ivIcon;
- TextView tvStationName;
- TextView tvStationNotice;
- VerticalDashLineView vDashBottom, vDashTop;
-
- public ViewHolder(@NonNull View itemView) {
- super(itemView);
- ivIcon = itemView.findViewById(R.id.module_mogo_och_bus_station_icon);
- tvStationName = itemView.findViewById(R.id.module_mogo_och_bus_station_name);
- tvStationNotice = itemView.findViewById(R.id.module_mogo_och_bus_station_notice);
- vDashTop = itemView.findViewById(R.id.module_mogo_och_bus_station_top_dash);
- vDashBottom = itemView.findViewById(R.id.module_mogo_och_bus_station_bottom_dash);
- }
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusRequest.java
new file mode 100644
index 0000000000..0ab375e2d4
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusRequest.java
@@ -0,0 +1,43 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+class BusOperationStatusRequest {
+
+ private String sn;
+ private double lat;
+ private double lon;
+ public BusOperationStatusRequest(double lon, double lat) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lat = lat;
+ this.lon = lon;
+ }
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java
new file mode 100644
index 0000000000..744fbac9c5
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOperationStatusResponse.java
@@ -0,0 +1,20 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态返回参数
+ */
+public class BusOperationStatusResponse extends BaseData {
+
+ public Result data;
+
+ public static class Result {
+
+ public int serviceStatus;//0:已收车,1:已出车
+
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOrderBean.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOrderBean.java
new file mode 100644
index 0000000000..85c3a1da58
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOrderBean.java
@@ -0,0 +1,86 @@
+package com.mogo.och.bus.bean;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 小巴订单
+ */
+public class BusOrderBean {
+
+ /**
+ * orderNo number
+ * passengerPhone string 下单用户电话
+ * startStationId integer 开始站点
+ * startStationName string
+ * endStationId integer 结束站点
+ * endStationName string
+ */
+
+ private String orderNo;
+ private String passengerPhone;
+ private int startStationId;//乘客上车点
+ private String startStationName;
+ private String endStationName;
+ private int endStationId;//乘客下车点
+
+ public void setOrderNo(String orderNo) {
+ this.orderNo = orderNo;
+ }
+
+ public void setPassengerPhone(String passengerPhone) {
+ this.passengerPhone = passengerPhone;
+ }
+
+ public void setStartStationId(int startStationId) {
+ this.startStationId = startStationId;
+ }
+
+ public void setStartStationName(String startStationName) {
+ this.startStationName = startStationName;
+ }
+
+ public void setEndStationName(String endStationName) {
+ this.endStationName = endStationName;
+ }
+
+ public void setEndStationId(int endStationId) {
+ this.endStationId = endStationId;
+ }
+
+ public String getOrderNo() {
+ return orderNo;
+ }
+
+ public String getPassengerPhone() {
+ return passengerPhone;
+ }
+
+ public int getStartStationId() {
+ return startStationId;
+ }
+
+ public String getStartStationName() {
+ return startStationName;
+ }
+
+ public String getEndStationName() {
+ return endStationName;
+ }
+
+ public int getEndStationId() {
+ return endStationId;
+ }
+
+ @Override
+ public String toString() {
+ return "BusOrderBean{" +
+ "orderNo=" + orderNo +
+ ", passengerPhone='" + passengerPhone + '\'' +
+ ", startStationId=" + startStationId +
+ ", startStationName='" + startStationName + '\'' +
+ ", endStationName='" + endStationName + '\'' +
+ ", endStationId=" + endStationId +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOrdersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOrdersResponse.java
new file mode 100644
index 0000000000..2215a298a5
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusOrdersResponse.java
@@ -0,0 +1,23 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/19
+ */
+public class BusOrdersResponse extends BaseData {
+ public Result data;
+ public static class Result{
+ public List orders;
+ }
+
+ @Override
+ public String toString() {
+ return "BusOrdersResponse{" +
+ "data=" + data +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java
new file mode 100644
index 0000000000..6485027084
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusQueryLineStationsRequest.java
@@ -0,0 +1,63 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 根据车机行驶线路站点信息
+ */
+class BusQueryLineStationsRequest {
+
+ private String sn;
+ private double lat;
+ private double lon;
+ private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus
+ // 0 - 关闭、1 - 启动
+// public String status;
+ public BusQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lat = lat;
+ this.lon = lon;
+ this.markDrivingStatus = markDrivingStatus;
+ }
+
+ public boolean isMarkDrivingStatus() {
+ return markDrivingStatus;
+ }
+
+ public void setMarkDrivingStatus(boolean markDrivingStatus) {
+ this.markDrivingStatus = markDrivingStatus;
+ }
+
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+ // public BusOperationStatusRequest shutdown() {
+// status = "0";
+// return this;
+// }
+//
+// public BusOperationStatusRequest launch() {
+// status = "1";
+// return this;
+// }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java
new file mode 100644
index 0000000000..c27264694f
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusResetDrivingLineRequest.java
@@ -0,0 +1,18 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/18
+ */
+public class BusResetDrivingLineRequest {
+ public String sn;
+ public int lineId; //切换到的线路id
+
+ public BusResetDrivingLineRequest(int lineId) {
+ sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lineId = lineId;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResponse.java
new file mode 100644
index 0000000000..2c9bad3e3c
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResponse.java
@@ -0,0 +1,27 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * 网约车小巴路线接口请求响应结果
+ *
+ * @author tongchenfei
+ */
+public class BusRoutesResponse extends BaseData {
+ private BusRoutesResult data;
+
+ public BusRoutesResult getResult() {
+ return data;
+ }
+
+ public void setResult(BusRoutesResult data) {
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return "BusRoutesResponse{" +
+ "data=" + data +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java
new file mode 100644
index 0000000000..3a99d5d57e
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusRoutesResult.java
@@ -0,0 +1,45 @@
+package com.mogo.och.bus.bean;
+
+import java.util.List;
+
+/**
+ * 网约车小巴路线接口返回接口数据封装
+ *
+ * @author tongchenfei
+ */
+public class BusRoutesResult {
+ private List sites;
+ private int lineId;
+ private String name;
+ private int lineType; //线路类型,0:环形
+ private String description;
+ private int status;
+
+ public int getLineId() {
+ return lineId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getSites() {
+ return sites;
+ }
+
+ public void setSite(List site) {
+ this.sites = sites;
+ }
+
+ @Override
+ public String toString() {
+ return "BusRoutesResult{" +
+ "sites=" + sites +
+ ", lineId=" + lineId +
+ ", name='" + name + '\'' +
+ ", lineType=" + lineType +
+ ", description='" + description + '\'' +
+ ", status=" + status +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusStationBean.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusStationBean.java
new file mode 100644
index 0000000000..4e8b00eb18
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusStationBean.java
@@ -0,0 +1,152 @@
+package com.mogo.och.bus.bean;
+
+/**
+ * 单个网约车小巴车站信息
+ *
+ * @author tongchenfei
+ */
+public class BusStationBean {
+// private int lineId;
+// private int siteId;
+// private String siteName;
+// private String cityCode;
+// private String areaCode;
+// private String areaName;
+// private double lat;
+// private double lon;
+// private String siteDesc;
+// private int siteState;
+// private int isCurrentSite;// @see OchBusConst 是否是当前站 1:是 2:下一站 0:普通站
+// private int siteColor;
+// private String peoples;
+// private int ifStop; // 是否需要停靠、1需要、0不需要
+
+
+ private String name;
+ private String description;
+ private String cityCode;
+ private double lon; //高精坐标
+ private double lat; //高精坐标
+ private int businessType; //站点类型,9:taxi,10:bus
+ private int status;
+ private int siteId;
+ private int seq;
+ private int drivingStatus;//行驶信息,0初始值;1已经过;2当前站;3未到站
+ private int ifStop = 1; // 是否需要停靠、1需要、0不需要 // TODO: 2021/10/19 原来站点里有设计是否需要停靠字段,现设计暂无,默认都需要停靠
+ private boolean leaving;
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setCityCode(String cityCode) {
+ this.cityCode = cityCode;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setBusinessType(int businessType) {
+ this.businessType = businessType;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public void setSiteId(int siteId) {
+ this.siteId = siteId;
+ }
+
+ public void setSeq(int seq) {
+ this.seq = seq;
+ }
+
+ public void setDrivingStatus(int drivingStatus) {
+ this.drivingStatus = drivingStatus;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getCityCode() {
+ return cityCode;
+ }
+
+
+ public int getBusinessType() {
+ return businessType;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public int getSiteId() {
+ return siteId;
+ }
+
+ public int getSeq() {
+ return seq;
+ }
+
+ public int getDrivingStatus() {
+ return drivingStatus;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public void setIfStop(int ifStop) {
+ this.ifStop = ifStop;
+ }
+
+ public int getIfStop() {
+ return ifStop;
+ }
+
+ public void setLeaving(boolean leaving) {
+ this.leaving = leaving;
+ }
+
+ public boolean isLeaving() {
+ return leaving;
+ }
+
+ @Override
+ public String toString() {
+ return "BusStationBean{" +
+ "name='" + name + '\'' +
+ ", description='" + description + '\'' +
+ ", cityCode='" + cityCode + '\'' +
+ ", lon=" + lon +
+ ", lat=" + lat +
+ ", businessType=" + businessType +
+ ", status=" + status +
+ ", siteId=" + siteId +
+ ", seq=" + seq +
+ ", drivingStatus=" + drivingStatus +
+ ", ifStop=" + ifStop +
+ ", leaving=" + leaving +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java
new file mode 100644
index 0000000000..a9552157ff
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java
@@ -0,0 +1,27 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+public class BusUpdateSiteStatusRequest {
+
+ public String sn;
+ public int seq;//站点序号
+ public int siteId;//站点id
+ public double lon;
+ public double lat;
+
+ public BusUpdateSiteStatusRequest(int seq, int siteId, double lon, double lat) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.seq = seq;
+ this.siteId = siteId;
+ this.lon = lon;
+ this.lat = lat;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java
index c85a2d0b82..dcacb5e380 100644
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java
@@ -1,6 +1,6 @@
package com.mogo.och.bus.bean;
-import com.mogo.och.bus.constant.OchBusConst;
+import com.mogo.och.bus.constant.BusConst;
import java.util.UUID;
@@ -21,6 +21,6 @@ public class CarHeartbeatReqBean {
this.lon = lon;
this.lat = lat;
this.msgId = UUID.randomUUID().toString();
- this.interval = (int) (OchBusConst.LOOP_PERIOD_60S / 1000);
+ this.interval = (int) (BusConst.LOOP_PERIOD_60S / 1000);
}
}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusRequest.java
deleted file mode 100644
index fcc762be44..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusRequest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.commons.network.Utils;
-
-public
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态请求参数
- */
-class OchBusOperationStatusRequest {
-
- private String sn;
- private double lat;
- private double lon;
- public OchBusOperationStatusRequest(double lon, double lat) {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.lat = lat;
- this.lon = lon;
- }
- public void setLat(double lat) {
- this.lat = lat;
- }
-
- public void setLon(double lon) {
- this.lon = lon;
- }
-
- public String getSn() {
- return sn;
- }
-
- public double getLat() {
- return lat;
- }
-
- public double getLon() {
- return lon;
- }
-
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusResponse.java
deleted file mode 100644
index fd60cc3b4d..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusResponse.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态返回参数
- */
-public class OchBusOperationStatusResponse extends BaseData {
-
- public Result data;
-
- public static class Result {
-
- public int serviceStatus;//0:已收车,1:已出车
-
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrder.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrder.java
deleted file mode 100644
index 1e509dfccf..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrder.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.mogo.och.bus.bean;
-
-/**
- * @author congtaowang
- * @since 2021/3/23
- *
- * 小巴订单
- */
-public class OchBusOrder {
-
- /**
- * orderId number
- * passengerPhone string 下单用户电话
- * startStationId integer 开始站点
- * startStationName string
- * endStationId integer 结束站点
- * endStationName string
- */
-
- private long orderId;
- private String passengerPhone;
- private int startStationId;//乘客上车点
- private String startStationName;
- private String endStationName;
- private int endStationId;//乘客下车点
-
- public void setOrderId(long orderId) {
- this.orderId = orderId;
- }
-
- public void setPassengerPhone(String passengerPhone) {
- this.passengerPhone = passengerPhone;
- }
-
- public void setStartStationId(int startStationId) {
- this.startStationId = startStationId;
- }
-
- public void setStartStationName(String startStationName) {
- this.startStationName = startStationName;
- }
-
- public void setEndStationName(String endStationName) {
- this.endStationName = endStationName;
- }
-
- public void setEndStationId(int endStationId) {
- this.endStationId = endStationId;
- }
-
- public long getOrderId() {
- return orderId;
- }
-
- public String getPassengerPhone() {
- return passengerPhone;
- }
-
- public int getStartStationId() {
- return startStationId;
- }
-
- public String getStartStationName() {
- return startStationName;
- }
-
- public String getEndStationName() {
- return endStationName;
- }
-
- public int getEndStationId() {
- return endStationId;
- }
-
- @Override
- public String toString() {
- return "OchBusOrder{" +
- "orderId=" + orderId +
- ", passengerPhone='" + passengerPhone + '\'' +
- ", startStationId=" + startStationId +
- ", startStationName='" + startStationName + '\'' +
- ", endStationName='" + endStationName + '\'' +
- ", endStationId=" + endStationId +
- '}';
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrdersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrdersResponse.java
deleted file mode 100644
index 252858472b..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrdersResponse.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/19
- */
-public class OchBusOrdersResponse extends BaseData {
- public Result data;
- public static class Result{
- public List orders;
- }
-
- @Override
- public String toString() {
- return "OchBusOrdersResponse{" +
- "data=" + data +
- '}';
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusQueryLineStationsRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusQueryLineStationsRequest.java
deleted file mode 100644
index fdd0d7461e..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusQueryLineStationsRequest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-
-public
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 根据车机行驶线路站点信息
- */
-class OchBusQueryLineStationsRequest {
-
- private String sn;
- private double lat;
- private double lon;
- private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus
- // 0 - 关闭、1 - 启动
-// public String status;
- public OchBusQueryLineStationsRequest(double lon, double lat,boolean markDrivingStatus) {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.lat = lat;
- this.lon = lon;
- this.markDrivingStatus = markDrivingStatus;
- }
-
- public boolean isMarkDrivingStatus() {
- return markDrivingStatus;
- }
-
- public void setMarkDrivingStatus(boolean markDrivingStatus) {
- this.markDrivingStatus = markDrivingStatus;
- }
-
- public void setLat(double lat) {
- this.lat = lat;
- }
-
- public void setLon(double lon) {
- this.lon = lon;
- }
-
- public String getSn() {
- return sn;
- }
-
- public double getLat() {
- return lat;
- }
-
- public double getLon() {
- return lon;
- }
- // public OchBusOperationStatusRequest shutdown() {
-// status = "0";
-// return this;
-// }
-//
-// public OchBusOperationStatusRequest launch() {
-// status = "1";
-// return this;
-// }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusResetDrivingLineRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusResetDrivingLineRequest.java
deleted file mode 100644
index 4faf1980a8..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusResetDrivingLineRequest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.commons.network.Utils;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/18
- */
-public class OchBusResetDrivingLineRequest {
- public String sn;
- public int lineId; //切换到的线路id
-
- public OchBusResetDrivingLineRequest(int lineId) {
- sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.lineId = lineId;
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java
deleted file mode 100644
index 0b7c31b096..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * 网约车小巴路线接口请求响应结果
- *
- * @author tongchenfei
- */
-public class OchBusRoutesResponse extends BaseData {
- private OchBusRoutesResult data;
-
- public OchBusRoutesResult getResult() {
- return data;
- }
-
- public void setResult(OchBusRoutesResult data) {
- this.data = data;
- }
-
- @Override
- public String toString() {
- return "OchBusRoutesResponse{" +
- "data=" + data +
- '}';
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java
deleted file mode 100644
index c55f12b3db..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import java.util.List;
-
-/**
- * 网约车小巴路线接口返回接口数据封装
- *
- * @author tongchenfei
- */
-public class OchBusRoutesResult {
- private List sites;
- private int lineId;
- private String name;
- private int lineType; //线路类型,0:环形
- private String description;
- private int status;
-
- public int getLineId() {
- return lineId;
- }
-
- public String getName() {
- return name;
- }
-
- public List getSites() {
- return sites;
- }
-
- public void setSite(List site) {
- this.sites = sites;
- }
-
- @Override
- public String toString() {
- return "OchBusRoutesResult{" +
- "sites=" + sites +
- ", lineId=" + lineId +
- ", name='" + name + '\'' +
- ", lineType=" + lineType +
- ", description='" + description + '\'' +
- ", status=" + status +
- '}';
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java
deleted file mode 100644
index e70d321a40..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package com.mogo.och.bus.bean;
-
-/**
- * 单个网约车小巴车站信息
- *
- * @author tongchenfei
- */
-public class OchBusStation {
-// private int lineId;
-// private int siteId;
-// private String siteName;
-// private String cityCode;
-// private String areaCode;
-// private String areaName;
-// private double lat;
-// private double lon;
-// private String siteDesc;
-// private int siteState;
-// private int isCurrentSite;// @see OchBusConst 是否是当前站 1:是 2:下一站 0:普通站
-// private int siteColor;
-// private String peoples;
-// private int ifStop; // 是否需要停靠、1需要、0不需要
-
-
- private String name;
- private String description;
- private String cityCode;
- private double lon; //高精坐标
- private double lat; //高精坐标
- private int businessType; //站点类型,9:taxi,10:bus
- private int status;
- private int siteId;
- private int seq;
- private int drivingStatus;//行驶信息,0初始值;1已经过;2当前站;3未到站
- private int ifStop = 1; // 是否需要停靠、1需要、0不需要 // TODO: 2021/10/19 原来站点里有设计是否需要停靠字段,现设计暂无,默认都需要停靠
- private boolean leaving;
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public void setCityCode(String cityCode) {
- this.cityCode = cityCode;
- }
-
- public void setLon(double lon) {
- this.lon = lon;
- }
-
- public void setLat(double lat) {
- this.lat = lat;
- }
-
- public void setBusinessType(int businessType) {
- this.businessType = businessType;
- }
-
- public void setStatus(int status) {
- this.status = status;
- }
-
- public void setSiteId(int siteId) {
- this.siteId = siteId;
- }
-
- public void setSeq(int seq) {
- this.seq = seq;
- }
-
- public void setDrivingStatus(int drivingStatus) {
- this.drivingStatus = drivingStatus;
- }
-
- public String getName() {
- return name;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getCityCode() {
- return cityCode;
- }
-
-
- public int getBusinessType() {
- return businessType;
- }
-
- public int getStatus() {
- return status;
- }
-
- public int getSiteId() {
- return siteId;
- }
-
- public int getSeq() {
- return seq;
- }
-
- public int getDrivingStatus() {
- return drivingStatus;
- }
-
- public double getLon() {
- return lon;
- }
-
- public double getLat() {
- return lat;
- }
-
- public void setIfStop(int ifStop) {
- this.ifStop = ifStop;
- }
-
- public int getIfStop() {
- return ifStop;
- }
-
- public void setLeaving(boolean leaving) {
- this.leaving = leaving;
- }
-
- public boolean isLeaving() {
- return leaving;
- }
-
- @Override
- public String toString() {
- return "OchBusStation{" +
- "name='" + name + '\'' +
- ", description='" + description + '\'' +
- ", cityCode='" + cityCode + '\'' +
- ", lon=" + lon +
- ", lat=" + lat +
- ", businessType=" + businessType +
- ", status=" + status +
- ", siteId=" + siteId +
- ", seq=" + seq +
- ", drivingStatus=" + drivingStatus +
- ", ifStop=" + ifStop +
- ", leaving=" + leaving +
- '}';
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusUpdateSiteStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusUpdateSiteStatusRequest.java
deleted file mode 100644
index ed5923c905..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusUpdateSiteStatusRequest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.commons.network.Utils;
-
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态请求参数
- */
-public class OchBusUpdateSiteStatusRequest {
-
- public String sn;
- public int seq;//站点序号
- public int siteId;//站点id
- public double lon;
- public double lat;
-
- public OchBusUpdateSiteStatusRequest(int seq, int siteId, double lon, double lat) {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- this.seq = seq;
- this.siteId = siteId;
- this.lon = lon;
- this.lat = lat;
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java
index 1a38e7e2eb..98105058b8 100644
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java
@@ -22,7 +22,7 @@ class QueryLeaveAwayPassengersResponse extends BaseData {
public static class LeaveAwayPassenger {
/**
- * orderId: 订单id
+ * orderNo: 订单no
* orderStatus: 订单状态
* orderType:订单类型:0及时,1预约
* bookingTime:预计用车时间
@@ -40,7 +40,7 @@ class QueryLeaveAwayPassengersResponse extends BaseData {
* endSiteGcjPoint:
*/
//todo 目前是需要乘客电话来通知乘客下车 目前后台没有乘客信息userPhone
- public long orderId;
+ public String orderNo;
public int orderStatus;
public int orderType;
public long bookingTime;
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryOchBusOperationStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryOchBusOperationStatusRequest.java
deleted file mode 100644
index ceaf72c7f8..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryOchBusOperationStatusRequest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.mogo.och.bus.bean;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.commons.network.Utils;
-
-public
-/**
- * @author congtaowang
- * @since 2021/3/22
- *
- * 小巴车运营状态请求参数
- */
-class QueryOchBusOperationStatusRequest {
-
- public String sn;
-
-
- public QueryOchBusOperationStatusRequest() {
- this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java
deleted file mode 100644
index 9f35270323..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/BusLinesCallback.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.mogo.och.bus.callback;
-
-import com.mogo.och.bus.bean.BusQueryLinesResponse;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public interface BusLinesCallback {
- void onBusLinesChange(BusQueryLinesResponse lines);
- void onChangeLineIdSuccess();
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/CarOperationStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/CarOperationStatusCallback.java
deleted file mode 100644
index 0e9cd198da..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/CarOperationStatusCallback.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.mogo.och.bus.callback;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface CarOperationStatusCallback {
- void changeOperationStatus(boolean changeStatus);
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java
new file mode 100644
index 0000000000..e03e963942
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusControllerStatusCallback.java
@@ -0,0 +1,17 @@
+package com.mogo.och.bus.callback;
+
+import android.location.Location;
+
+/**
+ * Created on 2021/9/10
+ *
+ * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
+ */
+public interface IBusControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(Location location);
+ //开始开启自动驾驶
+ void startOpenAutopilot();
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java
new file mode 100644
index 0000000000..b181736278
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IBusLinesCallback.java
@@ -0,0 +1,12 @@
+package com.mogo.och.bus.callback;
+
+import com.mogo.och.bus.bean.BusQueryLinesResponse;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public interface IBusLinesCallback {
+ void onBusLinesChange(BusQueryLinesResponse lines);
+ void onChangeLineIdSuccess();
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java
new file mode 100644
index 0000000000..d414f71e2c
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ICarOperationStatusCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.bus.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface ICarOperationStatusCallback {
+ void changeOperationStatus(boolean changeStatus);
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IOCHBusControllerStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IOCHBusControllerStatusCallback.java
deleted file mode 100644
index 1e7bd30279..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IOCHBusControllerStatusCallback.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.mogo.och.bus.callback;
-
-import android.location.Location;
-
-/**
- * Created on 2021/9/10
- *
- * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
- */
-public interface IOCHBusControllerStatusCallback {
- // 是否vr map模式
- void onVRModeChanged(boolean isVRMode);
- // 自车定位
- void onCarLocationChanged(Location location);
- //开始开启自动驾驶
- void startOpenAutopilot();
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java
new file mode 100644
index 0000000000..854a2699d5
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IRefreshBusStationsCallback.java
@@ -0,0 +1,13 @@
+package com.mogo.och.bus.callback;
+
+import com.mogo.och.bus.bean.BusStationBean;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface IRefreshBusStationsCallback {
+ void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived);
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ISlidePannelHideCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ISlidePannelHideCallback.java
new file mode 100644
index 0000000000..16e6893135
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/ISlidePannelHideCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.bus.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface ISlidePannelHideCallback {
+ void hideSlidePanel();
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/RefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/RefreshBusStationsCallback.java
deleted file mode 100644
index bc59a7ba79..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/RefreshBusStationsCallback.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.mogo.och.bus.callback;
-
-import com.mogo.och.bus.bean.OchBusStation;
-
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface RefreshBusStationsCallback {
- void refreshBusStations(List stationList, int currentStation, int nextStation,boolean isArrived);
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/SlidePannelHideCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/SlidePannelHideCallback.java
deleted file mode 100644
index 11dd2f0d36..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/SlidePannelHideCallback.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.mogo.och.bus.callback;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/22
- */
-public interface SlidePannelHideCallback {
- void hideSlidePanel();
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt
new file mode 100644
index 0000000000..563b0825a5
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt
@@ -0,0 +1,67 @@
+package com.mogo.och.bus.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class BusConst {
+ companion object {
+
+ private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
+ private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
+ private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
+
+ @JvmStatic
+ fun getBaseUrl(): String {
+ return when (DebugConfig.getNetMode()) {
+ DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
+ DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
+ DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
+ else -> BASE_URL_OCH_RELEASE
+ }
+ }
+
+ // OCH arouter 路由path
+ const val PATH = "/och/api"
+
+ // 测试用的广播
+ const val BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY = "sceneType"
+ // 无状态
+ const val STATION_STATUS_IDLE = 0
+ // 已过站(历史站)
+ const val STATION_STATUS_LEAVING = 1
+ // 到站(当前站)
+ const val STATION_STATUS_STOPPED = 2
+ // 未到站(未到站)
+ const val STATION_STATUS_ARRIVING = 3
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+ // 开始服务启动自动驾驶等待时间(埋点上传)
+ const val LOOP_PERIOD_15S = 15 * 1000L
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ //起点UUID
+ const val BUS_START_MAP_MAKER = "bus_start_map_maker";
+ //终点UUID
+ const val BUS_END_MAP_MAKER = "bus_end_map_maker";
+
+ // 埋点key:开始服务开启自动驾驶(成功/失败)
+ const val EVENT_KEY_START_SERVICE = "event_key_och_bus_start_service"
+ const val EVENT_PARAM_SN = "sn"
+ const val EVENT_PARAM_TIME = "time"
+ const val EVENT_PARAM_START_NAME = "start_name"
+ const val EVENT_PARAM_END_NAME = "end_name"
+ const val EVENT_PARAM_LINE_ID = "line_id"
+ const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false
+ const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号
+ const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false
+
+ /**
+ * 订单起终点Marker类型
+ */
+ const val TYPE_MARKER_BUS_ORDER = "TYPE_MARKER_BUS_ORDER"
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt
deleted file mode 100644
index a85ea7ae3f..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.mogo.och.bus.constant
-
-import com.mogo.commons.debug.DebugConfig
-
-/**
- * Created on 2021/12/6
- */
-class OchBusConst {
- companion object {
-
- private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
- private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
- private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
-
- @JvmStatic
- fun getBaseUrl(): String {
- return when (DebugConfig.getNetMode()) {
- DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
- DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
- DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
- else -> BASE_URL_OCH_RELEASE
- }
- }
-
- // OCH arouter 路由path
- const val PATH = "/och/api"
-
- // 测试用的广播
- const val BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY = "sceneType"
- // 无状态
- const val STATION_STATUS_IDLE = 0
- // 已过站(历史站)
- const val STATION_STATUS_LEAVING = 1
- // 到站(当前站)
- const val STATION_STATUS_STOPPED = 2
- // 未到站(未到站)
- const val STATION_STATUS_ARRIVING = 3
-
- // 上报心跳轮询ms
- const val LOOP_PERIOD_60S = 60 * 1000L
- const val LOOP_PERIOD_1S = 1 * 1000L
- const val LOOP_DELAY = 100L
-
- //起点UUID
- const val BUS_START_MAP_MAKER = "bus_start_map_maker";
- //终点UUID
- const val BUS_END_MAP_MAKER = "bus_end_map_maker";
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java
new file mode 100644
index 0000000000..5b7e2eca1e
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java
@@ -0,0 +1,488 @@
+package com.mogo.och.bus.fragment;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.animation.ObjectAnimator;
+import android.content.Intent;
+import android.graphics.Color;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.Group;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.config.HmiBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener;
+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.CallerAutopilotRecordListenerManager;
+import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.MogoMapUIController;
+import com.mogo.map.MogoMarkerManager;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.uicontroller.VisualAngleMode;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.constants.DataTypes;
+import com.mogo.module.common.view.OnPreventFastClickListener;
+import com.mogo.och.bus.R;
+import com.mogo.och.bus.ui.BusTrafficLightView;
+import com.mogo.och.bus.view.BusArcView;
+import com.mogo.och.bus.view.SlidePanelView;
+
+import mogo.telematics.pad.MessagePad;
+import record_cache.RecordPanelOuterClass;
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+public abstract class BaseBusTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener {
+
+ private static final String TAG = "BaseOchFragment";
+
+ protected SlidePanelView slidePanelView;
+ private RelativeLayout ctvAutopilotStatus;
+ private ImageView ctvAutopilotStatusIv;
+ private TextView ctvAutopilotStatusTv;
+ protected TextView tvOperationStatus;
+ protected RelativeLayout mSettingBtn;
+ protected ImageView mBadcaseBtn;
+ public boolean isOperationStatus;//false-收车,true-出车
+ private FrameLayout flStationPanelContainer;
+ private Group groupTestPanel;
+ private FrameLayout flSpeed;
+ private BusArcView mouduleArc;
+ private ImageView mUpgradeTipIv;
+ // private BusTrafficLightView mTrafficLightView;
+
+ public static final String TYPE_ENTRANCE = "entrance";
+
+ //远景和中景的切换
+ private ImageView mSwitchMapModeImage;
+ private FrameLayout mSwitchMapModeLayout;
+ private TextView mSwitchText;
+
+ private ObjectAnimator autopilotLoadingAnimator;
+
+ /**
+ * 滑动按钮触发的事件
+ */
+ private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> {
+ // 此处做一个代理,处理一下共有情况
+ if (getSlidePanelOnEndListener() != null) {
+ getSlidePanelOnEndListener().moveToEnd();
+ }
+ };
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.bus_base_fragment;
+ }
+
+ private View panelView;
+
+ @Override
+ protected void initViews() {
+ groupTestPanel = findViewById(R.id.groupTestPanel);
+ slidePanelView = findViewById(R.id.module_mogo_och_slide_panel);
+ ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
+ ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv);
+ ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv);
+ flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
+
+ // mTrafficLightView = findViewById(R.id.bus_traffic_light_view);
+ // CallerHmiManager.INSTANCE.setProxyTrafficLightView(mTrafficLightView);
+
+ tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
+
+ flSpeed = (FrameLayout) findViewById(R.id.fl_speed);
+ mouduleArc = (BusArcView) findViewById(R.id.bus_arc);
+
+ panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
+ slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener);
+
+ mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout);
+ mSwitchMapModeImage = findViewById(R.id.bus_switch_model_icon);
+ mSwitchText = findViewById(R.id.bus_switch_model_text);
+
+ mSwitchMapModeLayout.setOnClickListener(new OnPreventFastClickListener() {
+
+ @Override
+ public void onClickImpl(View v) {
+ //切换地图的远近视图
+ if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight()) {
+ MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers();
+ MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ mSwitchText.setText(R.string.bus_map_model_normal);
+ } else if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isMediumSight()) {
+ MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS);
+ MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ mSwitchText.setText(R.string.bus_map_model_faster);
+ }
+ }
+ });
+
+ if (DebugConfig.isDebug()) {
+ mouduleArc.setLongClickable(true);
+ mouduleArc.setOnLongClickListener(v -> {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "长按显示状态工具栏");
+ Intent intent = new Intent();
+ intent.putExtra("oper", 52);
+ MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent);
+ return true;
+ });
+ }
+ initListener();
+ ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener(){
+
+ @Override
+ public void onClickImpl(View v) {
+ restartAutopilot();
+ }
+ });
+
+ // debug下调用测试面板 2022.2.25修改到 长按当前站点名字
+// if (DebugConfig.isDebug()) {
+// ctvAutopilotStatus.setOnLongClickListener(v -> {
+// debugTestBar();
+// return true;
+// });
+// }
+ onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState(), false);
+ // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
+ findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用")
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
+ );
+
+ // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
+ findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, "能使用")
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
+ );
+
+ // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
+ findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, "Running")
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
+ );
+
+ // 模拟 自动驾驶网约车回调数据
+ findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi().mockOchStatus(-1, "Arrived")
+ debugArrivedStation()
+ );
+
+ tvOperationStatus.setOnClickListener(view -> {
+ onChangeOperationStatus();
+ });
+
+ mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout);
+ mSettingBtn.setOnClickListener(v -> {
+ // TODO: 2021/12/9
+ CallerHmiManager.INSTANCE.showToolsView();
+ });
+
+ // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
+ mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_iv);
+// CallerHmiManager.INSTANCE.registerBadCaseCallback(
+// () -> { // onShow()
+// return mBadcaseBtn; },
+// () -> { // onHide()
+// return null; });
+
+ if (mBadcaseBtn != null) {
+ CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn, null, null);
+ if (!HmiBuildConfig.isShowBadCaseView) {
+ CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this);
+ }
+ }
+ //设置升级小红点提示 默认隐藏
+ mUpgradeTipIv = findViewById(R.id.module_och_bus_upgrade_red_tip);
+ CallerHmiManager.INSTANCE.registerUpgradeTipsCallback(() -> mUpgradeTipIv);
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ if (!HmiBuildConfig.isShowBadCaseView) {
+ CallerAutopilotRecordListenerManager.INSTANCE.removeListener(TAG);
+ }
+ }
+
+
+ @Override
+ public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) {
+ if (!HmiBuildConfig.isShowBadCaseView && recordPanel != null && recordPanel.getType() == 1 && recordPanel.getStat() == 100) {
+ CallerDevaToolsManager.INSTANCE.onReceiveBadCaseRecord(recordPanel);
+ }
+ }
+
+
+ /**
+ * 测试到站
+ */
+ protected abstract void debugArrivedStation();
+
+ private void initListener() {
+ MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this);
+ }
+
+ protected void onChangeOperationStatus() {
+
+ }
+
+ /**
+ * 展示滑动按钮
+ *
+ * @param text 指定的文字
+ */
+ public void showSlidePanle(String text) {
+ if (isOperationStatus) {
+ getActivity().runOnUiThread(() -> {
+ slidePanelView.setText(text);
+ slidePanelView.setVisibility(View.VISIBLE);
+ });
+ }
+ }
+
+ /**
+ * 隐藏滑动按钮
+ */
+ public void hideSlidePanel() {
+ getActivity().runOnUiThread(() -> {
+ slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ public void showNotice(String notice) {
+ getActivity().runOnUiThread(() -> {
+ AIAssist.getInstance(getContext()).speakTTSVoice(notice);
+ });
+ }
+
+ /**
+ * 改变自动驾驶状态
+ *
+ * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
+ */
+ public void onAutopilotStatusChanged(int autopilotStatus, boolean isAnimateRunning) {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setChecked(isInAutopilot);
+ changeAutopilotBtnView(autopilotStatus, isAnimateRunning);
+ });
+ }
+
+ private void changeAutopilotBtnView(int autopilotStatus, boolean isAnimateRunning) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChangeChangeAutopilotBtnView: " + autopilotStatus + "isAnimateRunning = " + isAnimateRunning);
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+ == autopilotStatus) {//0不可用
+ if (isAnimateRunning) {
+ stopAutopilotAnimation();
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_wrong_autopilot_icon);
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_failure_tv));
+ ctvAutopilotStatus.setFocusableInTouchMode(false);
+ ctvAutopilotStatus.setSelected(false);
+ }
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_disable));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_disable_autopilot_icon);
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+// ctvAutopilotStatus.setPressed(false);
+ }
+ }, 1000);
+
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE
+ == autopilotStatus) {//1可用
+ if (isAnimateRunning) {
+ return;
+ }
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+// ctvAutopilotStatus.setPressed(true);
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
+ == autopilotStatus) {//2 running
+ if (isAnimateRunning) {
+ stopAutopilotAnimation();
+ }
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_right_autopilot_icon);
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_success_tv));
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(false);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatus.setSelected(true);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+// ctvAutopilotStatus.setPressed(false);
+ }
+ }, 1000);
+ }
+ }
+
+ /**
+ * 隐藏【自动驾驶】按钮
+ */
+ public void hideAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setVisibility(View.GONE);
+// slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ /**
+ * 展示【自动驾驶】按钮
+ */
+ public void showAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+ ctvAutopilotStatus.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public void hidPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.GONE);
+ });
+ }
+
+ public void showPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public View getPanelView() {
+ return panelView;
+ }
+
+ public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
+ return null;
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 重新开启自动驾驶
+ */
+ public abstract void restartAutopilot();
+
+ /**
+ * 模拟自动驾驶返回状态
+ *
+ * @param status
+ */
+ public abstract void debugAutoPilotStatus(int status);
+
+ /**
+ * 开启自动驾驶中间动画
+ */
+ public void startAutopilotAnimation() {
+// if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_tv));
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_loading_autopilot_icon);
+ if (autopilotLoadingAnimator == null) {
+ autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv, "rotation", 0f, 360f);
+ autopilotLoadingAnimator.setInterpolator(new LinearInterpolator());
+ autopilotLoadingAnimator.setRepeatCount(-1);//无限循环
+ autopilotLoadingAnimator.setDuration(1000);//设置持续时间
+ }
+ autopilotLoadingAnimator.start();//动画开始
+// }
+ }
+
+ /**
+ * 停止自动驾驶中间动画
+ */
+ public void stopAutopilotAnimation() {
+ if (autopilotLoadingAnimator != null) {
+ autopilotLoadingAnimator.end();
+ ctvAutopilotStatusIv.clearAnimation();
+ autopilotLoadingAnimator = null;
+ }
+ }
+
+ /**
+ * 迈速表实时更新
+ *
+ * @param newSpeed
+ */
+ public void updateSpeedView(float newSpeed) {
+ int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
+ mouduleArc.setArcColor(Color.parseColor(speed > 60 ? "#DB3137" : "#3E77F6"));
+ mouduleArc.setValues(speed);
+ flSpeed.setBackgroundResource(speed > 60 ? R.drawable.bus_yi_biao_pan_bg_speeding : R.drawable.bus_yi_biao_pan_bg_nor);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ MogoApisHandler.getInstance().getApis().getRegisterCenterApi().unregisterMogoMapListener(TYPE_ENTRANCE);
+ }
+
+ @Override
+ public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
+ if (visualAngleMode.isMediumSight()) {
+ mSwitchMapModeLayout.setVisibility(View.VISIBLE);
+ } else if (visualAngleMode.isLongSight()) {
+ mSwitchMapModeLayout.setVisibility(View.VISIBLE);
+ } else if (visualAngleMode.isCloseSight()) {
+ mSwitchMapModeLayout.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * bus调试面板打开关闭
+ */
+ public void debugTestBar() {
+ if (groupTestPanel.getVisibility() == View.VISIBLE) {
+ groupTestPanel.setVisibility(View.GONE);
+ } else {
+ groupTestPanel.setVisibility(View.VISIBLE);
+ }
+ }
+}
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
deleted file mode 100644
index fe02bfef81..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java
+++ /dev/null
@@ -1,462 +0,0 @@
-package com.mogo.och.bus.fragment;
-
-import android.animation.ObjectAnimator;
-import android.content.Intent;
-import android.graphics.Color;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.animation.LinearInterpolator;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import androidx.constraintlayout.widget.Group;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.debug.DebugConfig;
-import com.mogo.commons.mvp.IView;
-import com.mogo.commons.mvp.MvpFragment;
-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.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.map.listener.IMogoMapListener;
-import com.mogo.map.uicontroller.VisualAngleMode;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.module.common.constants.DataTypes;
-import com.mogo.module.common.view.OnPreventFastClickListener;
-import com.mogo.och.bus.R;
-import com.mogo.och.bus.view.BusArcView;
-import com.mogo.och.bus.view.SlidePanelView;
-
-/**
- * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
- *
- * 部分业务放在了此处处理
- *
- * @author tongchenfei
- */
-public abstract class BaseOchBusTabFragment> extends MvpFragment implements IMogoMapListener {
-
- private static final String TAG = "BaseOchFragment";
-
- protected SlidePanelView slidePanelView;
- private RelativeLayout ctvAutopilotStatus;
- private ImageView ctvAutopilotStatusIv;
- private TextView ctvAutopilotStatusTv;
- protected TextView tvOperationStatus;
- protected RelativeLayout mSettingBtn;
- protected ImageView mBadcaseBtn;
- public boolean isOperationStatus;//false-收车,true-出车
- private FrameLayout flStationPanelContainer;
- private Group groupTestPanel;
- private FrameLayout flSpeed;
- private BusArcView mouduleArc;
- private ImageView mUpgradeTipIv;
-
- public static final String TYPE_ENTRANCE = "entrance";
-
- //远景和中景的切换
- private ImageView mSwitchMapModeImage;
- private FrameLayout mSwitchMapModeLayout;
- private TextView mSwitchText;
-
- private ObjectAnimator autopilotLoadingAnimator;
-
- /**
- * 滑动按钮触发的事件
- */
- private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> {
- // 此处做一个代理,处理一下共有情况
- if (getSlidePanelOnEndListener() != null) {
- getSlidePanelOnEndListener().moveToEnd();
- }
- };
-
- @Override
- protected int getLayoutId() {
- return R.layout.bus_base_fragment;
- }
-
- private View panelView;
-
- @Override
- protected void initViews() {
- groupTestPanel = findViewById(R.id.groupTestPanel);
- slidePanelView = findViewById(R.id.module_mogo_och_slide_panel);
- ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
- ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv);
- ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv);
- flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
-
- tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
-
- flSpeed = (FrameLayout) findViewById(R.id.fl_speed);
- mouduleArc = (BusArcView) findViewById(R.id.bus_arc);
-
- panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
- slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener);
-
- mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout);
- mSwitchMapModeImage = findViewById(R.id.bus_switch_model_icon);
- mSwitchText = findViewById(R.id.bus_switch_model_text);
-
- mSwitchMapModeLayout.setOnClickListener(new OnPreventFastClickListener(){
-
- @Override
- public void onClickImpl(View v) {
- //切换地图的远近视图
- if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isLongSight()) {
- MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).visibleAllMarkers();
- MogoApisHandler.getInstance().getApis().getMapServiceApi()
- .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
- mSwitchText.setText(R.string.bus_map_model_normal);
- } else if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isMediumSight()) {
- MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS);
- MogoApisHandler.getInstance().getApis().getMapServiceApi()
- .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
- mSwitchText.setText(R.string.bus_map_model_faster);
- }
- }
- });
-
- if (DebugConfig.isDebug()) {
- mouduleArc.setLongClickable(true);
- mouduleArc.setOnLongClickListener(v -> {
- Log.d(TAG,"长按显示状态工具栏");
- Intent intent = new Intent();
- intent.putExtra("oper", 52);
- MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent);
- return true;
- });
- }
- initListener();
- ctvAutopilotStatus.setOnClickListener(v -> {
- // 如果能自动驾驶,就自动驾驶,不能就提示
-// if (MogoApisHandler.getInstance().getApis().getAdasControllerApi().getAutopilotStatus() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
-// return;
-// }
-// if (autopilotLoadingAnimator != null){
-// TipToast.shortTip("正在开启自动驾驶。。。");
-// return;
-// }
- restartAutopilot();
- });
-
- // debug下调用测试面板 2022.2.25修改到 长按当前站点名字
-// if (DebugConfig.isDebug()) {
-// ctvAutopilotStatus.setOnLongClickListener(v -> {
-// debugTestBar();
-// return true;
-// });
-// }
- onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState(),false);
- // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
- findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
-// MogoApisHandler.getInstance().getApis()
-// .getAdasControllerApi()
-// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用")
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
- );
-
- // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
- findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
-// MogoApisHandler.getInstance().getApis()
-// .getAdasControllerApi()
-// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, "能使用")
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
- );
-
- // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
- findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
-// MogoApisHandler.getInstance().getApis()
-// .getAdasControllerApi()
-// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, "Running")
- debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
- );
-
- // 模拟 自动驾驶网约车回调数据
- findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
-// MogoApisHandler.getInstance().getApis()
-// .getAdasControllerApi().mockOchStatus(-1, "Arrived")
- debugArrivedStation()
- );
-
- tvOperationStatus.setOnClickListener(view -> {
- onChangeOperationStatus();
- });
-
- mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout);
- mSettingBtn.setOnClickListener(v -> {
- // TODO: 2021/12/9
- CallerHmiManager.INSTANCE.showToolsView();
- });
-
- // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
- mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_iv);
- CallerHmiManager.INSTANCE.registerBadCaseCallback(
- () -> { // onShow()
- return mBadcaseBtn; },
- () -> { // onHide()
- return null; });
-
- //设置升级小红点提示 默认隐藏
- mUpgradeTipIv = findViewById(R.id.module_och_bus_upgrade_red_tip);
- CallerHmiManager.INSTANCE.registerUpgradeTipsCallback(() -> mUpgradeTipIv);
- }
-
- /**
- * 测试到站
- */
- protected abstract void debugArrivedStation();
-
- private void initListener() {
- MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this);
- }
-
- protected void onChangeOperationStatus() {
-
- }
-
- /**
- * 展示滑动按钮
- *
- * @param text 指定的文字
- */
- public void showSlidePanle(String text) {
- if (isOperationStatus) {
- getActivity().runOnUiThread(() -> {
- slidePanelView.setText(text);
- slidePanelView.setVisibility(View.VISIBLE);
- });
- }
- }
-
- /**
- * 隐藏滑动按钮
- */
- public void hideSlidePanel() {
- getActivity().runOnUiThread(() -> {
- slidePanelView.setVisibility(View.GONE);
- });
- }
-
- public void showNotice(String notice) {
- getActivity().runOnUiThread(() -> {
- AIAssist.getInstance(getContext()).speakTTSVoice(notice);
- });
- }
-
- /**
- * 改变自动驾驶状态
- * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
- */
- public void onAutopilotStatusChanged(int autopilotStatus,boolean isAnimateRunning) {
- getActivity().runOnUiThread(() -> {
-// ctvAutopilotStatus.setChecked(isInAutopilot);
- changeAutopilotBtnView(autopilotStatus,isAnimateRunning);
- });
- }
-
- private void changeAutopilotBtnView(int autopilotStatus,boolean isAnimateRunning) {
- Logger.d( TAG, "onStateChangeChangeAutopilotBtnView: " + autopilotStatus +"isAnimateRunning = "+isAnimateRunning);
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
- == autopilotStatus) {//0不可用
- if (isAnimateRunning){
- stopAutopilotAnimation();
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_wrong_autopilot_icon);
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_failure_tv));
- ctvAutopilotStatus.setFocusableInTouchMode(false);
- ctvAutopilotStatus.setSelected(false);
- }
- UiThreadHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_disable));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_disable_autopilot_icon);
- ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setFocusableInTouchMode(true);
-// ctvAutopilotStatus.setPressed(false);
- }
- },1000);
-
- }else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE
- == autopilotStatus){//1可用
- if (isAnimateRunning){
- return;
- }
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
- ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setFocusableInTouchMode(true);
-// ctvAutopilotStatus.setPressed(true);
- }else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
- == autopilotStatus){//2 running
- if (isAnimateRunning){
- stopAutopilotAnimation();
- }
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_right_autopilot_icon);
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_success_tv));
- ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setFocusableInTouchMode(false);
- UiThreadHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatus.setSelected(true);
- ctvAutopilotStatus.setFocusableInTouchMode(true);
-// ctvAutopilotStatus.setPressed(false);
- }
- },1000);
- }
- }
-
- /**
- * 隐藏【自动驾驶】按钮
- */
- public void hideAutopilotBiz() {
- getActivity().runOnUiThread(() -> {
-// ctvAutopilotStatus.setVisibility(View.GONE);
-// slidePanelView.setVisibility(View.GONE);
- });
- }
-
- /**
- * 展示【自动驾驶】按钮
- */
- public void showAutopilotBiz() {
- getActivity().runOnUiThread(() -> {
- ctvAutopilotStatus.setVisibility(View.VISIBLE);
- if (isOperationStatus) {
- slidePanelView.setVisibility(View.VISIBLE);
- } else {
- slidePanelView.setVisibility(View.GONE);
- }
- });
- }
-
- public void hidPanel(){
- getActivity().runOnUiThread(()->{
- flStationPanelContainer.setVisibility(View.GONE);
- });
- }
-
- public void showPanel(){
- getActivity().runOnUiThread(()->{
- flStationPanelContainer.setVisibility(View.VISIBLE);
- });
- }
-
- public View getPanelView() {
- return panelView;
- }
-
- public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
- return null;
- }
-
- @Override
- public void onDestroyView() {
- super.onDestroyView();
- }
-
- /**
- * 获取站点面板view,在{@link #initViews()}时候添加到container中
- *
- * @return 站点面板view
- */
- public abstract int getStationPanelViewId();
-
- /**
- * 重新开启自动驾驶
- */
- public abstract void restartAutopilot();
-
- /**
- * 模拟自动驾驶返回状态
- * @param status
- */
- public abstract void debugAutoPilotStatus(int status);
-
- /**
- * 开启自动驾驶中间动画
- */
- public void startAutopilotAnimation() {
-// if (MogoApisHandler.getInstance().getApis().getAdasControllerApi().getAutopilotStatus() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){
- ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_tv));
- ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
- ctvAutopilotStatus.setSelected(false);
- ctvAutopilotStatus.setFocusableInTouchMode(true);
- ctvAutopilotStatusIv.setImageResource(R.drawable.bus_loading_autopilot_icon);
- if (autopilotLoadingAnimator == null){
- autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv,"rotation", 0f,360f);
- autopilotLoadingAnimator.setInterpolator(new LinearInterpolator());
- autopilotLoadingAnimator.setRepeatCount(-1);//无限循环
- autopilotLoadingAnimator.setDuration(1000);//设置持续时间
- }
- autopilotLoadingAnimator.start();//动画开始
-// }
- }
-
- /**
- * 停止自动驾驶中间动画
- */
- public void stopAutopilotAnimation() {
- if (autopilotLoadingAnimator != null){
- autopilotLoadingAnimator.end();
- ctvAutopilotStatusIv.clearAnimation();
- autopilotLoadingAnimator = null;
- }
- }
-
- /**
- * 迈速表实时更新
- * @param newSpeed
- */
- public void updateSpeedView(float newSpeed){
- int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
- mouduleArc.setArcColor(Color.parseColor(speed > 60 ? "#DB3137" : "#3E77F6"));
- mouduleArc.setValues(speed);
- flSpeed.setBackgroundResource(speed > 60 ? R.drawable.bus_yi_biao_pan_bg_speeding : R.drawable.bus_yi_biao_pan_bg_nor);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- MogoApisHandler.getInstance().getApis().getRegisterCenterApi().unregisterMogoMapListener(TYPE_ENTRANCE);
- }
-
- @Override
- public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
- if (visualAngleMode.isMediumSight()) {
- mSwitchMapModeLayout.setVisibility(View.VISIBLE);
- } else if (visualAngleMode.isLongSight()) {
- mSwitchMapModeLayout.setVisibility(View.VISIBLE);
- } else if (visualAngleMode.isCloseSight()) {
- mSwitchMapModeLayout.setVisibility(View.GONE);
- }
- }
-
- /**
- * bus调试面板打开关闭
- */
- public void debugTestBar(){
- if (groupTestPanel.getVisibility() == View.VISIBLE) {
- groupTestPanel.setVisibility(View.GONE);
- } else {
- groupTestPanel.setVisibility(View.VISIBLE);
- }
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java
new file mode 100644
index 0000000000..083cc2bab1
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java
@@ -0,0 +1,368 @@
+package com.mogo.och.bus.fragment;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.Intent;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+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.map.CallerHDMapManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.map.MogoMarkerManager;
+import com.mogo.map.marker.IMogoMarker;
+import com.mogo.map.marker.MogoMarkerOptions;
+import com.mogo.och.bus.R;
+import com.mogo.och.bus.bean.BusStationBean;
+import com.mogo.och.bus.constant.BusConst;
+import com.mogo.och.bus.presenter.BusPresenter;
+import com.mogo.och.bus.ui.BusSwitchLineActivity;
+import com.mogo.och.bus.view.SlidePanelView;
+
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+
+
+/**
+ * 网约车小巴界面
+ *
+ * @author tongchenfei
+ */
+public class BusFragment extends BaseBusTabFragment
+ implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener {
+ private static final String TAG = "BusFragment";
+
+ private TextView mCurrentStationName;
+ private TextView mStartStationFlag;
+ private TextView mNextStationName;
+ private TextView mEndStationFlag;
+ // private TextView mDebugArrive;
+ private TextView mSwitchLine; //切换路线
+ private int mCurrentStation = 0;
+
+ private View mBus;
+
+ private BusStationBean startStation = null;
+ private BusStationBean endStation = null;
+
+ @Override
+ public String getTagName() {
+ return "BusFragment";
+ }
+
+ @Override
+ protected void initViews() {
+ super.initViews();
+ mBus = findViewById(R.id.module_och_bus_tag);
+ mCurrentStationName = findViewById(R.id.module_och_bus_current_station);
+ mStartStationFlag = findViewById(R.id.module_och_bus_start_station_tag);
+ mNextStationName = findViewById(R.id.module_och_bus_order_end_station);
+ mEndStationFlag = findViewById(R.id.module_och_bus_end_station_tag);
+ mSwitchLine = findViewById(R.id.switch_line_btn);
+// mDebugArrive = findViewById(R.id.module_och_bus_arrive_station);
+
+ if (DebugConfig.isDebug()) {
+ mBus.setOnClickListener(view -> {
+ TipToast.shortTip("重置了车站状态");
+ mPresenter.queryBusRoutes();
+ });
+
+ mBus.setOnLongClickListener(view -> {
+ getActivity().finish();
+ return true;
+ });
+ //debug下调用测试面板
+ mCurrentStationName.setOnLongClickListener(v -> {
+ debugTestBar();
+ return true;
+ });
+ }
+
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+ // 初始化的时候设置 UI 按钮状态
+ switch (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
+ hideAutopilotBiz();
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
+ showAutopilotBiz();
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, false);
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
+ showAutopilotBiz();
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, false);
+ break;
+ default:
+ break;
+ }
+ mSwitchLine.setOnClickListener(this);
+ }
+
+ @Override
+ protected void debugArrivedStation() {
+ mPresenter.onAutopilotArriveAtStation(null);
+ }
+
+ @NonNull
+ @Override
+ protected BusPresenter createPresenter() {
+ return new BusPresenter(this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+
+ /**
+ * 根据站点列表信息刷新车站面板,滑块面板
+ *
+ * @param stationList 车站列表信息
+ * @param currentStation 当前站点
+ * @param nextStation 下个站点
+ * @param isArrived 是否都站
+ */
+ public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) {
+ mCurrentStation = currentStation;
+ if (getActivity() == null) {
+ return;
+ }
+ getActivity().runOnUiThread(() -> {
+ if (stationList == null) {
+ // 获取小巴数据失败
+ return;
+ }
+
+ // 渲染小巴路线数据
+ renderCurrentStationStatus(stationList, currentStation, nextStation, isArrived);
+ });
+ }
+
+ /**
+ * 重新刷新站点信息 isArrived 是否到站
+ */
+ private void renderCurrentStationStatus(List stationList, int currentStation
+ , int nextStation, boolean isArrived) {
+ CallerLogger.INSTANCE.d(M_BUS + "MapMaker ", "currentStation=" + currentStation + ",nextStation=" + nextStation + "isArrived=" + isArrived);
+ String currentStationName = null;
+ String nextStationName = null;
+ int startStationFlagVisibility = View.INVISIBLE;
+ int endStationFlagVisibility = View.INVISIBLE;
+
+ boolean isArriveEndStation = false;
+ boolean isArriveAtStation = false;
+ boolean isArriveAtStartStation = false;
+
+ // 获取当前站点的名称
+ currentStationName = stationList.get(currentStation).getName();
+
+ startStation = stationList.get(0);
+ endStation = stationList.get(stationList.size() - 1);
+
+ // 是否到达起点
+ if (currentStation == 0) {
+ startStationFlagVisibility = View.VISIBLE;
+ isArriveAtStartStation = true;
+ mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start));
+
+ setOrRemoveMapMaker(true, BusConst.BUS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+ setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ } else if (currentStation > 0 && currentStation < stationList.size() - 1) {// 是否到达站点
+ isArriveAtStation = true;
+
+ setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+ setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ } else if (currentStation == stationList.size() - 1) {// 是否到达终点
+ isArriveEndStation = true;
+ nextStationName = "--";
+ mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_end));
+ startStationFlagVisibility = View.VISIBLE;
+ endStationFlagVisibility = View.INVISIBLE;
+
+ setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+
+ if (isArrived) {
+ setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ } else {
+ setOrRemoveMapMaker(true, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ }
+ }
+
+ // 获取下一站点名称
+ if (nextStation > currentStation && nextStation <= stationList.size() - 1) {
+ nextStationName = stationList.get(nextStation).getName();
+ }
+
+ // 是否到达终点
+ if (nextStation == stationList.size() - 1) {
+ endStationFlagVisibility = View.VISIBLE;
+ }
+
+ // 重置滑动按钮文字
+ if (isArriveEndStation) {
+ showSlidePanle("单程结束");
+ } else if (isArriveAtStartStation) {
+ showSlidePanle("滑动出发");
+ } else if (isArriveAtStation) {
+ showSlidePanle("滑动出发");
+ }
+
+ mCurrentStationName.setText(currentStationName);
+ mNextStationName.setText(nextStationName);
+ mStartStationFlag.setVisibility(startStationFlagVisibility);
+ mEndStationFlag.setVisibility(endStationFlagVisibility);
+ }
+
+ public void hideOchBus() {
+// tvNotice.setVisibility(View.GONE);
+ }
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.fragment_och_bus;
+ }
+
+ @Override
+ public void restartAutopilot() {
+ mPresenter.restartAutopilot();
+ }
+
+ @Override
+ public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
+ return this;
+ }
+
+ @Override
+ public void moveToEnd() {
+ // 开启自动驾驶到下一站
+ mPresenter.autoDriveToNextStation(false);
+ }
+
+ /**
+ * 设置自动驾驶可用状态
+ */
+ public void onAutopilotEnableChange(boolean isEnable) {
+ if (isEnable) {
+ showAutopilotBiz();
+ } else {
+ hideAutopilotBiz();
+ }
+ }
+
+ @Override
+ protected void onChangeOperationStatus() {
+ super.onChangeOperationStatus();
+ mPresenter.onChangeOperationStatus();
+ }
+
+ /**
+ * 修改经营状态
+ *
+ * @param launch true-收车,false-出车
+ */
+ public void changeOperationStatus(boolean launch) {
+ isOperationStatus = launch;
+ if (launch) {
+ // 出车的时候重制站点状态
+ mPresenter.queryBusRoutes();
+ tvOperationStatus.setText("收车");
+ showSlidePanle("滑动出发");
+ showPanel();
+ } else {
+ AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
+ tvOperationStatus.setText("出车");
+ hideSlidePanel();
+ hidPanel();
+
+ //移除起点终点
+ if (null != startStation) {
+ setOrRemoveMapMaker(false, BusConst.BUS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+ }
+ if (null != endStation) {
+ setOrRemoveMapMaker(false, BusConst.BUS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ }
+ }
+ }
+
+ /**
+ * VR模式切换
+ *
+ * @param isVRMode
+ */
+ public void onVRModeChanged(boolean isVRMode) {
+ if (mRootView != null) {
+ mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ /**
+ * 绘制地图起点终点
+ *
+ * @param isAdd
+ * @param uuid
+ */
+ private void setOrRemoveMapMaker(boolean isAdd, String uuid, double lat, double longi,int resourceId) {
+ if (isAdd) {
+ CallerLogger.INSTANCE.d(M_BUS + "setMapMaker= ", uuid + "=latitude=" + lat + ",longitude=" + longi);
+
+ MogoMarkerOptions options = new MogoMarkerOptions()
+ .owner(BusConst.TYPE_MARKER_BUS_ORDER)
+ .anchor(0.5f, 0.5f)
+ .set3DMode(true)
+ .gps(true)
+ .controlAngle(true)
+ .icon3DRes(resourceId)
+ .latitude(lat)
+ .longitude(longi);
+ IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .addMarker(uuid, options);
+ marker.setRotateAngle(CallerHDMapManager.INSTANCE.getCenterLineInfo(
+ longi,lat,-1)
+ .getAngle()
+ .floatValue());
+ }else {
+ CallerLogger.INSTANCE.d(M_BUS + "RemoveMapMaker=",uuid+"=latitude="+lat+",longitude="+longi);
+ MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(uuid);
+ }
+ }
+
+ @Override
+ public void debugAutoPilotStatus(int status) {
+ mPresenter.debugAutoPilotStatus(status);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线
+ //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
+ == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning1));
+ return;
+ }
+ if (mCurrentStation > 0) {
+ TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning2));
+ return;
+ }
+ Intent intent = new Intent(getContext(), BusSwitchLineActivity.class);
+ startActivity(intent);
+ }
+ }
+
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java
deleted file mode 100644
index 0f64136336..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java
+++ /dev/null
@@ -1,360 +0,0 @@
-package com.mogo.och.bus.fragment;
-
-import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.util.Log;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.debug.DebugConfig;
-import com.mogo.commons.voice.AIAssist;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
-import com.mogo.map.marker.MogoMarkerOptions;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.och.bus.R;
-import com.mogo.och.bus.bean.OchBusStation;
-import com.mogo.och.bus.constant.OchBusConst;
-import com.mogo.och.bus.presenter.OchBusPresenter;
-import com.mogo.och.bus.ui.BusSwitchLineActivity;
-import com.mogo.och.bus.view.SlidePanelView;
-
-import org.w3c.dom.Text;
-
-import java.util.List;
-
-
-/**
- * 网约车小巴界面
- *
- * @author tongchenfei
- */
-public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBusPresenter >
- implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener {
- private static final String TAG = "OchBusFragment";
-
- private TextView mCurrentStationName;
- private TextView mStartStationFlag;
- private TextView mNextStationName;
- private TextView mEndStationFlag;
-// private TextView mDebugArrive;
- private TextView mSwitchLine; //切换路线
- private int mCurrentStation = 0;
-
- private View mBus;
-
- private OchBusStation startStation = null;
- private OchBusStation endStation = null;
-
- @Override
- public String getTagName() {
- return "OchBusFragment";
- }
-
- @Override
- protected void initViews() {
- super.initViews();
- mBus = findViewById( R.id.module_och_bus_tag );
- mCurrentStationName = findViewById( R.id.module_och_bus_current_station );
- mStartStationFlag = findViewById( R.id.module_och_bus_start_station_tag );
- mNextStationName = findViewById( R.id.module_och_bus_order_end_station );
- mEndStationFlag = findViewById( R.id.module_och_bus_end_station_tag );
- mSwitchLine = findViewById(R.id.switch_line_btn);
-// mDebugArrive = findViewById(R.id.module_och_bus_arrive_station);
-
- if ( DebugConfig.isDebug() ) {
- mBus.setOnClickListener( view -> {
- TipToast.shortTip( "重置了车站状态" );
- mPresenter.queryBusRoutes();
- } );
-
- mBus.setOnLongClickListener( view -> {
- getActivity().finish();
- return true;
- } );
- //debug下调用测试面板
- mCurrentStationName.setOnLongClickListener(v -> {
- debugTestBar();
- return true;
- });
- }
-
- Logger.d( TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
- // 初始化的时候设置 UI 按钮状态
- switch ( CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() ) {
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
- hideAutopilotBiz();
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
- showAutopilotBiz();
- onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE ,false);
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
- showAutopilotBiz();
- onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ,false);
- break;
- default:
- break;
- }
- mSwitchLine.setOnClickListener(this);
- }
-
- @Override
- protected void debugArrivedStation() {
- mPresenter.onAutopilotArriveAtStation(null);
- }
-
- @NonNull
- @Override
- protected OchBusPresenter createPresenter() {
- return new OchBusPresenter( this );
- }
-
- @Override
- public void onResume() {
- super.onResume();
- }
-
- /**
- * 根据站点列表信息刷新车站面板,滑块面板
- *
- * @param stationList 车站列表信息
- * @param currentStation 当前站点
- * @param nextStation 下个站点
- * @param isArrived 是否都站
- */
- public void refreshBusStations( List< OchBusStation > stationList, int currentStation, int nextStation ,boolean isArrived) {
- mCurrentStation = currentStation;
- if ( getActivity() == null ) {
- return;
- }
- getActivity().runOnUiThread( () -> {
- if ( stationList == null ) {
- // 获取小巴数据失败
- return;
- }
-
- // 渲染小巴路线数据
- renderCurrentStationStatus( stationList, currentStation, nextStation ,isArrived);
- } );
- }
-
- /**
- * 重新刷新站点信息 isArrived 是否到站
- */
- private void renderCurrentStationStatus( List< OchBusStation > stationList, int currentStation
- , int nextStation ,boolean isArrived) {
- Log.d("MapMaker= ","currentStation="+currentStation+",nextStation="+nextStation+"isArrived="+isArrived);
- String currentStationName = null;
- String nextStationName = null;
- int startStationFlagVisibility = View.INVISIBLE;
- int endStationFlagVisibility = View.INVISIBLE;
-
- boolean isArriveEndStation = false;
- boolean isArriveAtStation = false;
- boolean isArriveAtStartStation = false;
-
- // 获取当前站点的名称
- currentStationName = stationList.get( currentStation ).getName();
-
- startStation = stationList.get(0);
- endStation = stationList.get(stationList.size() - 1);
-
- // 是否到达起点
- if ( currentStation == 0 ) {
- startStationFlagVisibility = View.VISIBLE;
- isArriveAtStartStation = true;
- mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start));
-// Log.d("MapMaker= ","起点=");
- setOrRemoveMapMaker(true, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat()
- ,startStation.getLon(),R.drawable.icon_station_start_end);
- setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat()
- ,endStation.getLon(),R.drawable.icon_station_start_end);
- } else if ( currentStation > 0 && currentStation < stationList.size() - 1 ) {// 是否到达站点
-// Log.d("MapMaker= ","中间=");
- isArriveAtStation = true;
-// mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start1));
- setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat()
- ,startStation.getLon(),R.drawable.icon_station_start_end);
- setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat()
- ,endStation.getLon(),R.drawable.icon_station_start_end);
- } else if ( currentStation == stationList.size() - 1 ) {// 是否到达终点
-// Log.d("MapMaker= ","终点=");
- isArriveEndStation = true;
- nextStationName = "--";
- mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_end));
- startStationFlagVisibility = View.VISIBLE;
- endStationFlagVisibility = View.INVISIBLE;
- setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat()
- ,startStation.getLon(),R.drawable.icon_station_start_end);
- if (isArrived){
- setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat()
- ,endStation.getLon(),R.drawable.icon_station_start_end);
- }else {
- setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat()
- ,endStation.getLon(),R.drawable.icon_station_start_end);
- }
- }
-
- // 获取下一站点名称
- if ( nextStation > currentStation && nextStation <= stationList.size() - 1 ) {
- nextStationName = stationList.get( nextStation ).getName();
- }
-
- // 是否到达终点
- if ( nextStation == stationList.size() - 1 ) {
- endStationFlagVisibility = View.VISIBLE;
- }
-
- // 重置滑动按钮文字
- if ( isArriveEndStation ) {
- showSlidePanle( "单程结束" );
- } else if ( isArriveAtStartStation ) {
- showSlidePanle( "滑动出发" );
- } else if ( isArriveAtStation ) {
- showSlidePanle( "滑动出发" );
- }
-
- mCurrentStationName.setText( currentStationName );
- mNextStationName.setText( nextStationName );
- mStartStationFlag.setVisibility( startStationFlagVisibility );
- mEndStationFlag.setVisibility( endStationFlagVisibility );
- }
-
- public void hideOchBus() {
-// tvNotice.setVisibility(View.GONE);
- }
-
- @Override
- public int getStationPanelViewId() {
- return R.layout.fragment_och_bus;
- }
-
- @Override
- public void restartAutopilot() {
- mPresenter.restartAutopilot();
- }
-
- @Override
- public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
- return this;
- }
-
- @Override
- public void moveToEnd() {
- // 开启自动驾驶到下一站
- mPresenter.autoDriveToNextStation(false);
- }
-
- /**
- * 设置自动驾驶可用状态
- */
- public void onAutopilotEnableChange( boolean isEnable ) {
- if ( isEnable ) {
- showAutopilotBiz();
- } else {
- hideAutopilotBiz();
- }
- }
-
- @Override
- protected void onChangeOperationStatus() {
- super.onChangeOperationStatus();
- mPresenter.onChangeOperationStatus();
- }
-
- /**
- * 修改经营状态
- * @param launch true-收车,false-出车
- */
- public void changeOperationStatus( boolean launch ) {
- isOperationStatus = launch;
- if ( launch ) {
- // 出车的时候重制站点状态
- mPresenter.queryBusRoutes();
- tvOperationStatus.setText( "收车" );
- showSlidePanle("滑动出发");
- showPanel();
- } else {
- AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
- tvOperationStatus.setText("出车");
- hideSlidePanel();
- hidPanel();
-
- //移除起点终点
- if (null != startStation){
- setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat()
- ,startStation.getLon(),R.drawable.icon_station_start_end);
- }
- if (null != endStation){
- setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat()
- ,endStation.getLon(),R.drawable.icon_station_start_end);
- }
- }
- }
-
- /**
- * VR模式切换
- * @param isVRMode
- */
- public void onVRModeChanged(boolean isVRMode) {
- if (mRootView != null) {
- mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
- }
- }
-
- /**
- * 绘制地图起点终点
- * @param isAdd
- * @param uuid
- * @param iconId
- */
- private void setOrRemoveMapMaker(boolean isAdd, String uuid,double lat,double longi, int iconId){
- if (isAdd){
- Log.d("setMapMaker= ",uuid+"=latitude="+lat+",longitude="+longi);
- MogoMarkerOptions options = new MogoMarkerOptions();
- options.anchorColor("#000000");//不设置报错,暂时随便设置个
- options.setGps(true);//使用wgs 必须设置true
- options.scale(0.15f);
- Bitmap bitmap = BitmapFactory.decodeResource(AbsMogoApplication.getApp().getResources(), iconId, null);
- options.icon(bitmap);
- options.latitude(lat);
- options.longitude(longi);
- MogoApisHandler.getInstance().getApis().getMapServiceApi()
- .getMarkerManager(AbsMogoApplication.getApp()).addMarker(uuid, options);
- }else {
- Log.d("RemoveMapMaker=",uuid+"=latitude="+lat+",longitude="+longi);
- MogoApisHandler.getInstance().getApis().getMapServiceApi()
- .getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(uuid);
- }
- }
-
- public void debugAutoPilotStatus(int status){
- mPresenter.debugAutoPilotStatus(status);
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.switch_line_btn ){//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线
- //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线
- if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
- == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
- TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning1));
- return;
- }
- if (mCurrentStation > 0){
- TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning2));
- return;
- }
- Intent intent = new Intent(getContext(), BusSwitchLineActivity.class);
- startActivity(intent);
- }
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java
new file mode 100644
index 0000000000..c0b80d394f
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/BusServiceManager.java
@@ -0,0 +1,242 @@
+package com.mogo.och.bus.net;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.Context;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.eagle.core.data.BaseData;
+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.bean.BusQueryLinesResponse;
+import com.mogo.och.bus.bean.BusRoutesResponse;
+import com.mogo.och.bus.bean.CarHeartbeatReqBean;
+import com.mogo.och.bus.bean.BusOperationStatusRequest;
+import com.mogo.och.bus.bean.BusOperationStatusResponse;
+import com.mogo.och.bus.bean.BusOrdersResponse;
+import com.mogo.och.bus.bean.BusQueryLineStationsRequest;
+import com.mogo.och.bus.bean.BusResetDrivingLineRequest;
+import com.mogo.och.bus.bean.BusUpdateSiteStatusRequest;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.bus.constant.BusConst;
+import com.mogo.och.bus.presenter.BusOrderModel;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/20
+ */
+public class BusServiceManager {
+
+ private static final String TAG = BusServiceManager.class.getSimpleName();
+
+ private final IBusApiService mService;
+
+ private static final class SingletonHolder {
+ private static final BusServiceManager INSTANCE = new BusServiceManager();
+ }
+
+ public static BusServiceManager getInstance(){
+ return SingletonHolder.INSTANCE;
+ }
+
+ private BusServiceManager(){
+ mService = MoGoRetrofitFactory.getInstance(BusConst.getBaseUrl()).create(IBusApiService.class);
+ }
+
+ /**
+ * 查询小巴车线路
+ * @param context
+ * @param callback
+ */
+ public void queryBusRoutes(Context context, IBusServiceCallback callback) {
+ //获取当前高德坐标
+
+ mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ , new BusQueryLineStationsRequest(BusOrderModel.getInstance().mLongitude
+ , BusOrderModel.getInstance().mLatitude,true))
+ .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
+ .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate"));
+ }
+
+ /**
+ * 重置线路站点
+ * @param context
+ * @param lineId
+ * @param callback
+ */
+ public void resetStationStatus(Context context, int lineId, IBusServiceCallback callback){
+ mService.resetStationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),new BusResetDrivingLineRequest(lineId))
+ .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus"));
+ }
+
+ /**
+ * 离站上报
+ * @param context
+ * @param seq
+ * @param siteId
+ * @param callback
+ */
+ public void leaveStation(Context context, int seq, int siteId, IBusServiceCallback callback){
+ mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new BusUpdateSiteStatusRequest(seq,siteId, BusOrderModel.getInstance().mLongitude
+ , BusOrderModel.getInstance().mLatitude))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
+ }
+
+ /**
+ * 到站更新站点状态
+ * @param context
+ * @param seq
+ * @param siteId
+ * @param callback
+ */
+ public void arriveSiteStation(Context context, int seq, int siteId, IBusServiceCallback callback){
+ mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new BusUpdateSiteStatusRequest(seq,siteId
+ , BusOrderModel.getInstance().mLongitude, BusOrderModel.getInstance().mLatitude))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
+ }
+
+ /**
+ * 查询下车乘客
+ * @param context
+ * @param seq
+ * @param siteId
+ * @param callback
+ */
+ public void queryStationLeaveAwayPassengers(Context context, int seq, int siteId
+ , IBusServiceCallback callback){
+ mService.queryStationLeaveAwayPassengers( MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),new QueryLeaveAwayPassengersRequest(seq,siteId))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers"));
+ }
+
+ /**
+ * 收车
+ * @param context
+ * @param callback
+ */
+ public void stopTakeOrder(Context context, IBusServiceCallback callback){
+ mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude
+ , BusOrderModel.getInstance().mLatitude))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder"));
+ }
+
+ /**
+ * 出车
+ * @param context
+ * @param callback
+ */
+ public void startTakeOrder(Context context, IBusServiceCallback callback){
+ mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new BusOperationStatusRequest(BusOrderModel.getInstance().mLongitude
+ , BusOrderModel.getInstance().mLatitude))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"startTakeOrder"));
+ }
+
+ /**
+ * 查询出车/收车状态
+ * @param context
+ * @param callback
+ */
+ public void queryOperationStatus(Context context, IBusServiceCallback callback){
+ mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus"));
+ }
+
+ /**
+ * 查询小巴车订单
+ * @param context
+ * @param callback
+ */
+ public void queryBusOrders(Context context, IBusServiceCallback callback){
+ mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"queryBusOrders"));
+ }
+
+ public void queryBusLines(Context context, IBusServiceCallback callback){
+ mService.queryBusLines(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"queryBusLines"));
+ }
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param context
+ * @param lon
+ * @param lat
+ * @param callback
+ */
+ public void runCarHeartbeat(Context context, double lon, double lat,
+ IBusServiceCallback callback) {
+ mService.runCarHeartbeat(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),new CarHeartbeatReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
+ }
+
+ private SubscribeImpl getSubscribeImpl(Context context, IBusServiceCallback callback, String apiName){
+ return new SubscribeImpl(RequestOptions.create(context)){
+ @Override
+ public void onSuccess(T o) {
+ super.onSuccess(o);
+ CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onSuccess() " + o.msg);
+ if (callback != null) {
+ callback.onSuccess(o);
+ }
+ }
+
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +"msg="+ message+" code="+code);
+ if (callback != null) {
+ callback.onFail("msg="+ message+" code="+code);
+ }
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +" e="+e.getMessage());
+ if (callback != null) {
+ callback.onFail(e.getMessage());
+ }
+ }
+ };
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java
new file mode 100644
index 0000000000..31a4af6df5
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusApiService.java
@@ -0,0 +1,149 @@
+package com.mogo.och.bus.net;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.och.bus.bean.BusOperationStatusRequest;
+import com.mogo.och.bus.bean.BusOrdersResponse;
+import com.mogo.och.bus.bean.BusQueryLinesResponse;
+import com.mogo.och.bus.bean.BusRoutesResponse;
+import com.mogo.och.bus.bean.CarHeartbeatReqBean;
+import com.mogo.och.bus.bean.BusQueryLineStationsRequest;
+import com.mogo.och.bus.bean.BusOperationStatusResponse;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.bus.bean.BusResetDrivingLineRequest;
+import com.mogo.och.bus.bean.BusUpdateSiteStatusRequest;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Header;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * 小巴车相关接口
+ *
+ * @author tongchenfei
+ *
+ * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072
+ */
+public interface IBusApiService {
+ /**
+ * 根据车机坐标获取所在区域全部站点信息
+ *
+ * @param request 请求参数
+ * @return 接口返回数据
+ */
+ @Headers( {"Content-Type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" )
+ @POST( "/autopilot-car-hailing/line/v2/driver/bus/lineDataWithDriver/query" )
+// @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
+ Observable querySiteByCoordinate(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusQueryLineStationsRequest request);
+
+ /**
+ * 重置巴士路线: 点击小巴车tab 或者出车后会使用
+ *
+ * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的
+ * @return 返回值是重置后的车站列表
+ */
+ @Headers( {"Content-Type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" )
+ @POST( "/autopilot-car-hailing/car/v2/driver/bus/drivingLine/reset" )
+// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" )
+ Observable resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusResetDrivingLineRequest request);
+
+ /**
+ * 离站,通知服务器
+ * @param request
+ * @return
+ */
+ @Headers({"Content-Type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/car/v2/bus/driving/away")
+ @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away")
+ Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusUpdateSiteStatusRequest request);
+
+ /**
+ * 到站 更新到站信息
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/order/v2/bus/driving/attachSite")
+ @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite")
+ Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusUpdateSiteStatusRequest request);
+
+
+ /**
+ * 到站查询下车乘客
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/order/v2/bus/driving/siteArrivedOrders")
+ @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/siteArrivedOrders")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
+ Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request);
+
+ /**
+ * 出车
+ * @param request
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder")
+ @POST("/autopilot-car-hailing/car/v2/driver/bus/startTakeOrder")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder")
+ Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request);
+
+ /**
+ * 收车
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder")
+ @POST("/autopilot-car-hailing/car/v2/driver/bus/stopTakeOrder")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder")
+ Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body BusOperationStatusRequest request);
+
+ /**
+ * 查询小巴出车/收车状态
+ * @param sn
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query")
+ @GET("/autopilot-car-hailing/car/v2/driver/bus/takeOrderStatus/query")
+// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query")
+ Observable queryOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query")
+ @GET("/autopilot-car-hailing/order/v2/driver/bus/servicingOrders/query")
+// @GET("/mock/268/autopilot-car-hailing/bus/api/servicingOrders/query")
+ Observable queryBusOrders(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/location/v2/driver/heartbeat" )
+ @POST( "/autopilot-car-hailing/location/v2/driver/bus/heartbeat" )
+ Observable runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket,@Body CarHeartbeatReqBean data);
+
+ /**
+ * 查询车辆配置的所有路线
+ * @param appId
+ * @param ticket
+ * @param sn
+ * @return
+ */
+// @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query")
+ @GET("/autopilot-car-hailing/line/v2/driver/bus/bindLine/query")
+ Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+}
+
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusServiceCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusServiceCallback.java
new file mode 100644
index 0000000000..966a86d980
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IBusServiceCallback.java
@@ -0,0 +1,15 @@
+package com.mogo.och.bus.net;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/20
+ */
+public interface IBusServiceCallback< T >{
+ void onSuccess(T o);
+
+ void onFail(String failMsg);
+
+ default void onError() {
+
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java
deleted file mode 100644
index d3a65f66b1..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package com.mogo.och.bus.net;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.och.bus.bean.BusQueryLinesResponse;
-import com.mogo.och.bus.bean.CarHeartbeatReqBean;
-import com.mogo.och.bus.bean.OchBusOperationStatusRequest;
-import com.mogo.och.bus.bean.OchBusQueryLineStationsRequest;
-import com.mogo.och.bus.bean.OchBusOperationStatusResponse;
-import com.mogo.och.bus.bean.OchBusOrdersResponse;
-import com.mogo.och.bus.bean.OchBusRoutesResponse;
-import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
-import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
-import com.mogo.och.bus.bean.OchBusResetDrivingLineRequest;
-import com.mogo.och.bus.bean.OchBusUpdateSiteStatusRequest;
-
-import io.reactivex.Observable;
-import retrofit2.http.Body;
-import retrofit2.http.GET;
-import retrofit2.http.Header;
-import retrofit2.http.Headers;
-import retrofit2.http.POST;
-import retrofit2.http.Query;
-
-/**
- * 小巴车相关接口
- *
- * @author tongchenfei
- *
- * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072
- */
-public interface IOchBusApiService {
- /**
- * 根据车机坐标获取所在区域全部站点信息
- *
- * @param request 请求参数
- * @return 接口返回数据
- */
- @Headers( {"Content-Type:application/json;charset=UTF-8"} )
-// @POST( "/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
- @POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" )
-// @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
- Observable< OchBusRoutesResponse > querySiteByCoordinate(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusQueryLineStationsRequest request);
-
- /**
- * 重置巴士路线: 点击小巴车tab 或者出车后会使用
- *
- * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的
- * @return 返回值是重置后的车站列表
- */
- @Headers( {"Content-Type:application/json;charset=UTF-8"} )
-// @POST( "/autopilot-car-hailing/bus/api/drivingLine/reset" )
- @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" )
-// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" )
- Observable< OchBusRoutesResponse > resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body OchBusResetDrivingLineRequest request);
-
- /**
- * 离站,通知服务器
- * @param request
- * @return
- */
- @Headers({"Content-Type:application/json;charset=UTF-8"})
-// @POST("/autopilot-car-hailing/bus/api/driving/away")
- @POST("/autopilot-car-hailing/car/v2/bus/driving/away")
-// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away")
- Observable< OchBusRoutesResponse > leaveStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusUpdateSiteStatusRequest request);
-
- /**
- * 到站 更新到站信息
- * @param request
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
-// @POST("/autopilot-car-hailing/bus/api/driving/attachSite")
- @POST("/autopilot-car-hailing/order/v2/bus/driving/attachSite")
-// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite")
- Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusUpdateSiteStatusRequest request);
-
-
- /**
- * 到站查询下车乘客
- * @param request
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
-// @POST("/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
- @POST("/autopilot-car-hailing/order/v2/bus/driving/siteArrivedOrders")
-// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
- Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request);
-
- /**
- * 出车
- * @param request
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
-// @POST("/autopilot-car-hailing/bus/api/startTakeOrder")
- @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder")
-// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder")
- Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusOperationStatusRequest request);
-
- /**
- * 收车
- * @param request
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
-// @POST("/autopilot-car-hailing/bus/api/stopTakeOrder")
- @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder")
-// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder")
- Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusOperationStatusRequest request);
-
- /**
- * 查询小巴出车/收车状态
- * @param sn
- * @return
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
-// @GET("/autopilot-car-hailing/bus/api/takeOrderStatus/query")
- @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query")
-// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query")
- Observable queryOperationStatus(@Header ("appId") String appId,@Header("ticket") String ticket,@Query("sn") String sn);
-
- @Headers({"Content-type:application/json;charset=UTF-8"})
-// @GET("/autopilot-car-hailing/bus/api/servicingOrders/query")
- @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query")
-// @GET("/mock/268/autopilot-car-hailing/bus/api/servicingOrders/query")
- Observable queryBusOrders(@Header ("appId") String appId,@Header("ticket") String ticket,@Query("sn") String sn);
-
- /**
- * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
-// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
- @POST( "/autopilot-car-hailing/location/v2/driver/heartbeat" )
- Observable runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket,@Body CarHeartbeatReqBean data);
-
- @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query")
- Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
-}
-
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java
deleted file mode 100644
index 3fc23505e5..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java
+++ /dev/null
@@ -1,275 +0,0 @@
-package com.mogo.och.bus.net;
-
-import android.content.Context;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.eagle.core.network.RequestOptions;
-import com.mogo.eagle.core.network.SubscribeImpl;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.och.bus.bean.BusQueryLinesResponse;
-import com.mogo.och.bus.bean.CarHeartbeatReqBean;
-import com.mogo.och.bus.bean.OchBusOperationStatusRequest;
-import com.mogo.och.bus.bean.OchBusOperationStatusResponse;
-import com.mogo.och.bus.bean.OchBusOrdersResponse;
-import com.mogo.och.bus.bean.OchBusQueryLineStationsRequest;
-import com.mogo.och.bus.bean.OchBusResetDrivingLineRequest;
-import com.mogo.och.bus.bean.OchBusRoutesResponse;
-import com.mogo.och.bus.bean.OchBusUpdateSiteStatusRequest;
-import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
-import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
-import com.mogo.och.bus.constant.OchBusConst;
-import com.mogo.och.bus.presenter.OchBusOrderModel;
-
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/20
- */
-public class OCHBusServiceManager {
-
- private static final String TAG = OCHBusServiceManager.class.getSimpleName();
-
- private IOchBusApiService mService;
- private String baseUrl = OchBusConst.getBaseUrl();
-
- private static final class SingletonHolder {
- private static final OCHBusServiceManager INSTANCE = new OCHBusServiceManager();
- }
-
- public static OCHBusServiceManager getInstance(){
- return SingletonHolder.INSTANCE;
- }
-
- private OCHBusServiceManager(){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
-
- /**
- * 查询小巴车线路
- * @param context
- * @param callback
- */
- public void queryBusRoutes(Context context,OCHServiceCallback callback) {
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- //获取当前高德坐标
-
- mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- , new OchBusQueryLineStationsRequest(OchBusOrderModel.getInstance().mLongitude
- ,OchBusOrderModel.getInstance().mLatitude,true))
- .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
- .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate"));
- }
-
- /**
- * 重置线路站点
- * @param context
- * @param lineId
- * @param callback
- */
- public void resetStationStatus(Context context, int lineId, OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.resetStationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),new OchBusResetDrivingLineRequest(lineId))
- .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus"));
- }
-
- /**
- * 离站上报
- * @param context
- * @param seq
- * @param siteId
- * @param callback
- */
- public void leaveStation(Context context,int seq,int siteId,OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new OchBusUpdateSiteStatusRequest(seq,siteId,OchBusOrderModel.getInstance().mLongitude
- ,OchBusOrderModel.getInstance().mLatitude))
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
- }
-
- /**
- * 到站更新站点状态
- * @param context
- * @param seq
- * @param siteId
- * @param callback
- */
- public void arriveSiteStation(Context context,int seq,int siteId,OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new OchBusUpdateSiteStatusRequest(seq,siteId
- ,OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude))
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
- }
-
- /**
- * 查询下车乘客
- * @param context
- * @param seq
- * @param siteId
- * @param callback
- */
- public void queryStationLeaveAwayPassengers(Context context,int seq,int siteId
- ,OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.queryStationLeaveAwayPassengers( MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),new QueryLeaveAwayPassengersRequest(seq,siteId))
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers"));
- }
-
- /**
- * 收车
- * @param context
- * @param callback
- */
- public void stopTakeOrder(Context context,OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude
- ,OchBusOrderModel.getInstance().mLatitude))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder"));
- }
-
- /**
- * 出车
- * @param context
- * @param callback
- */
- public void startTakeOrder(Context context,OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken()
- ,new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude
- ,OchBusOrderModel.getInstance().mLatitude))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"startTakeOrder"));
- }
-
- /**
- * 查询出车/收车状态
- * @param context
- * @param callback
- */
- public void queryOperationStatus(Context context,OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn( Schedulers.io() )
- .observeOn( AndroidSchedulers.mainThread() )
- .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus"));
- }
-
- /**
- * 查询小巴车订单
- * @param context
- * @param callback
- */
- public void queryBusOrders(Context context, OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
- }
- mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"queryBusOrders"));
- }
-
- public void queryBusLines(Context context, OCHServiceCallback callback){
- if (mService == null){
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create(IOchBusApiService.class,baseUrl);
- }
- mService.queryBusLines(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context,callback,"queryBusLines"));
- }
-
- /**
- * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
- * @param context
- * @param lon
- * @param lat
- * @param callback
- */
- public void runCarHeartbeat(Context context, double lon, double lat,
- OCHServiceCallback callback) {
- if ( mService == null ) {
- mService = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(IOchBusApiService.class, baseUrl);
- }
- mService.runCarHeartbeat(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
- ,MoGoAiCloudClientConfig.getInstance().getToken(),new CarHeartbeatReqBean(
- MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
- }
-
- private SubscribeImpl getSubscribeImpl(Context context, OCHServiceCallback callback, String apiName){
- return new SubscribeImpl(RequestOptions.create(context)){
- @Override
- public void onSuccess(T o) {
- super.onSuccess(o);
- Logger.e(TAG,apiName + ": onSuccess() " + o.msg);
- if (callback != null) {
- callback.onSuccess(o);
- }
- }
-
- @Override
- public void onError(String message, int code) {
- super.onError(message, code);
- Logger.e(TAG,apiName + ": onError() " +"msg="+ message+" code="+code);
- if (callback != null) {
- callback.onFail("msg="+ message+" code="+code);
- }
- }
-
- @Override
- public void onError(Throwable e) {
- super.onError(e);
- Logger.e(TAG,apiName + ": onError() " +" e="+e.getMessage());
- if (callback != null) {
- callback.onFail(e.getMessage());
- }
- }
- };
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHServiceCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHServiceCallback.java
deleted file mode 100644
index a243248570..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHServiceCallback.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.mogo.och.bus.net;
-
-/**
- * @author: wangmingjun
- * @date: 2021/10/20
- */
-public interface OCHServiceCallback< T >{
- void onSuccess(T o);
-
- void onFail(String failMsg);
-
- default void onError() {
-
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLineModel.java
new file mode 100644
index 0000000000..84f715c78e
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLineModel.java
@@ -0,0 +1,77 @@
+package com.mogo.och.bus.presenter;
+
+import android.content.Context;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.och.bus.bean.BusQueryLinesResponse;
+import com.mogo.och.bus.bean.BusRoutesResponse;
+import com.mogo.och.bus.callback.IBusLinesCallback;
+import com.mogo.och.bus.net.BusServiceManager;
+import com.mogo.och.bus.net.IBusServiceCallback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public class BusLineModel {
+ private static volatile BusLineModel sInstance;
+ private Context mContext;
+ private IBusLinesCallback mBusLinesCallback;
+ public static BusLineModel getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( BusLineModel.class ) {
+ if ( sInstance == null ) {
+ sInstance = new BusLineModel();
+ }
+ }
+ }
+ return sInstance;
+ }
+ private BusLineModel() {
+
+ }
+ public void init() {
+ mContext = AbsMogoApplication.getApp();
+ }
+ public void setBusLinesCallback(IBusLinesCallback callback){
+ mBusLinesCallback = callback;
+ }
+ public void queryBusLines(){
+ BusServiceManager.getInstance().queryBusLines(mContext, new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusQueryLinesResponse data) {
+ if (null == data && mBusLinesCallback != null) {
+ mBusLinesCallback.onBusLinesChange(null);
+ return;
+ }
+
+ if (mBusLinesCallback != null){
+ mBusLinesCallback.onBusLinesChange(data);
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ public void commitSwitchLineId(int lineId){
+ BusServiceManager.getInstance().resetStationStatus(mContext,lineId, new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusRoutesResponse o) {
+ if (mBusLinesCallback != null){
+ mBusLinesCallback.onChangeLineIdSuccess();
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ TipToast.longTip("切换路线失败");
+ }
+ });
+ }
+
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java
new file mode 100644
index 0000000000..04bf358f4e
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusLinePresenter.java
@@ -0,0 +1,74 @@
+package com.mogo.och.bus.presenter;
+
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.bus.bean.BusQueryLinesResponse;
+import com.mogo.och.bus.callback.IBusLinesCallback;
+import com.mogo.och.bus.ui.BusSwitchLineView;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public class BusLinePresenter extends Presenter implements IBusLinesCallback {
+
+ public BusLinePresenter(BusSwitchLineView view) {
+ super(view);
+ BusLineModel.getInstance().init();
+ BusOrderModel.getInstance().init();
+ }
+
+ @Override
+ public void onCreate(@NonNull LifecycleOwner owner) {
+ super.onCreate(owner);
+ initListener();
+ }
+
+ private void initListener() {
+ BusLineModel.getInstance().setBusLinesCallback(this);
+ }
+
+ private void runOnUIThread( Runnable executor ) {
+ if ( executor == null ) {
+ return;
+ }
+ if ( Looper.myLooper() != Looper.getMainLooper() ) {
+ UiThreadHandler.post( executor );
+ } else {
+ executor.run();
+ }
+ }
+
+ @Override
+ public void onBusLinesChange(BusQueryLinesResponse lines) {
+ runOnUIThread(() -> mView.onBusLinesChange(lines));
+ }
+
+ @Override
+ public void onChangeLineIdSuccess() {
+ runOnUIThread(() -> mView.onChangeLineIdSuccess());
+ }
+
+ public void queryBusLines(){
+ BusLineModel.getInstance().queryBusLines();
+ }
+
+ public void commitSwitchLineId(int lineId){
+ BusLineModel.getInstance().commitSwitchLineId(lineId);
+ }
+
+ public void queryBusRoutes(){
+ BusOrderModel.getInstance().queryBusRoutes();
+ }
+
+ @Override
+ public void onDestroy(@NonNull LifecycleOwner owner) {
+ super.onDestroy(owner);
+ BusLineModel.getInstance().setBusLinesCallback(null);
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java
new file mode 100644
index 0000000000..73127227d9
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusModelLoopManager.java
@@ -0,0 +1,54 @@
+package com.mogo.och.bus.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.bus.constant.BusConst;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created on 2021/11/22
+ *
+ * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
+ */
+public class BusModelLoopManager {
+
+ private static final String TAG = BusModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final BusModelLoopManager INSTANCE = new BusModelLoopManager();
+ }
+
+ public static BusModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mHeartbeatDisposable; //心跳轮询
+
+ public void startHeartbeatLoop() {
+ if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_BUS + TAG, "startHeartbeatLoop()");
+ mHeartbeatDisposable = Observable.interval(BusConst.LOOP_DELAY,
+ BusConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> BusOrderModel.getInstance().runCarHeartbeat());
+ }
+
+ public void stopHeartbeatLoop() {
+ if (mHeartbeatDisposable != null) {
+ CallerLogger.INSTANCE.i(M_BUS + TAG, "stopHeartbeatLoop()");
+ mHeartbeatDisposable.dispose();
+ mHeartbeatDisposable = null;
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusOrderModel.java
new file mode 100644
index 0000000000..ded7d29d63
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusOrderModel.java
@@ -0,0 +1,837 @@
+package com.mogo.och.bus.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+import static com.mogo.och.bus.constant.BusConst.STATION_STATUS_STOPPED;
+
+import android.content.Context;
+import android.location.Location;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+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.bus.bean.BusOperationStatusResponse;
+import com.mogo.och.bus.bean.BusOrderBean;
+import com.mogo.och.bus.bean.BusOrdersResponse;
+import com.mogo.och.bus.bean.BusRoutesResponse;
+import com.mogo.och.bus.bean.BusRoutesResult;
+import com.mogo.och.bus.bean.BusStationBean;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.bus.callback.ICarOperationStatusCallback;
+import com.mogo.och.bus.callback.IBusControllerStatusCallback;
+import com.mogo.och.bus.callback.IRefreshBusStationsCallback;
+import com.mogo.och.bus.callback.ISlidePannelHideCallback;
+import com.mogo.och.bus.constant.BusConst;
+import com.mogo.och.bus.net.BusServiceManager;
+import com.mogo.och.bus.net.IBusServiceCallback;
+import com.mogo.och.bus.util.BusAnalyticsUtil;
+import com.mogo.och.bus.util.PinYinUtil;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.exceptions.UndeliverableException;
+import io.reactivex.functions.Consumer;
+import io.reactivex.plugins.RxJavaPlugins;
+import io.reactivex.schedulers.Schedulers;
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 小巴订单管理
+ */
+public class BusOrderModel {
+ private final String TAG = BusOrderModel.class.getSimpleName();
+ private int currentLineId = -1;
+ private int currentStationIndex = 0; //因为服务端和前台对于当前站不一致,所以设置两个current index, 一个用于前台展示, 一个用于服务端接口请求
+ private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
+ /**
+ * 运营状态、后端更具运营状态来判断车辆是否派单
+ */
+ private boolean mIsWorking = false;
+ private static volatile BusOrderModel sInstance;
+ public double mLongitude = 0;
+ public double mLatitude = 0;
+ private Context mContext;
+ private Disposable mBusOrdersDisposable; //定时轮询小巴车订单
+ private List prevBusOrderNos = new ArrayList<>();
+ private final List stationList = new ArrayList<>();
+ private BusRoutesResult busRoutesResult = null;
+ /**
+ * 用来表示是否正在开往下一站
+ */
+ private boolean isGoingToNextStation = false;
+ // 运营类型
+ private static final int VEHICLE_TYPE = 10;
+ private static final int MSG_QUERY_BUS_STATION = 1001;
+ private static final long QUERY_BUS_STATION_DELAY = 5000;
+
+ private ICarOperationStatusCallback carOperationStatusCallback;
+ private IRefreshBusStationsCallback refreshBusStationsCallback;
+ private ISlidePannelHideCallback slidePannelHideCallback;
+ private IBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+
+ private boolean hadQueryLeaveAwayPassager = false;
+
+ private final Handler handler = new Handler(new Handler.Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ if ( msg.what == MSG_QUERY_BUS_STATION ) {
+ BusOrderModel.getInstance().queryBusRoutes();
+ return true;
+ }
+ return false;
+ }
+ });
+
+ public static BusOrderModel getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( BusOrderModel.class ) {
+ if ( sInstance == null ) {
+ sInstance = new BusOrderModel();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ private BusOrderModel() {
+
+ }
+
+ public void init() {
+ mContext = AbsMogoApplication.getApp();
+ // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传
+ String productFlavor = DebugConfig.getProductFlavor();
+ if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) {
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener );
+ }
+
+ //2022.1.28
+ // 调用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_BUS + TAG,"UndeliverableException");
+ }
+ if ((e instanceof IOException)) {//
+ // fine, irrelevant network problem or API that throws on cancellation
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"IOException");
+ return;
+ }
+ if (e instanceof InterruptedException) {
+ // fine, some blocking code was interrupted by a dispose call
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"InterruptedException");
+ return;
+ }
+ if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
+ // that's likely a bug in the application
+ CallerLogger.INSTANCE.d(M_BUS + 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_BUS + TAG,"IllegalStateException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"Undeliverable exception");
+ }
+ });
+
+ //2021/10/20 轮询小巴车订单,暂时用来播报
+ startLoopBusOrders();
+ }
+
+ public void setCarOperationStatusCallback(ICarOperationStatusCallback callback){
+ this.carOperationStatusCallback = callback;
+ }
+
+ public void setRefreshBusStationsCallback(IRefreshBusStationsCallback callback){
+ this.refreshBusStationsCallback = callback;
+ }
+
+ public void setSlidePannelHideCallback(ISlidePannelHideCallback callback){
+ this.slidePannelHideCallback = callback;
+ }
+
+ public void setControllerStatusCallback(IBusControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+
+ /**
+ * 轮询bus待服务订单
+ */
+ private void startLoopBusOrders() {
+ if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) {
+ return;
+ }
+ mBusOrdersDisposable = Observable.interval(BusConst.LOOP_DELAY,
+ BusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> queryBusOrders());
+ }
+
+ private void queryBusOrders() {
+ BusServiceManager.getInstance().queryBusOrders(mContext, new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusOrdersResponse o) {
+ if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "获取到bus订单数据: " + o.data.orders.toString() );
+ List busOrders = o.data.orders;
+ for (int i = 0; i < busOrders.size(); i++) {
+ BusOrderBean order = busOrders.get(i);
+ if (order == null) return;
+ if (TextUtils.isEmpty(order.getPassengerPhone())) return;
+ if (prevBusOrderNos.contains(order.getOrderNo())) continue;
+ try {
+ String tailNum = null;
+ try {
+ tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ tailNum = order.getPassengerPhone();
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + tailNum);
+ AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum
+ + " 上车站点为 " + order.getStartStationName());
+ prevBusOrderNos.add(order.getOrderNo());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ public void release(){
+ if (mBusOrdersDisposable != null) {
+ mBusOrdersDisposable.dispose();
+ }
+ startOrStopOrderLoop(false);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ // 注销到达起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+ }
+
+ private Object readResolve() {
+ // 阻止反序列化,必须实现 Serializable 接口
+ return sInstance;
+ }
+
+ private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+
+ // 自车定位
+ private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
+
+ @Override
+ public void onCarLocationChanged2( Location location ) {
+// CallerLogger.INSTANCE.d(M_BUS + TAG,"location = "+location.getLongitude()+","+location.getLatitude());
+ mLongitude = location.getLongitude();
+ mLatitude = location.getLatitude();
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(location);
+ }
+ }
+ };
+
+ /**
+ * 查询小巴路线
+ */
+ public void queryBusRoutes() {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "查询小巴路线");
+ BusServiceManager.getInstance().queryBusRoutes(mContext, new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusRoutesResponse data) {
+ if ( data == null
+ || data.getResult() == null
+ || data.getResult().getSites() == null
+ || data.getResult().getSites().isEmpty() ) {
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + data );
+ renderBusStationsStatus( data.getResult());
+ }
+ @Override
+ public void onFail(String failMsg) {
+ // 重复请求小巴路线,直至成功
+ queryBusStationDelay();
+ }
+ });
+
+ }
+
+ /**
+ * 测试、重置站点状态
+ */
+ public void debugResetStationStatus() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "测试、重置站点状态");
+ BusServiceManager.getInstance().resetStationStatus(mContext, currentLineId
+ , new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusRoutesResponse o) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + o);
+ isGoingToNextStation = false;
+ if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) {
+ return;
+ }
+ renderBusStationsStatus(o.getResult());
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ // 重复请求小巴路线,直至成功
+ queryBusStationDelay();
+ }
+ });
+
+ }
+
+ /**
+ * 离站上报
+ */
+ public void leaveStation(boolean isOneWayOver,boolean isRestart){
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex);
+ BusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq()
+ , stationList.get(backgroundCurrentStationIndex).getSiteId(), new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusRoutesResponse o) {
+ if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) {
+ return;
+ }
+ if (!isOneWayOver){
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" );
+ //需要更改当前站和下一站的状态 然后渲染
+ RenderLeaveStationSuccess(o.getResult(),isRestart);
+ }else {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "单程真的结束了====" );
+ isGoingToNextStation = false;
+ currentStationIndex = 0;
+ backgroundCurrentStationIndex = 0;
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ queryBusRoutes();
+ }
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+ });
+ }
+
+ /**
+ * 离站上报成功后渲染站点
+ * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
+ * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染
+ */
+ private void RenderLeaveStationSuccess(BusRoutesResult result, boolean isRestart) {
+ renderBusStationsStatus(result);
+ if (slidePannelHideCallback != null) {
+ slidePannelHideCallback.hideSlidePanel();
+ }
+ //开启自动驾驶
+ startAutopilot(isRestart);
+ if (isGoingToNextStation) {
+ // 为了避免恢复自动驾驶时重复的接口请求
+ return;
+ }
+ isGoingToNextStation = true;
+ AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" );
+ }
+
+ /**
+ * 开启自动驾驶
+ * @param isRestart
+ */
+ private void startAutopilot(boolean isRestart) {
+ BusStationBean currentStation = stationList.get( currentStationIndex -1);
+ BusStationBean nextStation = stationList.get( currentStationIndex);
+
+// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+// == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) {
+// TipToast.shortTip("自动驾驶状态为不可用!");
+// }
+ AutopilotControlParameters currentAutopilot = new AutopilotControlParameters();
+ currentAutopilot.isSpeakVoice = !isRestart;
+ currentAutopilot.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName());
+ currentAutopilot.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName());
+ currentAutopilot.startLatLon = new AutopilotControlParameters
+ .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() );
+ currentAutopilot.endLatLon = new AutopilotControlParameters
+ .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() );
+ currentAutopilot.vehicleType = VEHICLE_TYPE;
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + currentAutopilot.toString()
+ +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName());
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(currentAutopilot);
+
+ triggerStartServiceEvent(false);
+
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.startOpenAutopilot();
+ }
+ }
+
+ /**
+ * 到站后重置站点状态
+ */
+ private void arriveSiteStation(boolean isRestart) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+currentStationIndex);
+ BusServiceManager.getInstance().arriveSiteStation(mContext
+ , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId()
+ , new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success");
+ if (!isRestart){
+ renderArriveBusStation();
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+ });
+ }
+
+ private void renderArriveBusStation() {
+ List site = busRoutesResult.getSites();
+ if (site != null && site.size() > 0){
+ backgroundCurrentStationIndex = currentStationIndex;
+ if (refreshBusStationsCallback != null){
+ refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex
+ , getNextStopStation(),true);
+ }
+ }
+ }
+
+ /**
+ * 查询到站下车乘客
+ */
+ private void queryStationLeaveAwayPassengers() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客");
+
+ BusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext
+ , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId()
+ , new IBusServiceCallback() {
+ @Override
+ public void onSuccess(QueryLeaveAwayPassengersResponse o) {
+ hadQueryLeaveAwayPassager = true;
+ arriveSiteStation(false);
+ playLeavePassengersMsg( o );
+ queryBusOrders();
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ hadQueryLeaveAwayPassager = true;
+ arriveSiteStation(false);
+ }
+ });
+ }
+
+ /**
+ * 收车
+ */
+ public void stopTakeOrder(){
+ BusServiceManager.getInstance().stopTakeOrder(mContext, new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ mIsWorking = !mIsWorking;
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ startOrStopOrderLoop(mIsWorking);
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }else {
+ TipToast.shortTip(failMsg);
+ }
+ }
+ });
+ }
+
+ /**
+ * 出车
+ */
+ public void startTakeOrder(){
+ BusServiceManager.getInstance().startTakeOrder(mContext, new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ mIsWorking = !mIsWorking;
+ startOrStopOrderLoop(mIsWorking);
+ if ( stationList != null && stationList.size() > 0 ) {
+ AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往"
+ + stationList.get( currentStationIndex ).getName() + "站点" );
+ }
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ queryBusRoutes();
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }else {
+ TipToast.shortTip(failMsg);
+ }
+ }
+ });
+ }
+
+ /**
+ * 查询运营状态
+ */
+ public void queryOperationStatus() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态");
+ BusServiceManager.getInstance().queryOperationStatus(mContext
+ , new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BusOperationStatusResponse o) {
+ if ( o.data != null ) {
+ mIsWorking = o.data.serviceStatus == 1;
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态 result.status: " + o.data.serviceStatus);
+ startOrStopOrderLoop(mIsWorking);
+ }
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+ });
+ }
+
+ /**
+ * 开启自动驾驶到下一站
+ */
+ public void autoDriveToNextStation( boolean isRestart ) {
+ if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) {
+ // 当前站是最后一站,结束当前行程
+ travelOver();
+ return;
+ }
+ leaveStation(false,isRestart);
+ }
+
+ /**
+ * 渲染站点信息
+ * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
+ * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理current index,不能直接渲染
+ * @param result
+ */
+ private void renderBusStationsStatus(BusRoutesResult result) {
+ if (result == null) return;
+ busRoutesResult = result;
+ List site = result.getSites();
+ currentLineId = result.getLineId();
+ stationList.clear();
+ stationList.addAll( site );
+ for ( int i = 0; i < stationList.size(); i++ ) {
+ BusStationBean s = stationList.get( i );
+ // 是否正在开往下一站
+ if ( s.isLeaving()) {
+ isGoingToNextStation = true;
+ }
+ // 当前站点信息
+ if (s.getDrivingStatus() == STATION_STATUS_STOPPED ) {
+ currentStationIndex = i;
+ break;
+ }
+ }
+ backgroundCurrentStationIndex = currentStationIndex;
+ BusStationBean currentStation = stationList.get(currentStationIndex);
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "渲染站点信息服务端currentStationIndex="+currentStationIndex
+ +" isLeaving()="+currentStation.isLeaving());
+ //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态
+ // ,订单开始站下在始发站的状态流转有问题
+ if (currentStationIndex == 0 && !currentStation.isLeaving()){
+ arriveSiteStation(true);
+ }
+ // 美化是否开始
+ if (FunctionBuildConfig.isDemoMode && ((currentStationIndex > 0
+ && currentStationIndex < stationList.size()-1)
+ || (stationList.get(0).isLeaving() || stationList.get(stationList.size() -1).isLeaving()))){//行驶过程中设置美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)");
+ }
+ if (refreshBusStationsCallback != null){
+ if (currentStation.isLeaving()){//如果服务端的当前站是leaving状态,展示当前站需要+1
+ currentStationIndex ++;
+ refreshBusStationsCallback.refreshBusStations(stationList
+ , currentStationIndex, getNextStopStation(),false);
+ }else{
+ refreshBusStationsCallback.refreshBusStations(stationList
+ , currentStationIndex, getNextStopStation(),true);
+ }
+ }
+ if ( currentStation.isLeaving() && slidePannelHideCallback != null) {
+ slidePannelHideCallback.hideSlidePanel();
+ }
+ }
+
+ /**
+ * 重置下一站
+ *
+ * @param lastStopStation
+ */
+ private void resetNextStopStation( int lastStopStation ) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "重置下一站");
+ int nextStopStation = getNextStopStation();
+ if ( nextStopStation < 0 ) {
+ return;
+ }
+ if ( lastStopStation <= nextStopStation || nextStopStation <= currentStationIndex ) {
+ return;
+ }
+ if ( CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
+ == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ) {
+ // 自动驾驶中动态设置下一个停靠站点/
+ autoDriveToNextStation( true );
+ }
+ }
+
+ /**
+ * 根据订单状态、获取下一站靠站的的站点
+ *
+ * @return -1 当前已是最后一个站点
+ */
+ private int getNextStopStation() {
+ if ( currentStationIndex >= stationList.size() - 1 ) {
+ return -1;
+ }
+ int nextStationIndex = currentStationIndex + 1;
+ for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) {
+ if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) {
+ break;
+ }
+ break;
+ }
+ return nextStationIndex;
+ }
+
+ /**
+ * 延时查询站点信心
+ */
+ private void queryBusStationDelay() {
+ handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY );
+ }
+
+ /**
+ * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
+ */
+ public void restartAutopilot() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "重启自动驾驶===" + isGoingToNextStation );
+ if ( isGoingToNextStation ) {
+ autoDriveToNextStation( true );
+ }
+ }
+
+ /**
+ * 播报下车乘客信息
+ *
+ * @param awayPassengersResponse
+ */
+ private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息currentStationIndex="+currentStationIndex);
+
+ if ( currentStationIndex > stationList.size() - 1 ) {
+ return;
+ }
+ String station = stationList.get( currentStationIndex ).getName();
+ StringBuilder builder = new StringBuilder( "已到达" );
+ builder.append( station );
+ if ( !station.endsWith( "站" ) ) {
+ builder.append( "站" );
+ }
+ if ( awayPassengersResponse == null || awayPassengersResponse.data == null
+ || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息为null");
+ } else {
+ builder.append( ",请尾号为 " );
+ for ( QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders ) {
+ if ( leaveAwayPassenger == null ) {
+ continue;
+ }
+ String tailNum = null;
+ try {
+ tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ tailNum = leaveAwayPassenger.passengerPhone;
+ }
+ builder.append( tailNum ).append( "。" );
+ }
+ builder.append( "的乘客下车" );
+ }
+ builder.append(",带好随身物品,下车请注意安全");
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + builder.toString());
+ AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() );
+ }
+
+ /**
+ * 修改小巴运营状态
+ */
+ public void onChangeOperationStatus() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "修改小巴运营状态");
+ if (isWorking()){//收车
+ stopTakeOrder();
+ }else {//出车
+ startTakeOrder();
+ }
+ }
+
+ /**
+ * 行程结束
+ */
+ private void travelOver() {
+// CallerLogger.INSTANCE.d( M_BUS + TAG, "行程结束");
+
+ if ( currentStationIndex >= stationList.size() ) {
+ CallerLogger.INSTANCE.e( M_BUS + TAG, "travel over index out of station list" );
+ return;
+ }
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" );
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" );
+ leaveStation(true,true);
+ }
+
+ public boolean isWorking() {
+ return mIsWorking;
+ }
+
+ /**
+ * 到站
+ * @param data
+ */
+ public void onArriveAt( MessagePad.ArrivalNotification data){
+ if ( currentStationIndex > stationList.size() - 1 ) {
+ CallerLogger.INSTANCE.e( M_BUS + TAG, "到站异常,取消后续操作结束" );
+ return;
+ }
+ if (FunctionBuildConfig.isDemoMode && currentStationIndex == stationList.size() - 1){//到达最后一站结束美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(到最后一站)");
+ }
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + currentStationIndex);
+ isGoingToNextStation = false;
+ // 到达站点后,更新站点状态
+// currentStationIndex = getNextStopStation();
+ queryStationLeaveAwayPassengers();
+ UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单
+ @Override
+ public void run() {
+ if (!hadQueryLeaveAwayPassager){
+ arriveSiteStation(false);
+ }
+ hadQueryLeaveAwayPassager = false;
+ }
+ },1500);
+ }
+
+ public boolean isGoingToNextStation() {
+ return isGoingToNextStation;
+ }
+
+ // 车机端上传心跳数据(只在出车状态时上传)
+ public void runCarHeartbeat() {
+ BusServiceManager.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
+ new IBusServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ private void startOrStopOrderLoop(boolean start) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ BusModelLoopManager.getInstance().startHeartbeatLoop();
+ } else {
+ BusModelLoopManager.getInstance().stopHeartbeatLoop();
+ }
+ }
+
+ public void triggerStartServiceEvent(boolean send) {
+ if (stationList == null || currentStationIndex >= stationList.size() || currentStationIndex == 0) {
+ return;
+ }
+ BusStationBean currentStation = stationList.get( currentStationIndex -1);
+ BusStationBean nextStation = stationList.get( currentStationIndex);
+ BusAnalyticsUtil.triggerStartServiceEvent(send,
+ currentStation.getName(), nextStation.getName(), currentLineId);
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java
new file mode 100644
index 0000000000..8c2f855e50
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java
@@ -0,0 +1,280 @@
+package com.mogo.och.bus.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.location.Location;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.bus.bean.BusStationBean;
+import com.mogo.och.bus.callback.ICarOperationStatusCallback;
+import com.mogo.och.bus.callback.IBusControllerStatusCallback;
+import com.mogo.och.bus.callback.IRefreshBusStationsCallback;
+import com.mogo.och.bus.callback.ISlidePannelHideCallback;
+import com.mogo.och.bus.fragment.BusFragment;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+import mogo_msg.MogoReportMsg;
+
+/**
+ * 网约车小巴
+ *
+ * @author tongchenfei
+ */
+public class BusPresenter extends Presenter
+ implements ICarOperationStatusCallback, IRefreshBusStationsCallback, ISlidePannelHideCallback
+ , IMoGoAutopilotStatusListener, IBusControllerStatusCallback {
+
+ private static final String TAG = "BusPresenter";
+
+ private int currentAutopilotStatus = -1;
+ private boolean isAnimateRunning = false;
+ private List mStationList = new ArrayList<>();
+ private int mCurrentStation = 0;
+
+ public BusPresenter(BusFragment view) {
+ super(view);
+ //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
+ CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
+ BusOrderModel.getInstance().init();
+ }
+
+ @Override
+ public void onCreate(@NonNull LifecycleOwner owner) {
+ super.onCreate(owner);
+ BusOrderModel.getInstance().queryOperationStatus();
+ BusOrderModel.getInstance().queryBusRoutes();
+ initModelListener();
+ }
+
+ @Override
+ public void onDestroy(@NonNull LifecycleOwner owner) {
+ super.onDestroy(owner);
+ BusOrderModel.getInstance().release();
+ releaseListener();
+ }
+
+ public void initModelListener() {
+ BusOrderModel.getInstance().setCarOperationStatusCallback(this);
+ BusOrderModel.getInstance().setRefreshBusStationsCallback(this);
+ BusOrderModel.getInstance().setSlidePannelHideCallback(this);
+ BusOrderModel.getInstance().setControllerStatusCallback(this);
+ }
+
+ public void releaseListener() {
+ BusOrderModel.getInstance().setCarOperationStatusCallback(null);
+ BusOrderModel.getInstance().setRefreshBusStationsCallback(null);
+ BusOrderModel.getInstance().setSlidePannelHideCallback(null);
+ BusOrderModel.getInstance().setControllerStatusCallback(null);
+ }
+
+ public void queryBusRoutes() {
+ BusOrderModel.getInstance().queryBusRoutes();
+ }
+
+ public void debugResetStationStatus() {
+ BusOrderModel.getInstance().debugResetStationStatus();
+ }
+
+ public void autoDriveToNextStation(boolean isRestart) {
+ currentAutopilotStatus = -1;
+ BusOrderModel.getInstance().autoDriveToNextStation(isRestart);
+ }
+
+ public void restartAutopilot() {
+ currentAutopilotStatus = -1;
+ BusOrderModel.getInstance().restartAutopilot();
+ }
+
+ public void onChangeOperationStatus() {
+ BusOrderModel.getInstance().onChangeOperationStatus();
+ }
+
+ @Override
+ public void changeOperationStatus(boolean changeStatus) {
+ if (mView != null) {
+ runOnUIThread(() -> mView.changeOperationStatus(changeStatus));
+ }
+ }
+
+ @Override
+ public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) {
+ mStationList.clear();
+ mStationList.addAll(stationList);
+ mCurrentStation = currentStation;
+ functionDemoModeChange();
+ CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation);
+ if (mView != null) {
+ runOnUIThread(() -> mView.refreshBusStations(
+ stationList, currentStation, nextStation, isArrived));
+ }
+ }
+
+ private void functionDemoModeChange() {
+// CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel ="," functionDemoModeChange ="+mCurrentStation);
+ if (FunctionBuildConfig.isDemoMode
+ && ((mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
+ || ((mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
+ && BusOrderModel.getInstance().isGoingToNextStation()))) {
+ runOnUIThread(() -> mView.onAutopilotStatusChanged(
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, false));
+ }
+ }
+
+ @Override
+ public void hideSlidePanel() {
+ if (mView != null) {
+ runOnUIThread(() -> mView.hideSlidePanel());
+ }
+ }
+
+ @Override
+ public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) {
+ BusOrderModel.getInstance().onArriveAt(arrivalNotification);
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+
+ }
+
+ @Override
+ public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
+ if (autopilotStatusInfo == null) return;
+ int state = autopilotStatusInfo.getState();
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChange: " + state + "currentAutopilotStatus = " + currentAutopilotStatus);
+ switch (state) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
+ if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->1语音提示
+// AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" );
+ }
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE;
+ // 设置UI【自动驾驶】按钮是否展示
+ runOnUIThread(() -> mView.onAutopilotEnableChange(true));
+ if (BusOrderModel.getInstance().isGoingToNextStation()) {
+ runOnUIThread(() -> mView.hideSlidePanel());
+ }
+ if (FunctionBuildConfig.isDemoMode
+ && (
+ (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
+ || (
+ (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
+ && BusOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ) {
+ CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能");
+ return;
+ }
+ // 改变UI自动驾驶状态
+ runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus, isAnimateRunning));
+ }
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
+ runOnUIThread(() -> mView.stopAutopilotAnimation());
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING;
+ // 改变UI自动驾驶状态
+ runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus, isAnimateRunning));
+ BusOrderModel.getInstance().triggerStartServiceEvent(true);
+ }
+ isAnimateRunning = false;
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
+ if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->0语音提示
+// AIAssist.getInstance( getContext() ).speakTTSVoice( "自动驾驶已停止,请人工接管" );
+ }
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE;
+ if (FunctionBuildConfig.isDemoMode
+ && (
+ (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
+ || (
+ (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
+ && BusOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ) {
+ CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能");
+ return;
+ }
+ runOnUIThread(() -> {
+ mView.onAutopilotEnableChange(false);
+ mView.onAutopilotStatusChanged(currentAutopilotStatus, isAnimateRunning);
+ });
+ }
+ isAnimateRunning = false;
+ break;
+ default:
+ runOnUIThread(() -> mView.onAutopilotEnableChange(false));
+ break;
+ }
+ }
+
+ @Override
+ public void onVRModeChanged(boolean isVRMode) {
+ runOnUIThread(() -> mView.onVRModeChanged(isVRMode));
+ }
+
+ @Override
+ public void onCarLocationChanged(Location location) {
+ if (null != location) {
+ runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
+ }
+ }
+
+ @Override
+ public void startOpenAutopilot() {
+ isAnimateRunning = true;
+ runOnUIThread(() -> mView.startAutopilotAnimation());
+ // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
+// UiThreadHandler.postDelayed(new Runnable() {
+// @Override
+// public void run() {
+// debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+// }
+// },2300);
+ }
+
+ private void runOnUIThread(Runnable executor) {
+ if (executor == null) {
+ return;
+ }
+ if (Looper.myLooper() != Looper.getMainLooper()) {
+ UiThreadHandler.post(executor);
+ } else {
+ executor.run();
+ }
+ }
+
+ /**
+ * 测试使用
+ *
+ * @param status
+ */
+ public void debugAutoPilotStatus(int status) {
+ AutopilotStatusInfo info = new AutopilotStatusInfo();
+ info.setState(status);
+ onAutopilotStatusResponse(info);
+ }
+
+ @Override
+ public void onAutopilotGuardian(MogoReportMsg.MogoReportMessage guardianInfo) {
+
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java
deleted file mode 100644
index c176a5eab2..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLineModel.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.mogo.och.bus.presenter;
-
-import android.content.Context;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
-import com.mogo.och.bus.bean.BusQueryLinesResponse;
-import com.mogo.och.bus.bean.OchBusRoutesResponse;
-import com.mogo.och.bus.callback.BusLinesCallback;
-import com.mogo.och.bus.net.OCHBusServiceManager;
-import com.mogo.och.bus.net.OCHServiceCallback;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public class OchBusLineModel {
- private static volatile OchBusLineModel sInstance;
- private Context mContext;
- private BusLinesCallback mBusLinesCallback;
- public static OchBusLineModel getInstance() {
- if ( sInstance == null ) {
- synchronized ( OchBusLineModel.class ) {
- if ( sInstance == null ) {
- sInstance = new OchBusLineModel();
- }
- }
- }
- return sInstance;
- }
- private OchBusLineModel() {
-
- }
- public void init() {
- mContext = AbsMogoApplication.getApp();
- }
- public void setBusLinesCallback(BusLinesCallback callback){
- mBusLinesCallback = callback;
- }
- public void queryBusLines(){
- OCHBusServiceManager.getInstance().queryBusLines(mContext, new OCHServiceCallback() {
- @Override
- public void onSuccess(BusQueryLinesResponse data) {
- if (null == data && mBusLinesCallback != null) {
- mBusLinesCallback.onBusLinesChange(null);
- return;
- }
-
- if (mBusLinesCallback != null){
- mBusLinesCallback.onBusLinesChange(data);
- }
- }
-
- @Override
- public void onFail(String failMsg) {
-
- }
- });
- }
-
- public void commitSwitchLineId(int lineId){
- OCHBusServiceManager.getInstance().resetStationStatus(mContext,lineId, new OCHServiceCallback() {
- @Override
- public void onSuccess(OchBusRoutesResponse o) {
- if (mBusLinesCallback != null){
- mBusLinesCallback.onChangeLineIdSuccess();
- }
- }
-
- @Override
- public void onFail(String failMsg) {
- TipToast.longTip("切换路线失败");
- }
- });
- }
-
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java
deleted file mode 100644
index de2289284a..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusLinePresenter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.mogo.och.bus.presenter;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LifecycleOwner;
-
-import com.mogo.commons.mvp.Presenter;
-import com.mogo.och.bus.bean.BusQueryLinesResponse;
-import com.mogo.och.bus.callback.BusLinesCallback;
-import com.mogo.och.bus.ui.BusSwitchLineActivity;
-import com.mogo.och.bus.ui.BusSwitchLineView;
-
-/**
- * @author: wangmingjun
- * @date: 2022/2/9
- */
-public class OchBusLinePresenter extends Presenter implements BusLinesCallback {
-
- public OchBusLinePresenter(BusSwitchLineView view) {
- super(view);
- OchBusLineModel.getInstance().init();
- OchBusOrderModel.getInstance().init();
- }
-
- @Override
- public void onCreate(@NonNull LifecycleOwner owner) {
- super.onCreate(owner);
- initListener();
- }
-
- private void initListener() {
- OchBusLineModel.getInstance().setBusLinesCallback(this);
- }
-
- @Override
- public void onBusLinesChange(BusQueryLinesResponse lines) {
- mView.onBusLinesChange(lines);
- }
-
- @Override
- public void onChangeLineIdSuccess() {
- mView.onChangeLineIdSuccess();
- }
-
- public void queryBusLines(){
- OchBusLineModel.getInstance().queryBusLines();
- }
-
- public void commitSwitchLineId(int lineId){
- OchBusLineModel.getInstance().commitSwitchLineId(lineId);
- }
-
- public void queryBusRoutes(){
- OchBusOrderModel.getInstance().queryBusRoutes();
- }
-
- @Override
- public void onDestroy(@NonNull LifecycleOwner owner) {
- super.onDestroy(owner);
- OchBusLineModel.getInstance().setBusLinesCallback(null);
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusModelLoopManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusModelLoopManager.java
deleted file mode 100644
index c21d6d9302..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusModelLoopManager.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.mogo.och.bus.presenter;
-
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.och.bus.constant.OchBusConst;
-
-import java.util.concurrent.TimeUnit;
-
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * Created on 2021/11/22
- *
- * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
- */
-public class OchBusModelLoopManager {
-
- private static final String TAG = OchBusModelLoopManager.class.getSimpleName();
-
- private static final class SingletonHolder {
- private static final OchBusModelLoopManager INSTANCE = new OchBusModelLoopManager();
- }
-
- public static OchBusModelLoopManager getInstance() {
- return SingletonHolder.INSTANCE;
- }
-
- private Disposable mHeartbeatDisposable; //心跳轮询
-
- public void startHeartbeatLoop() {
- if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
- return;
- }
- Logger.i(TAG, "startHeartbeatLoop()");
- mHeartbeatDisposable = Observable.interval(OchBusConst.LOOP_DELAY,
- OchBusConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> OchBusOrderModel.getInstance().runCarHeartbeat());
- }
-
- public void stopHeartbeatLoop() {
- if (mHeartbeatDisposable != null) {
- Logger.i(TAG, "stopHeartbeatLoop()");
- mHeartbeatDisposable.dispose();
- mHeartbeatDisposable = null;
- }
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java
deleted file mode 100644
index 3fb034c010..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java
+++ /dev/null
@@ -1,844 +0,0 @@
-package com.mogo.och.bus.presenter;
-
-import static com.mogo.och.bus.constant.OchBusConst.STATION_STATUS_STOPPED;
-
-import android.content.Context;
-import android.location.Location;
-import android.os.Handler;
-import android.os.Message;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.mogo.commons.AbsMogoApplication;
-import com.mogo.commons.debug.DebugConfig;
-import com.mogo.commons.voice.AIAssist;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
-import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.map.MogoLocation;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
-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.bus.bean.OchBusOperationStatusResponse;
-import com.mogo.och.bus.bean.OchBusOrder;
-import com.mogo.och.bus.bean.OchBusOrdersResponse;
-import com.mogo.och.bus.bean.OchBusRoutesResponse;
-import com.mogo.och.bus.bean.OchBusRoutesResult;
-import com.mogo.och.bus.bean.OchBusStation;
-import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
-import com.mogo.och.bus.callback.CarOperationStatusCallback;
-import com.mogo.och.bus.callback.IOCHBusControllerStatusCallback;
-import com.mogo.och.bus.callback.RefreshBusStationsCallback;
-import com.mogo.och.bus.callback.SlidePannelHideCallback;
-import com.mogo.och.bus.constant.OchBusConst;
-import com.mogo.och.bus.net.OCHBusServiceManager;
-import com.mogo.och.bus.net.OCHServiceCallback;
-import com.mogo.och.bus.util.PinYinUtil;
-import com.mogo.service.IMogoServiceApis;
-import com.mogo.service.statusmanager.IMogoStatusChangedListener;
-import com.mogo.service.statusmanager.StatusDescriptor;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.exceptions.UndeliverableException;
-import io.reactivex.functions.Consumer;
-import io.reactivex.plugins.RxJavaPlugins;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * @author congtaowang
- * @since 2021/3/23
- *
- * 小巴订单管理
- */
-public class OchBusOrderModel {
- private final String TAG = OchBusOrderModel.class.getSimpleName();
- private int currentLineId = -1;
- private int currentStationIndex = 0; //因为服务端和前台对于当前站不一致,所以设置两个current index, 一个用于前台展示, 一个用于服务端接口请求
- private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
- /**
- * 运营状态、后端更具运营状态来判断车辆是否派单
- */
- private boolean mIsWorking = false;
- private static volatile OchBusOrderModel sInstance;
- public double mLongitude = 0;
- public double mLatitude = 0;
- private Context mContext;
- private Disposable mBusOrdersDisposable; //定时轮询小巴车订单
- private List prevBusOrderIds = new ArrayList<>();
- private final List< OchBusStation > stationList = new ArrayList<>();
- private OchBusRoutesResult ochBusRoutesResult = null;
- /**
- * 用来表示是否正在开往下一站
- */
- private boolean isGoingToNextStation = false;
- // 运营类型
- private static final int VEHICLE_TYPE = 10;
- private static final int MSG_QUERY_BUS_STATION = 1001;
- private static final long QUERY_BUS_STATION_DELAY = 5000;
-
- private CarOperationStatusCallback carOperationStatusCallback;
- private RefreshBusStationsCallback refreshBusStationsCallback;
- private SlidePannelHideCallback slidePannelHideCallback;
- private IOCHBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
-
- private boolean hadQueryLeaveAwayPassager = false;
-
- private final Handler handler = new Handler(new Handler.Callback() {
- @Override
- public boolean handleMessage(Message msg) {
- if ( msg.what == MSG_QUERY_BUS_STATION ) {
- OchBusOrderModel.getInstance().queryBusRoutes();
- return true;
- }
- return false;
- }
- });
-
- public static OchBusOrderModel getInstance() {
- if ( sInstance == null ) {
- synchronized ( OchBusOrderModel.class ) {
- if ( sInstance == null ) {
- sInstance = new OchBusOrderModel();
- }
- }
- }
- return sInstance;
- }
-
- private OchBusOrderModel() {
-
- }
-
- public void init() {
- mContext = AbsMogoApplication.getApp();
- // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传
- String productFlavor = DebugConfig.getProductFlavor();
- if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) {
- MogoApisHandler.getInstance()
- .getApis()
- .getRegisterCenterApi()
- .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2);
- MogoApisHandler.getInstance()
- .getApis()
- .getStatusManagerApi()
- .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener );
- }
-
- //2022.1.28
- // 调用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();
- Log.d(TAG,"UndeliverableException");
- }
- if ((e instanceof IOException)) {//
- // fine, irrelevant network problem or API that throws on cancellation
- Log.d(TAG,"IOException");
- return;
- }
- if (e instanceof InterruptedException) {
- // fine, some blocking code was interrupted by a dispose call
- Log.d(TAG,"InterruptedException");
- return;
- }
- if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
- // that's likely a bug in the application
- Log.d(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
- Log.d(TAG,"IllegalStateException");
- Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
- return;
- }
- Log.d(TAG,"Undeliverable exception");
- }
- });
-
- //2021/10/20 轮询小巴车订单,暂时用来播报
- startLoopBusOrders();
- }
-
- public void setCarOperationStatusCallback(CarOperationStatusCallback callback){
- this.carOperationStatusCallback = callback;
- }
-
- public void setRefreshBusStationsCallback(RefreshBusStationsCallback callback){
- this.refreshBusStationsCallback = callback;
- }
-
- public void setSlidePannelHideCallback(SlidePannelHideCallback callback){
- this.slidePannelHideCallback = callback;
- }
-
- public void setControllerStatusCallback(IOCHBusControllerStatusCallback callback) {
- this.mControllerStatusCallback = callback;
- }
-
- /**
- * 轮询bus待服务订单
- */
- private void startLoopBusOrders() {
- if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) {
- return;
- }
- mBusOrdersDisposable = Observable.interval(OchBusConst.LOOP_DELAY,
- OchBusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> queryBusOrders());
- }
-
- private void queryBusOrders() {
- OCHBusServiceManager.getInstance().queryBusOrders(mContext, new OCHServiceCallback() {
- @Override
- public void onSuccess(OchBusOrdersResponse o) {
- if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) {
- Logger.d( TAG, "获取到bus订单数据: " + o.data.orders.toString() );
- List busOrders = o.data.orders;
- for (int i = 0; i < busOrders.size(); i++) {
- OchBusOrder order = busOrders.get(i);
- if (order == null) return;
- if (TextUtils.isEmpty(order.getPassengerPhone())) return;
- if (prevBusOrderIds.contains(order.getOrderId())) continue;
- try {
- String tailNum = null;
- try {
- tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4);
- } catch (Exception e) {
- e.printStackTrace();
- tailNum = order.getPassengerPhone();
- }
- Logger.d(TAG, "TTS:" + tailNum);
- AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum
- + " 上车站点为 " + order.getStartStationName());
- prevBusOrderIds.add(order.getOrderId());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- @Override
- public void onFail(String failMsg) {
-
- }
- });
- }
-
- public void release(){
- if (mBusOrdersDisposable != null) {
- mBusOrdersDisposable.dispose();
- }
- startOrStopOrderLoop(false);
- MogoApisHandler.getInstance()
- .getApis()
- .getStatusManagerApi()
- .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
-
- // 注销到达起始站围栏监听
- MogoApisHandler.getInstance()
- .getApis()
- .getRegisterCenterApi()
- .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
- }
-
- private Object readResolve() {
- // 阻止反序列化,必须实现 Serializable 接口
- return sInstance;
- }
-
- private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
- // VR mode变更回调
- @Override
- public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
- if (StatusDescriptor.VR_MODE == descriptor) {
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onVRModeChanged(isTrue);
- }
- }
- }
- };
-
- // 自车定位
- private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
-
- @Override
- public void onCarLocationChanged2( Location location ) {
-// Log.d(TAG,"location = "+location.getLongitude()+","+location.getLatitude());
- IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
- MogoLocation mogoLocation = new MogoLocation();
- mogoLocation.setAccuracy(location.getAccuracy());
- mogoLocation.setProvider(location.getProvider());
- mogoLocation.setLongitude(location.getLongitude());
- mogoLocation.setLatitude(location.getLatitude());
- mogoLocation.setSpeed(location.getSpeed());
- mogoLocation.setBearing(location.getBearing());
- // TODO: 2021/9/2 因0830新版server后台只能过滤locType=1&&satellites>=4的定位数据,暂固化值,后续优化
- mogoLocation.setLocType(1);
- mogoLocation.setSatellite(4);
- /**
- * TODO: 2021/10/20
- * 因ALocationClient实际无坐标返回,所以此处从custom map中AMapViewWrapper获取坐标并反馈回用于坐标上传
- * {@link com.mogo.map.impl.custom.location.ALocationClient}
- */
- apis.getLocationInfoApi().provideLocation(mogoLocation);
-
- mLongitude = location.getLongitude();
- mLatitude = location.getLatitude();
-
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onCarLocationChanged(location);
- }
- }
- };
-
- /**
- * 查询小巴路线
- */
- public void queryBusRoutes() {
- Logger.d( TAG, "查询小巴路线");
- OCHBusServiceManager.getInstance().queryBusRoutes(mContext, new OCHServiceCallback() {
- @Override
- public void onSuccess(OchBusRoutesResponse data) {
- if ( data == null
- || data.getResult() == null
- || data.getResult().getSites() == null
- || data.getResult().getSites().isEmpty() ) {
- return;
- }
- Logger.d( TAG, "获取到小巴路线数据: " + data );
- renderBusStationsStatus( data.getResult());
- }
- @Override
- public void onFail(String failMsg) {
- // 重复请求小巴路线,直至成功
- queryBusStationDelay();
- }
- });
-
- }
-
- /**
- * 测试、重置站点状态
- */
- public void debugResetStationStatus() {
- Logger.d( TAG, "测试、重置站点状态");
- OCHBusServiceManager.getInstance().resetStationStatus(mContext, currentLineId
- , new OCHServiceCallback() {
- @Override
- public void onSuccess(OchBusRoutesResponse o) {
- Logger.d(TAG, "获取到小巴路线数据: " + o);
- isGoingToNextStation = false;
- if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) {
- return;
- }
- renderBusStationsStatus(o.getResult());
- }
-
- @Override
- public void onFail(String failMsg) {
- // 重复请求小巴路线,直至成功
- queryBusStationDelay();
- }
- });
-
- }
-
- /**
- * 离站上报
- */
- public void leaveStation(boolean isOneWayOver,boolean isRestart){
- Log.d(TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex);
- OCHBusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq()
- , stationList.get(backgroundCurrentStationIndex).getSiteId(), new OCHServiceCallback() {
- @Override
- public void onSuccess(OchBusRoutesResponse o) {
- if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) {
- return;
- }
- if (!isOneWayOver){
- Logger.d( TAG, "自动驾驶开启开往下一站====" );
- //需要更改当前站和下一站的状态 然后渲染
- RenderLeaveStationSuccess(o.getResult(),isRestart);
- }else {
- Logger.d( TAG, "单程真的结束了====" );
- isGoingToNextStation = false;
- currentStationIndex = 0;
- backgroundCurrentStationIndex = 0;
- CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
- queryBusRoutes();
- }
- }
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }
- }
- });
- }
-
- /**
- * 离站上报成功后渲染站点
- * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
- * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染
- */
- private void RenderLeaveStationSuccess(OchBusRoutesResult result,boolean isRestart) {
- renderBusStationsStatus(result);
- if (slidePannelHideCallback != null) {
- slidePannelHideCallback.hideSlidePanel();
- }
- //开启自动驾驶
- startAutopilot(isRestart);
- if (isGoingToNextStation) {
- // 为了避免恢复自动驾驶时重复的接口请求
- return;
- }
- isGoingToNextStation = true;
- AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" );
- }
-
- /**
- * 开启自动驾驶
- * @param isRestart
- */
- private void startAutopilot(boolean isRestart) {
- OchBusStation currentStation = stationList.get( currentStationIndex -1);
- OchBusStation nextStation = stationList.get( currentStationIndex);
-
-// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
-// == Integer.parseInt(DebugConfig.getAutoPilotStatus())) {
-// TipToast.shortTip("自动驾驶状态为不可用!");
-// }
- AutopilotControlParameters currentAutopilot = new AutopilotControlParameters();
- currentAutopilot.isSpeakVoice = !isRestart;
- currentAutopilot.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName());
- currentAutopilot.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName());
- currentAutopilot.startLatLon = new AutopilotControlParameters
- .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() );
- currentAutopilot.endLatLon = new AutopilotControlParameters
- .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() );
- currentAutopilot.vehicleType = VEHICLE_TYPE;
- Logger.d( TAG, "开启自动驾驶====" + currentAutopilot.toString()
- +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName());
- CallerAutoPilotManager.INSTANCE.startAutoPilot(currentAutopilot);
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.startOpenAutopilot();
- }
- }
-
- /**
- * 到站后重置站点状态
- */
- private void arriveSiteStation(boolean isRestart) {
- Log.d(TAG,"arriveSiteStation-currentStationIndex = "+currentStationIndex);
- OCHBusServiceManager.getInstance().arriveSiteStation(mContext
- , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId()
- , new OCHServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
- Log.d(TAG,"arriveSiteStation success");
- if (!isRestart){
- renderArriveBusStation();
- }
- }
-
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }
- }
- });
- }
-
- private void renderArriveBusStation() {
- List< OchBusStation > site = ochBusRoutesResult.getSites();
- if (site != null && site.size() > 0){
- backgroundCurrentStationIndex = currentStationIndex;
- if (refreshBusStationsCallback != null){
- refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex
- , getNextStopStation(),true);
- }
- }
- }
-
- /**
- * 查询到站下车乘客
- */
- private void queryStationLeaveAwayPassengers() {
- Logger.d( TAG, "查询到站下车乘客");
-
- OCHBusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext
- , stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId()
- , new OCHServiceCallback() {
- @Override
- public void onSuccess(QueryLeaveAwayPassengersResponse o) {
- hadQueryLeaveAwayPassager = true;
- arriveSiteStation(false);
- playLeavePassengersMsg( o );
- queryBusOrders();
- }
-
- @Override
- public void onFail(String failMsg) {
- hadQueryLeaveAwayPassager = true;
- arriveSiteStation(false);
- }
- });
- }
-
- /**
- * 收车
- */
- public void stopTakeOrder(){
- OCHBusServiceManager.getInstance().stopTakeOrder(mContext, new OCHServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
- mIsWorking = !mIsWorking;
- carOperationStatusCallback.changeOperationStatus(isWorking());
- startOrStopOrderLoop(mIsWorking);
- }
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }else {
- TipToast.shortTip(failMsg);
- }
- }
- });
- }
-
- /**
- * 出车
- */
- public void startTakeOrder(){
- OCHBusServiceManager.getInstance().startTakeOrder(mContext, new OCHServiceCallback() {
- @Override
- public void onSuccess(BaseData o) {
- mIsWorking = !mIsWorking;
- startOrStopOrderLoop(mIsWorking);
- if ( stationList != null && stationList.size() > 0 ) {
- AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往"
- + stationList.get( currentStationIndex ).getName() + "站点" );
- }
- carOperationStatusCallback.changeOperationStatus(isWorking());
- queryBusRoutes();
- }
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }else {
- TipToast.shortTip(failMsg);
- }
- }
- });
- }
-
- /**
- * 查询运营状态
- */
- public void queryOperationStatus() {
- Logger.d( TAG, "查询运营状态");
- OCHBusServiceManager.getInstance().queryOperationStatus(mContext
- , new OCHServiceCallback() {
- @Override
- public void onSuccess(OchBusOperationStatusResponse o) {
- if ( o.data != null ) {
- mIsWorking = o.data.serviceStatus == 1;
- Logger.d( TAG, "查询运营状态 result.status: " + o.data.serviceStatus);
- startOrStopOrderLoop(mIsWorking);
- }
- carOperationStatusCallback.changeOperationStatus(isWorking());
- }
- @Override
- public void onFail(String failMsg) {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }
- }
- });
- }
-
- /**
- * 开启自动驾驶到下一站
- */
- public void autoDriveToNextStation( boolean isRestart ) {
- if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) {
- // 当前站是最后一站,结束当前行程
- travelOver();
- return;
- }
- leaveStation(false,isRestart);
- }
-
- /**
- * 渲染站点信息
- * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
- * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理current index,不能直接渲染
- * @param result
- */
- private void renderBusStationsStatus(OchBusRoutesResult result) {
- if (result == null) return;
- ochBusRoutesResult = result;
- List< OchBusStation > site = result.getSites();
- currentLineId = result.getLineId();
- stationList.clear();
- stationList.addAll( site );
- for ( int i = 0; i < stationList.size(); i++ ) {
- OchBusStation s = stationList.get( i );
- // 是否正在开往下一站
- if ( s.isLeaving()) {
- isGoingToNextStation = true;
- }
- // 当前站点信息
- if (s.getDrivingStatus() == STATION_STATUS_STOPPED ) {
- currentStationIndex = i;
- break;
- }
- }
- backgroundCurrentStationIndex = currentStationIndex;
- OchBusStation currentStation = stationList.get(currentStationIndex);
- Logger.d( TAG, "渲染站点信息服务端currentStationIndex="+currentStationIndex
- +" isLeaving()="+currentStation.isLeaving());
- //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态
- // ,订单开始站下在始发站的状态流转有问题
- if (currentStationIndex == 0 && !currentStation.isLeaving()){
- arriveSiteStation(true);
- }
- // 美化是否开始
- if (FunctionBuildConfig.isDemoMode && ((currentStationIndex > 0
- && currentStationIndex < stationList.size()-1)
- || (stationList.get(0).isLeaving() || stationList.get(stationList.size() -1).isLeaving()))){//行驶过程中设置美化
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
- Logger.d(TAG, "美化模式-ignore:置为true(每次滑动出发)");
- }
- if (refreshBusStationsCallback != null){
- if (currentStation.isLeaving()){//如果服务端的当前站是leaving状态,展示当前站需要+1
- currentStationIndex ++;
- refreshBusStationsCallback.refreshBusStations(stationList
- , currentStationIndex, getNextStopStation(),false);
- }else{
- refreshBusStationsCallback.refreshBusStations(stationList
- , currentStationIndex, getNextStopStation(),true);
- }
- }
- if ( currentStation.isLeaving() && slidePannelHideCallback != null) {
- slidePannelHideCallback.hideSlidePanel();
- }
- }
-
- /**
- * 重置下一站
- *
- * @param lastStopStation
- */
- private void resetNextStopStation( int lastStopStation ) {
- Logger.d( TAG, "重置下一站");
- int nextStopStation = getNextStopStation();
- if ( nextStopStation < 0 ) {
- return;
- }
- if ( lastStopStation <= nextStopStation || nextStopStation <= currentStationIndex ) {
- return;
- }
- if ( CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
- == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ) {
- // 自动驾驶中动态设置下一个停靠站点/
- autoDriveToNextStation( true );
- }
- }
-
- /**
- * 根据订单状态、获取下一站靠站的的站点
- *
- * @return -1 当前已是最后一个站点
- */
- private int getNextStopStation() {
- if ( currentStationIndex >= stationList.size() - 1 ) {
- return -1;
- }
- int nextStationIndex = currentStationIndex + 1;
- for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) {
- if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) {
- break;
- }
- break;
- }
- return nextStationIndex;
- }
-
- /**
- * 延时查询站点信心
- */
- private void queryBusStationDelay() {
- handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY );
- }
-
- /**
- * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
- */
- public void restartAutopilot() {
- Logger.d( TAG, "重启自动驾驶===" + isGoingToNextStation );
- if ( isGoingToNextStation ) {
- autoDriveToNextStation( true );
- }
- }
-
- /**
- * 播报下车乘客信息
- *
- * @param awayPassengersResponse
- */
- private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) {
- Logger.d( TAG, "播报下车乘客信息currentStationIndex="+currentStationIndex);
-
- if ( currentStationIndex > stationList.size() - 1 ) {
- return;
- }
- String station = stationList.get( currentStationIndex ).getName();
- StringBuilder builder = new StringBuilder( "已到达" );
- builder.append( station );
- if ( !station.endsWith( "站" ) ) {
- builder.append( "站" );
- }
- if ( awayPassengersResponse == null || awayPassengersResponse.data == null
- || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) {
- Logger.d( TAG, "播报下车乘客信息为null");
- } else {
- builder.append( ",请尾号为 " );
- for ( QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders ) {
- if ( leaveAwayPassenger == null ) {
- continue;
- }
- String tailNum = null;
- try {
- tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4);
- } catch (Exception e) {
- e.printStackTrace();
- tailNum = leaveAwayPassenger.passengerPhone;
- }
- builder.append( tailNum ).append( "。" );
- }
- builder.append( "的乘客下车" );
- }
- builder.append(",带好随身物品,下车请注意安全");
- Logger.d(TAG, "TTS:" + builder.toString());
- AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() );
- }
-
- /**
- * 修改小巴运营状态
- */
- public void onChangeOperationStatus() {
- Logger.d( TAG, "修改小巴运营状态");
- if (isWorking()){//收车
- stopTakeOrder();
- }else {//出车
- startTakeOrder();
- }
- }
-
- /**
- * 行程结束
- */
- private void travelOver() {
-// Logger.d( TAG, "行程结束");
-
- if ( currentStationIndex >= stationList.size() ) {
- Logger.e( TAG, "travel over index out of station list" );
- return;
- }
- Logger.d( TAG, "单程结束====" );
- CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
- AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" );
- leaveStation(true,true);
- }
-
- public boolean isWorking() {
- return mIsWorking;
- }
-
- /**
- * 到站
- * @param data
- */
- public void onArriveAt( AutopilotStationInfo data){
- if ( currentStationIndex > stationList.size() - 1 ) {
- Logger.e( TAG, "到站异常,取消后续操作结束" );
- return;
- }
- if (FunctionBuildConfig.isDemoMode && currentStationIndex == stationList.size() - 1){//到达最后一站结束美化
- FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
- Logger.d(TAG, "美化模式-ignore:置为false(到最后一站)");
- }
- Logger.d( TAG, "到站====currentStationIndex=" + currentStationIndex);
- isGoingToNextStation = false;
- // 到达站点后,更新站点状态
-// currentStationIndex = getNextStopStation();
- queryStationLeaveAwayPassengers();
- UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单
- @Override
- public void run() {
- if (!hadQueryLeaveAwayPassager){
- arriveSiteStation(false);
- }
- hadQueryLeaveAwayPassager = false;
- }
- },1500);
- }
-
- public boolean isGoingToNextStation() {
- return isGoingToNextStation;
- }
-
- // 车机端上传心跳数据(只在出车状态时上传)
- public void runCarHeartbeat() {
- OCHBusServiceManager.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
- new OCHServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
-
- }
-
- @Override
- public void onFail(String failMsg) {
-
- }
- });
- }
-
- private void startOrStopOrderLoop(boolean start) {
- Logger.d(TAG, "startOrStopOrderLoop() " + start);
- if (start) {
- OchBusModelLoopManager.getInstance().startHeartbeatLoop();
- } else {
- OchBusModelLoopManager.getInstance().stopHeartbeatLoop();
- }
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java
deleted file mode 100644
index 6b741f08cf..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java
+++ /dev/null
@@ -1,277 +0,0 @@
-package com.mogo.och.bus.presenter;
-import android.location.Location;
-import android.os.Looper;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LifecycleOwner;
-import com.mogo.commons.mvp.Presenter;
-import com.mogo.commons.voice.AIAssist;
-import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.och.bus.bean.OchBusStation;
-import com.mogo.och.bus.callback.CarOperationStatusCallback;
-import com.mogo.och.bus.callback.IOCHBusControllerStatusCallback;
-import com.mogo.och.bus.callback.RefreshBusStationsCallback;
-import com.mogo.och.bus.callback.SlidePannelHideCallback;
-import com.mogo.och.bus.fragment.OchBusFragment;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 网约车小巴
- *
- * @author tongchenfei
- */
-public class OchBusPresenter extends Presenter< OchBusFragment >
- implements CarOperationStatusCallback, RefreshBusStationsCallback, SlidePannelHideCallback
- , IMoGoAutopilotStatusListener, IOCHBusControllerStatusCallback {
-
- private static final String TAG = "OchBusPresenter";
-
- private int currentAutopilotStatus = -1;
- private boolean isAnimateRunning = false;
- private List mStationList = new ArrayList<>();
- private int mCurrentStation = 0;
-
- public OchBusPresenter( OchBusFragment view ) {
- super( view );
- //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
- CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
- OchBusOrderModel.getInstance().init();
- }
-
- @Override
- public void onCreate( @NonNull LifecycleOwner owner ) {
- super.onCreate( owner );
- OchBusOrderModel.getInstance().queryOperationStatus();
- OchBusOrderModel.getInstance().queryBusRoutes();
- initModelListener();
- }
-
- @Override
- public void onDestroy(@NonNull LifecycleOwner owner) {
- super.onDestroy(owner);
- OchBusOrderModel.getInstance().release();
- releaseListener();
- }
-
- public void initModelListener(){
- OchBusOrderModel.getInstance().setCarOperationStatusCallback(this);
- OchBusOrderModel.getInstance().setRefreshBusStationsCallback(this);
- OchBusOrderModel.getInstance().setSlidePannelHideCallback(this);
- OchBusOrderModel.getInstance().setControllerStatusCallback(this);
- }
-
- public void releaseListener(){
- OchBusOrderModel.getInstance().setCarOperationStatusCallback(null);
- OchBusOrderModel.getInstance().setRefreshBusStationsCallback(null);
- OchBusOrderModel.getInstance().setSlidePannelHideCallback(null);
- OchBusOrderModel.getInstance().setControllerStatusCallback(null);
- }
-
- public void queryBusRoutes(){
- OchBusOrderModel.getInstance().queryBusRoutes();
- }
-
- public void debugResetStationStatus(){
- OchBusOrderModel.getInstance().debugResetStationStatus();
- }
-
- public void autoDriveToNextStation(boolean isRestart){
- currentAutopilotStatus = -1;
- OchBusOrderModel.getInstance().autoDriveToNextStation(isRestart);
- }
-
- public void restartAutopilot(){
- currentAutopilotStatus = -1;
- OchBusOrderModel.getInstance().restartAutopilot();
- }
-
- public void onChangeOperationStatus(){
- OchBusOrderModel.getInstance().onChangeOperationStatus();
- }
-
- @Override
- public void changeOperationStatus(boolean changeStatus) {
- if (mView != null) {
- mView.changeOperationStatus(changeStatus);
- }
- }
-
- @Override
- public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) {
- mStationList.clear();
- mStationList.addAll(stationList);
- mCurrentStation = currentStation;
- functionDemoModeChange();
- Log.d("OchBusOrderModel ="," mCurrentStation ="+mCurrentStation);
- if ( mView != null ) {
- mView.refreshBusStations( stationList, currentStation, nextStation ,isArrived);
- }
- }
-
- private void functionDemoModeChange() {
-// Log.d("OchBusOrderModel ="," functionDemoModeChange ="+mCurrentStation);
- if (FunctionBuildConfig.isDemoMode
- && (
- (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1)
- || (
- (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1)
- && OchBusOrderModel.getInstance().isGoingToNextStation()
- )
- )
- ){
- mView.onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ,false);
- }
- }
-
- @Override
- public void hideSlidePanel() {
- if (mView != null){
- mView.hideSlidePanel();
- }
- }
-
- @Override
- public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo autopilotStationInfo) {
- OchBusOrderModel.getInstance().onArriveAt(autopilotStationInfo);
- }
-
- @Override
- public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) {
-
- }
-
- @Override
- public void onAutopilotSNRequest() {
-
- }
-
- @Override
- public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
- if (autopilotStatusInfo == null) return;
- int state = autopilotStatusInfo.getState();
- Logger.d( TAG, "onStateChange: " + state +"currentAutopilotStatus = "+currentAutopilotStatus);
- switch ( state ) {
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
- if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){
- if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){//2-->1语音提示
-// AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" );
- }
- currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE;
- // 设置UI【自动驾驶】按钮是否展示
- mView.onAutopilotEnableChange( true );
- if ( OchBusOrderModel.getInstance().isGoingToNextStation() ) {
- mView.hideSlidePanel();
- }
- if (FunctionBuildConfig.isDemoMode
- && (
- (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1)
- || (
- (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1)
- && OchBusOrderModel.getInstance().isGoingToNextStation()
- )
- )
- ){
- Log.d("OchBusOrderModel=","有美化功能");
- return;
- }
- // 改变UI自动驾驶状态
- mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning);
- }
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
- runOnUIThread(()->mView.stopAutopilotAnimation());
- if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
- currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING;
- // 改变UI自动驾驶状态
- mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning);
- }
- isAnimateRunning = false;
- break;
- case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
- if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
- if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){//2-->0语音提示
-// AIAssist.getInstance( getContext() ).speakTTSVoice( "自动驾驶已停止,请人工接管" );
- }
- currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE;
- if (FunctionBuildConfig.isDemoMode
- && (
- (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1)
- || (
- (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1)
- && OchBusOrderModel.getInstance().isGoingToNextStation()
- )
- )
- ){
- Log.d("OchBusOrderModel=","有美化功能");
- return;
- }
- mView.onAutopilotEnableChange( false );
- mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning);
- }
- isAnimateRunning = false;
- break;
- default:
- mView.onAutopilotEnableChange( false );
- break;
- }
- }
-
- @Override
- public void onVRModeChanged(boolean isVRMode) {
- runOnUIThread(() -> mView.onVRModeChanged(isVRMode));
- }
-
- @Override
- public void onCarLocationChanged(Location location) {
- if (null != location){
- runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
- }
- }
-
- @Override
- public void startOpenAutopilot() {
- isAnimateRunning = true;
- runOnUIThread(()->mView.startAutopilotAnimation());
- // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
-// UiThreadHandler.postDelayed(new Runnable() {
-// @Override
-// public void run() {
-// debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
-// }
-// },2300);
- }
-
- private void runOnUIThread( Runnable executor ) {
- if ( executor == null ) {
- return;
- }
- if ( Looper.myLooper() != Looper.getMainLooper() ) {
- UiThreadHandler.post( executor );
- } else {
- executor.run();
- }
- }
-
- /**
- * 测试使用
- * @param status
- */
- public void debugAutoPilotStatus(int status){
- AutopilotStatusInfo info = new AutopilotStatusInfo();
- info.setState(status);
- onAutopilotStatusResponse(info);
- }
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestBusBroadcastReceiver.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestBusBroadcastReceiver.java
new file mode 100644
index 0000000000..b9ffc6d492
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestBusBroadcastReceiver.java
@@ -0,0 +1,42 @@
+package com.mogo.och.bus.receiver;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.bus.constant.BusConst;
+
+/**
+ * 测试小巴车的场景
+ *
+ * @author donghongyu
+ * @date 4/26/21 12:08 PM
+ */
+public class TestBusBroadcastReceiver extends BroadcastReceiver {
+ private static final String TAG = "TestBusBroadcastReceiver";
+
+ private Context mContext;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ this.mContext = context;
+ int sceneType = intent.getIntExtra(BusConst.BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY, 0);
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "sceneType:" + sceneType);
+
+ // 分发场景
+ dispatchSceneTest(sceneType);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void dispatchSceneTest(int sceneType) {
+
+ }
+
+
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestOchBusBroadcastReceiver.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestOchBusBroadcastReceiver.java
deleted file mode 100644
index 132b5a87a6..0000000000
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestOchBusBroadcastReceiver.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.mogo.och.bus.receiver;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.och.bus.constant.OchBusConst;
-
-/**
- * 测试小巴车的场景
- *
- * @author donghongyu
- * @date 4/26/21 12:08 PM
- */
-public class TestOchBusBroadcastReceiver extends BroadcastReceiver {
- private static final String TAG = "TestOchBusBroadcastReceiver";
-
- private Context mContext;
-
- @Override
- public void onReceive(Context context, Intent intent) {
- try {
- this.mContext = context;
- int sceneType = intent.getIntExtra(OchBusConst.BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY, 0);
- Logger.d(TAG, "sceneType:" + sceneType);
-
- // 分发场景
- dispatchSceneTest(sceneType);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- private void dispatchSceneTest(int sceneType) {
-
- }
-
-
-}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java
index 6dc465f911..1c772f89d2 100644
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusSwitchLineActivity.java
@@ -23,7 +23,7 @@ import com.mogo.commons.mvp.MvpActivity;
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
import com.mogo.och.bus.R;
import com.mogo.och.bus.bean.BusQueryLinesResponse;
-import com.mogo.och.bus.presenter.OchBusLinePresenter;
+import com.mogo.och.bus.presenter.BusLinePresenter;
import java.util.ArrayList;
import java.util.List;
@@ -32,7 +32,7 @@ import java.util.List;
* @author: wangmingjun
* @date: 2022/2/8
*/
-public class BusSwitchLineActivity extends MvpActivity
+public class BusSwitchLineActivity extends MvpActivity
implements View.OnClickListener, BusSwitchLineView {
private ImageView mClose;
@@ -50,8 +50,8 @@ public class BusSwitchLineActivity extends MvpActivity {
+ mCurrentLightId = 0;
+ BusTrafficLightView.this.setVisibility(GONE);
+ });
+ }
+
+ /**
+ * @param redNum 红灯倒计时
+ * @param yellowNum 黄灯倒计时
+ * @param greenNum 绿灯倒计时
+ */
+ @Override
+ public void changeCountdownTrafficLightNum(int redNum, int yellowNum, int greenNum) {
+ super.changeCountdownTrafficLightNum(redNum, yellowNum, greenNum);
+ switch (mCurrentLightId) {
+ case 1:
+ changeCountdownRed(redNum);
+ break;
+ case 2:
+ changeCountdownYellow(yellowNum);
+ break;
+ case 3:
+ changeCountdownGreen(greenNum);
+ break;
+ default:
+ UiThreadHandler.post(() -> {
+ mLightTimeTV.setText("");
+ });
+ break;
+ }
+ }
+
+ @Override
+ public void changeCountdownRed(int redNum) {
+ super.changeCountdownRed(redNum);
+ UiThreadHandler.post(() -> {
+ if (redNum > 0) {
+ mLightTimeTV.setVertrial(true);
+ mLightTimeTV.setmColorList(new int[]{getResources().getColor(R.color.bus_traffic_light_red_color_up),
+ getResources().getColor(R.color.bus_traffic_light_red_color_down)});
+ mLightTimeTV.setText(String.valueOf(redNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ @Override
+ public void changeCountdownGreen(int greenNum) {
+ super.changeCountdownGreen(greenNum);
+ UiThreadHandler.post(() -> {
+ if (greenNum > 0) {
+ mLightTimeTV.setVertrial(true);
+ mLightTimeTV.setmColorList(new int[]{getResources().getColor(R.color.bus_traffic_light_green_color_up),
+ getResources().getColor(R.color.bus_traffic_light_green_color_down)});
+ mLightTimeTV.setText(String.valueOf(greenNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ @Override
+ public void changeCountdownYellow(int yellowNum) {
+ super.changeCountdownYellow(yellowNum);
+ UiThreadHandler.post(() -> {
+ if (yellowNum > 0) {
+ mLightTimeTV.setVertrial(true);
+ mLightTimeTV.setmColorList(new int[]{getResources().getColor(R.color.bus_traffic_light_yellow_color_up),
+ getResources().getColor(R.color.bus_traffic_light_yellow_color_down)});
+ mLightTimeTV.setText(String.valueOf(yellowNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ /**
+ * 更新红绿灯icon
+ *
+ * @param lightId 0-都是默认,1-红,2-黄,3-绿
+ */
+ private void updateTrafficLightIcon(int lightId) {
+ UiThreadHandler.post(() -> {
+ switch (lightId) {
+ case 1:
+ mLightIconIV.setBackgroundResource(R.drawable.bus_light_red_nor);
+ BusTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ case 2:
+ mLightIconIV.setBackgroundResource(R.drawable.bus_lightyellow_nor);
+ BusTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ case 3:
+ mLightIconIV.setBackgroundResource(R.drawable.bus_light_green_nor);
+ BusTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ default:
+ BusTrafficLightView.this.setVisibility(GONE);
+ break;
+ }
+ });
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/GradientTextView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/GradientTextView.java
new file mode 100644
index 0000000000..c93f1c1475
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/GradientTextView.java
@@ -0,0 +1,113 @@
+package com.mogo.och.bus.ui;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.LinearGradient;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Shader;
+import android.util.AttributeSet;
+
+import androidx.appcompat.widget.AppCompatTextView;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/3/22
+ */
+public class GradientTextView extends AppCompatTextView {
+
+ private LinearGradient mLinearGradient;
+ private Paint mPaint;
+ private int mViewWidth = 0;//文字的宽度
+ private int mViewHeight = 0;//文字的高度
+ private Rect mTextBound = new Rect();
+ private int[] mColorList;//存放颜色的数组
+ private boolean isVertrial;//默认是横向
+
+ private float mRadius;
+ private float mdx;
+ private float mdy;
+ private int mColor;
+
+ public GradientTextView(Context context) {
+ this(context, null);
+ }
+
+ public GradientTextView(Context context,
+ AttributeSet attrs) {
+ super(context, attrs);
+ //设置默认的颜色
+ mColorList = new int[]{0xFFFFFFFF, 0xFFFFFFF};
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+
+ if (isVertrial) {
+ mViewHeight = getMeasuredHeight();
+ } else {
+ mViewWidth = getMeasuredWidth();
+ }
+ mPaint = getPaint();
+ String mTipText = getText().toString();
+
+ setStyle();
+
+ mPaint.getTextBounds(mTipText, 0, mTipText.length(), mTextBound);
+
+ mPaint.setShadowLayer(mRadius, mdx, mdy, mColor);
+
+ //画出文字
+ canvas.drawText(mTipText, getMeasuredWidth() / 2 - mTextBound.width() / 2, getMeasuredHeight() / 2 + mTextBound.height() / 2, mPaint);
+ }
+
+ /**
+ * true表示纵向渐变,false变身横向渐变
+ *
+ * @param vertrial
+ */
+ public void setVertrial(boolean vertrial) {
+ isVertrial = vertrial;
+ }
+
+ /**
+ * 设置渐变的颜色
+ *
+ * @param mColorList
+ */
+ public void setmColorList(int[] mColorList) {
+ if (mColorList != null && mColorList.length < 2) {
+ throw new RuntimeException("ClorList's length must be > 2");
+ } else {
+
+ this.mColorList = mColorList;
+ }
+ }
+
+ public void setStyle() {
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+ mPaint.setFilterBitmap(true);
+ //前面4个参数分别表示渐变的开始x轴,开始y轴,结束的x轴,结束的y轴,mcolorList表示渐变的颜色数组
+ mLinearGradient = new LinearGradient(0, 0, mViewWidth, mViewHeight, mColorList, null, Shader.TileMode.CLAMP);
+ mPaint.setShader(mLinearGradient);
+ mPaint.setStrokeJoin(Paint.Join.ROUND);
+ mPaint.setStrokeCap(Paint.Cap.ROUND);
+ mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+ }
+
+ /**
+ * 设置投影层
+ * @param radius
+ * @param dx
+ * @param dy
+ * @param color
+ */
+ public void setShadowLayerCustom(float radius, float dx, float dy, int color) {
+ this.mRadius = radius;
+ this.mdx = dx;
+ this.mdy = dy;
+ this.mColor = color;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsUtil.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsUtil.java
new file mode 100644
index 0000000000..a663c4a020
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsUtil.java
@@ -0,0 +1,63 @@
+package com.mogo.och.bus.util;
+
+import android.text.TextUtils;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.app.AppConfigInfo;
+import com.mogo.eagle.core.function.call.analytics.AnalyticsManager;
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.bus.constant.BusConst;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * OCH Bus埋点工具
+ *
+ * Created on 2022/3/24
+ */
+public class BusAnalyticsUtil {
+
+ /**
+ * 触发'滑动出发'埋点流程:
+ * 滑动出发(开启自动驾驶)后,15s内成功则发送成功埋点,否则发送失败埋点
+ * @param send 是否直接发送埋点(15s内开启成功则直接发送成功埋点)
+ */
+ public static void triggerStartServiceEvent(
+ boolean send, String startName, String endName, int lineId) {
+
+ String sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ String plateNum = AppConfigInfo.INSTANCE.getPlateNumber();
+ String dateTime = DateTimeUtils.getTimeText(
+ System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss);
+
+ Map params = new HashMap<>();
+ params.put(BusConst.EVENT_PARAM_SN, sn);
+ params.put(BusConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
+ params.put(BusConst.EVENT_PARAM_ENV_ONLINE,
+ DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
+ params.put(BusConst.EVENT_PARAM_TIME, dateTime);
+ params.put(BusConst.EVENT_PARAM_START_NAME, startName);
+ params.put(BusConst.EVENT_PARAM_END_NAME, endName);
+ params.put(BusConst.EVENT_PARAM_LINE_ID, lineId);
+
+ Runnable runnable = () -> {
+ // 15s内未开启,上报失败埋点
+ params.put(BusConst.EVENT_PARAM_START_RESULT, false);
+ AnalyticsManager.INSTANCE.track(BusConst.EVENT_KEY_START_SERVICE, params);
+ };
+
+ if (send) {
+ // 开启成功,上报埋点
+ if (runnable != null && UiThreadHandler.getsUiHandler().hasCallbacks(runnable)) {
+ UiThreadHandler.removeCallbacks(runnable);
+ }
+ params.put(BusConst.EVENT_PARAM_START_RESULT, true);
+ AnalyticsManager.INSTANCE.track(BusConst.EVENT_KEY_START_SERVICE, params);
+ } else {
+ UiThreadHandler.postDelayed(runnable, BusConst.LOOP_PERIOD_15S);
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java
index 2fd6a41ce5..a9e7bdff5d 100644
--- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java
@@ -24,7 +24,7 @@ import com.mogo.och.bus.R;
public class BusArcView extends View {
//中心的文字描述
- private String mDes = "km/h";
+ private String mDes = "KM/H";
//根据数据显示的圆弧Paint
private Paint mArcPaint;
//圆弧颜色
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_light_green_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_light_green_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_light_red_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_light_red_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_lightyellow_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/end_maker_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/end_maker_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_station_start_end.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_maker_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/start_maker_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_badcase_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_badcase_btn_bg.png
new file mode 100644
index 0000000000..89a6eaa5dc
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_badcase_btn_bg.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_base_icon_not_in_autopilot.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_base_slide_block.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_base_slide_block.png
new file mode 100644
index 0000000000..ed7b293b90
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_base_slide_block.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_disable_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_disable_autopilot_icon.png
new file mode 100644
index 0000000000..170f254cd1
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_disable_autopilot_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_icon_arrived_station.png
similarity index 100%
rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png
rename to OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_icon_arrived_station.png
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_icon_arriving_station.png
similarity index 100%
rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png
rename to OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_icon_arriving_station.png
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_light_green_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_light_green_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_light_red_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_light_red_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_lightyellow_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_loading_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_loading_autopilot_icon.png
new file mode 100644
index 0000000000..f21a1081f1
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_loading_autopilot_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_och_dot_line.png
similarity index 100%
rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png
rename to OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_och_dot_line.png
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_right_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_right_autopilot_icon.png
new file mode 100644
index 0000000000..cc2b18083d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_right_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_setting_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_setting_btn_bg.png
new file mode 100644
index 0000000000..ba41bf3a53
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_switch_map_angle.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_switch_map_angle.png
new file mode 100644
index 0000000000..3e1b96f3e3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_switch_map_angle.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_wrong_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_wrong_autopilot_icon.png
new file mode 100644
index 0000000000..0c8988acb3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/bus_wrong_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_badcase_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_badcase_btn_bg.png
new file mode 100644
index 0000000000..89a6eaa5dc
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_badcase_btn_bg.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png
index 21dc719ec9..927296d690 100644
Binary files a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png
index 8ffd0abe52..ed7b293b90 100644
Binary files a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png
index a676a789c3..8a065b66dd 100644
Binary files a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png
index e1fd463963..4ed57a0e30 100644
Binary files a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_light_green_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_light_green_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_light_red_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_light_red_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_lightyellow_nor.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_och_dot_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_och_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_och_dot_line.png differ
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_ap_badcase_check.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_selected_btn.png
similarity index 100%
rename from core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_ap_badcase_check.png
rename to OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_selected_btn.png
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_setting_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_setting_btn_bg.png
new file mode 100644
index 0000000000..ba41bf3a53
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_switch_line_close.png
similarity index 100%
rename from OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png
rename to OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_switch_line_close.png
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_ap_badcase_default.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_unselect_btn.png
similarity index 100%
rename from core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xxhdpi/icon_ap_badcase_default.png
rename to OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_unselect_btn.png
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/end_maker_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/end_maker_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_station_start_end.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_maker_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/start_maker_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bg_bus_traffic_light_background.xml b/OCH/mogo-och-bus/src/main/res/drawable/bg_bus_traffic_light_background.xml
new file mode 100644
index 0000000000..e0b90b9c55
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bg_bus_traffic_light_background.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
index 7cf9966090..8bf210c856 100644
--- a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
+++ b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
@@ -3,7 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/dp_72">
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_traffic_light_view.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_traffic_light_view.xml
new file mode 100644
index 0000000000..05f2d9c38b
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/layout/bus_traffic_light_view.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml
index 558429d9ec..0c307b9d24 100644
--- a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml
+++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml
@@ -75,13 +75,16 @@
@@ -114,12 +117,15 @@
diff --git a/OCH/mogo-och-bus/src/main/res/raw/end_marker.nt3d b/OCH/mogo-och-bus/src/main/res/raw/end_marker.nt3d
new file mode 100644
index 0000000000..be6057c547
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/raw/end_marker.nt3d differ
diff --git a/OCH/mogo-och-bus/src/main/res/raw/star_marker.nt3d b/OCH/mogo-och-bus/src/main/res/raw/star_marker.nt3d
new file mode 100644
index 0000000000..c6e546fc31
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/raw/star_marker.nt3d differ
diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml
index 3ef9d9d932..a27b69ae1d 100644
--- a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml
+++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml
@@ -124,4 +124,16 @@
20px
+ 225px
+ 154px
+ 60px
+ 40px
+ 23px
+ 210px
+ 120px
+ 15px
+ 17px
+ 154px
+ 130px
+ 60px
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml
index 8f068b0633..9c23585e71 100644
--- a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml
+++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml
@@ -121,4 +121,17 @@
120px
86px
50px
+
+ 225px
+ 154px
+ 60px
+ 40px
+ 23px
+ 210px
+ 120px
+ 15px
+ 17px
+ 154px
+ 130px
+ 60px
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml
index a702d05967..600e6c2c33 100644
--- a/OCH/mogo-och-bus/src/main/res/values/colors.xml
+++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml
@@ -38,4 +38,10 @@
#19FFFFFF
#FFFFFF
+ #FFFFA28B
+ #FFDA1100
+ #FF60FFD3
+ #FF006D43
+ #FFFFE198
+ #FFFF9B00
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values/dimens.xml b/OCH/mogo-och-bus/src/main/res/values/dimens.xml
index 49e258a5e0..51d39b3e5c 100644
--- a/OCH/mogo-och-bus/src/main/res/values/dimens.xml
+++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml
@@ -137,4 +137,17 @@
72px
52px
20px
+
+ 225px
+ 154px
+ 60px
+ 40px
+ 23px
+ 210px
+ 120px
+ 15px
+ 17px
+ 154px
+ 130px
+ 60px
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/build.gradle b/OCH/mogo-och-taxi-passenger/build.gradle
index 8b22040630..07c786beb2 100644
--- a/OCH/mogo-och-taxi-passenger/build.gradle
+++ b/OCH/mogo-och-taxi-passenger/build.gradle
@@ -53,13 +53,13 @@ dependencies {
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.amapnavi3dmap
+ implementation rootProject.ext.dependencies.amapsearch
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.mogoutils
implementation rootProject.ext.dependencies.mogocommons
implementation rootProject.ext.dependencies.modulecommon
implementation rootProject.ext.dependencies.mogo_core_data
implementation rootProject.ext.dependencies.mogo_core_function_call
- implementation rootProject.ext.dependencies.mogo_core_function_smp
implementation rootProject.ext.dependencies.mogo_core_function_v2x
}else {
implementation project(":core:mogo-core-utils")
@@ -67,7 +67,6 @@ dependencies {
implementation project(':modules:mogo-module-common')
implementation project(':core:mogo-core-data')
implementation project(':core:mogo-core-function-call')
- implementation project(':core:function-impl:mogo-core-function-smp')
implementation project(':core:function-impl:mogo-core-function-v2x')
}
}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/assets/map_style.data b/OCH/mogo-och-taxi-passenger/src/main/assets/map_style.data
new file mode 100755
index 0000000000..0e9e36690e
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/assets/map_style.data differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/assets/map_style_extra.data b/OCH/mogo-och-taxi-passenger/src/main/assets/map_style_extra.data
new file mode 100755
index 0000000000..7aa8fa7b45
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/assets/map_style_extra.data differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java
deleted file mode 100644
index 8a9b2a2233..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package com.mogo.och.taxi.passenger;
-
-import android.content.Context;
-
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentActivity;
-
-import com.alibaba.android.arouter.facade.annotation.Route;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
-import com.mogo.och.taxi.passenger.ui.OCHTaxiFragment;
-import com.mogo.service.statusmanager.IMogoStatusChangedListener;
-import com.mogo.service.statusmanager.StatusDescriptor;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-public
-/**
- * @author congtaowang
- * @since 2021/1/15
- *
- * 网约车-出租车
- */
-@Route( path = OCHTaxiConst.PATH )
-class MogoOCHTaxi implements IMogoOCH, IMogoStatusChangedListener {
-
- private static final String TAG = "MogoOCHTaxi";
- private OCHTaxiFragment ochTaxiFragment;
- private FragmentActivity mActivity;
- private int mContainerId;
- @Override
- public void init( Context context ) {
- Logger.d( TAG, "init" );
- MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.VR_MODE,this);
- MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.TOP_VIEW,this);
- }
-
- /**
- * 进入鹰眼模式,设置手势缩放地图失效
- */
- private void stepIntoVrMode() {
- Logger.d( TAG, "进入vr模式" );
- MogoApisHandler.getInstance()
- .getApis()
- .getMapServiceApi()
- .getMapUIController()
- .openVrMode( false );
- }
-
- private void showFragment() {
- if (ochTaxiFragment == null) {
- Logger.d(TAG, "准备add fragment======");
- ochTaxiFragment = new OCHTaxiFragment();
- mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, ochTaxiFragment).commitAllowingStateLoss();
- return;
- }
- Logger.d(TAG, "准备show fragment");
- mActivity.getSupportFragmentManager().beginTransaction().show(ochTaxiFragment).commitAllowingStateLoss();
- }
-
- private void hideFragment(){
- if (ochTaxiFragment != null){
- mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiFragment).commitAllowingStateLoss();
- }
- }
-
- @Override
- public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
- if (descriptor == StatusDescriptor.VR_MODE){
- if (isTrue){
- showFragment();
- }else {
- hideFragment();
- }
- }
- }
-
- @Override
- public void createCoverage(FragmentActivity activity, int containerId) {
-
- }
-
- @NotNull
- @Override
- public String getFunctionName() {
- return null;
- }
-
- @Nullable
- @Override
- public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
- this.mActivity = fragmentActivity;
- this.mContainerId = integer;
-
- UiThreadHandler.postDelayed(() -> stepIntoVrMode(), 5_000L);
- return null;
- }
-
- @Override
- public void onDestroy() {
-
- }
-}
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
new file mode 100644
index 0000000000..e633e71bb7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java
@@ -0,0 +1,107 @@
+package com.mogo.och.taxi.passenger;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.MogoMapUIController;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
+import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 网约车-出租车-乘客端
+ */
+@Route( path = TaxiPassengerConst.PATH )
+class MogoOCHTaxiPassenger implements IMogoOCH, IMogoStatusChangedListener {
+
+ private static final String TAG = "MogoOCHTaxiPassenger";
+ private TaxiPassengerBaseFragment ochTaxiPassengerFragment;
+ private FragmentActivity mActivity;
+ private int mContainerId;
+ @Override
+ public void init( Context context ) {
+ CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "init" );
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.VR_MODE,this);
+ }
+
+ /**
+ * 进入鹰眼模式,设置手势缩放地图失效
+ */
+ private void stepIntoVrMode() {
+ CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "进入vr模式" );
+ MogoMapUIController.getInstance()
+ .stepInVrMode( false );
+ }
+
+ private void showFragment() {
+ if (ochTaxiPassengerFragment == null) {
+ CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "准备add fragment======");
+ ochTaxiPassengerFragment = new TaxiPassengerBaseFragment();
+ mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, ochTaxiPassengerFragment).commitAllowingStateLoss();
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "准备show fragment");
+ mActivity.getSupportFragmentManager().beginTransaction().show(ochTaxiPassengerFragment).commitAllowingStateLoss();
+ }
+
+ private void hideFragment(){
+ if (ochTaxiPassengerFragment != null){
+ mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiPassengerFragment).commitAllowingStateLoss();
+ }
+ }
+
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (descriptor == StatusDescriptor.VR_MODE){
+ if (isTrue){
+ showFragment();
+ }else {
+ hideFragment();
+ }
+ }
+ }
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
+ this.mActivity = fragmentActivity;
+ this.mContainerId = integer;
+
+// UiThreadHandler.postDelayed(() -> stepIntoVrMode(), 5_000L);
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+// 若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠
+ if (mActivity == null) return;
+ mActivity.finish();
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java
deleted file mode 100644
index e56ae47928..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.mogo.och.taxi.passenger;
-
-import android.content.Context;
-
-import com.mogo.eagle.core.data.map.MogoLatLng;
-import com.mogo.eagle.core.data.map.MogoLocation;
-import com.mogo.eagle.core.function.v2x.events.utils.LocationUtils;
-import com.mogo.eagle.core.utilcode.util.ColorUtils;
-import com.mogo.map.overlay.IMogoOverlayManager;
-import com.mogo.map.overlay.IMogoPolyline;
-import com.mogo.map.overlay.MogoPolylineOptions;
-import com.mogo.module.common.MogoApisHandler;
-import java.util.ArrayList;
-import java.util.List;
-
-public class OCHTaxiOverlayManager {
-
-
- private IMogoPolyline mMoGoPolyline;
- // 连接线参数
- private MogoPolylineOptions mPolylineOptions;
- // 线路径集合
- private List mPolylinePointList;
- // 渐变色
- private List mPolylineColors;
- private Context mContext;
- IMogoOverlayManager mogoOverlayManager;
- public OCHTaxiOverlayManager(Context context) {
- mPolylineOptions = new MogoPolylineOptions();
- // 绘制路径集合
- mPolylinePointList = new ArrayList<>();
- // 引导线颜色
- mPolylineColors = new ArrayList<>();
- mContext = context;
- mogoOverlayManager = MogoApisHandler.getInstance().getApis().getMapServiceApi().getOverlayManager(mContext);
- }
-
- /**
- * 绘制最优路线
- *
- * @param polylinePoint 要绘制的经纬度度集合
- */
- public IMogoPolyline draw(MogoLocation carLocal, List polylinePoint) {
- if (mMoGoPolyline != null) {
- mMoGoPolyline.remove();
- mPolylinePointList.clear();
- mPolylineColors.clear();
- }
- if (polylinePoint != null) {
-
- // 将当前车辆位置放进去
- mPolylinePointList.add(new MogoLatLng(carLocal.getLatitude(), carLocal.getLongitude()));
- // 过滤后台推送的推荐路线集合
- for (MogoLatLng polyline : polylinePoint) {
- //需要剔除已经行驶过的经纬度,这里需要比对推荐路线集合中的点是否在当前车辆行驶方向前面如果不在则抛弃
- if (LocationUtils.isPointOnCarFront(carLocal, polyline)) {
- mPolylinePointList.add(polyline);
- }
- }
- mPolylineColors.addAll(ColorUtils.getGradientAlpha("#002965ED", "#FF2965ED", "#002965ED", mPolylinePointList.size()));
- // 替换路径集合
- mPolylineOptions.points(mPolylinePointList);
- // 线条粗细,渐变,渐变色值
- mPolylineOptions.width(25).useGradient(true).colorValues(mPolylineColors);
- // 绘制线
- mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions);
- }
- return mMoGoPolyline;
- }
-
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/CarHeartbeatReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/CarHeartbeatReqBean.java
deleted file mode 100644
index 5b0d3282f0..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/CarHeartbeatReqBean.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
-
-import java.util.UUID;
-
-/**
- * Created on 2021/9/16
- *
- * 上传车机心跳信息请求数据
- */
-public class CarHeartbeatReqBean {
- public String sn;
- public double lon; //经度
- public double lat; //纬度
- public String msgId; //心跳信息唯一标识
- public int interval; //上报间隔,单位秒,非必传,默认60秒
-
- public CarHeartbeatReqBean(String sn, double lon, double lat) {
- this.sn = sn;
- this.lon = lon;
- this.lat = lat;
- this.msgId = UUID.randomUUID().toString();
- this.interval = (int) (OCHTaxiConst.LOOP_PERIOD_60S / 1000);
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverServiceDataRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverServiceDataRespBean.java
deleted file mode 100644
index 09251e601b..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverServiceDataRespBean.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * Created on 2021/9/17
- *
- * 司机运营数据返回数据结构
- */
-public class DriverServiceDataRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- public Immediate immediate; //daily数据
- }
-
- public static class Immediate {
- public long timeDuration; //当日在线时长,单位秒
- public long orderNum; //当日完成订单数
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusQueryRespBean.java
deleted file mode 100644
index 0081acf8e0..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusQueryRespBean.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 收车/出车状态查询返回数据结构
- */
-public class DriverStatusQueryRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- public int serviceStatus; //0收车,1出车
- public long serviceOrderId;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusUpdateReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusUpdateReqBean.java
deleted file mode 100644
index 8dfa1af49c..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusUpdateReqBean.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 收车/出车状态更新请求数据结构
- */
-public class DriverStatusUpdateReqBean {
- public String sn;
- public int status; //0收车,1出车
-
- public DriverStatusUpdateReqBean(String sn, int status) {
- this.sn = sn;
- this.status = status;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderCancelReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderCancelReqBean.java
deleted file mode 100644
index 78ce76e482..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderCancelReqBean.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 司机取消订单请求的数据结构
- */
-public class OrderCancelReqBean {
- public String sn;
- public long order_id; //订单号(必须)
- public int cancel_type; //取消类型(必须)
- public String cancel_reason; //取消原因(必须)
-
- public OrderCancelReqBean(String sn, long order_id, int cancel_type, String cancel_reason) {
- this.sn = sn;
- this.order_id = order_id;
- this.cancel_type = cancel_type;
- this.cancel_reason = cancel_reason;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabReqBean.java
deleted file mode 100644
index c96c2d5ee8..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabReqBean.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created on 2021/9/7
- *
- * (预约单)抢单动作的请求数据结构
- */
-public class OrderGrabReqBean {
- public String sn;
- public long orderId;
-
- public OrderGrabReqBean(String sn, long orderId) {
- this.sn = sn;
- this.orderId = orderId;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabRespBean.java
deleted file mode 100644
index bc4970b7e3..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabRespBean.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * Created on 2021/9/7
- *
- * (预约单)抢单动作的返回数据结构
- */
-public class OrderGrabRespBean extends BaseData {
- public long data; // 暂不使用
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabStatusQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabStatusQueryRespBean.java
deleted file mode 100644
index 1e64ef93f1..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabStatusQueryRespBean.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * Created on 2021/9/7
- *
- * (预约单)查询抢单结果的返回数据结构
- */
-public class OrderGrabStatusQueryRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- public int grabStatus; //0:抢单中; 1:抢单结束,匹配; 2:抢单结束,匹配到其他司机;3:订单已取消;4:非法,不是选择的自己
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryReqBean.java
deleted file mode 100644
index d0a1c79b09..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryReqBean.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 查询订单信息请求数据结构
- */
-public class OrderQueryReqBean {
-
- public String sn;
- public long orderId;
-
- public OrderQueryReqBean(String sn, long orderId) {
- this.sn = sn;
- this.orderId = orderId;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRespBean.java
deleted file mode 100644
index 51b901163e..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRespBean.java
+++ /dev/null
@@ -1,88 +0,0 @@
-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 OrderQueryRespBean extends BaseData {
- public Result data;
-
- public static class Result implements Comparable{
- // 订单id
- public long orderId;
- // 订单类型
- public int orderType; //1即时单 2预约单
- // 订单状态
- public int orderStatus;
- // 订单运营类型 (9出租车,10小巴)
- public int businessType;
- // 起始站点id
- public int startSiteId;
- // 起始站点名称
- public String startSiteAddr;
- // 起始站点坐标
- public List startSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
- public List startSiteGcjPoint; //高德坐标,用于本地计算距离 [lon,lat]
- // 终点站点id
- public int endSiteId;
- // 终点站点名称
- public String endSiteAddr;
- // 终点站点坐标
- public List endSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
- public List endSiteGcjPoint; //高德坐标,用于计算距离 [lon,lat]
-
- // 车牌号
- public String carNumber;
- //订单创建时间戳
- public long createTime;
- //开始服务时间戳:司机点击'开始服务'后订单状态更新成功的时间
- public long startTime;
- //预计用车时间:预约单=下单时的预约用车时间;即时单=派单成功的时间+预估的达到上车点的时间
- public long bookingTime;
-
-
-
- // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km
- public double travelDistance;
-
- /**
- * @param distance
- */
- public void decreaseTravelDistance( double distance ) {
- travelDistance = ( ( float ) distance / 1000f );
- if ( travelDistance < 0 ) {
- travelDistance = 0;
- }
- }
-
- @Override
- public int compareTo(Result o) {
- long result = this.orderId - o.orderId;
- return result == 0 ? 0 : (result > 0 ? 1 : -1);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Result result = (Result) o;
- return orderId == result.orderId &&
- orderType == result.orderType &&
- orderStatus == result.orderStatus &&
- businessType == result.businessType;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(orderId, orderType, orderStatus, businessType, startSiteId,
- startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
- endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
- }
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoReqBean.java
deleted file mode 100644
index bcaf6658bd..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoReqBean.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created on 2021/9/7
- *
- * 查询订单路径信息(起始点里程、预估时间等)请求数据结构
- */
-public class OrderQueryRouteInfoReqBean {
- public String sn;
- public long orderId;
-
- public OrderQueryRouteInfoReqBean(String sn, long orderId) {
- this.sn = sn;
- this.orderId = orderId;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoRespBean.java
deleted file mode 100644
index 551e70925f..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoRespBean.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-/**
- * Created on 2021/9/7
- *
- * 查询订单路径信息(起始点里程、预估时间等)返回数据结构
- */
-public class OrderQueryRouteInfoRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- // 到上车点
- public long durationToStart; //司机绑定时的位置距离上车点时长,单位:秒
- public long distanceToStart; //司机绑定时的位置距离上车点距离,单位:米
-
- // 起点至终点
- public long durationToEnd; //订单上车点到目的地的时长,单位:秒
- public long distanceToEnd; //订单上车点到目的地的距离,单位:米
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderStatusUpdateReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderStatusUpdateReqBean.java
deleted file mode 100644
index 6d99c1e0bf..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderStatusUpdateReqBean.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 订单状态更新请求数据结构
- */
-public class OrderStatusUpdateReqBean {
- public String sn;
- public long orderId;
- public int orderStatus;
-
- public OrderStatusUpdateReqBean(String sn, long orderId, int orderStatus) {
- this.sn = sn;
- this.orderId = orderId;
- this.orderStatus = orderStatus;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersInServiceQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersInServiceQueryRespBean.java
deleted file mode 100644
index f594fd6178..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersInServiceQueryRespBean.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-import java.util.List;
-
-/**
- * Created on 2021/9/8
- *
- * 查询全部服务中/待服务订单的返回数据
- */
-public class OrdersInServiceQueryRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- public List servicing; //服务中订单
- public List waitService; //待服务订单
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryReqBean.java
deleted file mode 100644
index 767828d2d4..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryReqBean.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 查询订单列表请求数据结构
- */
-public class OrdersListQueryReqBean {
-
- public String sn;
- public int page; //页码,从0开始
- public int size; //每页条数
-
- public OrdersListQueryReqBean(String sn, int page, int size) {
- this.sn = sn;
- this.page = page;
- this.size = size;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryRespBean.java
deleted file mode 100644
index 98e61a7fe8..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryRespBean.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-import java.util.List;
-
-/**
- * Created by pangfan on 2021/8/19
- */
-public class OrdersListQueryRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- public List orders;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersNewBookingQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersNewBookingQueryRespBean.java
deleted file mode 100644
index 3c9aad7030..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersNewBookingQueryRespBean.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mogo.och.taxi.passenger.bean;
-
-import com.mogo.eagle.core.data.BaseData;
-
-import java.util.List;
-
-/**
- * Created on 2021/9/8
- *
- * 查询新到的预约单的返回数据结构
- */
-public class OrdersNewBookingQueryRespBean extends BaseData {
- public Result data;
-
- public static class Result {
- public List orders;
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerCarHeartbeatReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerCarHeartbeatReqBean.java
new file mode 100644
index 0000000000..02d24c51b3
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerCarHeartbeatReqBean.java
@@ -0,0 +1,26 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
+
+import java.util.UUID;
+
+/**
+ * Created on 2021/9/16
+ *
+ * 上传车机心跳信息请求数据
+ */
+public class TaxiPassengerCarHeartbeatReqBean {
+ public String sn;
+ public double lon; //经度
+ public double lat; //纬度
+ public String msgId; //心跳信息唯一标识
+ public int interval; //上报间隔,单位秒,非必传,默认60秒
+
+ public TaxiPassengerCarHeartbeatReqBean(String sn, double lon, double lat) {
+ this.sn = sn;
+ this.lon = lon;
+ this.lat = lat;
+ this.msgId = UUID.randomUUID().toString();
+ this.interval = (int) (TaxiPassengerConst.LOOP_PERIOD_60S / 1000);
+ }
+}
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/TaxiPassengerOrderQueryReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryReqBean.java
new file mode 100644
index 0000000000..c15f77d484
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryReqBean.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单信息请求数据结构
+ */
+public class TaxiPassengerOrderQueryReqBean {
+
+ public String driverSn;
+ public String orderNo;
+
+ public TaxiPassengerOrderQueryReqBean(String driverSn, String orderNo) {
+ this.driverSn = driverSn;
+ this.orderNo = orderNo;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java
new file mode 100644
index 0000000000..5b1da564c7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java
@@ -0,0 +1,88 @@
+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 TaxiPassengerOrderQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result implements Comparable{
+ // 订单no
+ public String orderNo;
+ // 订单类型
+ public int orderType; //1即时单 2预约单
+ // 订单状态
+ public int orderStatus;
+ // 订单运营类型 (9出租车,10小巴)
+ public int businessType;
+ // 起始站点id
+ public int startSiteId;
+ // 起始站点名称
+ public String startSiteAddr;
+ // 起始站点坐标
+ public List startSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List startSiteGcjPoint; //高德坐标,用于本地计算距离 [lon,lat]
+ // 终点站点id
+ public int endSiteId;
+ // 终点站点名称
+ public String endSiteAddr;
+ // 终点站点坐标
+ public List endSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List endSiteGcjPoint; //高德坐标,用于计算距离 [lon,lat]
+
+ // 车牌号
+ public String carNumber;
+ //订单创建时间戳
+ public long createTime;
+ //开始服务时间戳:司机点击'开始服务'后订单状态更新成功的时间
+ public long startTime;
+ //预计用车时间:预约单=下单时的预约用车时间;即时单=派单成功的时间+预估的达到上车点的时间
+ public long bookingTime;
+
+
+
+ // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km
+ public double travelDistance;
+
+ /**
+ * @param distance
+ */
+ public void decreaseTravelDistance( double distance ) {
+ travelDistance = ( ( float ) distance / 1000f );
+ if ( travelDistance < 0 ) {
+ travelDistance = 0;
+ }
+ }
+
+ @Override
+ public int compareTo(Result o) {
+ boolean isEqual = this.orderNo.equals(o.orderNo);
+ return isEqual ? 0 : 1;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Result result = (Result) o;
+ return Objects.equals(orderNo, result.orderNo) &&
+ orderType == result.orderType &&
+ orderStatus == result.orderStatus &&
+ businessType == result.businessType;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderNo, orderType, orderStatus, businessType, startSiteId,
+ startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
+ endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java
new file mode 100644
index 0000000000..08925ce3d9
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrdersInServiceQueryRespBean.java
@@ -0,0 +1,19 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * 查询全部服务中/待服务订单的返回数据
+ */
+public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List servicing; //服务中订单
+ public List waitService; //待服务订单
+ }
+}
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/IOCHTaxiADASStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiADASStatusCallback.java
deleted file mode 100644
index ff28cdbe95..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiADASStatusCallback.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.mogo.och.taxi.passenger.callback;
-
-/**
- * Created on 2021/9/8
- *
- * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
- */
-public interface IOCHTaxiADASStatusCallback {
- // 自动驾驶触发的已到达目的地:暂未用到
- void onAutopilotArriveEnd();
-
- // 自动驾驶可用状态
- void onAutopilotEnable();
-
- // 自动驾驶不可用状态
- void onAutopilotDisable();
-
- // 自动驾驶运行中
- void onAutopilotRunning();
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiAutopilotPlanningCallback.java
deleted file mode 100644
index 2bbd29669f..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiAutopilotPlanningCallback.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.mogo.och.taxi.passenger.callback;
-
-import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
-
-import java.util.List;
-
-/**
- * @author: wangmingjun
- * @date: 2021/11/1
- */
-public interface IOCHTaxiAutopilotPlanningCallback {
- void routeResult(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/IOCHTaxiCarStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiCarStatusCallback.java
deleted file mode 100644
index d59144e86c..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiCarStatusCallback.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.mogo.och.taxi.passenger.callback;
-
-/**
- * Created on 2021/9/8
- *
- * Model->Presenter回调:出车/收车状态变更
- */
-public interface IOCHTaxiCarStatusCallback {
- void onCarStatusChanged(boolean inOperation);
-
- void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum);
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiControllerStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiControllerStatusCallback.java
deleted file mode 100644
index f40c0ea82d..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiControllerStatusCallback.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.mogo.och.taxi.passenger.callback;
-
-import android.location.Location;
-
-/**
- * Created on 2021/9/10
- *
- * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
- */
-public interface IOCHTaxiControllerStatusCallback {
- // 是否vr map模式
- void onVRModeChanged(boolean isVRMode);
- // 自车定位
- void onCarLocationChanged(Location location);
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiNaviChangedCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiNaviChangedCallback.java
deleted file mode 100644
index 9205cd3e26..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiNaviChangedCallback.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.mogo.och.taxi.passenger.callback;
-
-/**
- * @author: wangmingjun
- * @date: 2021/12/3
- */
-public interface IOCHTaxiNaviChangedCallback {
- // 当前位置距离上车点的距离(米)、预估时间(秒)
- void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond);
- void reInitNaviAmap(boolean isPlay,boolean isRestart);
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiOrderStatusCallback.java
deleted file mode 100644
index 4891db386f..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiOrderStatusCallback.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.mogo.och.taxi.passenger.callback;
-
-import androidx.annotation.NonNull;
-
-import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
-
-import java.util.List;
-
-/**
- * Created on 2021/9/8
- *
- * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
- */
-public interface IOCHTaxiOrderStatusCallback {
- // 进行中单变更:暂未用到
- void onOrdersInServiceChanged(@NonNull List inServiceList);
- // 待服务单变更
- void onOrdersWaitServiceChanged(@NonNull List waitServiceList);
-
- // 当前进行单状态变更:新到进行中订单、进行中单状态变更
- void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
- // 当前订单取消完成:用于司机主动取消订单的结果反馈
- void onCurrentOrderCancelDone();
- // 待服务单被取消
- void onOrderCancelDone(long orderId);
- // 当前订单route信息查询反馈
- void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
- // 当前位置距离上车点的距离(米)、预估时间(秒)
- void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
- // 当前位置距离上车点的距离(米)、预估时间(秒)
- void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
-
- // 获取全部订单列表(含已完成、已取消)的反馈
- void onOrdersListPageRefresh(List ordersList);
-
- // 新到预约单
- void onNewBookingOrderGot(OrderQueryRespBean.Result order);
-
- // 执行抢单动作完成:可进入抢单中状态
- void onGrabOrderExecuteDone();
-
- // 抢到预约单
- void onGrabOrderSuccess(OrderQueryRespBean.Result order);
-
- // 未抢到预约单
- void onGrabOrderFailed(OrderQueryRespBean.Result order);
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerADASStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerADASStatusCallback.java
new file mode 100644
index 0000000000..df56841e67
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerADASStatusCallback.java
@@ -0,0 +1,20 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
+ */
+public interface IOCHTaxiPassengerADASStatusCallback {
+ // 自动驾驶触发的已到达目的地:暂未用到
+ void onAutopilotArriveEnd();
+
+ // 自动驾驶可用状态
+ void onAutopilotEnable();
+
+ // 自动驾驶不可用状态
+ void onAutopilotDisable();
+
+ // 自动驾驶运行中
+ void onAutopilotRunning();
+}
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
new file mode 100644
index 0000000000..3f1cb1bac3
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.passenger.callback;
+
+
+import com.amap.api.maps.model.LatLng;
+
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/1
+ */
+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/IOCHTaxiPassengerControllerStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java
new file mode 100644
index 0000000000..8ad329a33a
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java
@@ -0,0 +1,15 @@
+package com.mogo.och.taxi.passenger.callback;
+
+import android.location.Location;
+
+/**
+ * Created on 2021/9/10
+ *
+ * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
+ */
+public interface IOCHTaxiPassengerControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(Location location);
+}
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
new file mode 100644
index 0000000000..e30e544db8
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerNaviChangedCallback.java
@@ -0,0 +1,10 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/3
+ */
+public interface IOCHTaxiPassengerNaviChangedCallback {
+ // 当前位置距离上车点的距离(米)、预估时间(秒) 、当前路的名称
+ void onCurrentRoadName(String currentRoadName);
+}
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
new file mode 100644
index 0000000000..4f82627a0c
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java
@@ -0,0 +1,25 @@
+package com.mogo.och.taxi.passenger.callback;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
+ */
+public interface IOCHTaxiPassengerOrderStatusCallback {
+
+ // 当前进行单状态变更:新到进行中订单、进行中单状态变更
+ void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order);
+
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ 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/callback/ITaxiPassengerMapViewCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/ITaxiPassengerMapViewCallback.java
new file mode 100644
index 0000000000..f26039ec07
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/ITaxiPassengerMapViewCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/3/10
+ */
+public interface ITaxiPassengerMapViewCallback {
+ void onCameraChange(float bearing);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/ITaxiPassengerVeloctityCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/ITaxiPassengerVeloctityCallback.java
new file mode 100644
index 0000000000..50cf8d8a65
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/ITaxiPassengerVeloctityCallback.java
@@ -0,0 +1,10 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/3/13
+ */
+public interface ITaxiPassengerVeloctityCallback {
+ //限速
+ void onLimitingVelocityChange(int limitingVelocity);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/Shadow.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/Shadow.kt
deleted file mode 100644
index 6b678ce172..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/Shadow.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.mogo.och.taxi.passenger.callback
-
-import androidx.annotation.ColorRes
-
-/**
- * @author: wangmingjun
- * @date: 2022/1/21
- */
-interface Shadow {
- //设置阴影半径
- fun setShadowRadius(radius:Float): Shadow
-
- //添加单位设置
- fun setShadowRadius(unit:Int,radius: Float): Shadow
-
- //设置应用颜色
- fun setShadowColor(color:Int): Shadow
-
- //设置阴影颜色资源文件id
- fun setShadowColorRes(@ColorRes color: Int): Shadow
- /**
- * 设置模糊半径
- * @param radius
- */
- fun setBlurRadius(radius:Float): Shadow
-
- /**
- *
- * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
- * @param radius 模糊半径
- */
- fun setBlurRadius(unit:Int,radius:Float): Shadow
-
- /**
- * 设置水平方向的偏移量
- * @param offset x轴偏移
- */
- fun setXOffset(offset:Float): Shadow
-
-
- /**
- * 设置x方向的偏移量,设置单位
- * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
- * @param offset x轴偏移
- */
- fun setXOffset(unit:Int,offset:Float): Shadow
-
- /**
- * 设置竖直方向的偏移量
- * @param offset y轴偏移
- */
- fun setYOffset(offset:Float): Shadow
-
- /**
- * 设置竖直方向的偏移量,带单位
- * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
- * @param offset y轴偏移
- */
- fun setYOffset(unit:Int,offset:Float): Shadow
-
- /**
- * 更新绘制
- */
- fun commit();
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OCHTaxiConst.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OCHTaxiConst.kt
deleted file mode 100644
index da9eab278c..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OCHTaxiConst.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.mogo.och.taxi.passenger.constant
-
-import com.mogo.commons.debug.DebugConfig
-
-/**
- * Created on 2021/12/6
- */
-class OCHTaxiConst {
- companion object {
-
- private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
- private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
- private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
-
- @JvmStatic
- fun getBaseUrl(): String {
- return when (DebugConfig.getNetMode()) {
- DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
- DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
- DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
- else -> BASE_URL_OCH_RELEASE
- }
- }
-
- // OCH arouter 路由path
- const val PATH = "/och/api"
-
- // 到达起始点围栏
- const val ARRIVE_AT_START_STATION_DISTANCE = 50 //围栏由20m改为50m
-
- // 上报心跳轮询ms
- const val LOOP_PERIOD_60S = 60 * 1000L
-
- // 轮询查询进行中/待服务订单的间隔时间 2秒
- const val LOOP_PERIOD_2S = 2 * 1000L
- // 轮询查询新到预约单 1秒
- const val LOOP_PERIOD_1S = 1 * 1000L
- const val LOOP_DELAY = 100L
-
- // 订单信息
- const val SP_KEY_OCH_TAXI_ORDER = "SP_KEY_OCH_TAXI_ORDER"
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderCancelReasons.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderCancelReasons.kt
deleted file mode 100644
index 67150540de..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderCancelReasons.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.mogo.och.taxi.passenger.constant
-
-/**
- * 司机端取消订单的原因定义
- * Created on 2021/12/7
- *
- * * String int
- * 进行中订单:
- * 车况异常 0
- * 设备异常 1
- * 电量不足 2
- * 身体不适 3
- * 乘客未到 4
- * 乘客中途下车 5
- *
- * 待服务订单:
- * 2000 车辆故障
- * 2001 乘客联系取消
- * 2002 行程冲突
- * 2003 车电量不足
- * 2004 其他
- */
-enum class OrderCancelReasons(val type: Int, val msg: String) {
- CarBroken(1000, "车况异常"),
- DeviceBroken(1001, "设备异常"),
- BatteryLow(1002, "电量不足"),
- DriverIsIll(1003, "身体不适"),
- PassengerNotArrive(1004, "乘客未到"),
- PassengerStopOver(1005, "乘客中途下车"),
-
- BookCarBroken(2000, "车辆故障"),
- BookPassengerCancel(2001, "乘客联系取消"),
- BookJourneyConflict(2002, "行程冲突"),
- BookBatteryLow(2003, "车电量不足"),
- BookOther(2004, "其他");
-
- companion object {
- @JvmStatic
- fun getType(msg: String): Int {
- for (value in values()) {
- if (value.msg == msg) {
- return value.type
- }
- }
- return 0
- }
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderStatusEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderStatusEnum.kt
deleted file mode 100644
index a16e12cdf2..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderStatusEnum.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.mogo.och.taxi.passenger.constant
-
-/**
- * Created on 2021/12/7
- *
- * * Old code:START
- * 未派单 0
- * 去往上车站点 1
- * 车辆已到达上车站点 2
- * 乘客已到达上车站点 3
- * 去往下车站点 4
- * 到达下车站点 5
- * 已完成 6
- * 已取消 7
- * Old code:END
- *
- * 0 订单创建(为派单),
- * 10 已派上司机(司机去往上车点),
- * 20 司机到达上车点,
- * 30 乘客到达上车点,
- * 40 服务中(去往目的地),
- * 50 到达目的地,
- * 60 已完成,
- * 70 已取消
- */
-enum class OrderStatusEnum(val code: Int) {
- None( 0 ),
- OnTheWayToStartStation( 10),
- ArriveAtStartStation( 20),
- UserArriveAtStartStation( 30),
- OnTheWayToEndStation( 40),
- ArriveAtEndStation( 50),
- JourneyCompleted(60),//行程完成
- Cancel( 70);
-
- companion object {
- @JvmStatic
- fun valueOf(code: Int): OrderStatusEnum? {
- for (value in values()) {
- if (value.code == code) {
- return value
- }
- }
- return None
- }
- }
-}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderTypeEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderTypeEnum.kt
deleted file mode 100644
index bcf94ded11..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderTypeEnum.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.mogo.och.taxi.passenger.constant
-
-/**
- * RoboTaxi订单类型声明
- *
- * Created on 2021/12/6
- */
-enum class OrderTypeEnum(val type: Int) {
- Instant(1), // 即时单
- Reserved(2) // 预约单
-}
\ No newline at end of file
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
new file mode 100644
index 0000000000..a17c9add6c
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt
@@ -0,0 +1,46 @@
+package com.mogo.och.taxi.passenger.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class TaxiPassengerConst {
+ companion object {
+
+ private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
+ private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
+ private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
+
+ @JvmStatic
+ fun getBaseUrl(): String {
+ return when (DebugConfig.getNetMode()) {
+ DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
+ DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
+ DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
+ else -> BASE_URL_OCH_RELEASE
+ }
+ }
+
+ // OCH arouter 路由path
+ const val PATH = "/och/api"
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+
+ // 轮询查询进行中/待服务订单的间隔时间 2秒
+ const val LOOP_PERIOD_2S = 2 * 1000L
+ // 轮询查询新到预约单 1秒
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ // 订单信息
+ const val SP_KEY_OCH_TAXI_ORDER = "SP_KEY_OCH_TAXI_ORDER"
+
+ // 订单总里程
+ 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/constant/TaxiPassengerOrderStatusEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt
new file mode 100644
index 0000000000..1e3ec5ccd0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt
@@ -0,0 +1,47 @@
+package com.mogo.och.taxi.passenger.constant
+
+/**
+ * Created on 2021/12/7
+ *
+ * * Old code:START
+ * 未派单 0
+ * 去往上车站点 1
+ * 车辆已到达上车站点 2
+ * 乘客已到达上车站点 3
+ * 去往下车站点 4
+ * 到达下车站点 5
+ * 已完成 6
+ * 已取消 7
+ * Old code:END
+ *
+ * 0 订单创建(为派单),
+ * 10 已派上司机(司机去往上车点),
+ * 20 司机到达上车点,
+ * 30 乘客到达上车点,
+ * 40 服务中(去往目的地),
+ * 50 到达目的地,
+ * 60 已完成,
+ * 70 已取消
+ */
+enum class TaxiPassengerOrderStatusEnum(val code: Int) {
+ None( 0 ),
+ OnTheWayToStart( 10),
+ ArriveAtStart( 20),
+ UserArriveAtStart( 30),
+ OnTheWayToEnd( 40),
+ ArriveAtEnd( 50),
+ JourneyCompleted(60),//行程完成
+ Cancel( 70);
+
+ companion object {
+ @JvmStatic
+ fun valueOf(code: Int): TaxiPassengerOrderStatusEnum? {
+ for (value in values()) {
+ if (value.code == code) {
+ return value
+ }
+ }
+ return None
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/MogoOCHTaxiModelNew.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/MogoOCHTaxiModelNew.java
deleted file mode 100644
index 5f4c847dd1..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/MogoOCHTaxiModelNew.java
+++ /dev/null
@@ -1,1016 +0,0 @@
-package com.mogo.och.taxi.passenger.model;
-
-import android.content.Context;
-import android.content.Intent;
-import android.location.Location;
-import android.net.ConnectivityManager;
-
-import androidx.annotation.Nullable;
-
-import com.elegant.network.utils.GsonUtil;
-import com.mogo.cloud.commons.utils.CoordinateUtils;
-import com.mogo.commons.debug.DebugConfig;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
-import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
-import com.mogo.eagle.core.data.config.FunctionBuildConfig;
-import com.mogo.eagle.core.data.map.MogoLocation;
-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.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.AppIdentityModeUtils;
-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.map.navi.IMogoCarLocationChangedListener2;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
-import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
-import com.mogo.och.taxi.passenger.callback.IOCHTaxiADASStatusCallback;
-import com.mogo.och.taxi.passenger.callback.IOCHTaxiAutopilotPlanningCallback;
-import com.mogo.och.taxi.passenger.callback.IOCHTaxiCarStatusCallback;
-import com.mogo.och.taxi.passenger.callback.IOCHTaxiControllerStatusCallback;
-import com.mogo.och.taxi.passenger.callback.IOCHTaxiOrderStatusCallback;
-import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
-import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
-import com.mogo.och.taxi.passenger.constant.OrderTypeEnum;
-import com.mogo.och.taxi.passenger.network.OCHTaxiServiceCallback;
-import com.mogo.och.taxi.passenger.network.OCHTaxiServiceManagerNew;
-import com.mogo.och.taxi.passenger.utils.OrderUtil;
-import com.mogo.och.taxi.passenger.utils.PinYinUtil;
-import com.mogo.service.IMogoServiceApis;
-import com.mogo.service.cloud.socket.IMogoLifecycleListener;
-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.Collections;
-import java.util.List;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 网约车 - 出租车业务逻辑处理
- */
-public class MogoOCHTaxiModelNew {
-
- private static final String TAG = MogoOCHTaxiModelNew.class.getSimpleName();
-
- private static final class SingletonHolder {
- private static final MogoOCHTaxiModelNew INSTANCE = new MogoOCHTaxiModelNew();
- }
-
- public static MogoOCHTaxiModelNew getInstance() {
- return SingletonHolder.INSTANCE;
- }
-
- private Context mContext;
- private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值
- private volatile int mOCHCarStatus = -1; //出车/收车状态:1 出车;0 收车
- private volatile long mPrevOrderId = -1; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出)
- private volatile OrderQueryRespBean.Result mNewBookingOrder; //新到待抢预约单
- private volatile OrderQueryRespBean.Result mCurrentOCHOrder; //当前订单
- private volatile List mInServiceList = Collections.emptyList(); //进行中订单
- private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单
-
- private IOCHTaxiADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关
- private IOCHTaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:出车/收车状态
- private IOCHTaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
- private IOCHTaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更
-
- private IOCHTaxiAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划
-
- private double mLongitude, mLatitude;
-
- private MogoOCHTaxiModelNew() {
- }
- public void setMoGoAutopilotPlanningListener(IOCHTaxiAutopilotPlanningCallback
- moGoAutopilotPlanningCallback) {
- this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
- }
- public void setADASStatusCallback(IOCHTaxiADASStatusCallback callback) {
- this.mADASStatusCallback = callback;
- }
-
- public void setCarStatusCallback(IOCHTaxiCarStatusCallback callback) {
- this.mCarStatusCallback = callback;
- }
-
- public void setControllerStatusCallback(IOCHTaxiControllerStatusCallback callback) {
- this.mControllerStatusCallback = callback;
- }
-
- public void setOrderStatusCallback(IOCHTaxiOrderStatusCallback callback) {
- this.mOrderStatusCallback = callback;
- }
-
- public void init( Context context ) {
- 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();
- }
-
- if (NetworkUtils.isConnected(mContext)) {
-// startOrStopOrderLoop(mOCHCarStatus == 1);
- if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
- queryCarStatus();
- }
- }
- }
-
- public void startOrStopOrderLoop(){
- startOrStopOrderLoop(mOCHCarStatus == 1);
- }
-
- public void release() {
- startOrStopOrderLoop(false);
- releaseListeners();
- }
-
- private void initListeners() {
- MogoApisHandler.getInstance()
- .getApis()
- .getSocketManagerApi(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);
-
- MogoApisHandler.getInstance()
- .getApis()
- .getSocketManagerApi(mContext)
- .unregisterLifecycleListener(10010);
-
- CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener);
- CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
- }
-
- private void startOrStopOrderLoop(boolean start) {
- Logger.d(TAG, "startOrStopOrderLoop() " + start);
- if (start) {
- OCHTaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop();
- OCHTaxiModelLoopManager.getInstance().startNewBookingOrderLoop();
- OCHTaxiModelLoopManager.getInstance().startHeartbeatLoop();
- } else {
- OCHTaxiModelLoopManager.getInstance().stopInAndWaitOrdersLoop();
- OCHTaxiModelLoopManager.getInstance().stopNewBookingOrderLoop();
- OCHTaxiModelLoopManager.getInstance().stopHeartbeatLoop();
- }
- }
-
- //查询出车/收车状态
- public void queryCarStatus() {
- OCHTaxiServiceManagerNew.getInstance().queryDriverServiceStatus(mContext,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(DriverStatusQueryRespBean data) {
- if (null != data && 0 == data.code) {
- mOCHCarStatus = data.data.serviceStatus == 1 ? 1 : 0;
- //更新view
- startOrStopOrderLoop(mOCHCarStatus == 1);
- if (mCarStatusCallback != null) {
- mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1);
- }
- }
- }
-
- @Override
- public void onError() {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }
- }
-
- @Override
- public void onFail(int code, String msg) { }
- });
- }
-
- //更新出车收车状态
- public void updateCarStatus() {
- if ( mOCHCarStatus == -1){
- queryCarStatus();
- return;
- }
- final int status = mOCHCarStatus == 1 ? 0 : 1;
- OCHTaxiServiceManagerNew.getInstance().updateDriverServiceStatus(mContext, status,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
- if (null != data && 0 == data.code) {
- mOCHCarStatus = status;
- startOrStopOrderLoop(mOCHCarStatus == 1);
- if (mCarStatusCallback != null) {
- mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1);
- }
- Logger.d(TAG, "changeCarStatus:" + status);
- }
- }
-
- @Override
- public void onError() {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
- TipToast.shortTip(code + "," + msg);
- }
- });
- }
-
- /**
- * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等)
- *
- * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时,
- * 才更新最新进行中单到本地
- */
- public void queryInAndWaitOrders() {
- OCHTaxiServiceManagerNew.getInstance().queryOrdersInAndWaitService(mContext,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrdersInServiceQueryRespBean data) {
- if (data == null || data.data == null) {
- return;
- }
-
- //1. 处理进行中订单
- mInServiceList = data.data.servicing;
- if (data.data.servicing != null && !data.data.servicing.isEmpty()) {
- // 1.1. 当存在进行中单时:对本地currentOrder进行更新
- if (mCurrentOCHOrder == null) {
- //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新
- updateNativeCurrentOrder(data.data.servicing.get(0));
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
- }
- } else {
- //1.1.2. 当本地有currentOrder:
- //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新
- //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新
- if (mCurrentOCHOrder.orderId != data.data.servicing.get(0).orderId) {
- queryCurOrderStatus();
- } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
- updateNativeCurrentOrder(data.data.servicing.get(0));
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
- }
- }
- }
- } else {
- // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更新
- if (mCurrentOCHOrder != null) {
- queryCurOrderStatus();
- }
- }
-
- //2. 处理待服务订单列表
- if (data.data.waitService != null && !data.data.waitService.isEmpty()) {
- //2.1. 当存在待服务订单列表:跟本地待服务列表比较
- if (mWaitServiceList.isEmpty()
- || (mWaitServiceList.size() != data.data.waitService.size())
- || !OrderUtil.haveSameOrders(mWaitServiceList, data.data.waitService)) {
- // 2.1.1. 当本地无待服务单,或数量和内容不一致,更新本地待服务列表,并通知ui更新
- mWaitServiceList = data.data.waitService;
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
- }
- }
- } else {
- //2.2. 当无待服务单时:如果本地也无则跳过;如果本地有,则清除并通知ui更新
- if (!mWaitServiceList.isEmpty()) {
- mWaitServiceList.clear();
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
- }
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
- private void queryCurOrderStatus() {
- if (mCurrentOCHOrder == null) {
- return;
- }
- final long orderId = mCurrentOCHOrder.orderId;
- OCHTaxiServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrderQueryRespBean data) {
- if (data != null && data.data != null
- && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == data.data.orderId) {
- if (data.data.orderStatus == OrderStatusEnum.Cancel.getCode()
- || data.data.orderStatus == OrderStatusEnum.JourneyCompleted.getCode()
- || data.data.orderStatus == OrderStatusEnum.None.getCode()) {
- clearCurrentOCHOrder();
- cancelAutopilot();
- } else {
- updateNativeCurrentOrder(data.data);
- }
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onCurrentOrderStatusChanged(data.data);
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- //更新当前订单状态
- public void updateOCHOrderStatus(final OrderStatusEnum orderStatus) {
- if ( mCurrentOCHOrder == null ) {
- return;
- }
- final long orderId = mCurrentOCHOrder.orderId;
- OCHTaxiServiceManagerNew.getInstance().updateOrderStatus(mContext, orderId,
- orderStatus.getCode(), new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
- if (null != data && 0 == data.code
- && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
- mCurrentOCHOrder.orderStatus = orderStatus.getCode();
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
- }
- }
- }
-
- @Override
- public void onError() {
- if (!NetworkUtils.isConnected(mContext)) {
- TipToast.shortTip("网络异常,请稍后重试");
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-// TipToast.shortTip(code + "," + msg);
- }
- });
- }
-
- // 取消当前订单
- public void cancelCurrentOrder(int reasonType, String reason) {
- if (mCurrentOCHOrder == null) {
- mOrderStatusCallback.onCurrentOrderCancelDone();
- return;
- }
- final long orderId = mCurrentOCHOrder.orderId;
- OCHTaxiServiceManagerNew.getInstance().cancelOrder(mContext, orderId, reasonType, reason,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
- if (null != data && 0 == data.code
- && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onCurrentOrderCancelDone();
- }
- clearCurrentOCHOrder();
- cancelAutopilot();
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-// TipToast.shortTip(code + "," + msg);
- }
- });
- }
-
- // 取消待服务中订单
- public void cancelOrderById(final long orderId, int reasonType, String reason) {
- OCHTaxiServiceManagerNew.getInstance().cancelOrder(mContext, orderId, reasonType, reason,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
- if (null != data && 0 == data.code) {
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onOrderCancelDone(orderId);
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-// TipToast.shortTip(code + "," + msg);
- }
- });
- }
-
- // 查询当前订单route信息:预估时间、里程等
- public void queryCurOrderRouteInfo() {
- if (mCurrentOCHOrder == null) {
- return;
- }
- final long orderId = mCurrentOCHOrder.orderId;
- OCHTaxiServiceManagerNew.getInstance().queryOrderRouteInfo(mContext, orderId,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrderQueryRouteInfoRespBean data) {
- if (null != data && 0 == data.code
- && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onCurrentOrderRouteInfoGot(data.data);
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-// TipToast.shortTip(code + "," + msg);
- }
- });
- }
-
- // 获取全部订单列表
- public void queryOrdersList(int page, int size) {
- OCHTaxiServiceManagerNew.getInstance().queryOrdersList(mContext, page, size,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrdersListQueryRespBean data) {
- if (null != data && 0 == data.code) {
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onOrdersListPageRefresh(data.data.orders);
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
- TipToast.shortTip("请求异常,请稍后重试");
- }
- });
- }
-
- /**
- * 查询新到预约单
- *
- * 注:只有在本地缓存mNewBookingOrder为null时(执行完抢单or司机关闭改单),才更新新到待抢单
- */
- public void queryNewBookingOrder() {
- OCHTaxiServiceManagerNew.getInstance().queryNewBookingOrder(mContext,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrdersNewBookingQueryRespBean data) {
- if (data != null && data.code == 0
- && data.data != null && data.data.orders.size() > 0) {
- // 本地无新到单,且本次新到单id与上次收到的新单id不同时:显示本次新到单
- if (mNewBookingOrder == null ) {
- for (Long orderId : data.data.orders) {
- if (mPrevOrderId != orderId.longValue()) {
- queryNewBookingContent(orderId.longValue());
- break;
- }
- }
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- // 仅限于获取到新待抢单且需要展示时查询该单信息:(queryOrderById接口可以查询属于该车的单、未派的单)
- private void queryNewBookingContent(final long orderId) {
- OCHTaxiServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrderQueryRespBean data) {
- if (data != null && data.code == 0
- && data.data != null && data.data.orderId == orderId
- && data.data.orderType == OrderTypeEnum.Reserved.getType()) {
- mNewBookingOrder = data.data;
- mPrevOrderId = data.data.orderId;
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onNewBookingOrderGot(mNewBookingOrder);
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- // 执行抢单动作
- public void grabOrder() {
- if (mNewBookingOrder == null) {
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onGrabOrderFailed(null);
- }
- return;
- }
- final long orderId = mNewBookingOrder.orderId;
- OCHTaxiServiceManagerNew.getInstance().grabOrder(mContext, orderId,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrderGrabRespBean data) {
- if (data != null && data.code == 0
- && mNewBookingOrder != null && mNewBookingOrder.orderId == orderId) {
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onGrabOrderExecuteDone();
- OCHTaxiModelLoopManager.getInstance().startGrabResultLoop();
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
- TipToast.shortTip("请求异常,请稍后重试");
- }
- });
- }
-
- // 查询抢单结果
- public void queryOrderGrabStatus() {
- if (mNewBookingOrder == null) {
- OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
- if (mOrderStatusCallback != null) {
- mOrderStatusCallback.onGrabOrderFailed(null);
- }
- return;
- }
- final long orderId = mNewBookingOrder.orderId;
- OCHTaxiServiceManagerNew.getInstance().queryOrderGrabStatus(mContext, orderId,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(OrderGrabStatusQueryRespBean data) {
- //OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
- if (data != null && data.code == 0
- && mNewBookingOrder != null && mNewBookingOrder.orderId == orderId) {
- if (data.data.grabStatus == 0) {
- return; //抢单中,不处理继续轮询结果
- }
- if (mOrderStatusCallback != null) {
- if (data.data.grabStatus == 1) {
- mOrderStatusCallback.onGrabOrderSuccess(mNewBookingOrder);
- } else if (data.data.grabStatus == 2) {
- mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
- } else {
- // TODO: 2021/9/22 需根据具体内容给予提示,如订单已取消
- mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
- }
- }
- } else {
- if (mOrderStatusCallback != null) {
- // TODO: 2021/9/22 如果用户已取消单,抢单失败时暂返回null,UI当前直接恢复原页面内容,后续优化
- mOrderStatusCallback.onGrabOrderFailed(null);
- }
- }
- OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
- cancelNewBookingOrder();
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- // 车机端上传心跳数据(只在出车状态时上传)
- public void runCarHeartbeat() {
- OCHTaxiServiceManagerNew.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(BaseData data) {
-
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- // 查询司机服务数据
- public void queryDriverServiceData() {
- OCHTaxiServiceManagerNew.getInstance().queryDriverServiceData(mContext,
- new OCHTaxiServiceCallback() {
- @Override
- public void onSuccess(DriverServiceDataRespBean data) {
- if (data != null && data.code == 0
- && data.data != null && data.data.immediate != null) {
- if (mCarStatusCallback != null) {
- mCarStatusCallback.onServiceDataUpdate(
- data.data.immediate.timeDuration, data.data.immediate.orderNum);
- }
- }
- }
-
- @Override
- public void onFail(int code, String msg) {
-
- }
- });
- }
-
- // 取消当前新到预约单
- public void cancelNewBookingOrder() {
- mNewBookingOrder = null;
- }
-
- // 获取当前订单
- public OrderQueryRespBean.Result getCurrentOCHOrder() {
- return mCurrentOCHOrder;
- }
-
- // 获取当前订单状态
- public OrderStatusEnum getCurOrderStatus() {
- OrderQueryRespBean.Result order = MogoOCHTaxiModelNew.getInstance().getCurrentOCHOrder();
- if (order == null) {
- return OrderStatusEnum.None;
- }
- return OrderStatusEnum.valueOf(order.orderStatus);
- }
-
- //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据
- private void updateNativeCurrentOrder(OrderQueryRespBean.Result data) {
- if (data == null) {
- return;
- }
- mCurrentOCHOrder = data;
- SharedPrefsMgr.getInstance(mContext).putString(OCHTaxiConst.SP_KEY_OCH_TAXI_ORDER,
- GsonUtil.jsonFromObject(data));
- }
-
- //清除订单信息
- public void clearCurrentOCHOrder() {
- mCurrentOCHOrder = null;
- SharedPrefsMgr.getInstance(mContext).remove(OCHTaxiConst.SP_KEY_OCH_TAXI_ORDER);
- }
-
- //检测当前订单
- public boolean checkCurrentOCHOrder() {
- if ( mCurrentOCHOrder != null
- && mCurrentOCHOrder.startSiteGcjPoint != null
- && mCurrentOCHOrder.endSiteGcjPoint != null) {
- return true;
- }
- return false;
- }
-
- //以当前订单为基础,开启自动驾驶
- public void startAutoPilot() {
- if (!checkCurrentOCHOrder()) {
- Logger.e( TAG, "no order or order is empty." );
- TipToast.shortTip("当前订单不存在或异常!");
- return;
- }
-
- if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
- == Integer.parseInt(DebugConfig.getAutoPilotStatus())) {
- // TODO: 2021/11/28 工控机存在刚开始状态为0,但是可以开启变为2,工控机解决前不显示此toast
-// TipToast.shortTip("自动驾驶状态为不可用!");
- }
-
- double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0);
- double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1);
- double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0);
- double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1);
-
- AutopilotControlParameters parameters = new AutopilotControlParameters();
- parameters.vehicleType = mCurrentOCHOrder.businessType;
- parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM)
- parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM)
- parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon);
- parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon);
- CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters);
- Logger.d(TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters)
- +" ,startSiteName="+ mCurrentOCHOrder.startSiteAddr+" ,endSiteName="+mCurrentOCHOrder.endSiteAddr);
- if (DebugConfig.isDebug()) {
- // TipToast.shortTip("Start autopilot!");
- }
-
- // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
-// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" );
- }
-
- //结束自动驾驶
- public void cancelAutopilot() {
- try {
- CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
- Logger.d(TAG, "结束自动驾驶");
- } catch ( Exception e ) {
- e.printStackTrace();
- }
- }
-
- //根据围栏判断,是否到达起点
- private void judgeStartStation(Location location) {
- if (mCurrentOCHOrder == null || mCurrentOCHOrder.startSiteGcjPoint == null
- || mCurrentOCHOrder.startSiteGcjPoint.size() < 2) {
- return;
- }
- double startLon = mCurrentOCHOrder.startSiteGcjPoint.get(0);
- double startLat = mCurrentOCHOrder.startSiteGcjPoint.get(1);
- double distance = CoordinateUtils.calculateLineDistance(
- startLon, startLat,
- location.getLongitude(), location.getLatitude() );
-
- if (DebugConfig.isDebug() && mCurrentOCHOrder.orderStatus == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
- // TipToast.shortTip("距离上车点:" + Double.valueOf(distance).intValue());
- }
-
- Logger.i(TAG, "judgeStartStation() distance = " + distance);
-// if (mOrderStatusCallback != null && distance >= 0) {
-// mOrderStatusCallback.onCurrentOrderDistToStartChanged((long) distance, 0);
-// }
-
- if ( distance > OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) {
- distance = CoordinateUtils.calculateLineDistance(startLon, startLat,
- MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon(),
- MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat() );
- }
-
- if ( distance <= OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) {
- updateOCHOrderStatus( OrderStatusEnum.ArriveAtStartStation);
- return;
- }
- }
-
- // TODO: 2021/9/12
- public void calculateTravelDistance(Location carLocation){
- if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) {
- double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
- double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
- double distance = CoordinateUtils.calculateLineDistance(
- endLon, endLat,
- carLocation.getLongitude(), carLocation.getLatitude());
- mCurrentOCHOrder.decreaseTravelDistance(distance);
- if (mOrderStatusCallback != null && distance >= 0) {
- mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) distance, 0);
- }
- }
- }
-
- //监听网络变化,避免启动机器时无网导致无法更新订单信息
- private IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() {
- @Override
- public void onIntentReceived( String intentStr, Intent intent ) {
- Logger.d( TAG, "onIntentReceived = %s", intentStr );
- if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) {
- if ( NetworkUtils.isConnected( mContext ) ) {
- if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
- startOrStopOrderLoop(mOCHCarStatus == 1);
- queryCarStatus();
- }
- }
- }
- }
- };
-
- private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
- // VR mode变更回调
- @Override
- public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
- if (StatusDescriptor.VR_MODE == descriptor) {
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onVRModeChanged(isTrue);
- }
- }
- }
- };
-
- private IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() {
- @Override
- public void onConnectFailure() { Logger.e(TAG,"socket onConnectFailure"); }
-
- @Override
- public void onConnectSuccess() { Logger.e(TAG,"socket onConnectSuccess"); }
-
- @Override
- public void onConnectLost() { Logger.e(TAG,"socket onConnectLost"); }
- };
-
- // 自车定位
- private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
-
- @Override
- public void onCarLocationChanged2( Location location ) {
- IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
- MogoLocation mogoLocation = new MogoLocation();
- mogoLocation.setAccuracy(location.getAccuracy());
- mogoLocation.setProvider(location.getProvider());
- mogoLocation.setLongitude(location.getLongitude());
- mogoLocation.setLatitude(location.getLatitude());
- mogoLocation.setSpeed(location.getSpeed());
- mogoLocation.setBearing(location.getBearing());
- // TODO: 2021/9/2 因0830新版server后台只能过滤locType=1&&satellites>=4的定位数据,暂固话值,后续优化
- mogoLocation.setLocType(1);
- mogoLocation.setSatellite(4);
-
- apis.getLocationInfoApi().provideLocation(mogoLocation);
- //位置变化时,通过围栏判断是否到达x点
- if (location != null && checkCurrentOCHOrder()) {
- if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToStartStation) {
- judgeStartStation(location);
- } else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
- calculateTravelDistance(location);
- }
- }
- mLongitude = location.getLongitude();
- mLatitude = location.getLatitude();
- if (mControllerStatusCallback != null) {
- mControllerStatusCallback.onCarLocationChanged(location);
- }
- }
- };
-
- /**
- * 订单流转debug START
- */
- public void setArriveAtStartStation() {
- if (mCurrentOCHOrder == null
- || mCurrentOCHOrder.orderStatus != OrderStatusEnum.OnTheWayToStartStation.getCode()) {
- TipToast.shortTip("订单状态不匹配该操作!");
- return;
- }
- updateOCHOrderStatus(OrderStatusEnum.ArriveAtStartStation);
- }
-
- public void setArriveAtEndStation() {
- if (mCurrentOCHOrder == null
- || mCurrentOCHOrder.orderStatus != OrderStatusEnum.OnTheWayToEndStation.getCode()) {
- TipToast.shortTip("订单状态不匹配该操作!");
- return;
- }
- updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
- }
-
- /**
- * 测试开始服务
- */
- public void setOnTheWayToEndStation() {
- if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
- if (mCurrentOCHOrder == null
- || mCurrentOCHOrder.orderStatus != OrderStatusEnum.ArriveAtStartStation.getCode()) {
- TipToast.shortTip("订单状态不匹配该操作!");
- }
- updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
- }
- private IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){
-
- private boolean arriveAtEnd = false; //乘客app专用字段
-
- @Override
- public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
- if (autopilotStatusInfo == null) return;
- int state = autopilotStatusInfo.getState();
- Logger.d( TAG, "state = %s", state );
- if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
- if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
- if (mCurrentOCHOrder != null
- && getCurOrderStatus() == OrderStatusEnum.ArriveAtStartStation
- && state != mPrevAPStatus) {
- // 当高频返回autopilot 2时,不重复调用订单状态变更
- mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态
- updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
- }
- } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
- mPrevAPStatus = state;
-
- if (FunctionBuildConfig.isDemoMode
- && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
- // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
- if (!arriveAtEnd) {
- return;
- } else {
- arriveAtEnd = false;
- }
- }
-
- if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable();
- } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
- mPrevAPStatus = state;
-
- if (FunctionBuildConfig.isDemoMode
- && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
- // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
- if (!arriveAtEnd) {
- return;
- } else {
- arriveAtEnd = false;
- }
- }
-
- if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable();
- }
- }
-
- @Override
- public void onAutopilotSNRequest() {
-
- }
-
- @Override
- public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) {
-
- }
-
- @Override
- public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo data) {
- if (FunctionBuildConfig.isDemoMode
- && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
- arriveAtEnd = true;
- }
-
- if (data == null || !checkCurrentOCHOrder()
- || (getCurOrderStatus() == OrderStatusEnum.ArriveAtEndStation)) {
- return;
- }
- if (DebugConfig.isDebug()) {
- // TipToast.shortTip("到达目的地");
- }
- updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
- }
- };
- private IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){
-
- @Override
- public void onAutopilotTrajectory(ArrayList trajectoryInfos) {
-
- }
-
- @Override
- public void onAutopilotRotting(AutopilotRouteInfo routeList) {
- if (null != routeList && routeList.getModels() != null){
- mAutopilotPlanningCallback.routeResult(routeList.getModels());
- }
- }
- };
- /**
- * END
- */
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/NaviToDestinationModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/NaviToDestinationModel.java
deleted file mode 100644
index 38410c2606..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/NaviToDestinationModel.java
+++ /dev/null
@@ -1,433 +0,0 @@
-package com.mogo.och.taxi.passenger.model;
-
-import android.Manifest;
-import android.content.Context;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.amap.api.navi.AMapNavi;
-import com.amap.api.navi.AMapNaviListener;
-import com.amap.api.navi.enums.NaviType;
-import com.amap.api.navi.model.AMapCalcRouteResult;
-import com.amap.api.navi.model.AMapLaneInfo;
-import com.amap.api.navi.model.AMapModelCross;
-import com.amap.api.navi.model.AMapNaviCameraInfo;
-import com.amap.api.navi.model.AMapNaviCross;
-import com.amap.api.navi.model.AMapNaviInfo;
-import com.amap.api.navi.model.AMapNaviLocation;
-import com.amap.api.navi.model.AMapNaviRouteNotifyData;
-import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;
-import com.amap.api.navi.model.AMapServiceAreaInfo;
-import com.amap.api.navi.model.AimLessModeCongestionInfo;
-import com.amap.api.navi.model.AimLessModeStat;
-import com.amap.api.navi.model.NaviInfo;
-import com.amap.api.navi.model.NaviLatLng;
-import com.autonavi.tbt.TrafficFacilityInfo;
-import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
-import com.mogo.eagle.core.utilcode.util.NetworkUtils;
-import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
-import com.mogo.och.taxi.passenger.utils.PermissionUtil;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * @author: wangmingjun
- * @date: 2021/12/6
- */
-public class NaviToDestinationModel implements AMapNaviListener {
- private static Context mContext;
- private AMapNavi mAMapNavi = null;
- protected final List sList = new ArrayList();
- protected final List eList = new ArrayList();
- protected List mWayPointList = new ArrayList();
- private IOCHTaxiNaviChangedCallback mNaviChangedCallback;
- private AtomicInteger errorCount = new AtomicInteger(0);
- private boolean isPlay;
- public static NaviToDestinationModel getInstance(Context context) {
- mContext = context;
- return SingletonHolder.INSTANCE;
- }
-
- private static final class SingletonHolder {
- private static final NaviToDestinationModel INSTANCE = new NaviToDestinationModel();
- }
- private NaviToDestinationModel(){
- }
- public void initAMapNavi(NaviLatLng startLatLng,NaviLatLng endLatLng) {
- try {
- mAMapNavi = AMapNavi.getInstance(mContext);
- mAMapNavi.addAMapNaviListener(this);
- mAMapNavi.setUseInnerVoice(true, true);
- sList.add(startLatLng);
- eList.add(endLatLng);
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void setVoiceIsMute(boolean isPlay){
- if (mAMapNavi == null) return;
- this.isPlay = isPlay;
- if (isPlay){
- mAMapNavi.startSpeak();
- }else {
- mAMapNavi.stopSpeak();
- }
- }
-
- public AMapNavi getmAMapNavi() {
- return mAMapNavi;
- }
-
- public void destroyAmaNavi(){
- if (mAMapNavi != null){
- isPlay = false;
- mAMapNavi.stopNavi();
- mAMapNavi.destroy();
- mAMapNavi = null;
- mNaviChangedCallback = null;
- }
- }
-
- public void setOCHTaciNaviChangedCallback(IOCHTaxiNaviChangedCallback callback){
- this.mNaviChangedCallback = callback;
- }
- @Override
- public void onInitNaviFailure() {
- Toast.makeText(mContext, "init navi Failed", Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void onInitNaviSuccess() {
- //初始化成功
- /**
- * 方法: int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 参数:
- *
- * @congestion 躲避拥堵
- * @avoidhightspeed 不走高速
- * @cost 避免收费
- * @hightspeed 高速优先
- * @multipleroute 多路径
- *
- * 说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。
- * 注意: 不走高速与高速优先不能同时为true 高速优先与避免收费不能同时为true
- */
- int strategy = 0;
- try {
- //再次强调,最后一个参数为true时代表多路径,否则代表单路径
- strategy = mAMapNavi.strategyConvert(true, false, false, false, false);
- } catch (Exception e) {
- e.printStackTrace();
- }
- mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);
- }
- @Override
- public void onCalculateRouteSuccess(int[] ints) {
- //多路径算路成功回调
- mAMapNavi.startNavi(NaviType.GPS);
- }
-
- @Override
- public void onNaviInfoUpdate(NaviInfo naviinfo) {
- //导航过程中的信息更新,请看NaviInfo的具体说明
- if (null != mNaviChangedCallback){
- mNaviChangedCallback.onCurrentNaviDistAndTimeChanged(naviinfo.getPathRetainDistance(),naviinfo.getPathRetainTime());// 米、秒
- }
- }
-
- @Override
- public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
- errorCount.set(0);
- }
-
- @Override
- public void onCalculateRouteFailure(AMapCalcRouteResult result) {
- //路线计算失败
- //多路径算路成功回调
- if (errorCount.get() < 5){
- errorCount.getAndIncrement();
- if (mNaviChangedCallback != null){
- mNaviChangedCallback.reInitNaviAmap(isPlay,true);
- }
- }
- if (!NetworkUtils.isConnected(mContext) || result.getErrorCode() == 2){
- TipToast.longTip("网络异常,请重试");
- if (mNaviChangedCallback != null){
- mNaviChangedCallback.reInitNaviAmap(isPlay,false);
- }
- return;
- }
- if (!PermissionUtil.isLocServiceEnable(mContext) || !PermissionUtil.checkPermission(mContext,new String[]{Manifest.permission.ACCESS_FINE_LOCATION})){
- TipToast.longTip("请开启车机定位后重试");
- if (mNaviChangedCallback != null){
- mNaviChangedCallback.reInitNaviAmap(isPlay,false);
- }
- return;
- }
-// if (result.getErrorCode() == 3){
-// TipToast.longTip("车辆当前坐标错误");
-// }else if (result.getErrorCode() == 6){
-// TipToast.longTip("终点坐标错误");
-// }
- Log.i("dm", "路线计算失败:错误码=" + result.getErrorCode() + ",Error Message= " + result.getErrorDetail());
- Log.i("dm", "错误码详细链接见:http://lbs.amap.com/api/android-navi-sdk/guide/tools/errorcode/");
- }
- @Override
- public void onStartNavi(int type) {
- //开始导航回调
- }
-
- @Override
- public void onTrafficStatusUpdate() {
- //
- }
-
- @Override
- public void onLocationChange(AMapNaviLocation location) {
- //当前位置回调
- }
-
- @Override
- public void onGetNavigationText(int type, String text) {
- //播报类型和播报文字回调
- }
-
- @Override
- public void onGetNavigationText(String s) {
-
- }
-
- @Override
- public void onEndEmulatorNavi() {
- //结束模拟导航
- }
-
- @Override
- public void onArriveDestination() {
- //到达目的地
- }
-
- @Override
- public void onCalculateRouteFailure(int errorInfo) {
-
- }
-
- @Override
- public void onReCalculateRouteForYaw() {
- //偏航后重新计算路线回调
- }
-
- @Override
- public void onReCalculateRouteForTrafficJam() {
- //拥堵后重新计算路线回调
- }
-
- @Override
- public void onArrivedWayPoint(int wayID) {
- //到达途径点
- }
-
- @Override
- public void onGpsOpenStatus(boolean enabled) {
- //GPS开关状态回调
- }
- @Override
- public void showModeCross(AMapModelCross aMapModelCross) {
- }
-
- @Override
- public void hideModeCross() {
-
- }
-
- @Override
- public void updateIntervalCameraInfo(AMapNaviCameraInfo aMapNaviCameraInfo, AMapNaviCameraInfo aMapNaviCameraInfo1, int i) {
-
- }
-
- @Override
- public void showLaneInfo(AMapLaneInfo aMapLaneInfo) {
- //显示车道信息
-// StringBuffer sb = new StringBuffer();
-// sb.append("共" + aMapLaneInfo.frontLane.length + "车道");
-// for (int i = 0; i < aMapLaneInfo.frontLane.length; i++) {
-// //当前车道可以选择的动作
-// int background = aMapLaneInfo.backgroundLane[i];
-// //当前用户要执行的动作
-// int recommend = aMapLaneInfo.frontLane[i];
-//
-// Log.e("ggb", "---->>> background is " + background + " ; recommend is " + recommend);
-// //根据文档中每个动作对应的枚举类型,显示对应的图片
-// try {
-// sb.append(",第" + (i + 1) + "车道为" + array[background]);
-// if (recommend != 255) {
-// sb.append(",当前车道可 " + actions[recommend]);
-// }
-//
-// } catch (Exception e) {
-// e.printStackTrace();
-// }
-// }
-// Log.e("showLaneInfo", sb.toString());
- }
-
- @Override
- public void onNaviRouteNotify(AMapNaviRouteNotifyData aMapNaviRouteNotifyData) {
-
- }
-
- @Override
- public void updateCameraInfo(AMapNaviCameraInfo[] aMapCameraInfos) {
-
- }
-
- @Override
- public void onServiceAreaUpdate(AMapServiceAreaInfo[] amapServiceAreaInfos) {
-
- }
-
- @Override
- public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {
-
- }
-
- @Override
- public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {
- //已过时
- }
-
- @Override
- public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {
-
- }
-
- @Override
- public void showCross(AMapNaviCross aMapNaviCross) {
- //显示放大图回调
- }
-
- @Override
- public void hideCross() {
- //隐藏放大图回调
- }
-
- @Override
- public void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) {
- //过时
- }
-
- @Override
- public void hideLaneInfo() {
- //隐藏车道信息
- }
-
- @Override
- public void notifyParallelRoad(int i) {
- }
-
- @Override
- public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {
- //更新交通设施信息
- }
-
- @Override
- public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {
- //更新巡航模式的统计信息
- }
-
-
- @Override
- public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {
- //更新巡航模式的拥堵信息
- }
-
- @Override
- public void onPlayRing(int i) {
-
- }
-
- /**
- * 车道信息说明:
- *
- * 0xFF, 无对应车道
- * 0, 直行
- * 1, 左转
- * 2, 直行+左转
- * 3, 右转
- * 4, 直行+右转
- * 5, 左掉头
- * 6, 左转+右转
- * 7, 直行+左转+右转
- * 8, 右掉头
- * 9, 直行+左掉头
- * 10, 直行+右掉头
- * 11, 左转+左掉头
- * 12, 右转+右掉头
- * 13, 直行+扩展
- * 14, 左转+左掉头+扩展
- * 15, 保留
- * 16, 直行+左转+左掉头
- * 17, 右转+左掉头
- * 18, 左转+右转+左掉头
- * 19, 直行+右转+左掉头
- * 20, 左转+右掉头
- * 21, 公交车道
- * 22, 空车道
- * 23 可变车道
- */
-
- String[] array = {
- "直行车道"
- , "左转车道"
- , "左转或直行车道"
- , "右转车道"
- , "右转或直行车道"
- , "左掉头车道"
- , "左转或者右转车道"
- , " 左转或右转或直行车道"
- , "右转掉头车道"
- , "直行或左转掉头车道"
- , "直行或右转掉头车道"
- , "左转或左掉头车道"
- , "右转或右掉头车道"
- , "直行并且车道扩展"
- , "左转+左掉头+扩展"
- , "不可以选择该车道"
- , "直行+左转+左掉头车道"
- , "右转+左掉头"
- , "左转+右转+左掉头"
- , "直行+右转+左掉头"
- , "左转+右掉头"
- , "公交车道"
- , "空车道"
- , "可变车道"
- };
-
- String[] actions = {
- "直行"
- , "左转"
- , "左转或直行"
- , "右转"
- , "右转或这行"
- , "左掉头"
- , "左转或者右转"
- , " 左转或右转或直行"
- , "右转掉头"
- , "直行或左转掉头"
- , "直行或右转掉头"
- , "左转或左掉头"
- , "右转或右掉头"
- , "直行并且车道扩展"
- , "左转+左掉头+扩展"
- , "不可以选择"
- , "直行+左转+左掉头"
- , "右转+左掉头"
- , "左转+右转+左掉头"
- , "直行+右转+左掉头"
- , "左转+右掉头"
- , "公交车道"
- , "空车道"
- , "可变车道"
- };
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/OCHTaxiModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/OCHTaxiModelLoopManager.java
deleted file mode 100644
index a58fc4b411..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/OCHTaxiModelLoopManager.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.mogo.och.taxi.passenger.model;
-
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
-
-import java.util.concurrent.TimeUnit;
-
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * Created on 2021/9/10
- *
- * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
- */
-public class OCHTaxiModelLoopManager {
-
- private static final String TAG = OCHTaxiModelLoopManager.class.getSimpleName();
-
- private static final class SingletonHolder {
- private static final OCHTaxiModelLoopManager INSTANCE = new OCHTaxiModelLoopManager();
- }
-
- public static OCHTaxiModelLoopManager getInstance() {
- return SingletonHolder.INSTANCE;
- }
-
- private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
- private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询
- private Disposable mGrabResultDisposable; //抢单结果轮询
- private Disposable mHeartbeatDisposable; //心跳轮询
-
- public void startInAndWaitOrdersLoop() {
- if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
- return;
- }
- Logger.i(TAG, "startInAndWaitOrdersLoop()");
- mInAndWaitServiceDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
- OCHTaxiConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryInAndWaitOrders());
- }
-
- public void stopInAndWaitOrdersLoop() {
- if (mInAndWaitServiceDisposable != null) {
- Logger.i(TAG, "stopInAndWaitOrdersLoop()");
- mInAndWaitServiceDisposable.dispose();
- mInAndWaitServiceDisposable = null;
- }
- }
-
- public void startNewBookingOrderLoop() {
- if (mNewBookingOrderDisposable != null && !mNewBookingOrderDisposable.isDisposed()) {
- return;
- }
- Logger.i(TAG, "startNewBookingOrderLoop()");
- mNewBookingOrderDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
- OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryNewBookingOrder());
- }
-
- public void stopNewBookingOrderLoop() {
- if (mNewBookingOrderDisposable != null) {
- Logger.i(TAG, "stopNewBookingOrderLoop()");
- mNewBookingOrderDisposable.dispose();
- mNewBookingOrderDisposable = null;
- }
- }
-
- public void startGrabResultLoop() {
- if (mGrabResultDisposable != null && !mGrabResultDisposable.isDisposed()) {
- return;
- }
- Logger.i(TAG, "startGrabResultLoop()");
- mGrabResultDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
- OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryOrderGrabStatus());
- }
-
- public void stopGrabResultLoop() {
- if (mGrabResultDisposable != null) {
- Logger.i(TAG, "stopGrabResultLoop()");
- mGrabResultDisposable.dispose();
- mGrabResultDisposable = null;
- }
- }
-
- public void startHeartbeatLoop() {
- if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
- return;
- }
- Logger.i(TAG, "startHeartbeatLoop()");
- mHeartbeatDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
- OCHTaxiConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
- .map((aLong -> aLong + 1))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().runCarHeartbeat());
- }
-
- public void stopHeartbeatLoop() {
- if (mHeartbeatDisposable != null) {
- Logger.i(TAG, "stopHeartbeatLoop()");
- mHeartbeatDisposable.dispose();
- mHeartbeatDisposable = null;
- }
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java
new file mode 100644
index 0000000000..1543ad8da0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java
@@ -0,0 +1,120 @@
+package com.mogo.och.taxi.passenger.model;
+
+import android.content.Context;
+
+import com.amap.api.services.core.LatLonPoint;
+import com.amap.api.services.geocoder.GeocodeResult;
+import com.amap.api.services.geocoder.GeocodeSearch;
+import com.amap.api.services.geocoder.RegeocodeQuery;
+import com.amap.api.services.geocoder.RegeocodeResult;
+import com.amap.api.services.geocoder.RegeocodeRoad;
+import com.mogo.eagle.core.network.utils.GsonUtil;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback;
+
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/6
+ */
+public class TaxiPassengerGeocodeSearchModel implements GeocodeSearch.OnGeocodeSearchListener {
+
+ private final String TAG = TaxiPassengerGeocodeSearchModel.class.getSimpleName();
+
+ private static Context mContext;
+
+ private IOCHTaxiPassengerNaviChangedCallback mNaviChangedCallback;
+
+ GeocodeSearch mGeocodeSearch = null;
+
+ private String roadName = "";
+
+ private Timer timer ;
+
+ TimerTask timerTask;
+
+ public static TaxiPassengerGeocodeSearchModel getInstance(Context context) {
+ mContext = context;
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static final class SingletonHolder {
+ private static final TaxiPassengerGeocodeSearchModel INSTANCE = new TaxiPassengerGeocodeSearchModel();
+ }
+
+ private TaxiPassengerGeocodeSearchModel(){
+ }
+
+ public void initGeocodeSearch(){
+ //通过经纬度逆地理编码得到位置
+ mGeocodeSearch = new GeocodeSearch(mContext);
+ mGeocodeSearch.setOnGeocodeSearchListener(this);
+ timer = new Timer();
+ timerTask = new TimerTask() {
+ @Override
+ public void run() {
+ if (mNaviChangedCallback != null){
+ CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "roadName道路名称: " + roadName);
+ mNaviChangedCallback.onCurrentRoadName(roadName);
+ }
+ }
+ };
+ try{
+ timer.schedule(timerTask,500,2000);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+ public void searchLocationInfo(double lat, double lon){
+ if (null != mGeocodeSearch){
+ LatLonPoint latLng = new LatLonPoint(lat, lon);
+ //第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
+ RegeocodeQuery query = new RegeocodeQuery(latLng, 200, GeocodeSearch.AMAP);
+ mGeocodeSearch.getFromLocationAsyn(query);
+ }
+ }
+
+ public void destroyGeocodeSearch(){
+ CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "destroyGeocodeSearch");
+ if (mGeocodeSearch != null){
+ mGeocodeSearch = null;
+ }
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback = null;
+ }
+ if (null != timer){
+ timer.cancel();
+ }
+ if (null != timerTask){
+ timerTask = null;
+ }
+ roadName = "";
+ }
+
+ public void setOCHTaciNaviChangedCallback(IOCHTaxiPassengerNaviChangedCallback callback){
+ this.mNaviChangedCallback = callback;
+ }
+
+ @Override
+ public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {//更新频率几十 ms, 暂定更新UI为2s一次
+ if (regeocodeResult != null) {
+ List roads = regeocodeResult.getRegeocodeAddress().getRoads();
+ CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "位置roads:" + GsonUtil.jsonFromObject(roads));
+ if (roads != null && roads.size() > 0){
+ roadName = roads.get(0).getName();//当前路的名字
+// mNaviChangedCallback.onCurrentRoadName(roads.get(0).getName());
+ }
+ }
+ }
+
+ @Override
+ public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
+
+ }
+}
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
new file mode 100644
index 0000000000..cdcaf0cd1f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java
@@ -0,0 +1,687 @@
+package com.mogo.och.taxi.passenger.model;
+
+import android.content.Context;
+import android.content.Intent;
+import android.location.Location;
+import android.net.ConnectivityManager;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+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.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.api.v2x.LimitingVelocityListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
+import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
+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.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.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;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback;
+import com.mogo.och.taxi.passenger.callback.ITaxiPassengerVeloctityCallback;
+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.aicloud.services.socket.IMogoLifecycleListener;
+import com.mogo.och.taxi.passenger.utils.TPCoordinateCalculateRouteUtil;
+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.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;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车 - 出租车业务逻辑处理
+ */
+public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback {
+
+ private static final String TAG = TaxiPassengerModel.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final TaxiPassengerModel INSTANCE = new TaxiPassengerModel();
+ }
+
+ public static TaxiPassengerModel getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Context mContext;
+ private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值
+ private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentOCHOrder; //当前订单
+ private volatile List mInServiceList = Collections.emptyList(); //进行中订单
+ private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单
+
+ private IOCHTaxiPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关
+ private IOCHTaxiPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划
+
+ private Map mOrderStatusCallbackMap = new ConcurrentHashMap<>();
+ private Map mControllerStatusCallbackMap = new ConcurrentHashMap<>();
+
+ private ITaxiPassengerVeloctityCallback mVeloctityCallback;//道路限速返回
+
+ private double mLongitude, mLatitude;
+
+ private TaxiPassengerModel() {
+ }
+
+ public void setMoGoAutopilotPlanningListener(IOCHTaxiPassengerAutopilotPlanningCallback
+ moGoAutopilotPlanningCallback) {
+ this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
+ }
+
+ public void setADASStatusCallback(IOCHTaxiPassengerADASStatusCallback callback) {
+ this.mADASStatusCallback = callback;
+ }
+
+ public void setControllerStatusCallback(String tag,IOCHTaxiPassengerControllerStatusCallback callback) {
+ if (tag == null || "".equals(tag)) return;
+
+ if (callback == null) {
+ mControllerStatusCallbackMap.remove(tag);
+ return;
+ }
+
+ mControllerStatusCallbackMap.put(tag,callback);
+
+ }
+
+ public void setOrderStatusCallback(String tag ,IOCHTaxiPassengerOrderStatusCallback callback) {
+ if (tag == null || "".equals(tag)) return;
+
+ if (callback == null) {
+ mOrderStatusCallbackMap.remove(tag);
+ return;
+ }
+
+ mOrderStatusCallbackMap.put(tag,callback);
+ }
+
+ public void setVeloctityCallback(ITaxiPassengerVeloctityCallback callback){
+ this.mVeloctityCallback = callback;
+ }
+
+ public void init( Context context ) {
+ mContext = context.getApplicationContext();
+ initListeners();
+
+ // 调用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();
+ }
+
+ /**
+ * 订单轮询
+ */
+ public void startOrStopOrderLoop(){
+ if (NetworkUtils.isConnected(mContext)) {
+ startOrStopOrderLoop(true);
+ }
+ }
+
+ public void release() {
+ startOrStopOrderLoop(false);
+ startOrStopQueryOrderRemaining(false);
+ releaseListeners();
+ }
+
+ 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);
+
+ //增加限速监听
+ CallLimitingVelocityListenerManager.INSTANCE.addListener(TAG,limitingVelocityListener);
+ }
+
+ 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);
+ CallLimitingVelocityListenerManager.INSTANCE.removeListener(limitingVelocityListener);
+ }
+
+ private void startOrStopOrderLoop(boolean start) {
+ CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ TaxiPassengerModelLoopManager.getInstance().startInAndWaitOrdersLoop();
+ } else {
+ TaxiPassengerModelLoopManager.getInstance().stopInAndWaitOrdersLoop();
+ }
+ }
+
+ /**
+ * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等)
+ *
+ * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时,
+ * 才更新最新进行中单到本地
+ */
+ public void queryInAndWaitOrders() {
+ TaxiPassengerServiceManager.getInstance().queryOrdersInAndWaitService(mContext,
+ new TaxiPassengerServiceCallback() {
+ @Override
+ public void onSuccess(TaxiPassengerOrdersInServiceQueryRespBean data) {
+ if (data == null || data.data == null) {
+ return;
+ }
+
+ //1. 处理进行中订单
+ mInServiceList = data.data.servicing;
+ if (data.data.servicing != null && !data.data.servicing.isEmpty()) {
+ // 1.1. 当存在进行中单时:对本地currentOrder进行更新
+ if (mCurrentOCHOrder == null) {
+ //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallbackMap.size() > 0) {
+ for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){
+ callback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ } else {
+ //1.1.2. 当本地有currentOrder:
+ //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新
+ //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新
+ if (!mCurrentOCHOrder.orderNo.equals(data.data.servicing.get(0).orderNo)) {
+ queryCurOrderStatus();
+// } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
+ } else { //todo 订单拦截放到各自实现去做
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallbackMap.size() > 0) {
+ for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){
+ callback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+ }
+ } else {
+ // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更
+ if (mCurrentOCHOrder != null) {
+ queryCurOrderStatus();
+ }
+ recoverNaviInfo();
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
+ private void queryCurOrderStatus() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final String orderNo = mCurrentOCHOrder.orderNo;
+ TaxiPassengerServiceManager.getInstance().queryOrderById(mContext, orderNo,
+ new TaxiPassengerServiceCallback() {
+ @Override
+ public void onSuccess(TaxiPassengerOrderQueryRespBean data) {
+ if (data != null && data.data != null
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(data.data.orderNo)) {
+ if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.getCode()
+ || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode()
+ || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.getCode()) {
+ if (mOrderStatusCallbackMap.size() > 0) {
+ for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){
+ callback.onCurrentOrderStatusChanged(data.data);
+ }
+ }
+ clearCurrentOCHOrder();
+ } else {
+ updateNativeCurrentOrder(data.data);
+ if (mOrderStatusCallbackMap.size() > 0) {
+ for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){
+ callback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 获取当前订单
+ public TaxiPassengerOrderQueryRespBean.Result getCurrentOCHOrder() {
+ return mCurrentOCHOrder;
+ }
+
+ // 获取当前订单状态
+ public TaxiPassengerOrderStatusEnum getCurOrderStatus() {
+ TaxiPassengerOrderQueryRespBean.Result order = TaxiPassengerModel.getInstance().getCurrentOCHOrder();
+ if (order == null) {
+ return TaxiPassengerOrderStatusEnum.None;
+ }
+ return TaxiPassengerOrderStatusEnum.valueOf(order.orderStatus);
+ }
+
+ //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据
+ private void updateNativeCurrentOrder(TaxiPassengerOrderQueryRespBean.Result data) {
+ if (data == null) {
+ return;
+ }
+ mCurrentOCHOrder = data;
+ SharedPrefsMgr.getInstance(mContext).putString(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER,
+ GsonUtil.jsonFromObject(data));
+ }
+
+ //清除订单信息
+ public void clearCurrentOCHOrder() {
+ mCurrentOCHOrder = null;
+ SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER);
+ }
+
+ //检测当前订单
+ public boolean checkCurrentOCHOrder() {
+ if ( mCurrentOCHOrder != null
+ && mCurrentOCHOrder.startSiteGcjPoint != null
+ && mCurrentOCHOrder.endSiteGcjPoint != null) {
+ return true;
+ }
+ return false;
+ }
+
+ // TODO: 2021/9/12
+ public void calculateTravelDistance(Location carLocation){
+ if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) {
+ double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
+ double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ endLon, endLat,
+ carLocation.getLongitude(), carLocation.getLatitude());
+ mCurrentOCHOrder.decreaseTravelDistance(distance);
+ }
+ }
+
+ /**
+ * 计算订单起终距离
+ * @return
+ */
+ public int calculateOrderDistanceSum(){
+ double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
+ double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
+ double startLon = mCurrentOCHOrder.startSiteGcjPoint.get(0);
+ double startLat = mCurrentOCHOrder.startSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ endLon, endLat,
+ startLon, startLat);
+ return new Double(distance).intValue();
+ }
+
+ //监听网络变化,避免启动机器时无网导致无法更新订单信息
+ private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() {
+ @Override
+ public void onIntentReceived( String intentStr, Intent intent ) {
+ CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "onIntentReceived = %s", intentStr );
+ if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) {
+ if ( NetworkUtils.isConnected( mContext ) ) {
+ if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
+ startOrStopOrderLoop(true);
+ }
+ }
+ }
+ }
+ };
+
+ 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 (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){
+ callback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ }
+ };
+
+ private final IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() {
+ @Override
+ public void onConnectFailure() { CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"socket onConnectFailure"); }
+
+ @Override
+ public void onConnectSuccess() { CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"socket onConnectSuccess"); }
+
+ @Override
+ public void onConnectLost() { CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"socket onConnectLost"); }
+ };
+
+ // 自车定位
+ private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
+
+ @Override
+ public void onCarLocationChanged2( Location location ) {
+ //位置变化时,通过围栏判断是否到达x点
+ if (location != null && checkCurrentOCHOrder()) {
+ if (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.OnTheWayToEnd) {
+ calculateTravelDistance(location);
+ }
+ }
+ mLongitude = location.getLongitude();
+ mLatitude = location.getLatitude();
+ CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude);
+ for (IOCHTaxiPassengerControllerStatusCallback 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_TAXI_P + TAG, "state = %s", state );
+ if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
+ if (mCurrentOCHOrder != null
+ && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtStart
+ && state != mPrevAPStatus) {
+ // 当高频返回autopilot 2时,不重复调用订单状态变更
+ mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态
+// updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ }
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
+ mPrevAPStatus = state;
+
+ if (FunctionBuildConfig.isDemoMode
+ && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
+ // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
+ if (!arriveAtEnd) {
+ return;
+ } else {
+ arriveAtEnd = false;
+ }
+ }
+
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable();
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
+ mPrevAPStatus = state;
+
+ if (FunctionBuildConfig.isDemoMode
+ && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
+ // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
+ if (!arriveAtEnd) {
+ return;
+ } else {
+ arriveAtEnd = false;
+ }
+ }
+
+ 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;
+ }
+
+ if (arrivalNotification == null || !checkCurrentOCHOrder()
+ || (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtEnd)) {
+ return;
+ }
+ if (DebugConfig.isDebug()) {
+ // TipToast.shortTip("到达目的地");
+ }
+ }
+
+ };
+
+ private final IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){
+
+ @Override
+ public void onAutopilotTrajectory(@NonNull List trajectoryInfos) {
+
+ }
+
+ @Override
+ public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) {
+ if (null != routeList && routeList.getWayPointsList().size() > 0){
+ calculateRouteLineSum(TPCoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,routeList.getWayPointsList()));
+ updateRouteResult(routeList.getWayPointsList());
+ }
+ }
+
+ };
+
+ /**
+ * 限速监听
+ */
+ private final LimitingVelocityListener limitingVelocityListener = new LimitingVelocityListener(){
+
+ @Override
+ public void onLimitingVelocityChange(int limitingVelocity) {
+ if (mVeloctityCallback != null){
+ mVeloctityCallback.onLimitingVelocityChange(limitingVelocity);
+ }
+ }
+ };
+
+ public void updateRouteResult(List models){
+ if (mAutopilotPlanningCallback != null){
+ mAutopilotPlanningCallback.routeResult(models);
+ }
+ }
+ /**
+ * 导航订单起点到终点 获得剩余时间,里程,预计到达时间
+ */
+ public void initGeocodeSearch() {
+ if (mCurrentOCHOrder != null){
+ TaxiPassengerGeocodeSearchModel.getInstance(mContext).initGeocodeSearch();
+ TaxiPassengerGeocodeSearchModel.getInstance(mContext).setOCHTaciNaviChangedCallback(this);
+ }
+ }
+
+ public void destoryGeocodeSearch(){
+ TaxiPassengerGeocodeSearchModel.getInstance(mContext).destroyGeocodeSearch();
+ }
+
+ 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.onCurrentRoadName(currentRoadName);
+ }
+ }
+
+ /**
+ * 订单结束或者取消的时候, 刷新导航标识位以及缓存的数据
+ */
+ public void recoverNaviInfo(){
+ SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS);
+ }
+
+ 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;
+ }
+ if (Looper.myLooper() != Looper.getMainLooper()) {
+ UiThreadHandler.post(executor);
+ } else {
+ executor.run();
+ }
+ }
+
+}
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
new file mode 100644
index 0000000000..eacf0496b3
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java
@@ -0,0 +1,77 @@
+package com.mogo.och.taxi.passenger.model;
+
+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.passenger.constant.TaxiPassengerConst;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created on 2021/9/10
+ *
+ * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
+ */
+public class TaxiPassengerModelLoopManager {
+
+ private static final String TAG = TaxiPassengerModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final TaxiPassengerModelLoopManager INSTANCE = new TaxiPassengerModelLoopManager();
+ }
+
+ public static TaxiPassengerModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
+ private Disposable mQueryOrderRemainingDisposable; //心跳轮询
+
+ public void startInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
+ TaxiPassengerConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> TaxiPassengerModel.getInstance().queryInAndWaitOrders());
+ }
+
+ public void stopInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null) {
+ CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable.dispose();
+ mInAndWaitServiceDisposable = null;
+ }
+ }
+
+
+ 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 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/network/OCHTaxiServiceApiNew.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceApiNew.java
deleted file mode 100644
index 90b5213cbd..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceApiNew.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package com.mogo.och.taxi.passenger.network;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.och.taxi.passenger.bean.CarHeartbeatReqBean;
-import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
-import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.DriverStatusUpdateReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderCancelReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderStatusUpdateReqBean;
-import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersListQueryReqBean;
-import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
-
-import io.reactivex.Observable;
-import retrofit2.http.Body;
-import retrofit2.http.GET;
-import retrofit2.http.Headers;
-import retrofit2.http.POST;
-import retrofit2.http.Query;
-
-/**
- * Created by pangfan on 2021/8/19
- *
- * 网约车-出租车接口定义
- */
-interface OCHTaxiServiceApiNew {
-
- /**
- * 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
- * @param sn
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
- Observable queryOrdersInAndWaitService(@Query("sn") String sn);
-
- /**
- * 查询新到的预约单
- * @param sn
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
- Observable queryNewBookingOrder(@Query("sn") String sn);
-
- /**
- * (预约单)执行抢单动作
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
- Observable grabOrder(@Body OrderGrabReqBean data);
-
- /**
- * (预约单)查询抢单结果
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
- Observable queryOrderGrabStatus(@Body OrderGrabReqBean data);
-
- /**
- * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
- Observable queryOrderRouteInfo(@Body OrderQueryRouteInfoReqBean data);
-
- /**
- * 通过orderId查询订单信息(用于本地已经有orderId时)
- * @param data
- * @return
- * @deprecated v2.1_0930需求中暂不再使用此接口
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
- Observable queryOrderById(@Body OrderQueryReqBean data);
-
- /**
- * 查询服务中订单信息(用于本地无orderId时)
- * 如果有多条,只会返回时间最近的一条
- * @param sn
- * @return
- * @deprecated v2.1_0930需求中暂不再使用此接口
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
- Observable queryOrderInService(@Query("sn") String sn);
-
- /**
- * 取消订单
- */
- @Headers({"Content-type:application/json;charset=UTF-8"})
- @POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
- Observable cancelOrder(@Body OrderCancelReqBean data);
-
- /**
- * 订单列表获取
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
- Observable queryOrdersList(@Body OrdersListQueryReqBean data);
-
- /**
- * 订单状态更新
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
- Observable updateOrderStatus(@Body OrderStatusUpdateReqBean data);
-
- /**
- * 收车/出车状态更新
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
- Observable updateDriverServiceStatus(@Body DriverStatusUpdateReqBean data);
-
- /**
- * 收车/出车状态查询
- * @param sn
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
- Observable queryDriverServiceStatus(@Query("sn") String sn);
-
- /**
- * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
- * @param data
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
- Observable runCarHeartbeat(@Body CarHeartbeatReqBean data);
-
- /**
- * 查询司机服务数据
- * @param sn
- * @return
- */
- @Headers( {"Content-type:application/json;charset=UTF-8"} )
- @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
- Observable queryServiceData(@Query("sn") String sn);
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceCallback.java
deleted file mode 100644
index 7eb540694a..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceCallback.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.mogo.och.taxi.passenger.network;
-
-/**
- * @author congtaowang
- * @since 2021/1/15
- *
- * 修改订单状态回调接口
- */
-public interface OCHTaxiServiceCallback< T > {
-
- void onSuccess(T data);
-
- void onFail(int code, String msg);
-
- default void onError() {
-
- }
-}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceManagerNew.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceManagerNew.java
deleted file mode 100644
index 6f14a0afdc..0000000000
--- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceManagerNew.java
+++ /dev/null
@@ -1,352 +0,0 @@
-package com.mogo.och.taxi.passenger.network;
-
-import android.content.Context;
-
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.eagle.core.data.BaseData;
-import com.mogo.eagle.core.network.RequestOptions;
-import com.mogo.eagle.core.network.SubscribeImpl;
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
-import com.mogo.module.common.MogoApisHandler;
-import com.mogo.och.taxi.passenger.bean.CarHeartbeatReqBean;
-import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
-import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.DriverStatusUpdateReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderCancelReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoReqBean;
-import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
-import com.mogo.och.taxi.passenger.bean.OrderStatusUpdateReqBean;
-import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersListQueryReqBean;
-import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
-import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
-import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
-
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * Created by pangfan on 2021/8/19
- */
-public class OCHTaxiServiceManagerNew {
- private static final String TAG = OCHTaxiServiceManagerNew.class.getSimpleName();
-
- private static final class SingletonHolder {
- private static final OCHTaxiServiceManagerNew INSTANCE = new OCHTaxiServiceManagerNew();
- }
-
- public static OCHTaxiServiceManagerNew getInstance() {
- return SingletonHolder.INSTANCE;
- }
-
- private String baseUrl = OCHTaxiConst.getBaseUrl();
- private OCHTaxiServiceApiNew mOCHTaxiServiceApi;
-
- private OCHTaxiServiceManagerNew() {
- if (mOCHTaxiServiceApi == null){
- mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(OCHTaxiServiceApiNew.class, baseUrl);
- }
- }
-
- /**
- * 查询全部服务中/待服务订单列表
- * @param context
- * @param callback
- */
- public void queryOrdersInAndWaitService(Context context,
- OCHTaxiServiceCallback callback) {
- if (mOCHTaxiServiceApi == null) {
- mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(OCHTaxiServiceApiNew.class, baseUrl);
- }
- mOCHTaxiServiceApi.queryOrdersInAndWaitService(MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService"));
- }
-
- /**
- * 查询新到的预约单
- * @param context
- * @param callback
- */
- public void queryNewBookingOrder(Context context,
- OCHTaxiServiceCallback callback) {
- if (mOCHTaxiServiceApi == null) {
- mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(OCHTaxiServiceApiNew.class, baseUrl);
- }
- mOCHTaxiServiceApi.queryNewBookingOrder(MoGoAiCloudClientConfig.getInstance().getSn())
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "queryNewBookingOrder"));
- }
-
- /**
- * (预约单)执行抢单动作
- * @param context
- * @param orderId
- * @param callback
- */
- public void grabOrder(Context context, long orderId,
- OCHTaxiServiceCallback callback) {
- if ( mOCHTaxiServiceApi == null ) {
- mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(OCHTaxiServiceApiNew.class, baseUrl);
- }
- mOCHTaxiServiceApi.grabOrder(new OrderGrabReqBean(
- MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "grabOrder"));
- }
-
- /**
- * (预约单)查询抢单结果
- * @param context
- * @param orderId
- * @param callback
- */
- public void queryOrderGrabStatus(Context context, long orderId,
- OCHTaxiServiceCallback callback) {
- if ( mOCHTaxiServiceApi == null ) {
- mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(OCHTaxiServiceApiNew.class, baseUrl);
- }
- mOCHTaxiServiceApi.queryOrderGrabStatus(new OrderGrabReqBean(
- MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "queryOrderGrabStatus"));
- }
-
- /**
- * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
- * @param context
- * @param orderId
- * @param callback
- */
- public void queryOrderRouteInfo(Context context, long orderId,
- OCHTaxiServiceCallback callback) {
- if ( mOCHTaxiServiceApi == null ) {
- mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
- .create(OCHTaxiServiceApiNew.class, baseUrl);
- }
- mOCHTaxiServiceApi.queryOrderRouteInfo(new OrderQueryRouteInfoReqBean(
- MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(getSubscribeImpl(context, callback, "queryOrderRouteInfo"));
- }
-
- /**
- * 通过orderId查询订单信息(用于本地已经有orderId时)
- * @param context
- * @param orderId
- * @param callback
- * @deprecated v2.1_0930需求中暂不再使用此接口
- */
- public void queryOrderById(Context context, long orderId,
- OCHTaxiServiceCallback