diff --git a/OCH/mogo-och-bus-passenger/build.gradle b/OCH/mogo-och-bus-passenger/build.gradle index 6fad532472..4bc7c0fd4c 100644 --- a/OCH/mogo-och-bus-passenger/build.gradle +++ b/OCH/mogo-och-bus-passenger/build.gradle @@ -47,8 +47,8 @@ dependencies { implementation rootProject.ext.dependencies.kotlinstdlibjdk7 implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'com.google.android.material:material:1.2.1' + implementation rootProject.ext.dependencies.androidxrecyclerview + implementation rootProject.ext.dependencies.material annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.rxandroid implementation rootProject.ext.dependencies.androidxconstraintlayout 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 index 4c75d3d6b3..e021a8675b 100644 --- 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 @@ -49,10 +49,11 @@ public class BusPassengerTrafficLightView extends IViewTrafficLight { * 展示红绿灯预警 * * @param checkLightId 0-都是默认,1-红,2-黄,3-绿 + * @param lightSource 1:云端下发;2:自车感知 */ @Override - public void showWarningTrafficLight(int checkLightId) { - super.showWarningTrafficLight(checkLightId); + public void showWarningTrafficLight(int checkLightId,int lightSource) { + super.showWarningTrafficLight(checkLightId,lightSource); mCurrentLightId = checkLightId; updateTrafficLightIcon(checkLightId); } 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 index b2b722d02a..9d2f0e6657 100644 --- 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 @@ -16,12 +16,12 @@ public class BusRoutesResult { private int status; //线路轨迹相关字段 - public String csvFileUrl; //轨迹文件下载的cos url,默认“” - public String csvFileMd5; //轨迹文件md5,默认“” - public String txtFileUrl; //打点文件下载的cos url,默认“” - public String txtFileMd5; //轨迹文件md5,默认“” + public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“” + public String csvFileMd5 = ""; //轨迹文件md5,默认“” + public String txtFileUrl = ""; //打点文件下载的cos url,默认“” + public String txtFileMd5 = ""; //轨迹文件md5,默认“” public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 - public String carModel; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 + public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 public int getLineId() { return lineId; @@ -48,6 +48,12 @@ public class BusRoutesResult { ", lineType=" + lineType + ", description='" + description + '\'' + ", status=" + status + + ", csvFileUrl='" + csvFileUrl + '\'' + + ", csvFileMd5='" + csvFileMd5 + '\'' + + ", txtFileUrl='" + txtFileUrl + '\'' + + ", txtFileMd5='" + txtFileMd5 + '\'' + + ", contrailSaveTime=" + contrailSaveTime + + ", carModel='" + carModel + '\'' + '}'; } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java index 6f5eb5fea6..f82ab6af69 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/model/BusOrderModel.java @@ -15,6 +15,7 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import com.amap.api.maps.model.LatLng; +import com.elegant.network.utils.GsonUtil; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.voice.AIAssist; @@ -508,20 +509,27 @@ public class BusOrderModel { // == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { // ToastUtils.showShort("自动驾驶状态为不可用!"); // } - AutopilotControlParameters currentAutopilot = new AutopilotControlParameters(); - currentAutopilot.isSpeakVoice = !isRestart; - currentAutopilot.routeID = busRoutesResult.getLineId(); - currentAutopilot.routeName = busRoutesResult.getName(); - currentAutopilot.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()); - currentAutopilot.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName()); - currentAutopilot.startLatLon = new AutopilotControlParameters + AutopilotControlParameters parameters = new AutopilotControlParameters(); + parameters.isSpeakVoice = !isRestart; + parameters.routeID = busRoutesResult.getLineId(); + parameters.routeName = busRoutesResult.getName(); + parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()); + parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName()); + parameters.startLatLon = new AutopilotControlParameters .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() ); - currentAutopilot.endLatLon = new AutopilotControlParameters + parameters.endLatLon = new AutopilotControlParameters .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() ); - currentAutopilot.vehicleType = VEHICLE_TYPE; - CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + currentAutopilot.toString() + parameters.vehicleType = VEHICLE_TYPE; + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( + busRoutesResult.getLineId(), + busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, + busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, + busRoutesResult.contrailSaveTime, busRoutesResult.carModel); + } + CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName()); - CallerAutoPilotManager.INSTANCE.startAutoPilot(currentAutopilot); + CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); triggerStartServiceEvent(isRestart, false); 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 index 5b7b8603eb..f4c50754fb 100644 --- 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 @@ -148,8 +148,7 @@ public interface IBusApiService { Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); @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" ) + @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" ) Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body BusRoutePlanningUpdateReqBean data); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusTrafficLightView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusTrafficLightView.java index c8cee1dff0..4b25021821 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusTrafficLightView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/ui/BusTrafficLightView.java @@ -46,10 +46,11 @@ public class BusTrafficLightView extends IViewTrafficLight { * 展示红绿灯预警 * * @param checkLightId 0-都是默认,1-红,2-黄,3-绿 + * @param lightSource 1:云端下发;2:自车感知 */ @Override - public void showWarningTrafficLight(int checkLightId) { - super.showWarningTrafficLight(checkLightId); + public void showWarningTrafficLight(int checkLightId,int lightSource) { + super.showWarningTrafficLight(checkLightId,lightSource); mCurrentLightId = checkLightId; updateTrafficLightIcon(checkLightId); } diff --git a/OCH/mogo-och-common-module/build.gradle b/OCH/mogo-och-common-module/build.gradle index eae2f7ed3b..1f74335527 100644 --- a/OCH/mogo-och-common-module/build.gradle +++ b/OCH/mogo-och-common-module/build.gradle @@ -27,9 +27,9 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.1.0' - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'com.google.android.material:material:1.2.1' + implementation rootProject.ext.dependencies.androidxccorektx + implementation rootProject.ext.dependencies.androidxappcompat + implementation rootProject.ext.dependencies.material testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/BaseSurfaceView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/BaseSurfaceView.java new file mode 100644 index 0000000000..57186d98e9 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/BaseSurfaceView.java @@ -0,0 +1,174 @@ +package com.mogo.och.common.module.wigets.sfv; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.PixelFormat; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +import com.elegant.utils.UiThreadHandler; + +public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolder.Callback { + public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50; + + private HandlerThread handlerThread; + private SurfaceViewHandler handler; + protected int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND; + private Canvas canvas; + private boolean isAlive; + + public BaseSurfaceView(Context context) { + super(context); + init(); + } + + public BaseSurfaceView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public BaseSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + protected int getFrameDuration() { + return frameDuration; + } + + protected void setFrameDuration(int frameDuration) { + this.frameDuration = frameDuration; + } + + protected void init() { + getHolder().addCallback(this); + setBackgroundTransparent(); + } + + private void setBackgroundTransparent() { + getHolder().setFormat(PixelFormat.TRANSLUCENT); + setZOrderOnTop(true); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + isAlive = true; + startDrawThread(); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + stopDrawThread(); + isAlive = false; + } + + private void stopDrawThread() { + isAlive = false; + handlerThread.quit(); + handler = null; + } + + private void startDrawThread() { + handlerThread = new HandlerThread("SurfaceViewThread"); + handlerThread.start(); + handler = new SurfaceViewHandler(handlerThread.getLooper()); + handler.post(new DrawRunnable()); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int originWidth = getMeasuredWidth(); + int originHeight = getMeasuredHeight(); + int width = widthMode == MeasureSpec.AT_MOST ? getDefaultWidth() : originWidth; + int height = heightMode == MeasureSpec.AT_MOST ? getDefaultHeight() : originHeight; + setMeasuredDimension(width, height); + Log.v("ttaylor", "BaseSurfaceView.onMeasure()" + " default Width=" + getDefaultWidth() + " default height=" + getDefaultHeight()); + } + + /** + * the width is used when wrap_content is set to layout_width + * the child knows how big it should be + * + * @return + */ + protected abstract int getDefaultWidth(); + + /** + * the height is used when wrap_content is set to layout_height + * the child knows how big it should be + * + * @return + */ + protected abstract int getDefaultHeight(); + + + private class SurfaceViewHandler extends Handler { + + public SurfaceViewHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + } + } + + private class DrawRunnable implements Runnable { + + @Override + public void run() { + if (!isAlive) { + return; + } + try { + canvas = getHolder().lockCanvas(); + onFrameDraw(canvas); + } catch (Exception e) { + e.printStackTrace(); + } finally { + getHolder().unlockCanvasAndPost(canvas); + onFrameDrawFinish(); + } + + handler.postDelayed(this, frameDuration); + } + } + + /** + * it is will be invoked after one frame is drawn + */ + protected abstract void onFrameDrawFinish(); + + /** + * draw one frame to the surface by canvas + * + * @param canvas + */ + protected abstract void onFrameDraw(Canvas canvas); + + protected void runOnUIThread( Runnable executor ) { + if ( executor == null ) { + return; + } + if ( Looper.myLooper() != Looper.getMainLooper() ) { + UiThreadHandler.post( executor ); + } else { + executor.run(); + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameFinishCallback.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameFinishCallback.java new file mode 100644 index 0000000000..09cd4dea1f --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameFinishCallback.java @@ -0,0 +1,5 @@ +package com.mogo.och.common.module.wigets.sfv; + +public interface FrameFinishCallback { + void onFinishCallback(); +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java new file mode 100644 index 0000000000..1503e13f07 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java @@ -0,0 +1,404 @@ +package com.mogo.och.common.module.wigets.sfv; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.AttributeSet; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * a SurfaceView which draws bitmaps one after another like frame animation + */ +public class FrameSurfaceView extends BaseSurfaceView { + public static final int INVALID_INDEX = Integer.MAX_VALUE; + private int bufferSize = 3; + public static final String DECODE_THREAD_NAME = "DecodingThread"; + public static final int INFINITE = -1; + //-1 means repeat infinitely + private int repeatTimes; + private int repeatedCount; + + /** + * the resources of frame animation + */ + private List bitmapIds = new ArrayList<>(); + /** + * the index of bitmap resource which is decoding + */ + private int bitmapIdIndex; + /** + * the index of frame which is drawing + */ + private AtomicInteger frameIndex; + /** + * decoded bitmaps stores in this queue + * consumer is drawing thread, producer is decoding thread. + */ + private LinkedBlockingQueue decodedBitmaps = new LinkedBlockingQueue(bufferSize); + /** + * bitmaps already drawn by canvas stores in this queue + * consumer is decoding thread, producer is drawing thread. + */ + private LinkedBlockingQueue drawnBitmaps = new LinkedBlockingQueue(bufferSize); + /** + * the thread for decoding bitmaps + */ + private HandlerThread decodeThread; + /** + * the Runnable describes how to decode one bitmap + */ + private DecodeRunnable decodeRunnable; + /** + * this handler helps to decode bitmap one after another + */ + private Handler handler; + private BitmapFactory.Options options; + private Paint paint = new Paint(); + private Rect srcRect; + private Rect dstRect = new Rect(); + private int defaultWidth; + private int defaultHeight; + + private FrameFinishCallback frameFinishCallback; + + public FrameSurfaceView(Context context) { + super(context); + } + + public FrameSurfaceView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public FrameSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public void setRepeatTimes(int repeatTimes) { + this.repeatTimes = repeatTimes; + } + + @Override + protected void init() { + super.init(); + options = new BitmapFactory.Options(); + options.inMutable = true; + decodeThread = new HandlerThread(DECODE_THREAD_NAME); + frameIndex = new AtomicInteger(); + frameIndex.set(INVALID_INDEX); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + dstRect.set(0, 0, getWidth(), getHeight()); + } + + @Override + protected int getDefaultWidth() { + return defaultWidth; + } + + @Override + protected int getDefaultHeight() { + return defaultHeight; + } + + @Override + protected void onFrameDrawFinish() { + } + + /** + * set the duration of frame animation + * + * @param duration time in milliseconds + */ + public void setDuration(int duration) { + int frameDuration = duration / bitmapIds.size(); + setFrameDuration(frameDuration); + } + + /** + * set the materials of frame animation which is an array of bitmap resource id + * + * @param bitmapIds an array of bitmap resource id + */ + public void setBitmapIds(List bitmapIds) { + if (bitmapIds == null || bitmapIds.size() == 0) { + return; + } + this.bitmapIds = bitmapIds; + //by default, take the first bitmap's dimension into consideration + getBitmapDimension(bitmapIds.get(bitmapIdIndex)); + preloadFrames(); + decodeRunnable = new DecodeRunnable(bitmapIdIndex, bitmapIds, options); + } + + private void getBitmapDimension(int bitmapId) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeResource(this.getResources(), bitmapId, options); + defaultWidth = options.outWidth; + defaultHeight = options.outHeight; + srcRect = new Rect(0, 0, defaultWidth, defaultHeight); + //we have to re-measure to make defaultWidth in use in onMeasure() + requestLayout(); + } + + /** + * load the first several frames of animation before it is started + */ + private void preloadFrames() { + decodeAndPutBitmap(bitmapIds.get(bitmapIdIndex++), options, new LinkedBitmap()); + decodeAndPutBitmap(bitmapIds.get(bitmapIdIndex++), options, new LinkedBitmap()); + } + + /** + * recycle the bitmap used by frame animation. + * Usually it should be invoked when the ui of frame animation is no longer visible + */ + public void destroy() { + if (drawnBitmaps != null) { + drawnBitmaps.clear(); + } + if (decodeThread != null) { + decodeThread.quit(); + decodeThread = null; + } + if (handler != null) { + handler = null; + } + } + + @Override + protected void onFrameDraw(Canvas canvas) { + clearCanvas(canvas); + if (!isStart()) { + return; + } + if (!isFinish()) { + drawOneFrame(canvas); + } else { + onFrameAnimationEnd(); + if (repeatTimes != 0 && repeatTimes == INFINITE) { + start(); + } else if (repeatedCount < repeatTimes) { + start(); + repeatedCount++; + } else { + repeatedCount = 0; + } + } + } + + /** + * draw a single frame which is a bitmap + * + * @param canvas + */ + private void drawOneFrame(Canvas canvas) { + LinkedBitmap linkedBitmap = getDecodedBitmap(); + if (linkedBitmap != null) { + canvas.drawBitmap(linkedBitmap.bitmap, srcRect, dstRect, paint); + } + putDrawnBitmap(linkedBitmap); + frameIndex.incrementAndGet(); + if(isFinish()&&frameFinishCallback!=null){ + runOnUIThread(new Runnable() { + @Override + public void run() { + frameFinishCallback.onFinishCallback(); + } + }); + } + } + + /** + * invoked when frame animation is done + */ + private void onFrameAnimationEnd() { + reset(); + } + + /** + * reset the index of frame, preparing for the next frame animation + */ + public void reset() { + frameIndex.set(INVALID_INDEX); + } + + /** + * whether frame animation is finished + * + * @return true: animation is finished, false: animation is doing + */ + private boolean isFinish() { + return frameIndex.get() >= bitmapIds.size() - 1; + } + + /** + * whether frame animation is started + * + * @return true: animation is started, false: animation is not started + */ + private boolean isStart() { + return frameIndex.get() != INVALID_INDEX; + } + + /** + * start frame animation from the first frame + */ + public void start() { + frameIndex.compareAndSet(INVALID_INDEX, 0); + if (decodeThread == null) { + decodeThread = new HandlerThread(DECODE_THREAD_NAME); + } + if (!decodeThread.isAlive()) { + decodeThread.start(); + } + if (handler == null) { + handler = new Handler(decodeThread.getLooper()); + } + if (decodeRunnable != null) { + decodeRunnable.setIndex(0); + } + handler.post(decodeRunnable); + } + + + /** + * clear out the drawing on canvas,preparing for the next frame + * * @param canvas + */ + private void clearCanvas(Canvas canvas) { + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + canvas.drawPaint(paint); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); + } + + /** + * decode bitmap by BitmapFactory.decodeStream(), it is about twice faster than BitmapFactory.decodeResource() + * + * @param resId the bitmap resource + * @param options + * @return + */ + private Bitmap decodeBitmap(int resId, BitmapFactory.Options options) { + options.inScaled = false; + InputStream inputStream = getResources().openRawResource(resId); + return BitmapFactory.decodeStream(inputStream, null, options); + } + + /** + * reuse bitmap in drawnBitmaps to decode new bitmap + * + * @param resId + * @param options + */ + private void decodedBitmapByReuse(int resId, BitmapFactory.Options options) { + LinkedBitmap linkedBitmap = getDrawnBitmap(); + if (linkedBitmap == null) { + linkedBitmap = new LinkedBitmap(); + } + options.inBitmap = linkedBitmap.bitmap; + decodeAndPutBitmap(resId, options, linkedBitmap); + } + + /** + * decode bitmap and put it into decodedBitmaps + * + * @param resId + * @param options + * @param linkedBitmap + */ + private void decodeAndPutBitmap(int resId, BitmapFactory.Options options, LinkedBitmap linkedBitmap) { + Bitmap bitmap = decodeBitmap(resId, options); + linkedBitmap.bitmap = bitmap; + try { + decodedBitmaps.put(linkedBitmap); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void putDrawnBitmap(LinkedBitmap bitmap) { + drawnBitmaps.offer(bitmap); + } + + /** + * get bitmap which already drawn by canvas + * + * @return + */ + private LinkedBitmap getDrawnBitmap() { + LinkedBitmap bitmap = null; + try { + bitmap = drawnBitmaps.take(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return bitmap; + } + + /** + * get decoded bitmap in the decoded bitmap queue + * it might block due to new bitmap is not ready + * + * @return + */ + private LinkedBitmap getDecodedBitmap() { + LinkedBitmap bitmap = null; + try { + bitmap = decodedBitmaps.take(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return bitmap; + } + + public FrameFinishCallback getFrameFinishCallback() { + return frameFinishCallback; + } + + public void setFrameFinishCallback(FrameFinishCallback frameFinishCallback) { + this.frameFinishCallback = frameFinishCallback; + } + + private class DecodeRunnable implements Runnable { + + private int index; + private List bitmapIds; + private BitmapFactory.Options options; + + public DecodeRunnable(int index, List bitmapIds, BitmapFactory.Options options) { + this.index = index; + this.bitmapIds = bitmapIds; + this.options = options; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public void run() { + decodedBitmapByReuse(bitmapIds.get(index), options); + index++; + if (index < bitmapIds.size()) { + handler.post(this); + } else { + index = 0; + } + } + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/LinkedBitmap.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/LinkedBitmap.java new file mode 100644 index 0000000000..d3752c3bb0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/LinkedBitmap.java @@ -0,0 +1,12 @@ +package com.mogo.och.common.module.wigets.sfv; + +import android.graphics.Bitmap; + +/** + * a structure used by LinkedBlockingQueue to keep bitmap + */ +public class LinkedBitmap { + public Bitmap bitmap; + public LinkedBitmap next; + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/LinkedBlockingQueue.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/LinkedBlockingQueue.java new file mode 100644 index 0000000000..6b95bd5551 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/LinkedBlockingQueue.java @@ -0,0 +1,205 @@ +package com.mogo.och.common.module.wigets.sfv; + + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +public class LinkedBlockingQueue { + /** + * Current number of elements + */ + private final AtomicInteger count = new AtomicInteger(); + /** + * Lock held by take, poll, etc + */ + private final ReentrantLock takeLock = new ReentrantLock(); + + /** + * Wait queue for waiting takes + */ + private final Condition notEmpty = takeLock.newCondition(); + + /** + * Lock held by put, offer, etc + */ + private final ReentrantLock putLock = new ReentrantLock(); + + /** + * Wait queue for waiting puts + */ + private final Condition notFull = putLock.newCondition(); + /** + * The capacity bound, or Integer.MAX_VALUE if none + */ + private final int capacity; + /** + * the first element in the queue + */ + private LinkedBitmap head; + /** + * the last element int the queue + */ + private LinkedBitmap tail; + + + public LinkedBlockingQueue(int capacity) { + if (capacity <= 0) throw new IllegalArgumentException(); + this.capacity = capacity; + } + + public void put(LinkedBitmap bitmap) throws InterruptedException { + if (bitmap == null) throw new NullPointerException(); + // Note: convention in all put/take/etc is to preset local var + // holding count negative to indicate failure unless set. + int c = -1; + final ReentrantLock putLock = this.putLock; + final AtomicInteger count = this.count; + putLock.lockInterruptibly(); + try { + /* + * Note that count is used in wait guard even though it is + * not protected by lock. This works because count can + * only decrease at this point (all other puts are shut + * out by lock), and we (or some other waiting put) are + * signalled if it ever changes from capacity. Similarly + * for all other uses of count in other wait guards. + */ + while (count.get() == capacity) { + notFull.await(); + } + enqueue(bitmap); + c = count.getAndIncrement(); + if (c + 1 < capacity) + notFull.signal(); + } finally { + putLock.unlock(); + } + if (c == 0) + signalNotEmpty(); + } + + public boolean offer(LinkedBitmap bitmap) { + if (bitmap == null) throw new NullPointerException(); + final AtomicInteger count = this.count; + if (count.get() == capacity) + return false; + int c = -1; + final ReentrantLock putLock = this.putLock; + putLock.lock(); + try { + if (count.get() < capacity) { + enqueue(bitmap); + c = count.getAndIncrement(); + if (c + 1 < capacity) + notFull.signal(); + } + } finally { + putLock.unlock(); + } + if (c == 0) + signalNotEmpty(); + return c >= 0; + } + + public LinkedBitmap take() throws InterruptedException { + LinkedBitmap x; + int c = -1; + final AtomicInteger count = this.count; + final ReentrantLock takeLock = this.takeLock; + takeLock.lockInterruptibly(); + try { + while (count.get() == 0) { + notEmpty.await(); + } + x = dequeue(); + c = count.getAndDecrement(); + if (c > 1) + notEmpty.signal(); + } finally { + takeLock.unlock(); + } + if (c == capacity) + signalNotFull(); + return x; + } + + /** + * insert element into the end of queue + * + * @param bitmap + */ + private void enqueue(LinkedBitmap bitmap) { + if (head == null) { + head = bitmap; + tail = bitmap; + bitmap.next = null; + } else { + tail.next = bitmap; + bitmap.next = null; + } + } + + /** + * get and remove the first element of the queue + * + * @return + */ + private LinkedBitmap dequeue() { + LinkedBitmap p = head; + if (p == null) { + return null; + } else { + head = head.next; + } + return p; + } + + /** + * Signals a waiting take. Called only from put/offer (which do not + * otherwise ordinarily lock takeLock.) + */ + private void signalNotEmpty() { + final ReentrantLock takeLock = this.takeLock; + takeLock.lock(); + try { + notEmpty.signal(); + } finally { + takeLock.unlock(); + } + } + + /** + * Signals a waiting put. Called only from take/poll. + */ + private void signalNotFull() { + final ReentrantLock putLock = this.putLock; + putLock.lock(); + try { + notFull.signal(); + } finally { + putLock.unlock(); + } + } + + /** + * recycle the bitmaps one by one + */ + public void clear() { + LinkedBitmap p = head; + if (p == null) { + return; + } + while (p != null) { + if (p.bitmap != null) { + p.bitmap.recycle(); + } + p.bitmap = null; + p = p.next; + } + } + + public Integer getCount() { + return count.get(); + } +} \ 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 f3346cda06..d3b586a5ed 100644 --- a/OCH/mogo-och-taxi-passenger/build.gradle +++ b/OCH/mogo-och-taxi-passenger/build.gradle @@ -48,7 +48,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter implementation rootProject.ext.dependencies.androidxrecyclerview - implementation 'com.google.android.material:material:1.2.1' + implementation rootProject.ext.dependencies.material implementation rootProject.ext.dependencies.flexbox annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.rxandroid diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java new file mode 100644 index 0000000000..741c9c2b69 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerStartReqBean.java @@ -0,0 +1,23 @@ +package com.mogo.och.taxi.passenger.bean; + +/** + * Created by pangfan on 2021/8/19 + * 司机端准备好或者乘客已验证上车请求参数 + */ +public class TaxiPassengerStartReqBean { + + public String orderNo; + public String sn; + public TaxiPassengerStartReqBean.Result loc; + + public static class Result { + public Double lat; + public Double lon; + } + + public TaxiPassengerStartReqBean(String sn, String orderNo, TaxiPassengerStartReqBean.Result point) { + this.sn = sn; + this.orderNo = orderNo; + this.loc = point; + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java index 4f82627a0c..9d147d1ca4 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java @@ -22,4 +22,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback { //当前路名字 void onCurrentRoadName(String currentRoadName); + // 司机已确认开启自动驾驶环境 + void onDriverHasCheckedPilotCondition(boolean isBoarded); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt index a17c9add6c..d3270cb212 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerConst.kt @@ -42,5 +42,21 @@ class TaxiPassengerConst { //实时查询订单剩余时间 和 剩余里程 轮询间隔2s const val LOOP_CALCULATEROUTE_2S = 2 * 1000L + + // 开始服务启动自动驾驶等待时间(埋点上传) + const val LOOP_PERIOD_15S = 15 * 1000L + + // 埋点key:接管后点击'自动驾驶'按钮启动 + const val EVENT_KEY_RESTART_AUTOPILOT = "event_key_och_taxi_restart_autopilot" + // 埋点key:开始服务开启自动驾驶(成功/失败) + const val EVENT_KEY_START_SERVICE = "event_key_och_taxi_start_service" + const val EVENT_PARAM_SN = "sn" + const val EVENT_PARAM_TIME = "time" + const val EVENT_PARAM_START_NAME = "start_name" + const val EVENT_PARAM_END_NAME = "end_name" + const val EVENT_PARAM_ORDER_NUMBER = "order_num" + const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false + const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号 + const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false } } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index f9ce32b964..038e27f978 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -14,12 +14,13 @@ import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.v2x.LimitingVelocityListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager; @@ -32,11 +33,13 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; +import com.mogo.och.common.module.utils.PinYinUtil; import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback; @@ -51,6 +54,7 @@ import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceCallback; import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager; import com.mogo.aicloud.services.socket.IMogoLifecycleListener; +import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; @@ -70,7 +74,6 @@ import io.reactivex.plugins.RxJavaPlugins; import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; /** @@ -158,31 +161,31 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void accept(Throwable e) { if (e instanceof UndeliverableException) { e = e.getCause(); - CallerLogger.INSTANCE.d(M_TAXI + TAG, "UndeliverableException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "UndeliverableException"); } if ((e instanceof IOException)) {// // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.INSTANCE.d(M_TAXI + TAG, "IOException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IOException"); return; } if (e instanceof InterruptedException) { // fine, some blocking code was interrupted by a dispose call - CallerLogger.INSTANCE.d(M_TAXI + TAG, "InterruptedException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "InterruptedException"); return; } if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { // that's likely a bug in the application - CallerLogger.INSTANCE.d(M_TAXI + TAG, "NullPointerException or IllegalArgumentException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException"); Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } if (e instanceof IllegalStateException) { // that's a bug in RxJava or in a custom operator - CallerLogger.INSTANCE.d(M_TAXI + TAG, "IllegalStateException"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IllegalStateException"); Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"Undeliverable exception"); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"Undeliverable exception"); } }); @@ -505,11 +508,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); if (mCurrentOCHOrder != null - && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtStart + && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.UserArriveAtStart && state != mPrevAPStatus) { // 当高频返回autopilot 2时,不重复调用订单状态变更 mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态 -// updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation); + startServicePilotDone(); } } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { mPrevAPStatus = state; @@ -597,9 +600,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback */ public void startOrStopRouteAndWipe(boolean isStart){ if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startOrStopRouteAndWipe(); + TaxiPassengerModelLoopManager.getInstance().startRouteAndWipe(); }else { - TaxiPassengerModelLoopManager.getInstance().stopOrStopRouteAndWipe(); + TaxiPassengerModelLoopManager.getInstance().stopRouteAndWipe(); } } @@ -781,6 +784,102 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback }); } + public void loopQueryPilotStatus(){ + if (mCurrentOCHOrder == null) return; + TaxiPassengerServiceManager.getInstance().queryPilotStatus(mContext, mCurrentOCHOrder.orderNo, + new TaxiPassengerServiceCallback() { + @Override + public void onSuccess(TaxiPassengerBaseRespBean data) { + if (data != null && data.code == 0 && data.data.equals(true)) { + updateAutopilotStatus(true); + startOrStopReadyToAutopilotoop(false); + } + } + + @Override + public void onFail(int code, String msg) { + updateAutopilotStatus(false); + } + }); + } + + public void updateAutopilotStatus(boolean isBoarded){ + if (mOrderStatusCallbackMap.size() > 0) { + for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ + callback.onDriverHasCheckedPilotCondition(isBoarded); + } + } + } + + public void startDriverReadyToAutopilotLoop(){ + if (NetworkUtils.isConnected(mContext)) { + startOrStopReadyToAutopilotoop(true); + } + } + + public void startOrStopReadyToAutopilotoop(boolean isStart) { + if (isStart){ + TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot(); + }else { + TaxiPassengerModelLoopManager.getInstance().stopReadyToAutopilot(); + } + } + + public void startServicePilotDone(){ + if (mCurrentOCHOrder == null) return; + TaxiPassengerStartReqBean.Result result = new TaxiPassengerStartReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiPassengerServiceManager.getInstance().startServicePilotDone(mContext, + mCurrentOCHOrder.orderNo, result, + new TaxiPassengerServiceCallback(){ + + @Override + public void onSuccess(TaxiPassengerBaseRespBean data) { + + } + + @Override + public void onFail(int code, String msg) { + ToastUtils.showShort(msg); + } + }); + } + + public void startAutopilot() { + if (!checkCurrentOCHOrder()) { + CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "no order or order is empty."); + ToastUtils.showShort("当前订单不存在或异常!"); + return; + } + + if (mCurrentOCHOrder.orderStatus != TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode()) { + ToastUtils.showShort("当前订单状态异常!"); + return; + } + + double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0); + double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1); + double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0); + double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1); + + AutopilotControlParameters parameters = new AutopilotControlParameters(); + parameters.vehicleType = mCurrentOCHOrder.businessType; + parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) + parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) + parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon); + parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon); + CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "start autopilot with parameter: %s" + , GsonUtil.jsonFromObject(parameters) + + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); + + TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, false, + mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); + } + + private void runOnUIThread(Runnable executor) { if (executor == null) { return; diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java index da3b5e5f48..30be0829b1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java @@ -32,12 +32,34 @@ public class TaxiPassengerModelLoopManager { private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询 private Disposable mQueryOrderRemainingDisposable; //心跳轮询 private Disposable mRouteWipeDisposable; //轨迹擦除 + private Disposable mReadyToAutopilotDisposable; //轨迹擦除 - public void startOrStopRouteAndWipe() { + public void startReadyToAutopilot() { + if (mReadyToAutopilotDisposable != null && !mReadyToAutopilotDisposable.isDisposed()) { + return; + } + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startReadyToAutopilot()"); + mReadyToAutopilotDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, + TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) + .map((aLong -> aLong + 1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> TaxiPassengerModel.getInstance().loopQueryPilotStatus()); + } + + public void stopReadyToAutopilot() { + if (mReadyToAutopilotDisposable != null) { + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopReadyToAutopilot()"); + mReadyToAutopilotDisposable.dispose(); + mReadyToAutopilotDisposable = null; + } + } + + public void startRouteAndWipe() { if (mRouteWipeDisposable != null && !mRouteWipeDisposable.isDisposed()) { return; } - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startOrStopRouteWipe()"); + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startRouteAndWipe()"); mRouteWipeDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) .map((aLong -> aLong + 1)) @@ -46,9 +68,9 @@ public class TaxiPassengerModelLoopManager { .subscribe(aLong -> TaxiPassengerModel.getInstance().loopRouteAndWipe()); } - public void stopOrStopRouteAndWipe() { + public void stopRouteAndWipe() { if (mRouteWipeDisposable != null) { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopOrStopRouteWipe()"); + CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()"); mRouteWipeDisposable.dispose(); mRouteWipeDisposable = null; } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java index 5ac328f3a7..e7c366c18a 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceApi.java @@ -8,6 +8,7 @@ import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; import io.reactivex.Observable; import retrofit2.http.Body; @@ -101,4 +102,27 @@ interface TaxiPassengerServiceApi { @GET( "/autopilot-car-hailing/evaluation/label/driver/taxi/listByStar" ) Observable getWorldByStar(@Header ("appId") String appId, @Header("ticket") String ticket,@Query("star") String star); + /** + * 查询司机是否已确认可开启自动驾驶 + * @param appId + * @param ticket + * @param orderNo + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" ) + Observable queryPilotStatus(@Header ("appId") String appId + , @Header("ticket") String ticket,@Query("orderNo") String orderNo); + + /** + * 乘客屏启动自动驾驶成功 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/startServicePilot" ) + Observable startServicePilotDone(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiPassengerStartReqBean data); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java index 2573bae0ff..4d1866230e 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/TaxiPassengerServiceManager.java @@ -20,6 +20,7 @@ import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; import com.mogo.commons.debug.DebugConfig; @@ -176,7 +177,29 @@ public class TaxiPassengerServiceManager { ,MoGoAiCloudClientConfig.getInstance().getToken()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); + .subscribe(getSubscribeImpl(context, callback, "arrivedAndScore")); + } + + public void queryPilotStatus(Context context, String orderNo + ,TaxiPassengerServiceCallback callback){ + mOCHTaxiServiceApi.queryPilotStatus( + MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "queryPilotStatus")); + } + + public void startServicePilotDone(Context context,String orderNo,TaxiPassengerStartReqBean.Result loc + ,TaxiPassengerServiceCallback callback){ + mOCHTaxiServiceApi.startServicePilotDone(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiPassengerStartReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"startServicePilotDone")); } public void getWorldByStar(Context context,String start,TaxiPassengerServiceCallback callback){ mOCHTaxiServiceApi.getWorldByStar( diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 008cff94ff..ced41770c1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -142,19 +142,28 @@ public class BaseTaxiPassengerPresenter extends Presenter{ + CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"UserArriveAtStart"); + mView.showOrHideStartAutopilotView(true,false); + }); + //开启轮询司机是否已准备好开启自动驾驶的环境 + TaxiPassengerModel.getInstance().startDriverReadyToAutopilotLoop(); } if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){ -// mView.showOrHideStartAutopilotView(false); + runOnUIThread(() ->{ + mView.showOrHideServingOrderFragment(true); + mView.showOrHideStartAutopilotView(false,false); + }); + TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotoop(false); } // 30 用户到达上车点 并通过了手机号后四位验证 // 40 服务中 @@ -182,7 +201,6 @@ public class BaseTaxiPassengerPresenter extends Presenter mView.showArrivedEndLayout2Thank(aBoolean)); } + /** + * 开启自动驾驶 + */ + public void startAutopilot(){ + TaxiPassengerModel.getInstance().startAutopilot(); + } + } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java index 15b2472c79..28bc751b01 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java @@ -120,6 +120,11 @@ public class TaxiPassengerServingOrderPresenter extends Presenter mView.onCurrentRoadName(currentRoadName)); } + @Override + public void onDriverHasCheckedPilotCondition(boolean isBoarded) { + + } + @Override public void onVRModeChanged(boolean isVRMode) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index baf652f845..9627660c52 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -1,8 +1,10 @@ package com.mogo.och.taxi.passenger.ui; +import android.animation.ObjectAnimator; import android.os.Handler; import android.os.Looper; import android.view.View; +import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; @@ -154,6 +156,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment { -// if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) { -// // 1. 主动开启自动驾驶中,不为2(为0、1)则继续loading -// return; -// } -// if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status -// && mPrevAPStatus != status) { -// // 2. 主动开启自动驾驶中,为2则停止loading,并isStarting = false -// startAutopilotDone(true); -// return; -// } + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) { + // 1. 主动开启自动驾驶中,不为2(为0、1)则继续loading + return; + } + if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status + && mPrevAPStatus != status) { + // 2. 主动开启自动驾驶中,为2则停止loading,并isStarting = false + if ( mStartAutopilotView != null && mStartAutopilotView.get() != null){ + mStartAutopilotView.get().startOrStopLoadingAnim(false); + } + } // 3. 其他过程直接更新 if (mPrevAPStatus != status){ autopilotStatusAnimchanged(status); } -// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == mPrevAPStatus) { -// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) { -// // 2->1 -//// AIAssist.getInstance(getContext()).speakTTSVoice("已进入人工驾驶模式"); -// } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == status) { -// // 2->0 -//// AIAssist.getInstance(getContext()).speakTTSVoice("自动驾驶已停止,请人工接管"); -// } -// } mPrevAPStatus = status; }); } @@ -280,8 +275,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment(new TaxiPassengerStartAutopilotView(getContext())); + mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(this); } OverlayViewUtils.showOverlayView(getActivity(),mStartAutopilotView.get()); - mStartAutopilotView.get().setOnClickStartAutopilotBtnCallback(this); - mStartAutopilotView.get().updateStartAutopilotBtnStatus(isClickable); + updateStartAutopilotBtnStatus(isClickable); }else { if (mStartAutopilotView == null || mStartAutopilotView.get() == null){ return; @@ -306,6 +299,13 @@ public class TaxiPassengerBaseFragment extends MvpFragment mStartAutopilotParams = new HashMap<>(); + + private Runnable startAutopilotRunnable = () -> { + // 15s内未开启,上报失败埋点 + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_RESULT, false); + AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); + }; + + /** + * 触发'开启自动驾驶'埋点流程 + * 开启自动驾驶,15s内成功则发送成功埋点,否则发送失败埋点 + * @param restart false(点击'开始服务'启动)/true(接管后点击'自动驾驶'按钮启动) + * @param send 是否直接发送埋点(15s内开启成功则直接发送成功埋点) + */ + public void triggerStartAutopilotEvent( + boolean restart, boolean send, String startName, String endName, String orderNo) { + mStartAutopilotKey = restart ? + TaxiPassengerConst.EVENT_KEY_RESTART_AUTOPILOT : TaxiPassengerConst.EVENT_KEY_START_SERVICE; + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + String plateNum = AppConfigInfo.INSTANCE.getPlateNumber(); + String dateTime = DateTimeUtils.getTimeText( + System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss); + + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_SN, sn); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_ENV_ONLINE, + DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_TIME, dateTime); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_NAME, startName); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_END_NAME, endName); + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_ORDER_NUMBER, orderNo); + + if (send) { + // 开启成功,上报埋点 + if (startAutopilotRunnable != null && + UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) { + UiThreadHandler.removeCallbacks(startAutopilotRunnable); + } + mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_RESULT, true); + AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); + } else { + UiThreadHandler.postDelayed(startAutopilotRunnable, TaxiPassengerConst.LOOP_PERIOD_15S); + } + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_ic_autopilot_loading.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_ic_autopilot_loading.png new file mode 100644 index 0000000000..a71cf9a4f9 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_ic_autopilot_loading.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_passenger_start_panel_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_passenger_start_panel_bg.png new file mode 100644 index 0000000000..7121f26751 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_p_passenger_start_panel_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_ic_autopilot_loading.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_ic_autopilot_loading.png new file mode 100644 index 0000000000..a71cf9a4f9 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_ic_autopilot_loading.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_passenger_start_panel_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_passenger_start_panel_bg.png new file mode 100644 index 0000000000..7121f26751 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_passenger_start_panel_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml new file mode 100644 index 0000000000..cdd2d4d24a --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00000.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00000.png new file mode 100644 index 0000000000..f989ccf060 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00000.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00001.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00001.png new file mode 100644 index 0000000000..cb1d58d997 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00001.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00002.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00002.png new file mode 100644 index 0000000000..6f7458fc19 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00002.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00003.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00003.png new file mode 100644 index 0000000000..c9bf2d690f Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00003.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00004.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00004.png new file mode 100644 index 0000000000..1265d4c5d4 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00004.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00005.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00005.png new file mode 100644 index 0000000000..e3c2a48509 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00005.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00006.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00006.png new file mode 100644 index 0000000000..a14cc77e7c Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00006.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00007.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00007.png new file mode 100644 index 0000000000..7371fb9b6c Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00007.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00008.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00008.png new file mode 100644 index 0000000000..a26aec4c5d Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00008.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00009.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00009.png new file mode 100644 index 0000000000..771aa42537 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00009.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00010.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00010.png new file mode 100644 index 0000000000..2ac02ea932 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00010.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00011.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00011.png new file mode 100644 index 0000000000..0a1bceebac Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00011.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00012.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00012.png new file mode 100644 index 0000000000..c948a78044 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00012.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00013.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00013.png new file mode 100644 index 0000000000..52cc47f30f Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00013.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00014.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00014.png new file mode 100644 index 0000000000..3900fce374 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00014.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00015.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00015.png new file mode 100644 index 0000000000..1c61941897 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00015.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00016.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00016.png new file mode 100644 index 0000000000..8816ff0b08 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00016.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00017.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00017.png new file mode 100644 index 0000000000..931b999880 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00017.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00018.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00018.png new file mode 100644 index 0000000000..fa3baea429 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00018.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00019.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00019.png new file mode 100644 index 0000000000..ca624ff290 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00019.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00020.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00020.png new file mode 100644 index 0000000000..4928a6f675 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00020.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00021.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00021.png new file mode 100644 index 0000000000..7d968c90e0 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00021.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00022.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00022.png new file mode 100644 index 0000000000..07c248bdaa Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00022.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00023.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00023.png new file mode 100644 index 0000000000..6299225fd1 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00023.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00024.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00024.png new file mode 100644 index 0000000000..ae62fbc190 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00024.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00025.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00025.png new file mode 100644 index 0000000000..48cf8e68d0 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00025.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00026.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00026.png new file mode 100644 index 0000000000..994ddc6433 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00026.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00027.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00027.png new file mode 100644 index 0000000000..6060955dc2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00027.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00028.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00028.png new file mode 100644 index 0000000000..16752cf677 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00028.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00029.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00029.png new file mode 100644 index 0000000000..234dd480f2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00029.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00030.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00030.png new file mode 100644 index 0000000000..cb25229fc2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00030.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00031.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00031.png new file mode 100644 index 0000000000..63e94ba87e Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00031.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00032.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00032.png new file mode 100644 index 0000000000..683527f781 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00032.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00033.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00033.png new file mode 100644 index 0000000000..3a7d10ca3f Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00033.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00034.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00034.png new file mode 100644 index 0000000000..a05d419bff Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00034.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00035.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00035.png new file mode 100644 index 0000000000..0d545995fa Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00035.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00036.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00036.png new file mode 100644 index 0000000000..cc0e1fc0ea Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00036.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00037.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00037.png new file mode 100644 index 0000000000..c66fe3def9 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00037.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00038.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00038.png new file mode 100644 index 0000000000..8ad0957ff7 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00038.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00039.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00039.png new file mode 100644 index 0000000000..ad1eff3472 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00039.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00040.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00040.png new file mode 100644 index 0000000000..387a65d4c6 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00040.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00041.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00041.png new file mode 100644 index 0000000000..510d2c7473 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00041.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00042.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00042.png new file mode 100644 index 0000000000..7eaa141321 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00042.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00043.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00043.png new file mode 100644 index 0000000000..6c82a2ce88 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00043.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00044.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00044.png new file mode 100644 index 0000000000..0d8bf94fd6 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00044.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00045.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00045.png new file mode 100644 index 0000000000..1824507d21 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00045.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00046.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00046.png new file mode 100644 index 0000000000..6c56dbed45 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00046.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00047.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00047.png new file mode 100644 index 0000000000..7957eb7734 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00047.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00048.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00048.png new file mode 100644 index 0000000000..b143b054ac Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00048.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00049.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00049.png new file mode 100644 index 0000000000..9a91eddddc Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00049.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00050.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00050.png new file mode 100644 index 0000000000..e20e3665b9 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00050.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00051.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00051.png new file mode 100644 index 0000000000..57581f8876 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00051.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00052.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00052.png new file mode 100644 index 0000000000..e4561cda7c Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00052.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00053.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00053.png new file mode 100644 index 0000000000..01b205627b Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00053.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00054.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00054.png new file mode 100644 index 0000000000..42abd3cce6 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00054.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00055.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00055.png new file mode 100644 index 0000000000..1e5173c825 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00055.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00056.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00056.png new file mode 100644 index 0000000000..4954af5c7d Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00056.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00057.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00057.png new file mode 100644 index 0000000000..23a161a001 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00057.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00058.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00058.png new file mode 100644 index 0000000000..f1c4d5be16 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00058.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00059.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00059.png new file mode 100644 index 0000000000..1cac3df4d2 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00059.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00060.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00060.png new file mode 100644 index 0000000000..0274a42730 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00060.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00061.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00061.png new file mode 100644 index 0000000000..d169b35037 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00061.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00062.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00062.png new file mode 100644 index 0000000000..da6dbb7177 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00062.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00063.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00063.png new file mode 100644 index 0000000000..fb69912cf6 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00063.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00064.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00064.png new file mode 100644 index 0000000000..4dbd138756 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00064.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00065.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00065.png new file mode 100644 index 0000000000..a7b28ec2ac Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00065.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00066.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00066.png new file mode 100644 index 0000000000..830a996357 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00066.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00067.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00067.png new file mode 100644 index 0000000000..c5f256094d Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00067.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00068.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00068.png new file mode 100644 index 0000000000..e0a9774dc7 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00068.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00069.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00069.png new file mode 100644 index 0000000000..69ba8b259f Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00069.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00070.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00070.png new file mode 100644 index 0000000000..0e6f42a772 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00070.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00071.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00071.png new file mode 100644 index 0000000000..2d9473618c Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00071.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00072.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00072.png new file mode 100644 index 0000000000..0ce282af24 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00072.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00073.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00073.png new file mode 100644 index 0000000000..f4670bc002 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00073.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00074.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00074.png new file mode 100644 index 0000000000..56ad547bbd Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/image_00074.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00000.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00000.png new file mode 100755 index 0000000000..383fd3ce6a Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00000.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00001.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00001.png new file mode 100755 index 0000000000..9017b26f03 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00001.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00002.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00002.png new file mode 100755 index 0000000000..485d79cc9c Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00002.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00003.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00003.png new file mode 100755 index 0000000000..283b069fcf Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00003.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00004.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00004.png new file mode 100755 index 0000000000..9690363efc Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00004.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00005.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00005.png new file mode 100755 index 0000000000..d066263bce Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00005.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00006.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00006.png new file mode 100755 index 0000000000..de9763c559 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00006.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00007.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00007.png new file mode 100755 index 0000000000..bcab58b3a9 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00007.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00008.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00008.png new file mode 100755 index 0000000000..9c5f0994d3 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00008.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00009.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00009.png new file mode 100755 index 0000000000..b543a650cd Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00009.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00010.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00010.png new file mode 100755 index 0000000000..e51ae88287 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00010.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00011.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00011.png new file mode 100755 index 0000000000..426caaa5d6 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00011.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00012.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00012.png new file mode 100755 index 0000000000..64cbc675c6 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00012.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00013.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00013.png new file mode 100755 index 0000000000..6f272fa759 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/light_00013.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/starting_anmi_flow.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/starting_anmi_flow.xml new file mode 100644 index 0000000000..5f6badea0b --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/starting_anmi_flow.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_p_start_autopilot_txt_btn_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_p_start_autopilot_txt_btn_bg.xml index f6a17ddd99..6e6e5b6729 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_p_start_autopilot_txt_btn_bg.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_p_start_autopilot_txt_btn_bg.xml @@ -1,11 +1,12 @@ - + + + android:startColor="#E639699F" + android:endColor="#395EC5" /> diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml index c24b844553..56c052eb7b 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_start_autopilot_view.xml @@ -5,34 +5,37 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:ignore="MissingDefaultResource" - android:background="@drawable/taxi_p_passenger_check_panel_bg"> + android:background="@drawable/taxi_p_passenger_start_panel_bg"> - + + + app:layout_constraintBottom_toBottomOf="parent"/> - - + app:layout_constraintLeft_toLeftOf="@+id/taxi_p_start_autopilot_btn_sfv" + app:layout_constraintRight_toRightOf="@+id/taxi_p_start_autopilot_btn_sfv" + app:layout_constraintTop_toTopOf="@+id/taxi_p_start_autopilot_btn_sfv" + app:layout_constraintBottom_toBottomOf="@+id/taxi_p_start_autopilot_btn_sfv"/> \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml index e7b95cf0a7..5b26b8687b 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml @@ -62,7 +62,7 @@ 34px 28px - 60px - 560px - 158px + 52px + 1000px + 500px \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml index 48ed2067f1..b1e2c1dd14 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -125,8 +125,8 @@ 34px 28px - 60px - 560px - 158px + 52px + 1000px + 500px \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml index 6e8c0e95ad..0627d9585c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml @@ -50,6 +50,8 @@ #151937 #80141D45 + #4DFFFFFF + #FFFFFF \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml index 50b5ce589b..a453e6d3b3 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml @@ -120,7 +120,7 @@ 34px 28px - 60px - 560px - 158px + 52px + 1000px + 500px \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml index b5043ad377..bc93dc9da1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml @@ -33,4 +33,7 @@ 删除 点击开始 + 启动中... + 自动驾驶启动失败,请与司机确认车辆状态 + 车辆尚未完成准备,不能启动自动驾驶 \ No newline at end of file diff --git a/OCH/mogo-och-taxi/build.gradle b/OCH/mogo-och-taxi/build.gradle index 480688206d..11d63d9a60 100644 --- a/OCH/mogo-och-taxi/build.gradle +++ b/OCH/mogo-och-taxi/build.gradle @@ -47,8 +47,8 @@ dependencies { implementation rootProject.ext.dependencies.kotlinstdlibjdk7 implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'com.google.android.material:material:1.2.1' + implementation rootProject.ext.dependencies.androidxrecyclerview + implementation rootProject.ext.dependencies.material annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.rxandroid implementation rootProject.ext.dependencies.androidxconstraintlayout diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java index 22c969090e..0c164b143a 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java @@ -51,13 +51,13 @@ public class OrderQueryRespBean extends BaseData { public String passengerNum; //线路轨迹相关字段 - public long lineId; //路线id,默认-1 - public String csvFileUrl; //轨迹文件下载的cos url,默认“” - public String csvFileMd5; //轨迹文件md5,默认“” - public String txtFileUrl; //打点文件下载的cos url,默认“” - public String txtFileMd5; //轨迹文件md5,默认“” + public long lineId = -1; //路线id,默认-1 + public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“” + public String csvFileMd5 = ""; //轨迹文件md5,默认“” + public String txtFileUrl = ""; //打点文件下载的cos url,默认“” + public String txtFileMd5 = ""; //轨迹文件md5,默认“” public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 - public String carModel; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 + public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km public double travelDistance; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java deleted file mode 100644 index 91045acfc2..0000000000 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneUpdateOrderReqBean.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mogo.och.taxi.bean; - -/** - * Created by pangfan on 2021/8/19 - * - * 验证手机号后四位同时流转订单状态 - */ -public class TaxiCheckPhoneUpdateOrderReqBean { - - public String orderNo; - public String phone; - - public TaxiCheckPhoneUpdateOrderReqBean(String orderNo, String phone) { - this.orderNo = orderNo; - this.phone = phone; - } -} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneBaseRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java similarity index 75% rename from OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneBaseRespBean.java rename to OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java index 4a4c0da7b1..8d6ca6d4df 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiCheckPhoneBaseRespBean.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java @@ -7,6 +7,6 @@ import com.mogo.eagle.core.data.BaseData; * * 查询订单返回数据结构 */ -public class TaxiCheckPhoneBaseRespBean extends BaseData { +public class TaxiDataBaseRespBean extends BaseData { public Object data; } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java new file mode 100644 index 0000000000..5bb888fcc9 --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java @@ -0,0 +1,23 @@ +package com.mogo.och.taxi.bean; + +/** + * Created by pangfan on 2021/8/19 + * 司机端准备好或者乘客已验证上车请求参数 + */ +public class TaxiOrPassengerReadyReqBean { + + public String orderNo; + public String sn; + public TaxiOrPassengerReadyReqBean.Result loc; + + public static class Result { + public Double lat; + public Double lon; + } + + public TaxiOrPassengerReadyReqBean(String sn, String orderNo, TaxiOrPassengerReadyReqBean.Result point) { + this.sn = sn; + this.orderNo = orderNo; + this.loc = point; + } +} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java index b4dd23a2eb..d10920b8d1 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java @@ -45,4 +45,7 @@ public interface ITaxiOrderStatusCallback { // 未抢到预约单 void onGrabOrderFailed(OrderQueryRespBean.Result order); + + // 司机已确认开启自动驾驶环境 + void onDriverHasCheckedPilotCondition(boolean isSafe); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 2047065e57..ef85f1b00f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -17,7 +17,6 @@ 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.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; @@ -31,7 +30,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; @@ -50,7 +48,8 @@ import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean; import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; -import com.mogo.och.taxi.bean.TaxiCheckPhoneBaseRespBean; +import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; +import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.taxi.callback.ITaxiCarStatusCallback; import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback; @@ -77,11 +76,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import io.reactivex.android.schedulers.AndroidSchedulers; 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; import mogo_msg.MogoReportMsg; @@ -183,12 +180,11 @@ public class TaxiModel { Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } - CallerLogger.INSTANCE.d(M_TAXI + TAG,"Undeliverable exception"); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception"); } }); if (NetworkUtils.isConnected(mContext)) { -// startOrStopOrderLoop(mOCHCarStatus == 1); queryCarStatus(); } } @@ -266,14 +262,15 @@ public class TaxiModel { //更新view CallerLogger.INSTANCE.d(M_TAXI + TAG, "changeCarStatus:" + mOCHCarStatus); startOrStopOrderLoop(mOCHCarStatus == 1); + queryAutopilotStatus(mOCHCarStatus == 1); String role = ""; - if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose){ + if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) { role = TaxiConst.DEMO_USER; - }else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose){ + } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) { role = TaxiConst.TEST_USER; } if (mCarStatusCallback != null) { - mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1 , role); + mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1, role); } } @@ -283,7 +280,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } // queryCarStatus(); @@ -318,7 +315,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -438,39 +435,6 @@ public class TaxiModel { }); } - //更新当前订单状态 - public void updateOCHOrderStatus(final TaxiOrderStatusEnum orderStatus) { - if (mCurrentOCHOrder == null) { - return; - } - final String orderNo = mCurrentOCHOrder.orderNo; - TaxiServiceManager.getInstance().updateOrderStatus(mContext, orderNo, - orderStatus.getCode(), new TaxiServiceCallback() { - @Override - public void onSuccess(BaseData data) { - if (null != data && 0 == data.code - && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(orderNo)) { - mCurrentOCHOrder.orderStatus = orderStatus.getCode(); - if (mOrderStatusCallback != null) { - mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } - } - - @Override - public void onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - } - } - - @Override - public void onFail(int code, String msg) { -// ToastUtils.showShort(code + "," + msg); - } - }); - } - // 取消当前订单 public void cancelCurrentOrder(int reasonType, String reason) { if (mCurrentOCHOrder == null) { @@ -496,7 +460,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -525,7 +489,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -579,7 +543,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -602,10 +566,10 @@ public class TaxiModel { @Override public void onSuccess(OrdersNewBookingQueryRespBean data) { if (data != null && data.code == 0 - && data.data != null && data.data.orders !=null + && data.data != null && data.data.orders != null && data.data.orders.size() > 0) { // 本地无新到单,且本次新到单id与上次收到的新单id不同时:显示本次新到单 - if (mNewBookingOrder == null ) { + if (mNewBookingOrder == null) { for (String orderNo : data.data.orders) { if (!mPrevOrderNo.equals(orderNo)) { queryNewBookingContent(orderNo); @@ -673,7 +637,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -767,7 +731,7 @@ public class TaxiModel { public void onError() { if (!NetworkUtils.isConnected(mContext)) { ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - }else { + } else { ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); } } @@ -779,6 +743,60 @@ public class TaxiModel { }); } + /** + * 司机端确认可开始自动驾驶 + */ + public void confirmAutopilotConditionByDriver() { + if (mCurrentOCHOrder == null) return; + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().confirmAutopilotConditionByDriver(mContext, + mCurrentOCHOrder.orderNo, + result, + new TaxiServiceCallback(){ + + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + updateAutopilotStatus(data.code == 0); + } + + @Override + public void onFail(int code, String msg) { + updateAutopilotStatus(false); + } + }); + } + + public void updateAutopilotStatus(boolean isSafe){ + if (mOrderStatusCallback != null){ + mOrderStatusCallback.onDriverHasCheckedPilotCondition(isSafe); + } + } + + public void queryAutopilotStatus(boolean isStart){ + if (isStart){ + queryAutopilotStatus(); + } + } + + public void queryAutopilotStatus(){ + if (mCurrentOCHOrder == null) return; + TaxiServiceManager.getInstance().queryAutopilotStatus(mContext, mCurrentOCHOrder.orderNo, + new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + if (data != null && data.code == 0 && data.data.equals(true)) + updateAutopilotStatus(data.data.equals(true)); + } + + @Override + public void onFail(int code, String msg) { + updateAutopilotStatus(false); + } + }); + } + // 取消当前新到预约单 public void cancelNewBookingOrder() { mNewBookingOrder = null; @@ -837,6 +855,7 @@ public class TaxiModel { /** * 以当前订单为基础,开启自动驾驶 + * * @param isRestart 开启自动驾驶 */ @ChainLog( @@ -872,6 +891,13 @@ public class TaxiModel { parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon); parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon); + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( + mCurrentOCHOrder.lineId, + mCurrentOCHOrder.csvFileUrl, mCurrentOCHOrder.csvFileMd5, + mCurrentOCHOrder.txtFileUrl, mCurrentOCHOrder.txtFileMd5, + mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel); + } CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); CallerLogger.INSTANCE.d(M_TAXI + TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters) + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); @@ -914,9 +940,6 @@ public class TaxiModel { } CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeStartStation() distance = " + distance); -// if (mOrderStatusCallback != null && distance >= 0) { -// mOrderStatusCallback.onCurrentOrderDistToStartChanged((long) distance, 0); -// } if (distance > TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { distance = CoordinateUtils.calculateLineDistance(startLon, startLat, @@ -925,26 +948,11 @@ public class TaxiModel { } if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { - updateOCHOrderStatus(TaxiOrderStatusEnum.ArriveAtStart); + arrivedStartPoint(); 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 final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { @Override @@ -998,9 +1006,6 @@ public class TaxiModel { if (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToStart) { judgeStartStation(location); } -// else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) { -// calculateTravelDistance(location); -// } } mLongitude = location.getLongitude(); mLatitude = location.getLatitude(); @@ -1019,7 +1024,16 @@ public class TaxiModel { ToastUtils.showShort("订单状态不匹配该操作!"); return; } - updateOCHOrderStatus(TaxiOrderStatusEnum.ArriveAtStart); + arrivedStartPoint(); + } + + public void setDriverConfirmCondition() { + if (mCurrentOCHOrder == null + || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.UserArriveAtStart.getCode()) { + ToastUtils.showShort("订单状态不匹配该操作!"); + return; + } + confirmAutopilotConditionByDriver(); } public void setArriveAtEndStation() { @@ -1028,19 +1042,18 @@ public class TaxiModel { ToastUtils.showShort("订单状态不匹配该操作!"); return; } - updateOCHOrderStatus(TaxiOrderStatusEnum.ArriveAtEnd); + arriveTerminal(); } /** - * 测试开始服务 + * 测试开启自动驾驶 */ public void setOnTheWayToEndStation() { -// if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); if (mCurrentOCHOrder == null || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.UserArriveAtStart.getCode()) { ToastUtils.showShort("订单状态不匹配该操作!"); } - updateOCHOrderStatus(TaxiOrderStatusEnum.OnTheWayToEnd); + startServicePilotDone(); } private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { @@ -1066,7 +1079,8 @@ public class TaxiModel { && state != mPrevAPStatus) { // 当高频返回autopilot 2时,不重复调用订单状态变更 mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态 - updateOCHOrderStatus(TaxiOrderStatusEnum.OnTheWayToEnd); + + startServicePilotDone(); TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, true, mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); @@ -1121,7 +1135,7 @@ public class TaxiModel { if (DebugConfig.isDebug()) { // ToastUtils.showShort("到达目的地"); } - updateOCHOrderStatus(TaxiOrderStatusEnum.ArriveAtEnd); + arriveTerminal(); if (FunctionBuildConfig.isDemoMode) { // 当美化模式(演示模式)开启时: 到达目的地,置false FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; @@ -1138,7 +1152,7 @@ public class TaxiModel { @Override public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { - if (null != routeList && routeList.getWayPointsList().size() > 0){ + if (null != routeList && routeList.getWayPointsList().size() > 0) { updateOrderRoute(routeList.getWayPointsList()); updateOrderRouteInfo(routeList.getWayPointsList()); } @@ -1148,11 +1162,12 @@ public class TaxiModel { /** * 上报订单全路径规划数据 + * * @param models */ public void updateOrderRoute(List models) { if (null == mCurrentOCHOrder) return; - List points = coordinateConverterWgsToGcjList(mContext,models); + List points = coordinateConverterWgsToGcjList(mContext, models); TaxiServiceManager.getInstance().updateOrderRoute(mContext, mCurrentOCHOrder.orderNo , points, new TaxiServiceCallback() { @Override @@ -1186,6 +1201,7 @@ public class TaxiModel { /** * 计算全路径长度,以及实时更新剩余距离,剩余时间,预计时间 + * * @param models */ public void updateOrderRouteInfo(List models) { @@ -1194,14 +1210,14 @@ public class TaxiModel { Logger.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); //转换成高德坐标系 - mRoutePoints = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,models); + mRoutePoints = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext, models); startDynamicCalculateRouteInfo(); } - public void startDynamicCalculateRouteInfo(){ - Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- "+mCurrentOCHOrder); + public void startDynamicCalculateRouteInfo() { + Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder); - if (mCurrentOCHOrder != null && mRoutePoints.size() == 0){//根据orderNo去查询 + if (mCurrentOCHOrder != null && mRoutePoints.size() == 0) {//根据orderNo去查询 queryOrderRouteList(mCurrentOCHOrder.orderNo); } @@ -1212,30 +1228,30 @@ public class TaxiModel { /** * 实时计算当前剩余里程和时间 */ - public void dynamicCalculateRouteInfo(){ + public void dynamicCalculateRouteInfo() { List lastPoints = CoordinateCalculateRouteUtil - .getRemainPointListByCompare(mRoutePoints,mLongitude,mLatitude); + .getRemainPointListByCompare(mRoutePoints, mLongitude, mLatitude); float lastSumLength = 0; - if (lastPoints.size() == 1){ //只是最后一个点,计算当前位置和最后一个点的距离 + if (lastPoints.size() == 1) { //只是最后一个点,计算当前位置和最后一个点的距离 lastSumLength = CoordinateUtils.calculateLineDistance( lastPoints.get(0).longitude, lastPoints.get(0).latitude, mLongitude, mLatitude); - }else { + } else { lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); } - double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6 ; //秒 + double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 Logger.d(M_TAXI + "dynamicCalculateRouteInfo" - , "---lastSumLength: "+lastSumLength+"----lastTime : "+lastTime); + , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime); mCurrentOCHOrder.decreaseTravelDistance(lastSumLength); if (mOrderStatusCallback != null) { mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime); } - reportOrderRemain((long)lastSumLength,(long)lastTime); + reportOrderRemain((long) lastSumLength, (long) lastTime); } /** @@ -1268,6 +1284,7 @@ public class TaxiModel { /** * 开始轮询计算剩余里程和时间 + * * @param isStart */ public void startOrStopCalculateRouteInfo(boolean isStart) { @@ -1282,6 +1299,7 @@ public class TaxiModel { /** * 上报订单剩余里程和时间 单位:KM, M, 单位:分钟 + * * @param lastSumLength * @param duration */ @@ -1289,33 +1307,8 @@ public class TaxiModel { if (mCurrentOCHOrder == null) return; TaxiServiceManager.getInstance().reportOrderRemain(mContext, mCurrentOCHOrder.orderNo , lastSumLength, duration, new TaxiServiceCallback() { - @Override - public void onSuccess(BaseData data) { - - } - - @Override - public void onFail(int code, String msg) { - - } - }); - } - - /** - * 调试使用,没有乘客屏时可使用此按钮跳过乘客验证 - */ - public void jumpPassengerCheckDone() { - if (mCurrentOCHOrder == null - || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.ArriveAtStart.getCode() - || mCurrentOCHOrder.passengerPhone == null || mCurrentOCHOrder.passengerPhone.length() < 5) { - ToastUtils.showShort("订单状态不匹配该操作或者手机号有误!"); - return; - } - TaxiServiceManager.getInstance().checkPhoneAndUpdateOrderStatus(mContext - , mCurrentOCHOrder.orderNo, mCurrentOCHOrder.passengerPhone.substring(mCurrentOCHOrder.passengerPhone.length() -4) - , new TaxiServiceCallback() { @Override - public void onSuccess(TaxiCheckPhoneBaseRespBean data) { + public void onSuccess(BaseData data) { } @@ -1326,4 +1319,135 @@ public class TaxiModel { }); } + /** + * 司机端可确认乘客已上车,调用后,后台将订单置为乘客已上车状态 + */ + public void jumpPassengerCheckDone() { + if (mCurrentOCHOrder == null + || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.ArriveAtStart.getCode()) { + ToastUtils.showShort("订单状态不匹配该操作或者订单为空!"); + return; + } + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().updatePassengerHasBoardedStatus(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + if (null != data && 0 == data.code){ + updateOrderStatus(TaxiOrderStatusEnum.UserArriveAtStart); + } + } + + @Override + public void onFail(int code, String msg) { + ToastUtils.showShort(msg); + } + }); + } + + public void startServicePilotDone(){ + if (mCurrentOCHOrder == null) return; + + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().startServicePilotDone(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + if (null != data && 0 == data.code){ + updateOrderStatus(TaxiOrderStatusEnum.OnTheWayToEnd); + } + } + + @Override + public void onFail(int code, String msg) { + } + }); + } + + public void arrivedStartPoint(){ + if (mCurrentOCHOrder == null) return; + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().arrivedStartPoint(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + if (null != data && 0 == data.code){ + updateOrderStatus(TaxiOrderStatusEnum.ArriveAtStart); + } + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + + public void arriveTerminal(){ + if (mCurrentOCHOrder == null) return; + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().arriveTerminal(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + if (null != data && 0 == data.code){ + updateOrderStatus(TaxiOrderStatusEnum.ArriveAtEnd); + } + } + + @Override + public void onFail(int code, String msg) { + + } + }); + } + + public void orderCompleted(){ + if (mCurrentOCHOrder == null) return; + TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); + result.lat = mLatitude; + result.lon = mLongitude; + TaxiServiceManager.getInstance().orderCompleted(mContext + , mCurrentOCHOrder.orderNo + , result + , new TaxiServiceCallback() { + @Override + public void onSuccess(TaxiDataBaseRespBean data) { + if (null != data && 0 == data.code){ + updateOrderStatus(TaxiOrderStatusEnum.JourneyCompleted); + } + } + + @Override + public void onFail(int code, String msg) { + ToastUtils.showShort(msg); + } + }); + } + //更新当前订单状态 + public void updateOrderStatus(final TaxiOrderStatusEnum orderStatus) { + if (mCurrentOCHOrder == null) { + return; + } + mCurrentOCHOrder.orderStatus = orderStatus.getCode(); + if (mOrderStatusCallback != null) { + mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder); + } + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java index e57b349243..8c8a6a7c0e 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java @@ -19,8 +19,8 @@ import com.mogo.och.taxi.bean.OrdersListQueryReqBean; import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; -import com.mogo.och.taxi.bean.TaxiCheckPhoneBaseRespBean; -import com.mogo.och.taxi.bean.TaxiCheckPhoneUpdateOrderReqBean; +import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; +import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import io.reactivex.Observable; @@ -227,13 +227,84 @@ interface TaxiServiceApiNew { , @Header("ticket") String ticket, @Query("orderNo") String orderNo); /** - * 提交用户输入的手机后4位、并进行状态扭转 用于调试跳过乘客屏使用 + * 司机端跳过乘客验证,订单状态流转为乘客已上车 * @param data * @return */ @Headers( {"Content-type:application/json;charset=UTF-8"} ) - @POST( "/autopilot-car-hailing/order/v2/vehicle/taxi/passenger/verification/phone" ) - Observable checkPhoneAndUpdateOrderStatus(@Header ("appId") String appId - , @Header("ticket") String ticket, @Body TaxiCheckPhoneUpdateOrderReqBean data); + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/passenger" ) + Observable updatePassengerHasBoardedStatus(@Header ("appId") String appId + , @Header("ticket") String ticket, @Body TaxiOrPassengerReadyReqBean data); + /** + * 司机端确认可开启自动驾驶 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/ready/pilot" ) + Observable confirmAutopilotConditionByDriver(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); + + /** + * 查询司机是否已确认可开启自动驾驶 + * @param appId + * @param ticket + * @param orderNo + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @GET( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/pilot/status" ) + Observable queryPilotStatus(@Header ("appId") String appId + , @Header("ticket") String ticket,@Query("orderNo") String orderNo); + + /** + * 开启自动驾驶成功 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/startServicePilot" ) + Observable startServicePilotDone(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); + + /** + * 达到乘客上车点 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/passenger/arriveStartPoint" ) + Observable arrivedStartPoint(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); + + /** + * 到达乘客目的地 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/arriveTerminal" ) + Observable arriveTerminal(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); + + /** + * 订单完成 + * @param appId + * @param ticket + * @param data + * @return + */ + @Headers( {"Content-type:application/json;charset=UTF-8"} ) + @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/orderCompleted" ) + Observable orderCompleted(@Header ("appId") String appId + , @Header("ticket") String ticket,@Body TaxiOrPassengerReadyReqBean data); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java index 2634838a10..ce93f197b6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.java @@ -29,8 +29,8 @@ import com.mogo.och.taxi.bean.OrdersListQueryReqBean; import com.mogo.och.taxi.bean.OrdersListQueryRespBean; import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean; import com.mogo.och.taxi.bean.QueryOrderRouteResp; -import com.mogo.och.taxi.bean.TaxiCheckPhoneBaseRespBean; -import com.mogo.och.taxi.bean.TaxiCheckPhoneUpdateOrderReqBean; +import com.mogo.och.taxi.bean.TaxiDataBaseRespBean; +import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean; import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean; import com.mogo.och.taxi.constant.TaxiConst; @@ -347,16 +347,93 @@ public class TaxiServiceManager { .subscribe(getSubscribeImpl(context,callback,"queryOrderRoute")); } - public void checkPhoneAndUpdateOrderStatus(Context context, String orderNo,String phone - ,TaxiServiceCallback callback){ - - mOCHTaxiServiceApi.checkPhoneAndUpdateOrderStatus( + public void confirmAutopilotConditionByDriver(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.confirmAutopilotConditionByDriver( MoGoAiCloudClientConfig.getInstance().getServiceAppId() ,MoGoAiCloudClientConfig.getInstance().getToken() - ,new TaxiCheckPhoneUpdateOrderReqBean(orderNo,phone)) + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(getSubscribeImpl(context, callback, "checkPhoneAndUpdateOrderStatus")); + .subscribe(getSubscribeImpl(context,callback,"confirmAutopilotConditionByDriver")); + } + + public void queryAutopilotStatus(Context context, String orderNo, + TaxiServiceCallback callback){ + mOCHTaxiServiceApi.queryPilotStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,orderNo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context,callback,"queryAutopilotStatus")); + } + + public void updatePassengerHasBoardedStatus(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + + mOCHTaxiServiceApi.updatePassengerHasBoardedStatus( + MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "updatePassengerHasBoardedStatus")); + } + + public void startServicePilotDone(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.startServicePilotDone(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "startServicePilotDone")); + } + + public void arrivedStartPoint(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.arrivedStartPoint(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "arrivedStartPoint")); + + } + + public void arriveTerminal(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.arriveTerminal(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "arriveTerminal")); + + } + + + public void orderCompleted(Context context, String orderNo + , TaxiOrPassengerReadyReqBean.Result loc + , TaxiServiceCallback callback){ + mOCHTaxiServiceApi.orderCompleted(MoGoAiCloudClientConfig.getInstance().getServiceAppId() + ,MoGoAiCloudClientConfig.getInstance().getToken() + ,new TaxiOrPassengerReadyReqBean(MoGoAiCloudClientConfig.getInstance().getSn() + ,orderNo,loc)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscribeImpl(context, callback, "arriveTerminal")); + } private SubscribeImpl getSubscribeImpl( diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 7050ba9d19..58b2927aef 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -65,7 +65,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().setCarStatusCallback(this); TaxiModel.getInstance().setControllerStatusCallback(this); TaxiModel.getInstance().setOrderStatusCallback(this); -// TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this); } private void releaseListeners() { @@ -73,7 +72,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().setCarStatusCallback(null); TaxiModel.getInstance().setControllerStatusCallback(null); TaxiModel.getInstance().setOrderStatusCallback(null); -// TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null); } private void runOnUIThread( Runnable executor ) { @@ -102,15 +100,18 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().jumpPassengerCheckDone(); } + /** + * 司机确认车辆环境可开启自动驾驶 + */ + public void confirmAutopilotConditionByDriver() { + TaxiModel.getInstance().confirmAutopilotConditionByDriver(); + } + // 更新出车/收车状态 public void updateCarStatus() { TaxiModel.getInstance().updateCarStatus(); } - // 更新当前订单状态(当前订单状态流转) - public void updateCurOrderStatus(TaxiOrderStatusEnum status) { - TaxiModel.getInstance().updateOCHOrderStatus(status); - } // 获取当前订单状态 public TaxiOrderStatusEnum getCurOrderStatus() { @@ -152,6 +153,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiModel.getInstance().queryDriverServiceData(); } + //更新订单已完成状态 + public void completeOrderService() { + TaxiModel.getInstance().orderCompleted(); + } + @Override public void onAutopilotArriveEnd() { @@ -260,6 +266,11 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS runOnUIThread(() -> mView.onGrabOrderFailed(order)); } + @Override + public void onDriverHasCheckedPilotCondition(boolean isSafe) { + runOnUIThread(() -> mView.onCheckPilotConditionSafe(isSafe)); + } + @Override public void onVRModeChanged(boolean isVRMode) { runOnUIThread(() -> mView.switchVRFlatMode(isVRMode)); @@ -274,8 +285,4 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS }); } } -// @Override -// public void routeResult(List models) { -// if (models != null && models.size() > 0) mView.routeResult(models); -// } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index e574dcf909..234c1ce94b 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -92,6 +92,7 @@ public abstract class BaseTaxiTabFragment { // 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_taxi_upgrade_red_tip); CallerHmiManager.INSTANCE.registerUpgradeTipsCallback(() -> mUpgradeTipIv); @@ -176,14 +172,14 @@ public abstract class BaseTaxiTabFragment { -// 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); @@ -484,16 +471,6 @@ public abstract class BaseTaxiTabFragment里程 " + "" + dis + "" + " "+disUnit+"" - + ",剩余 " + "" + (int)Math.ceil((double)timeInSecond/ 60f) + "" + " 分钟"; + + ",剩余 " + "" + min + "" + " 分钟"; if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) { //前往上车点 @@ -343,6 +345,12 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement speekVoice200mTipsOnce(); } mDistanceAndTime2.setText(Html.fromHtml(strHtml2)); + if (isFirstStartAutopilotDone){ + showNotice(String.format(getResources() + .getString(R.string.module_och_taxi_order_server_start_auto_tip), + dis,min)); + isFirstStartAutopilotDone = false; + } } } @@ -381,16 +389,13 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement private void startOrEndService() { if (mCurrentOrder == null) return; - if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == mCurrentOrder.orderStatus) {//点击了完成服务,结束订单并更新订单信息 - mTaxiFragment.completeOrderService(TaxiOrderStatusEnum.JourneyCompleted); - showNotice(getResources().getString(R.string.module_och_taxi_order_server_completed_tip)); - return; - } else if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == mCurrentOrder.orderStatus) {//点击服务,开启自动驾驶 - mTaxiFragment.startAutoPilot(); - showNotice(getResources().getString(R.string.module_och_taxi_order_server_start_auto_tip)); - return; - }else if (TaxiOrderStatusEnum.ArriveAtStart.getCode() == mCurrentOrder.orderStatus){ //到达乘客上车点,司机可跳过乘客屏认证 + if (TaxiOrderStatusEnum.ArriveAtStart.getCode() == mCurrentOrder.orderStatus){ //到达乘客上车点,司机可跳过乘客屏认证 mTaxiFragment.jumpPassengerCheckDone(); + }else if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == mCurrentOrder.orderStatus) {//点击此按钮,说明通知后端准备好开启自动驾驶的条件 + mTaxiFragment.confirmAutopilotConditionByDriver(); + }else if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == mCurrentOrder.orderStatus) {//点击了完成服务,结束订单并更新订单信息 + mTaxiFragment.completeOrderService(); + showNotice(getResources().getString(R.string.module_och_taxi_order_server_completed_tip)); } } @@ -412,6 +417,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_new_order)); mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng); showOrHideNavi(true); setOrRemoveMapMaker(true, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker); @@ -420,6 +426,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement case Cancel: mCurrentOrder = null; mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.VISIBLE); showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel)); showOrHideNavi(false); @@ -430,6 +437,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement case ArriveAtStart: case UserArriveAtStart: mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.VISIBLE); if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == ochStatus.getCode()){ showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text_check_success)); @@ -458,6 +466,7 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement case JourneyCompleted: mCurrentOrder = null; mTtsLessThan200Tip = 0; + isFirstStartAutopilotDone = true; mOrderCancel.setVisibility(View.GONE); showNotice("感谢您使用蘑菇智行,再见~"); showOrHideNavi(false); @@ -618,6 +627,22 @@ public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implement MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .removeMarkers(uuid); } } + + public void updateOrderUI() { + try { + updateOrderBottomBtn(); + }catch (NullPointerException e){ + mTaxiFragment.confirmAutopilotConditionByDriver(); + } + } + + public void updateOrderBottomBtn(){ + mOrderServerStatus.setText(R.string.module_och_taxi_order_server_wait_passenger_start); + mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF")); + GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类 + background.setColor(Color.parseColor("#4D1D5EF3")); + mOrderServerStatus.setClickable(false); + } /** * END */ diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index 29f01e6f71..47de505c5e 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -59,8 +59,10 @@ public class TaxiFragment extends BaseTaxiTabFragment ordersList) { - if (null == personalDialogFragment) + if (null == personalDialogFragment || personalDialogFragment.get() == null){ personalDialogFragment = new WeakReference<>(new TaxiPersonalDialogFragment(this)); + } personalDialogFragment.get().onOrdersListPageRefresh(ordersList); } @@ -351,8 +357,10 @@ public class TaxiFragment extends BaseTaxiTabFragment { TaxiModel.getInstance().setArriveAtEndStation(); }); + findViewById(R.id.test_bar_start_service_confirm).setOnClickListener(v -> { + TaxiModel.getInstance().setDriverConfirmCondition(); + }); findViewById(R.id.test_bar_on_the_way_to_end).setOnClickListener(v -> { - showNotice("自动驾驶已启动,请系好安全带"); if (!isStarting){ mPresenter.startAutoPilot(false); startOrStopLoadingAnim(true); @@ -382,5 +390,4 @@ public class TaxiFragment extends BaseTaxiTabFragment +