diff --git a/OCH/mogo-och-taxi-unmanned/.gitignore b/OCH/mogo-och-taxi-unmanned/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/build.gradle b/OCH/mogo-och-taxi-unmanned/build.gradle
new file mode 100644
index 0000000000..3d5e7a6590
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/build.gradle
@@ -0,0 +1,63 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ // buildToolsVersion rootProject.ext.android.buildToolsVersion
+ defaultConfig {
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode Integer.valueOf(VERSION_CODE)
+ versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
+
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments = [AROUTER_MODULE_NAME: project.getName()]
+ }
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ debug {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: "libs", include: ["*.jar"])
+ implementation rootProject.ext.dependencies.kotlinstdlibjdk7
+ implementation rootProject.ext.dependencies.androidxappcompat
+ implementation rootProject.ext.dependencies.arouter
+ 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
+ implementation rootProject.ext.dependencies.amapnavi3dmap
+
+ implementation project(":OCH:mogo-och-common-module")
+ compileOnly project(":libraries:mogo-map")
+
+}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/consumer-rules.pro b/OCH/mogo-och-taxi-unmanned/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/OCH/mogo-och-taxi-unmanned/gradle.properties b/OCH/mogo-och-taxi-unmanned/gradle.properties
new file mode 100644
index 0000000000..2d8ec933d9
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.och
+POM_ARTIFACT_ID=och-taxi
+VERSION_CODE=1
diff --git a/OCH/mogo-och-taxi-unmanned/proguard-rules.pro b/OCH/mogo-och-taxi-unmanned/proguard-rules.pro
new file mode 100644
index 0000000000..481bb43481
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/AndroidManifest.xml b/OCH/mogo-och-taxi-unmanned/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..fb42392054
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+ /
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/assets/map_style.data b/OCH/mogo-och-taxi-unmanned/src/main/assets/map_style.data
new file mode 100644
index 0000000000..b200669659
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/assets/map_style.data differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/assets/map_style_extra.data b/OCH/mogo-och-taxi-unmanned/src/main/assets/map_style_extra.data
new file mode 100644
index 0000000000..7aa8fa7b45
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/assets/map_style_extra.data differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/IMogoOCH.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/IMogoOCH.java
new file mode 100644
index 0000000000..3c724ee33c
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/IMogoOCH.java
@@ -0,0 +1,24 @@
+package com.mogo.och.taxi;
+
+import androidx.annotation.IdRes;
+import androidx.fragment.app.FragmentActivity;
+
+import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 网约车抽象接口
+ */
+interface IMogoOCH extends IMoGoFunctionProvider {
+
+ /**
+ * 初始化网约车容器
+ *
+ * @param activity
+ * @param containerId 容器ID
+ */
+ void createCoverage(FragmentActivity activity, @IdRes int containerId);
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/TaxiProvider.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/TaxiProvider.java
new file mode 100644
index 0000000000..76a54882a1
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/TaxiProvider.java
@@ -0,0 +1,100 @@
+package com.mogo.och.taxi;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.taxi.constant.TaxiConst;
+import com.mogo.och.taxi.ui.TaxiFragment;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 网约车-出租车
+ */
+@Route( path = TaxiConst.PATH )
+class TaxiProvider implements IMogoOCH {
+
+ private static final String TAG = "TaxiProvider";
+ private TaxiFragment ochTaxiFragment;
+ private FragmentActivity mActivity;
+ private int mContainerId;
+ @Override
+ public void init( Context context ) {
+ CallerLogger.INSTANCE.d( M_TAXI + TAG, "init" );
+ }
+
+ /**
+ * 进入鹰眼模式,设置手势缩放地图失效
+ */
+ private void stepIntoVrMode() {
+ CallerLogger.INSTANCE.d( M_TAXI + TAG, "进入vr模式" );
+ CallerMoGoUiSettingManager.INSTANCE.stepInNightMode();//夜间模式 状态栏字体颜色变黑
+ }
+
+ private void showFragment() {
+ FragmentManager supportFragmentManager = mActivity.getSupportFragmentManager();
+ if (ochTaxiFragment == null) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "准备add fragment======");
+ Fragment fragmentByTag = supportFragmentManager.findFragmentByTag(TaxiFragment.TAG);
+ if (fragmentByTag instanceof TaxiFragment){
+ ochTaxiFragment = (TaxiFragment) fragmentByTag;
+ }else {
+ ochTaxiFragment = new TaxiFragment();
+ }
+
+ if (!ochTaxiFragment.isAdded()){
+ supportFragmentManager.beginTransaction().add(mContainerId, ochTaxiFragment
+ ,TaxiFragment.TAG).commitAllowingStateLoss();
+ }
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "准备show fragment");
+ supportFragmentManager.beginTransaction().show(ochTaxiFragment).commitAllowingStateLoss();
+ }
+
+ private void hideFragment(){
+ if (ochTaxiFragment != null){
+ mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiFragment).commitAllowingStateLoss();
+ }
+ }
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
+ this.mActivity = fragmentActivity;
+ this.mContainerId = integer;
+ showFragment();
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+ //若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠
+ if (mActivity == null) return;
+ mActivity.finish();
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/CarHeartbeatReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/CarHeartbeatReqBean.java
new file mode 100644
index 0000000000..d82de2425e
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/CarHeartbeatReqBean.java
@@ -0,0 +1,26 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.och.taxi.constant.TaxiConst;
+
+import java.util.UUID;
+
+/**
+ * Created on 2021/9/16
+ *
+ * 上传车机心跳信息请求数据
+ */
+public class CarHeartbeatReqBean {
+ public String sn;
+ public double lon; //经度
+ public double lat; //纬度
+ public String msgId; //心跳信息唯一标识
+ public int interval; //上报间隔,单位秒,非必传,默认60秒
+
+ public CarHeartbeatReqBean(String sn, double lon, double lat) {
+ this.sn = sn;
+ this.lon = lon;
+ this.lat = lat;
+ this.msgId = UUID.randomUUID().toString();
+ this.interval = (int) (TaxiConst.LOOP_PERIOD_60S / 1000);
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/DriverServiceDataRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/DriverServiceDataRespBean.java
new file mode 100644
index 0000000000..15d47effd0
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/DriverServiceDataRespBean.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/17
+ *
+ * 司机运营数据返回数据结构
+ */
+public class DriverServiceDataRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public long timeDuration; //当日在线时长,单位秒
+ public long orderNum; //当日完成订单数
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/DriverStatusUpdateReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/DriverStatusUpdateReqBean.java
new file mode 100644
index 0000000000..cb018309d7
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/DriverStatusUpdateReqBean.java
@@ -0,0 +1,14 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 状态更新请求数据结构
+ */
+public class DriverStatusUpdateReqBean {
+ public String sn;
+
+ public DriverStatusUpdateReqBean(String sn) {
+ this.sn = sn;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderCancelReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderCancelReqBean.java
new file mode 100644
index 0000000000..23187c3e81
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderCancelReqBean.java
@@ -0,0 +1,20 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 司机取消订单请求的数据结构
+ */
+public class OrderCancelReqBean {
+ public String sn;
+ public String orderNo; //订单号(必须)
+ public int cancelType; //取消类型(必须)
+ public String cancelReason; //取消原因(必须)
+
+ public OrderCancelReqBean(String sn, String orderNo, int cancelType, String cancelReason) {
+ this.sn = sn;
+ this.orderNo = orderNo;
+ this.cancelType = cancelType;
+ this.cancelReason = cancelReason;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabReqBean.java
new file mode 100644
index 0000000000..da925b8359
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabReqBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created on 2021/9/7
+ *
+ * (预约单)抢单动作的请求数据结构
+ */
+public class OrderGrabReqBean {
+ public String sn;
+ public String orderNo;
+
+ public OrderGrabReqBean(String sn, String orderNo) {
+ this.sn = sn;
+ this.orderNo = orderNo;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabRespBean.java
new file mode 100644
index 0000000000..60cc8b4b2a
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabRespBean.java
@@ -0,0 +1,12 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/7
+ *
+ * (预约单)抢单动作的返回数据结构
+ */
+public class OrderGrabRespBean extends BaseData {
+ public String data; // 暂不使用 返回的orderNo,不再是orderId
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabStatusQueryRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabStatusQueryRespBean.java
new file mode 100644
index 0000000000..3fe8d877af
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderGrabStatusQueryRespBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/7
+ *
+ * (预约单)查询抢单结果的返回数据结构
+ */
+public class OrderGrabStatusQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public int grabStatus; //0:抢单中; 1:抢单结束,匹配; 2:抢单结束,匹配到其他司机;3:订单已取消;4:非法,不是选择的自己
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryReqBean.java
new file mode 100644
index 0000000000..207668db4f
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryReqBean.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单信息请求数据结构
+ */
+public class OrderQueryReqBean {
+
+ public String sn;
+ public String orderNo;
+
+ public OrderQueryReqBean(String sn, String orderNo) {
+ this.sn = sn;
+ this.orderNo = orderNo;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java
new file mode 100644
index 0000000000..3a0a60ccd0
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java
@@ -0,0 +1,105 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单返回数据结构
+ */
+public class OrderQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result implements Comparable{
+ // 订单no
+ public String orderNo;
+ // 订单类型
+ public int orderType; //1即时单 2预约单
+ // 订单状态
+ public int orderStatus;
+ // 订单运营类型 (9出租车,10小巴)
+ public int businessType;
+ // 起始站点id
+ public int startSiteId;
+ // 起始站点名称
+ public String startSiteAddr;
+ // 起始站点坐标
+ public List startSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List startSiteGcjPoint; //高德坐标,用于本地计算距离 [lon,lat]
+ // 终点站点id
+ public int endSiteId;
+ // 终点站点名称
+ public String endSiteAddr;
+ // 终点站点坐标
+ public List endSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List endSiteGcjPoint; //高德坐标,用于计算距离 [lon,lat]
+
+ // 车牌号
+ public String carNumber;
+ //订单创建时间戳
+ public long createTime;
+ //开始服务时间戳:司机点击'开始服务'后订单状态更新成功的时间
+ public long startTime;
+ //预计用车时间:预约单=下单时的预约用车时间;即时单=派单成功的时间+预估的达到上车点的时间
+ public long bookingTime;
+ //乘客手机号
+ public String passengerPhone;
+ //订单多少乘客
+ public String passengerNum;
+
+ //线路轨迹相关字段
+ 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 csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“”
+ public String csvFileMd5DPQP = ""; //轨迹文件md5,默认“”
+ public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“”
+ public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“”
+ public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
+
+ // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km
+ public double travelDistance;
+
+ /**
+ * @param distance
+ */
+ public void decreaseTravelDistance( double distance ) {
+ travelDistance = ( ( float ) distance / 1000f );
+ if ( travelDistance < 0 ) {
+ travelDistance = 0;
+ }
+ }
+
+ @Override
+ public int compareTo(Result o) {
+ boolean isEqual = this.orderNo.equals(o.orderNo);
+ return isEqual ? 0 : 1;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Result result = (Result) o;
+ return Objects.equals(orderNo, result.orderNo) &&
+ orderType == result.orderType &&
+ orderStatus == result.orderStatus &&
+ businessType == result.businessType;
+
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderNo, orderType, orderStatus, businessType, startSiteId,
+ startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
+ endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java
new file mode 100644
index 0000000000..caa2be9c66
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created on 2021/9/7
+ *
+ * 查询订单路径信息(起始点里程、预估时间等)请求数据结构
+ */
+public class OrderQueryRouteInfoReqBean {
+ public String sn;
+ public String orderNo;
+
+ public OrderQueryRouteInfoReqBean(String sn, String orderNo) {
+ this.sn = sn;
+ this.orderNo = orderNo;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java
new file mode 100644
index 0000000000..02cc314c59
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java
@@ -0,0 +1,22 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/7
+ *
+ * 查询订单路径信息(起始点里程、预估时间等)返回数据结构
+ */
+public class OrderQueryRouteInfoRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ // 到上车点
+ public long durationToStart; //司机绑定时的位置距离上车点时长,单位:秒
+ public long distanceToStart; //司机绑定时的位置距离上车点距离,单位:米
+
+ // 起点至终点
+ public long durationToEnd; //订单上车点到目的地的时长,单位:秒
+ public long distanceToEnd; //订单上车点到目的地的距离,单位:米
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderRouteUpdateReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderRouteUpdateReqBean.java
new file mode 100644
index 0000000000..470869b5a8
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderRouteUpdateReqBean.java
@@ -0,0 +1,23 @@
+package com.mogo.och.taxi.bean;
+
+import java.util.List;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 订单状态更新请求数据结构
+ */
+public class OrderRouteUpdateReqBean {
+ public String orderNo;
+ public List points;
+
+ public static class Result {
+ public Double latitude;
+ public Double longitude;
+ }
+
+ public OrderRouteUpdateReqBean(String orderNo, List points) {
+ this.orderNo = orderNo;
+ this.points = points;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderStatusUpdateReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderStatusUpdateReqBean.java
new file mode 100644
index 0000000000..f31d0cc70c
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrderStatusUpdateReqBean.java
@@ -0,0 +1,18 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 订单状态更新请求数据结构
+ */
+public class OrderStatusUpdateReqBean {
+ public String sn;
+ public String orderNo;
+ public int orderStatus;
+
+ public OrderStatusUpdateReqBean(String sn, String orderNo, int orderStatus) {
+ this.sn = sn;
+ this.orderNo = orderNo;
+ this.orderStatus = orderStatus;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersInServiceQueryRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersInServiceQueryRespBean.java
new file mode 100644
index 0000000000..0dbe003f56
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersInServiceQueryRespBean.java
@@ -0,0 +1,19 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * 查询全部服务中/待服务订单的返回数据
+ */
+public class OrdersInServiceQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List servicing; //服务中订单
+ public List waitService; //待服务订单
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryReqBean.java
new file mode 100644
index 0000000000..de74f2f794
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryReqBean.java
@@ -0,0 +1,19 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单列表请求数据结构
+ */
+public class OrdersListQueryReqBean {
+
+ public String sn;
+ public int page; //页码,从0开始
+ public int size; //每页条数
+
+ public OrdersListQueryReqBean(String sn, int page, int size) {
+ this.sn = sn;
+ this.page = page;
+ this.size = size;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryRespBean.java
new file mode 100644
index 0000000000..7627953a54
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryRespBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+public class OrdersListQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List orders;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersNewBookingQueryRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersNewBookingQueryRespBean.java
new file mode 100644
index 0000000000..69f7e0341c
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/OrdersNewBookingQueryRespBean.java
@@ -0,0 +1,18 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * 查询新到的预约单的返回数据结构
+ */
+public class OrdersNewBookingQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List orders; // 返回的是order的orderNo集合, 不再是orderId集合
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/QueryOrderRouteResp.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/QueryOrderRouteResp.java
new file mode 100644
index 0000000000..0c21598580
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/QueryOrderRouteResp.java
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.bean;
+
+import com.amap.api.maps.model.LatLng;
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+public class QueryOrderRouteResp extends BaseData {
+ public List data;
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java
new file mode 100644
index 0000000000..8d6ca6d4df
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaxiDataBaseRespBean.java
@@ -0,0 +1,12 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单返回数据结构
+ */
+public class TaxiDataBaseRespBean extends BaseData {
+ public Object data;
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/TaxiOrPassengerReadyReqBean.java
new file mode 100644
index 0000000000..5bb888fcc9
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/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-unmanned/src/main/java/com/mogo/och/taxi/bean/UpdateOrderDisAndTimeReqBean.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/UpdateOrderDisAndTimeReqBean.java
new file mode 100644
index 0000000000..29e7e2b0e8
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/bean/UpdateOrderDisAndTimeReqBean.java
@@ -0,0 +1,14 @@
+package com.mogo.och.taxi.bean;
+
+
+public class UpdateOrderDisAndTimeReqBean {
+ public String orderNo; //订单号(必须)
+ public long distance; //剩余里程 单位米(必须)
+ public long duration; //剩余时间 单位秒(必须)
+
+ public UpdateOrderDisAndTimeReqBean(String orderNo, long distance, long duration) {
+ this.orderNo = orderNo;
+ this.distance = distance;
+ this.duration = duration;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java
new file mode 100644
index 0000000000..481bb3c470
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.callback;
+
+
+import com.amap.api.maps.model.LatLng;
+import com.mogo.eagle.core.data.map.MogoLocation;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/1
+ */
+public interface IOCHTaxiAutopilotPlanningCallback {
+ void setLineMarker(LatLng startStation,LatLng endStation);
+ void routeResult(List routeArrivied,List routeArriving, MogoLocation location);
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java
new file mode 100644
index 0000000000..278829580f
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiADASStatusCallback.java
@@ -0,0 +1,26 @@
+package com.mogo.och.taxi.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
+ */
+public interface ITaxiADASStatusCallback {
+ // 自动驾驶触发的已到达目的地:暂未用到
+ void onAutopilotArriveEnd();
+
+ // 自动驾驶可用状态
+ void onAutopilotEnable();
+
+ // 自动驾驶不可用状态
+ void onAutopilotDisable();
+
+ // 自动驾驶运行中
+ void onAutopilotRunning();
+
+ //人机共驾
+ void onManMachineCoDriving();
+
+ //自驾返回失败
+ void onStartAdasFailure();
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiCarOperationalCallback.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiCarOperationalCallback.java
new file mode 100644
index 0000000000..40b352acfa
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiCarOperationalCallback.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.callback;
+
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:接单车状态变更 登录状态变更
+ */
+public interface ITaxiCarOperationalCallback {
+
+ void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum);
+
+ void onOrdersListPageRefresh(List ordersList);
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java
new file mode 100644
index 0000000000..070559f406
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiControllerStatusCallback.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.callback;
+
+import com.mogo.eagle.core.data.map.MogoLocation;
+
+/**
+ * Created on 2021/9/10
+ *
+ * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
+ */
+public interface ITaxiControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(MogoLocation location);
+ //开始开启自动驾驶
+ void startOpenAutopilot();
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java
new file mode 100644
index 0000000000..7ffc67eb0f
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/callback/ITaxiOrderStatusCallback.java
@@ -0,0 +1,55 @@
+package com.mogo.och.taxi.callback;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
+ */
+public interface ITaxiOrderStatusCallback {
+ // 进行中单变更:暂未用到
+ void onOrdersInServiceChanged(@NonNull List inServiceList);
+ // 待服务单变更
+ void onOrdersWaitServiceChanged(@NonNull List waitServiceList);
+
+ // 当前进行单状态变更:新到进行中订单、进行中单状态变更
+ void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
+ // 当前订单取消完成:用于司机主动取消订单的结果反馈
+ void onCurrentOrderCancelDone();
+ // 待服务单被取消
+ void onOrderCancelDone(String orderNo);
+ // 当前订单route信息查询反馈
+ void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
+
+ // 新到预约单
+ void onNewBookingOrderGot(OrderQueryRespBean.Result order);
+
+ // 执行抢单动作完成:可进入抢单中状态
+ void onGrabOrderExecuteDone();
+
+ // 抢到预约单
+ void onGrabOrderSuccess(OrderQueryRespBean.Result order);
+
+ // 未抢到预约单
+ void onGrabOrderFailed(OrderQueryRespBean.Result order);
+
+ // 司机已确认开启自动驾驶环境
+ void onDriverHasCheckedPilotCondition(boolean isSafe);
+
+ /**
+ * 导航到目的地
+ * @param isAmap 是否是高德导航
+ * @param isShow 是否显示导航地图(否播报声音)
+ */
+ void onNaviToEnd(boolean isAmap, boolean isShow);
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt
new file mode 100644
index 0000000000..9b7e82ade1
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiConst.kt
@@ -0,0 +1,77 @@
+package com.mogo.och.taxi.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class TaxiConst {
+ companion object {
+
+ // OCH arouter 路由path
+ const val PATH = "/driver/api"
+
+ // 到达起始点围栏
+ const val ARRIVE_AT_START_STATION_DISTANCE = 15 //围栏由20m改为50m 再次改为15m
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+ // 开始服务启动自动驾驶等待时间(埋点上传)
+ const val LOOP_PERIOD_15S = 15 * 1000L
+ // 轮询查询进行中/待服务订单的间隔时间 2秒
+ const val LOOP_PERIOD_2S = 2 * 1000L
+ // 轮询查询新到预约单 1秒
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ // 下发给MEC轨迹信息间隔时间 10秒
+ const val LOOP_PERIOD_10S = 10 * 1000L
+ // 尝试下发给MEC轨迹最多10次
+ const val LOOP_SEND_TRAJ_TIMES = 10
+
+ // 订单信息
+ const val SP_KEY_OCH_TAXI_ORDER = "SP_KEY_OCH_TAXI_ORDER"
+
+ //起点UUID
+ const val TAXI_START_MAP_MAKER = "taxi_start_map_maker"
+ //终点UUID
+ const val TAXI_END_MAP_MAKER = "taxi_end_map_maker"
+
+ //演示:V 测试:内测
+ const val DEMO_USER = "V"
+ const val TEST_USER = "内测"
+
+ // 埋点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_LINE_ID = "line_id"
+ const val EVENT_PARAM_ORDER_NUMBER = "order_num"
+ const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false
+ const val EVENT_PARAM_START_FAILURE_CODE = "start_autopilot_failure_code" // 启动自驾失败code
+ const val EVENT_PARAM_START_FAILURE_MSG = "start_autopilot_failure_msg" // 启动自驾失败原因
+ const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号
+ const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false
+ // 埋点key:开启自动驾驶前已识别的异常,会导致无法开启自驾
+ const val EVENT_KEY_AP_UNABLE_START_REASON = "event_key_och_taxi_ap_unable_start_reason"
+ const val EVENT_PARAM_UNABLE_START_REASON = "unable_start_reason";
+
+ // 实时计算当前剩余里程和时间 间隔 2秒
+ const val LOOP_CALCULATEROUTE_2S = 2 * 1000L
+
+ //总里程/平均车速。(bus的平均里程:25km/h,taxi的平均里程:38km/h),单位为:分钟,不足1分钟时,显示1分钟。
+ const val TAXI_AVERAGE_SPEED = 38
+
+ /**
+ * 订单起终点Marker类型
+ */
+ const val TYPE_MARKER_TAXI_ORDER = "TYPE_MARKER_TAXI_ORDER"
+
+ const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L
+
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiDriverRoleEnum.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiDriverRoleEnum.kt
new file mode 100644
index 0000000000..07572efcd4
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiDriverRoleEnum.kt
@@ -0,0 +1,11 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * Created on 2021/12/7
+ * 1 运营, 2 测试, 3演示
+ */
+enum class TaxiDriverRoleEnum(val code: Int) {
+ OPERATION( 1),
+ TEST( 2),
+ DEMO( 3);
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOpenOrderStatusEnum.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOpenOrderStatusEnum.kt
new file mode 100644
index 0000000000..b583f28d3c
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOpenOrderStatusEnum.kt
@@ -0,0 +1,27 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * Created on 2022/08/19
+ *
+ *
+ * 0 初始状态,
+ * 10 接单状态 可接单,
+ * 20 暂停接到哪 不可接单,
+ */
+enum class TaxiOpenOrderStatusEnum(val code: Int) {
+ None( 0 ),
+ Ordering( 10),
+ UnOrdering( 20),;
+
+ companion object {
+ @JvmStatic
+ fun valueOf(code: Int): TaxiOpenOrderStatusEnum? {
+ for (value in values()) {
+ if (value.code == code) {
+ return value
+ }
+ }
+ return None
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderCancelReasons.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderCancelReasons.kt
new file mode 100644
index 0000000000..c55993eddf
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderCancelReasons.kt
@@ -0,0 +1,54 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * 司机端取消订单的原因定义
+ * Created on 2021/12/7
+ *
+ * * String int
+ * 进行中订单:
+ * 车况异常 0
+ * 设备异常 1
+ * 电量不足 2
+ * 身体不适 3
+ * 乘客未到 4
+ * 乘客中途下车 5
+ * 1099前都可用
+ *
+ * 待服务订单:
+ * 2000 车辆故障
+ * 2001 乘客联系取消
+ * 2002 行程冲突
+ * 2003 车电量不足
+ * 2004 其他
+ */
+enum class TaxiOrderCancelReasons(val type: Int, val msg: String) {
+ CarBroken(1000, "车况异常"),
+ DeviceBroken(1001, "设备异常"),
+ BatteryLow(1002, "电量不足"),
+ DriverIsIll(1003, "身体不适"),
+ PassengerNotArrive(1004, "乘客未到"),
+ PassengerStopOver(1005, "乘客中途下车"),
+ PassengerCancel(1006, "乘客联系安全员取消"),
+ UnContractPassenger(1007, "联系不上乘客"),
+ JourneyConflict(1008, "行程冲突"),
+ StartStationFaraway(1009,"距离过远 无法接单"),
+ Other( 1010, "其他原因"),
+
+ BookCarBroken(2000, "车辆故障"),
+ BookPassengerCancel(2001, "乘客联系取消"),
+ BookJourneyConflict(2002, "行程冲突"),
+ BookBatteryLow(2003, "车电量不足"),
+ BookOther(2004, "其他");
+
+ companion object {
+ @JvmStatic
+ fun getType(msg: String): Int {
+ for (value in values()) {
+ if (value.msg == msg) {
+ return value.type
+ }
+ }
+ return 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderStatusEnum.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderStatusEnum.kt
new file mode 100644
index 0000000000..1f703d0f2a
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderStatusEnum.kt
@@ -0,0 +1,47 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * Created on 2021/12/7
+ *
+ * * Old code:START
+ * 未派单 0
+ * 去往上车站点 1
+ * 车辆已到达上车站点 2
+ * 乘客已到达上车站点 3
+ * 去往下车站点 4
+ * 到达下车站点 5
+ * 已完成 6
+ * 已取消 7
+ * Old code:END
+ *
+ * 0 订单创建(为派单),
+ * 10 已派上司机(司机去往上车点),
+ * 20 司机到达上车点,
+ * 30 乘客到达上车点,
+ * 40 服务中(去往目的地),
+ * 50 到达目的地,
+ * 60 已完成,
+ * 70 已取消
+ */
+enum class TaxiOrderStatusEnum(val code: Int) {
+ None( 0 ),
+ OnTheWayToStart( 10),
+ ArriveAtStart( 20),
+ UserArriveAtStart( 30),
+ OnTheWayToEnd( 40),
+ ArriveAtEnd( 50),
+ JourneyCompleted(60),//行程完成
+ Cancel( 70);
+
+ companion object {
+ @JvmStatic
+ fun valueOf(code: Int): TaxiOrderStatusEnum? {
+ for (value in values()) {
+ if (value.code == code) {
+ return value
+ }
+ }
+ return None
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderTypeEnum.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderTypeEnum.kt
new file mode 100644
index 0000000000..34b09c6cc7
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxiOrderTypeEnum.kt
@@ -0,0 +1,11 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * RoboTaxi订单类型声明
+ *
+ * Created on 2021/12/6
+ */
+enum class TaxiOrderTypeEnum(val type: Int) {
+ Instant(1), // 即时单
+ Reserved(2) // 预约单
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt
new file mode 100644
index 0000000000..7a42236e8b
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/constant/TaxtServingStatusManager.kt
@@ -0,0 +1,38 @@
+package com.mogo.och.taxi.constant
+
+object TaxtServingStatusManager {
+
+ /**
+ * 接单状态
+ */
+ private var openOrderStatus: TaxiOpenOrderStatusEnum = TaxiOpenOrderStatusEnum.None
+
+ // region 是否可用接单
+ @JvmStatic
+ fun isOpeningOrderStatus():Boolean{
+ if(openOrderStatus==TaxiOpenOrderStatusEnum.Ordering){
+ return true
+ }
+ return false
+ }
+ @JvmStatic
+ fun setOpenOrderStatus(status: Int) {
+ when (status) {
+ 0 -> {
+ this.openOrderStatus = TaxiOpenOrderStatusEnum.UnOrdering
+ }
+ 1 -> {
+ this.openOrderStatus = TaxiOpenOrderStatusEnum.Ordering
+ }
+ else -> {
+ this.openOrderStatus = TaxiOpenOrderStatusEnum.None
+ }
+ }
+ }
+ @JvmStatic
+ fun getOpenOrderStatus(): TaxiOpenOrderStatusEnum {
+ return openOrderStatus
+ }
+
+ //endregion
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.java
new file mode 100644
index 0000000000..edae674246
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModel.java
@@ -0,0 +1,1728 @@
+package com.mogo.och.taxi.model;
+
+import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_CODE_OCH_TAXI_START_AUTOPILOT;
+import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_ADAS;
+import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.amap.api.maps.model.LatLng;
+import com.elegant.network.utils.GsonUtil;
+import com.mogo.aicloud.services.socket.IMogoOnMessageListener;
+import com.mogo.commons.module.intent.IMogoIntentListener;
+import com.mogo.commons.module.intent.IntentManager;
+import com.mogo.commons.module.status.IMogoStatusChangedListener;
+import com.mogo.commons.module.status.MogoStatusManager;
+import com.mogo.commons.module.status.StatusDescriptor;
+import com.mogo.eagle.core.data.BaseData;
+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.MogoLocation;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
+import com.mogo.eagle.core.utilcode.util.CoordinateUtils;
+import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager;
+import com.mogo.och.common.module.biz.common.socketmessage.data.OCHOperationalMessage;
+import com.mogo.och.common.module.biz.constant.LoginStatusManager;
+import com.mogo.och.common.module.biz.constant.OchCommonConst;
+import com.mogo.och.common.module.biz.network.OchCommonServiceCallback;
+import com.mogo.och.common.module.biz.provider.LoginService;
+import com.mogo.och.common.module.callback.OchAdasStartFailureCallback;
+import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager;
+import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
+import com.mogo.och.common.module.manager.distancemamager.IDistanceListener;
+import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener;
+import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager;
+import com.mogo.och.common.module.map.AmapNaviToDestinationModel;
+import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
+import com.mogo.och.common.module.utils.PinYinUtil;
+import com.mogo.och.common.module.utils.ToastUtilsOch;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.bean.OrderGrabRespBean;
+import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean;
+import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean;
+import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
+import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
+import com.mogo.och.taxi.bean.QueryOrderRouteResp;
+import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
+import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
+import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
+import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
+import com.mogo.och.taxi.callback.ITaxiCarOperationalCallback;
+import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
+import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback;
+import com.mogo.och.taxi.constant.TaxiConst;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.constant.TaxiOrderTypeEnum;
+import com.mogo.och.taxi.constant.TaxtServingStatusManager;
+import com.mogo.och.taxi.network.TaxiServiceManager;
+import com.mogo.och.taxi.utils.OrderUtil;
+import com.mogo.och.taxi.utils.TaxiAnalyticsManager;
+import com.mogo.och.taxi.utils.TaxiTrajectoryManager;
+import com.zhjt.service.chain.ChainLog;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import io.reactivex.exceptions.UndeliverableException;
+import io.reactivex.functions.Consumer;
+import io.reactivex.plugins.RxJavaPlugins;
+import mogo.telematics.pad.MessagePad;
+import mogo_msg.MogoReportMsg;
+import system_master.SystemStatusInfo;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车 - 出租车业务逻辑处理
+ */
+public class TaxiModel {
+
+ private static final String TAG = TaxiModel.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final TaxiModel INSTANCE = new TaxiModel();
+ }
+
+ public static TaxiModel getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Context mContext;
+ private volatile String mPrevOrderNo = ""; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出)
+ private volatile OrderQueryRespBean.Result mNewBookingOrder; //新到待抢预约单
+ private volatile OrderQueryRespBean.Result mCurrentOCHOrder; //当前订单
+ private volatile List mInServiceList = Collections.emptyList(); //进行中订单
+ private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单
+
+ private ITaxiADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关
+ private ITaxiCarOperationalCallback mCarOperationalCallback; //Model->Presenter:登录状态和司机今日接单状态
+ private ITaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+ private ITaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更
+ private IOCHTaxiAutopilotPlanningCallback mAutopilotPlanningCallback;
+
+ private volatile boolean isRestartAutopilot = false;
+
+ private final List mRoutePoints = new ArrayList<>();
+ private int mPreRouteIndex = 0;
+
+ private double mLongitude, mLatitude;
+ private MogoLocation mLocation = null;
+
+ private LoginService loginService;
+
+ private TaxiModel() {
+ }
+
+ public void setMoGoAutopilotPlanningListener(IOCHTaxiAutopilotPlanningCallback
+ moGoAutopilotPlanningCallback) {
+ this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
+ }
+
+ public void setADASStatusCallback(ITaxiADASStatusCallback callback) {
+ this.mADASStatusCallback = callback;
+ }
+
+ public void setCarStatusCallback(ITaxiCarOperationalCallback callback) {
+ this.mCarOperationalCallback = callback;
+ }
+
+ public void setControllerStatusCallback(ITaxiControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+
+ public void setOrderStatusCallback(ITaxiOrderStatusCallback callback) {
+ this.mOrderStatusCallback = callback;
+ }
+
+ public void init(Context context) {
+ mContext = context.getApplicationContext();
+ initListeners();
+ loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation();
+
+ // TODO: 2021/8/27 因需要通过此回调的location进行坐标上传,暂改为全程监听,退出后再反注册,
+ // 待后续整体调整location获取来源
+// if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) {
+// apis.getLocationInfoApi().start();
+// }
+
+ //2022.1.28
+ // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
+ // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with
+ RxJavaPlugins.setErrorHandler(new Consumer() {
+ @Override
+ public void accept(Throwable e) {
+ if (e instanceof UndeliverableException) {
+ e = e.getCause();
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "UndeliverableException");
+ }
+ if ((e instanceof IOException)) {//
+ // fine, irrelevant network problem or API that throws on cancellation
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "IOException");
+ return;
+ }
+ if (e instanceof InterruptedException) {
+ // fine, some blocking code was interrupted by a dispose call
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "InterruptedException");
+ return;
+ }
+ if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
+ // that's likely a bug in the application
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "NullPointerException or IllegalArgumentException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ if (e instanceof IllegalStateException) {
+ // that's a bug in RxJava or in a custom operator
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "IllegalStateException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "Undeliverable exception");
+ }
+ });
+ }
+
+ public void release() {
+ startOrStopOrderLoop(false);
+ startOrStopCalculateRouteInfo(false);
+ releaseListeners();
+ loginService = null;
+ }
+
+ private void initListeners() {
+ // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口
+ CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener);
+ IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener);
+ MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ //定位监听, 传false是高德坐标系
+ CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10, mMapLocationListener);
+
+ //2021.11.1 自动驾驶路线规划接口
+ CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener);
+
+ //开启自驾后 异常信息返回
+ OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener);
+
+ OCHSocketMessageManager.INSTANCE.registerSocketMessageListener(
+ OCHSocketMessageManager.msgMonitorType,
+ mMogoOnMessageListener);
+
+ AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext);
+
+ TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG,distanceListener);
+ TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener);
+
+ }
+
+ private final IMogoOnMessageListener mMogoOnMessageListener =
+ new IMogoOnMessageListener() {
+ @Override
+ public Class target() {
+ return OCHOperationalMessage.class;
+ }
+
+ @Override
+ public void onMsgReceived(OCHOperationalMessage obj) {
+ if (obj == null) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onMsgReceived = null");
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onMsgReceived = " + obj.getMessage());
+ OCHSocketMessageManager.INSTANCE.pushAppOperationalMsgBox(obj.getPushTimeStamp(),
+ obj.getMessage(), OCHSocketMessageManager.OPERATION_SYSTEM);
+ }
+ };
+
+ private void releaseListeners() {
+ MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ // 注销地图监听
+ CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG);
+
+ OCHSocketMessageManager.INSTANCE.releaseSocketMessageListener(OCHSocketMessageManager.msgMonitorType);
+
+ CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener);
+ CallerPlanningRottingListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
+ OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null);
+
+ AbnormalFactorsLoopManager.INSTANCE.stopLoopAbnormalFactors();
+ }
+
+ public void startOrStopOrderLoop(boolean start) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ TaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop();
+ TaxiModelLoopManager.getInstance().startNewBookingOrderLoop();
+ TaxiModelLoopManager.getInstance().startHeartbeatLoop();
+ } else {
+ TaxiModelLoopManager.getInstance().stopInAndWaitOrdersLoop();
+ TaxiModelLoopManager.getInstance().stopNewBookingOrderLoop();
+ TaxiModelLoopManager.getInstance().stopHeartbeatLoop();
+ }
+ }
+
+ //更新接单状态
+ public void updateCarStatus() {
+ if (!LoginStatusManager.isLogin()) {
+ loginService.queryLoginStatusByNet();
+ return;
+ }
+ TaxiServiceManager.changeOrderServing(mContext, TaxtServingStatusManager.isOpeningOrderStatus(),
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code) {
+ loginService.queryLoginStatusByNet();
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtilsOch.showWithCodeMessage(code, msg);
+ }
+ });
+
+ }
+
+ /**
+ * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等)
+ *
+ * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时,
+ * 才更新最新进行中单到本地
+ */
+ public void queryInAndWaitOrders() {
+ TaxiServiceManager.queryOrdersInAndWaitService(mContext,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrdersInServiceQueryRespBean data) {
+ if (data == null || data.data == null) {
+ return;
+ }
+
+ //1. 处理进行中订单
+ mInServiceList = data.data.servicing;
+ if (data.data.servicing != null && !data.data.servicing.isEmpty()) {
+ // 1.1. 当存在进行中单时:对本地currentOrder进行更新
+ if (mCurrentOCHOrder == null) {
+ //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ } else {
+ //1.1.2. 当本地有currentOrder:
+ //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新
+ //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControl-mCurrentOCHOrder = " + mCurrentOCHOrder.orderStatus
+ + ", orderStatus = " + data.data.servicing.get(0).orderStatus);
+ if (!mCurrentOCHOrder.orderNo.equals(data.data.servicing.get(0).orderNo)) {
+ queryCurOrderStatus();
+ } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+ } else {
+ // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更新
+ if (mCurrentOCHOrder != null) {
+ queryCurOrderStatus();
+ }
+ }
+
+ //2. 处理待服务订单列表
+ if (data.data.waitService != null && !data.data.waitService.isEmpty()) {
+ //2.1. 当存在待服务订单列表:跟本地待服务列表比较
+ if (mWaitServiceList.isEmpty()
+ || (mWaitServiceList.size() != data.data.waitService.size())
+ || !OrderUtil.haveSameOrders(mWaitServiceList, data.data.waitService)) {
+ // 2.1.1. 当本地无待服务单,或数量和内容不一致,更新本地待服务列表,并通知ui更新
+ mWaitServiceList = data.data.waitService;
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
+ }
+ }
+ } else {
+ //2.2. 当无待服务单时:如果本地也无则跳过;如果本地有,则清除并通知ui更新
+ if (!mWaitServiceList.isEmpty()) {
+ mWaitServiceList.clear();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
+ private void queryCurOrderStatus() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final String orderNo = mCurrentOCHOrder.orderNo;
+ TaxiServiceManager.queryOrderById(mContext, orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRespBean data) {
+ if (data != null && data.data != null
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(data.data.orderNo)) {
+ if (data.data.orderStatus == TaxiOrderStatusEnum.Cancel.getCode()
+ || data.data.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.getCode()
+ || data.data.orderStatus == TaxiOrderStatusEnum.None.getCode()) {
+ clearCurrentOCHOrder();
+ cancelAutopilot();
+ } else {
+ updateNativeCurrentOrder(data.data);
+ }
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(data.data);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 取消当前订单
+ public void cancelCurrentOrder(int reasonType, String reason) {
+ if (mCurrentOCHOrder == null) {
+ mOrderStatusCallback.onCurrentOrderCancelDone();
+ return;
+ }
+ final String orderNo = mCurrentOCHOrder.orderNo;
+ TaxiServiceManager.cancelOrder(mContext, orderNo, reasonType, reason,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(orderNo)) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderCancelDone();
+ }
+ clearCurrentOCHOrder();
+ cancelAutopilot();
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtilsOch.showWithCodeMessage(code, msg);
+ }
+ });
+ }
+
+ // 取消待服务中订单
+ public void cancelOrderById(final String orderNo, int reasonType, String reason) {
+ TaxiServiceManager.cancelOrder(mContext, orderNo, reasonType, reason,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrderCancelDone(orderNo);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtilsOch.showWithCodeMessage(code, msg);
+ }
+ });
+ }
+
+ // 查询当前订单route信息:预估时间、里程等
+ public void queryCurOrderRouteInfo() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final String orderNo = mCurrentOCHOrder.orderNo;
+ TaxiServiceManager.queryOrderRouteInfo(mContext, orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRouteInfoRespBean data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(orderNo)) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderRouteInfoGot(data.data);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// ToastUtils.showShort(code + "," + msg);
+ }
+ });
+ }
+
+ // 获取全部订单列表
+ public void queryOrdersList(int page, int size) {
+ TaxiServiceManager.queryOrdersList(mContext, page, size,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrdersListQueryRespBean data) {
+ if (null != data && 0 == data.code) {
+ if (mCarOperationalCallback != null) {
+ mCarOperationalCallback.onOrdersListPageRefresh(data.data.orders);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtilsOch.showWithCodeMessage(code, msg);
+ }
+ });
+ }
+
+ /**
+ * 查询新到预约单
+ *
+ * 注:只有在本地缓存mNewBookingOrder为null时(执行完抢单or司机关闭改单),才更新新到待抢单
+ */
+ public void queryNewBookingOrder() {
+ TaxiServiceManager.queryNewBookingOrder(mContext,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrdersNewBookingQueryRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.orders != null
+ && data.data.orders.size() > 0) {
+ // 本地无新到单,且本次新到单id与上次收到的新单id不同时:显示本次新到单
+ if (mNewBookingOrder == null) {
+ for (String orderNo : data.data.orders) {
+ if (!mPrevOrderNo.equals(orderNo)) {
+ queryNewBookingContent(orderNo);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 仅限于获取到新待抢单且需要展示时查询该单信息:(queryOrderById接口可以查询属于该车的单、未派的单)
+ private void queryNewBookingContent(final String orderNo) {
+ TaxiServiceManager.queryOrderById(mContext, orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.orderNo.equals(orderNo)
+ && data.data.orderType == TaxiOrderTypeEnum.Reserved.getType()) {
+ mNewBookingOrder = data.data;
+ mPrevOrderNo = data.data.orderNo;
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onNewBookingOrderGot(mNewBookingOrder);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 执行抢单动作
+ public void grabOrder() {
+ if (mNewBookingOrder == null) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ return;
+ }
+ final String orderNo = mNewBookingOrder.orderNo;
+ TaxiServiceManager.grabOrder(mContext, orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrderGrabRespBean data) {
+ if (data != null && data.code == 0
+ && mNewBookingOrder != null && mNewBookingOrder.orderNo.equals(orderNo)) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderExecuteDone();
+ TaxiModelLoopManager.getInstance().startGrabResultLoop();
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtilsOch.showWithCodeMessage(code, msg);
+ }
+ });
+ }
+
+ // 查询抢单结果
+ public void queryOrderGrabStatus() {
+ if (mNewBookingOrder == null) {
+ TaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ return;
+ }
+ final String orderNo = mNewBookingOrder.orderNo;
+ TaxiServiceManager.queryOrderGrabStatus(mContext, orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(OrderGrabStatusQueryRespBean data) {
+ //TaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ if (data != null && data.code == 0
+ && mNewBookingOrder != null && mNewBookingOrder.orderNo.equals(orderNo)) {
+ if (data.data.grabStatus == 0) {
+ return; //抢单中,不处理继续轮询结果
+ }
+ if (mOrderStatusCallback != null) {
+ if (data.data.grabStatus == 1) {
+ mOrderStatusCallback.onGrabOrderSuccess(mNewBookingOrder);
+ } else if (data.data.grabStatus == 2) {
+ mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
+ } else {
+ // TODO: 2021/9/22 需根据具体内容给予提示,如订单已取消
+ mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
+ }
+ }
+ } else {
+ if (mOrderStatusCallback != null) {
+ // TODO: 2021/9/22 如果用户已取消单,抢单失败时暂返回null,UI当前直接恢复原页面内容,后续优化
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ }
+ TaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ cancelNewBookingOrder();
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 车机端上传心跳数据(只在出车状态时上传)
+ public void runCarHeartbeat() {
+ TaxiServiceManager.runCarHeartbeat(mContext, mLongitude, mLatitude,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 查询司机服务数据
+ public void queryDriverServiceData() {
+ TaxiServiceManager.queryDriverServiceData(mContext,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(DriverServiceDataRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null) {
+ if (mCarOperationalCallback != null) {
+ mCarOperationalCallback.onServiceDataUpdate(
+ data.data.timeDuration, data.data.orderNum);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort(mContext.getString(R.string.network_error_tip));
+ } else {
+ ToastUtils.showShort(mContext.getString(R.string.request_error_tip));
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtilsOch.showWithCodeMessage(code, msg);
+ }
+ });
+ }
+
+ /**
+ * 司机端确认可开始自动驾驶
+ */
+ public void confirmAutopilotConditionByDriver() {
+ if (mCurrentOCHOrder == null) return;
+ TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result();
+// result.lat = mLatitude;
+// result.lon = mLongitude;
+ TaxiServiceManager.confirmAutopilotConditionByDriver(mContext,
+ mCurrentOCHOrder.orderNo,
+ result,
+ new OchCommonServiceCallback() {
+
+ @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.queryAutopilotStatus(mContext, mCurrentOCHOrder.orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(TaxiDataBaseRespBean data) {
+ if (data != null && data.code == 0)
+ updateAutopilotStatus(data.data.equals(true));
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ updateAutopilotStatus(false);
+ }
+ });
+ }
+
+ // 取消当前新到预约单
+ public void cancelNewBookingOrder() {
+ mNewBookingOrder = null;
+ }
+
+ // 获取当前订单
+ public OrderQueryRespBean.Result getCurrentOCHOrder() {
+ return mCurrentOCHOrder;
+ }
+
+ // 获取当前订单状态
+ public TaxiOrderStatusEnum getCurOrderStatus() {
+ OrderQueryRespBean.Result order = TaxiModel.getInstance().getCurrentOCHOrder();
+ if (order == null) {
+ return TaxiOrderStatusEnum.None;
+ }
+ return TaxiOrderStatusEnum.valueOf(order.orderStatus);
+ }
+
+ //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据
+ private void updateNativeCurrentOrder(OrderQueryRespBean.Result data) {
+ if (data == null) {
+ return;
+ }
+ mCurrentOCHOrder = data;
+ TaxiTrajectoryManager.getInstance().syncTrajectoryInfo();
+ SharedPrefsMgr.getInstance(mContext).putString(TaxiConst.SP_KEY_OCH_TAXI_ORDER,
+ GsonUtil.jsonFromObject(data));
+
+ if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) {
+ if (FunctionBuildConfig.isDemoMode) {
+ // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(true);
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为true(更新本地order信息)");
+ }
+
+ updateAutopilotControlParameters();
+ }
+ if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.getCode()) {
+ if (FunctionBuildConfig.isDemoMode) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "setIPCDemoMode:false");
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);
+ }
+
+ clearAutopilotControlParameters();
+ }
+ }
+
+ /**
+ * 将业务订单信息保存,鹰眼可取用
+ */
+ private void updateAutopilotControlParameters() {
+
+ AutopilotControlParameters parameters = initAutopilotControlParameters();
+ if (null == parameters) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "AutopilotControlParameters is empty.");
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControlParameters is update.");
+ CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters);
+ }
+
+ private void clearAutopilotControlParameters() {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControlParameters is clear.");
+ CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null);
+ }
+
+ //清除订单信息
+ public void clearCurrentOCHOrder() {
+ startOrStopCalculateRouteInfo(false);
+ mCurrentOCHOrder = null;
+ clearAutopilotControlParameters();
+ TaxiTrajectoryManager.getInstance().syncTrajectoryInfo();
+ SharedPrefsMgr.getInstance(mContext).remove(TaxiConst.SP_KEY_OCH_TAXI_ORDER);
+ isRestartAutopilot = false;
+ if (FunctionBuildConfig.isDemoMode) {
+ // 当美化模式(演示模式)开启时: 取消或订单已完成时,置false
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+ CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(false);
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为false(已完成or清除当前订单)");
+ }
+ }
+
+ //检测当前订单
+ public boolean checkCurrentOCHOrder() {
+ if (mCurrentOCHOrder != null
+ && mCurrentOCHOrder.startSiteGcjPoint != null
+ && mCurrentOCHOrder.endSiteGcjPoint != null) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 以当前订单为基础,开启自动驾驶
+ **/
+ @ChainLog(
+ linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT,
+ linkCode = CHAIN_SOURCE_ADAS,
+ nodeAliasCode = CHAIN_CODE_OCH_TAXI_START_AUTOPILOT,
+ paramIndexes = {-1}
+ )
+ public void startAutoPilot() {
+
+ if (!checkCurrentOCHOrder()) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "no order or order is empty.");
+ ToastUtils.showShort("当前订单不存在或异常!");
+ return;
+ }
+
+ //根据开关和后台是否发布轨迹启动自驾
+ if (FunctionBuildConfig.isPassStartAutopilotCommand && TextUtils.isEmpty(mCurrentOCHOrder.csvFileUrl)
+ && TextUtils.isEmpty(mCurrentOCHOrder.csvFileUrlDPQP)) {
+ ToastUtils.showLong("无发布轨迹, 请发布后重试");
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "isPassStartAutopilotCommand = " +
+ FunctionBuildConfig.isPassStartAutopilotCommand
+ + "busRoutesResult.csvFileUrl = " + mCurrentOCHOrder.csvFileUrl
+ + "busRoutesResult.csvFileUrlDPQP = " + mCurrentOCHOrder.csvFileUrlDPQP);
+ return;
+ }
+
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "isPassStartAutopilotCommand = " +
+ FunctionBuildConfig.isPassStartAutopilotCommand);
+
+ if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) {
+ ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() +
+ ", 请稍候重试");
+ TaxiAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent(
+ mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo,
+ OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason());
+ return;
+ }
+
+ //点击开始自动驾驶按钮订单状态去流转, 不再与自动驾驶是否启动成功挂钩
+ if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.getCode()) {
+ startServicePilotDone();
+ isRestartAutopilot = false;
+ } else {
+ isRestartAutopilot = true;
+ }
+
+ AutopilotControlParameters parameters = initAutopilotControlParameters();
+
+ if (null == parameters) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "AutopilotControlParameters is empty.");
+ return;
+ }
+
+ CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "start autopilot with parameter: %s",
+ GsonUtil.jsonFromObject(parameters)
+ + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr
+ + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr
+ + "isRestartAutopilot = " + isRestartAutopilot);
+
+ TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, false,
+ mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.lineId, mCurrentOCHOrder.orderNo);
+
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.startOpenAutopilot();
+ }
+
+ // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
+// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" );
+ }
+
+ private AutopilotControlParameters initAutopilotControlParameters() {
+
+ if (!checkCurrentOCHOrder()) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "no order or order is empty.");
+ return null;
+ }
+
+ AutopilotControlParameters parameters = new AutopilotControlParameters();
+
+ double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0);
+ double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1);
+ double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0);
+ double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1);
+
+ 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);
+ if (parameters.autoPilotLine == null) {
+ parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine(
+ mCurrentOCHOrder.lineId,
+ mCurrentOCHOrder.csvFileUrl, mCurrentOCHOrder.csvFileMd5,
+ mCurrentOCHOrder.txtFileUrl, mCurrentOCHOrder.txtFileMd5,
+ mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel,
+ mCurrentOCHOrder.csvFileUrlDPQP, mCurrentOCHOrder.csvFileMd5DPQP,
+ mCurrentOCHOrder.txtFileUrlDPQP, mCurrentOCHOrder.txtFileMd5DPQP,
+ mCurrentOCHOrder.contrailSaveTimeDPQP);
+ }
+ return parameters;
+ }
+
+ //结束自动驾驶
+ public void cancelAutopilot() {
+ try {
+ CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot();
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "结束自动驾驶");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ //根据围栏判断,是否到达起点
+ private void judgeStartStation(MogoLocation location) {
+ if (mCurrentOCHOrder == null || mCurrentOCHOrder.startSiteGcjPoint == null
+ || mCurrentOCHOrder.startSiteGcjPoint.size() < 2) {
+ return;
+ }
+ double startLon = mCurrentOCHOrder.startSiteGcjPoint.get(0);
+ double startLat = mCurrentOCHOrder.startSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ startLon, startLat,
+ location.getLongitude(), location.getLatitude());
+
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeStartStation() distance = " + distance);
+
+ if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) {
+ arrivedStartPoint();
+ }
+ }
+
+ //监听网络变化,避免启动机器时无网导致无法更新订单信息
+ private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() {
+ @Override
+ public void onIntentReceived(String intentStr, Intent intent) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr);
+ if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) {
+ if (NetworkUtils.isConnected(mContext)) {
+ startOrStopOrderLoop(LoginStatusManager.isLogin() && TaxtServingStatusManager.isOpeningOrderStatus());
+ loginService.queryLoginStatusByNet();
+ }
+ }
+ }
+ };
+
+ private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() {
+ @Override
+ public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) {
+ TaxiAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage);
+ if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "mAdasStartFailureListener = " + startFailedMessage);
+ mADASStatusCallback.onStartAdasFailure();
+ }
+ }
+ };
+
+ private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+
+ // 自车定位
+ private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() {
+ @Override
+ public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) {
+ //位置变化时,通过围栏判断是否到达x点
+ if (null == gnssInfo) return;
+ if (checkCurrentOCHOrder()) {
+ if (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToStart) {
+ judgeStartStation(gnssInfo);
+ }
+ if (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd &&
+ CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ judgeEndStation(gnssInfo);
+ }
+ }
+
+ mLongitude = gnssInfo.getLongitude();
+ mLatitude = gnssInfo.getLatitude();
+ mLocation = gnssInfo;
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(gnssInfo);
+ }
+ }
+ };
+
+ private void judgeEndStation(MogoLocation currentLocation) {
+ if (mCurrentOCHOrder == null || mCurrentOCHOrder.endSiteGcjPoint == null
+ || mCurrentOCHOrder.endSiteGcjPoint.size() < 2) {
+ return;
+ }
+ double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
+ double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ endLon, endLat,
+ currentLocation.getLongitude(), currentLocation.getLatitude());
+
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() distance = " + distance);
+
+ if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { //1、当前位置和站点围栏15m内
+
+ if (!checkCurrentOCHOrder()
+ || (getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "order exception or order ArriveAtEnd");
+ return;
+ }
+
+ //2、开始计算当前位置和站点的向量角度 < 90度 未经过 >90度 经过
+ double stationAngle = DrivingDirectionUtils.getDegreeOfCar2Poi(
+ currentLocation.getLongitude(),
+ currentLocation.getLatitude(),
+ endLon,
+ endLat,
+ (int) currentLocation.getHeading());
+
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() stationAngle = " + stationAngle);
+
+ //3、刚过站且过站距离在15m内, 提交到站
+ if (stationAngle > 90 && distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE){
+ if (!checkCurrentOCHOrder()
+ || (getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "order exception or order ArriveAtEnd");
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() = 刚过站且在15m内");
+ arriveTerminal();
+ }
+ }
+
+ }
+
+ /**
+ * 订单流转debug START
+ */
+ public void setArriveAtStartStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.OnTheWayToStart.getCode()) {
+ ToastUtils.showShort("订单状态不匹配该操作!");
+ return;
+ }
+ arrivedStartPoint();
+ }
+
+ public void setDriverConfirmCondition() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.UserArriveAtStart.getCode()) {
+ ToastUtils.showShort("订单状态不匹配该操作!");
+ return;
+ }
+ confirmAutopilotConditionByDriver();
+ }
+
+ public void setArriveAtEndStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) {
+ ToastUtils.showShort("订单状态不匹配该操作!");
+ return;
+ }
+ arriveTerminal();
+ }
+
+ /**
+ * 测试开启自动驾驶
+ */
+ public void setOnTheWayToEndStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != TaxiOrderStatusEnum.UserArriveAtStart.getCode()) {
+ ToastUtils.showShort("订单状态不匹配该操作!");
+ }
+ startServicePilotDone();
+ }
+
+ private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() {
+
+ @Override
+ public void onAutopilotDockerInfo(@NonNull String dockerVersion) {
+ }
+
+ @Override
+ public void onAutopilotRouteLineId(long lineId) {
+ }
+
+ @Override
+ public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) {
+ }
+
+ @Override
+ public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) {
+ TaxiTrajectoryManager.getInstance().onAutopilotGuardian(guardianInfo);
+ }
+
+ @Override
+ public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
+ }
+
+ @Override
+ public void onAutopilotStatusResponse(int state) {
+ if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ if (mADASStatusCallback != null) {
+ mADASStatusCallback.onAutopilotRunning();
+ }
+ if (mCurrentOCHOrder != null
+ && TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == mCurrentOCHOrder.orderStatus) {
+ TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, true,
+ mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.lineId, mCurrentOCHOrder.orderNo);
+ if (FunctionBuildConfig.isDemoMode) {
+ // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(true);
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为true(到达出发点且已开启自动驾驶)");
+ }
+ }
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
+ if (FunctionBuildConfig.isDemoMode
+ && checkCurrentOCHOrder()
+ && (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd
+ || getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {
+ // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态
+ return;
+ }
+ if (mADASStatusCallback != null) {
+ mADASStatusCallback.onAutopilotEnable();
+ }
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
+ if (FunctionBuildConfig.isDemoMode
+ && checkCurrentOCHOrder()
+ && (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd
+ || getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {
+ // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态
+ return;
+ }
+ if (mADASStatusCallback != null) {
+ mADASStatusCallback.onAutopilotDisable();
+ }
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) {
+ if (FunctionBuildConfig.isDemoMode) {
+ if (checkCurrentOCHOrder()
+ && (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd
+ || getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {//订单中
+ // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态
+ } else { //美化模式下没订单,显示人工驾驶
+ if (mADASStatusCallback != null) {
+ mADASStatusCallback.onAutopilotDisable();
+ }
+ }
+ return;
+ }
+ if (mADASStatusCallback != null) {
+ mADASStatusCallback.onManMachineCoDriving();
+ }
+ }
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+ }
+
+ @Override
+ public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification data) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "onAutopilotArriveAtStation = " + data.toString());
+
+ if (data == null || !checkCurrentOCHOrder()
+ || (getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {
+ return;
+ }
+ arriveTerminal();
+
+ if (FunctionBuildConfig.isDemoMode) {
+ // 当美化模式(演示模式)开启时: 到达目的地,置false
+ // 2022.10.08 到达目的地时候取消自动起自驾, 服务完成取消引导线和自动驾驶按钮状态
+// FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+// CallerAutoPilotManager.INSTANCE.setIgnoreConditionDraw(false);
+ CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为false(到达目的地)");
+ }
+ }
+
+ @Override
+ public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) {
+ }
+ };
+
+ private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener() {
+
+ @Override
+ public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) {
+ if (null != routeList && routeList.getWayPointsList() != null) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "getWayPointsList = "
+ + routeList.getWayPointsList().size());
+ }
+ if (null != routeList && routeList.getWayPointsList().size() > 0) {
+ updateOrderRoute(routeList.getWayPointsList());
+ updateOrderRouteInfo(routeList.getWayPointsList());
+ }
+ }
+
+ };
+
+ /**
+ * 设置路径规划起终点
+ *
+ */
+ public void setRouteLineMarker() {
+ OrderQueryRespBean.Result currentOCHOrder = getCurrentOCHOrder();
+ if(currentOCHOrder!=null) {
+ if (currentOCHOrder.startSiteGcjPoint == null || currentOCHOrder.startSiteGcjPoint.isEmpty() || currentOCHOrder.startSiteGcjPoint.size() < 2||
+ currentOCHOrder.endSiteGcjPoint == null || currentOCHOrder.endSiteGcjPoint.isEmpty() || currentOCHOrder.endSiteGcjPoint.size() < 2) {
+ cleanLineMarker();
+ return;
+ }
+ LatLng startStation = new LatLng(currentOCHOrder.startSiteGcjPoint.get(1),currentOCHOrder.startSiteGcjPoint.get(0));
+ LatLng endStation = new LatLng(currentOCHOrder.endSiteGcjPoint.get(1),currentOCHOrder.endSiteGcjPoint.get(0));
+ if (mAutopilotPlanningCallback != null) {
+ mAutopilotPlanningCallback.setLineMarker(startStation,endStation);
+ }
+ }
+ }
+ public void cleanLineMarker(){
+ if (mAutopilotPlanningCallback != null) {
+ mAutopilotPlanningCallback.setLineMarker(null,null);
+ }
+ }
+
+ /**
+ * 上报订单全路径规划数据
+ *
+ * @param models
+ */
+ public void updateOrderRoute(List models) {
+ if (null == mCurrentOCHOrder) return;
+ List points = coordinateConverterWgsToGcjList(mContext, models);
+ TaxiServiceManager.updateOrderRoute(mContext, mCurrentOCHOrder.orderNo
+ , points, new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onError() {
+ // TODO: 2022/5/18 是否在请求异常时候进行提示
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ public static List coordinateConverterWgsToGcjList(Context mContext, List mogoLatLngList) {
+ List points = new ArrayList<>();
+ for (MessagePad.Location m : mogoLatLngList) {
+ LatLng mogoLatLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(mContext, m);
+ OrderRouteUpdateReqBean.Result result = new OrderRouteUpdateReqBean.Result();
+ result.latitude = mogoLatLng.latitude;
+ result.longitude = mogoLatLng.longitude;
+ points.add(result);
+ }
+ return points;
+ }
+
+ /**
+ * 计算全路径长度,以及实时更新剩余距离,剩余时间,预计时间
+ *
+ * @param models
+ */
+ public void updateOrderRouteInfo(List models) {
+ if (null == models || models.size() == 0) return;
+ if (mCurrentOCHOrder == null) return;
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------计算出sumLength开始---------- ");
+
+ //转换成高德坐标系
+ if (mRoutePoints.size() > 0) {
+ mRoutePoints.clear();
+ }
+ mRoutePoints.addAll(CoordinateCalculateRouteUtil
+ .coordinateConverterWgsToGcjLocations(mContext, models));
+ startDynamicCalculateRouteInfo();
+ }
+
+ public void startDynamicCalculateRouteInfo() {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder);
+
+ if (mCurrentOCHOrder != null && mRoutePoints.size() == 0) {//根据orderNo去查询
+ queryOrderRouteList(mCurrentOCHOrder.orderNo);
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size());
+
+ if (mRoutePoints.size() > 0) {
+ reportTotalDisAndTime();
+ }
+ //开启实时计算剩余距离,剩余时间,预计时间
+ startOrStopCalculateRouteInfo(true);
+ AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onNaviToEnd(false, false);
+ }
+ }
+
+ private void reportTotalDisAndTime() {
+ float lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(mRoutePoints);
+ double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒
+
+ reportOrderRemain((long) lastSumLength, (long) lastTime);
+ }
+
+ /**
+ * 实时计算当前剩余里程和时间
+ */
+ public void dynamicCalculateRouteInfo() {
+// if (mLocation == null) {
+// return;
+// }
+// if (mRoutePoints.size() > 0 && mLocation != null) {
+// Map> lastPointsMap = CoordinateCalculateRouteUtil
+// .getRemainPointListByCompareNew(mPreRouteIndex, mRoutePoints, mLocation);
+//
+// for (int index : lastPointsMap.keySet()) {
+// mPreRouteIndex = index;
+// break;
+// }
+// for (List lastPoints : lastPointsMap.values()) {
+// float lastSumLength = 0;
+// if (lastPoints.size() == 1) { //只是最后一个点,计算当前位置和最后一个点的距离
+// lastSumLength = CoordinateUtils.calculateLineDistance(
+// lastPoints.get(0).getLongitude(), lastPoints.get(0).getLatitude(),
+// mLocation.getLongitude(), mLocation.getLatitude());
+// } else {
+// lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints);
+// }
+// updateDistance(lastSumLength);
+// break;
+// }
+// routeAndWipe();
+// }
+ }
+
+ private void updateDistance(float lastSumLength){
+ double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒
+ CallerLogger.INSTANCE.d(M_TAXI + "dynamicCalculateRouteInfo"
+ , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime
+ + " thread = " + Thread.currentThread().getName());
+
+ if (mCurrentOCHOrder != null) {
+ mCurrentOCHOrder.decreaseTravelDistance(lastSumLength);
+ }
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime);
+ }
+
+ reportOrderRemain((long) lastSumLength, (long) lastTime);
+ }
+
+ private void routeAndWipe() {
+ if (mRoutePoints != null && mRoutePoints.size() > 0 && mLocation != null) {
+ int haveArrivedIndex = CoordinateCalculateRouteUtil
+ .getArrivedPointIndexNew(mPreRouteIndex,
+ mRoutePoints,
+ mLocation.getLongitude(),
+ mLocation.getLatitude());
+ List routePoints = CoordinateCalculateRouteUtil
+ .coordinateConverterLocationToLatLng(mContext, mRoutePoints);
+ List routeArrivied = new ArrayList<>();
+ List routeArriving = new ArrayList<>();
+ for (int i = 0; i < routePoints.size(); i++){
+ if (i <= haveArrivedIndex){
+ routeArrivied.add(routePoints.get(i));
+ }else {
+ routeArriving.add(routePoints.get(i));
+ }
+ }
+ if (mAutopilotPlanningCallback != null) {
+ mAutopilotPlanningCallback.routeResult(routeArrivied,routeArriving, mLocation);
+ }
+ setRouteLineMarker();
+ }
+ }
+
+ private final IDistanceListener distanceListener = this::updateDistance;
+
+ private final ITrajectoryListener trajectoryListener = (routeArrivied, routeArriving, location) -> {
+ if (mAutopilotPlanningCallback != null) {
+ List routeArriviedTemp = new ArrayList<>();
+ List routeArrivingTemp = new ArrayList<>();
+ LatLng temp;
+ for (MogoLocation mogoLocation : routeArrivied) {
+ temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude());
+ routeArriviedTemp.add(temp);
+ }
+ for (MogoLocation mogoLocation : routeArriving) {
+ temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude());
+ routeArrivingTemp.add(temp);
+ }
+ mAutopilotPlanningCallback.routeResult(routeArriviedTemp, routeArrivingTemp,location);
+ setRouteLineMarker();
+ }
+ };
+
+
+ /**
+ * 查询当前订单的全局路径 (当自动驾驶开启后,订单前往乘客上车点,杀掉应用再次进来时候)
+ */
+ private void queryOrderRouteList(String orderNo) {
+ if (mCurrentOCHOrder != null) {
+ TaxiServiceManager.queryOrderRoute(mContext, orderNo,
+ new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(QueryOrderRouteResp data) {
+ if (data != null && data.data != null && mRoutePoints.size() == 0) {
+ mRoutePoints.clear();
+ List routePoints = CoordinateCalculateRouteUtil
+ .coordinateConverterLatlngToLocation(data.data);
+ mRoutePoints.addAll(routePoints);
+ }
+ }
+
+ @Override
+ public void onError() {
+ // TODO: 2022/5/18 是否在请求异常的时候提示
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+ }
+
+ /**
+ * 开始轮询计算剩余里程和时间
+ *
+ * @param isStart
+ */
+ public void startOrStopCalculateRouteInfo(boolean isStart) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "startOrStopOrderLoop() " + isStart);
+ if (isStart) {
+ TaxiModelLoopManager.getInstance().startCalculateRouteInfoLoop();
+ } else {
+ mRoutePoints.clear();
+ TaxiModelLoopManager.getInstance().stopCalculateRouteInfoLoop();
+ }
+ }
+
+ /**
+ * 上报订单剩余里程和时间 单位:KM, M, 单位:秒
+ *
+ * @param lastSumLength
+ * @param duration
+ */
+ public void reportOrderRemain(long lastSumLength, long duration) {// 米/秒
+ if (mCurrentOCHOrder == null) return;
+ TaxiServiceManager.reportOrderRemain(mContext, mCurrentOCHOrder.orderNo
+ , lastSumLength, duration, new OchCommonServiceCallback() {
+ @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()) {
+ ToastUtils.showShort("订单状态不匹配该操作或者订单为空!");
+ return;
+ }
+ TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result();
+ result.lat = mLatitude;
+ result.lon = mLongitude;
+ TaxiServiceManager.updatePassengerHasBoardedStatus(mContext
+ , mCurrentOCHOrder.orderNo
+ , result
+ , new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(TaxiDataBaseRespBean data) {
+
+ }
+
+ @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.startServicePilotDone(mContext
+ , mCurrentOCHOrder.orderNo
+ , result
+ , new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(TaxiDataBaseRespBean data) {
+
+ }
+
+ @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.arrivedStartPoint(mContext
+ , mCurrentOCHOrder.orderNo
+ , result
+ , new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(TaxiDataBaseRespBean data) {
+
+ }
+
+ @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.arriveTerminal(mContext
+ , mCurrentOCHOrder.orderNo
+ , result
+ , new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(TaxiDataBaseRespBean data) {
+
+ }
+
+ @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.orderCompleted(mContext
+ , mCurrentOCHOrder.orderNo
+ , result
+ , new OchCommonServiceCallback() {
+ @Override
+ public void onSuccess(TaxiDataBaseRespBean data) {
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ ToastUtils.showShort(msg);
+ }
+ });
+ }
+
+ // 登出
+ public void logout() {
+ loginService.loginOut(mLatitude, mLongitude);
+ }
+
+ //导航去订单终点目的地
+ public void startNaviToEndStation(boolean isShow) {
+ if (mRoutePoints.size() > 0) { //使用自驾轨迹
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onNaviToEnd(false, isShow);
+ }
+ } else {//若直接要显示导航地图则直接导航, 若不是则2s后若无轨迹数据使用高德导航
+ if (isShow && mRoutePoints.size() == 0 && mOrderStatusCallback != null) {
+
+ mOrderStatusCallback.onNaviToEnd(true, true);
+ } else {
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (mRoutePoints.size() == 0 && mOrderStatusCallback != null) {
+ mOrderStatusCallback.onNaviToEnd(true, false);
+ }
+ }
+ }, 2000l);
+ }
+
+ }
+ }
+
+ public void setStation(){
+ OrderQueryRespBean.Result currentOCHOrder = getCurrentOCHOrder();
+ if(currentOCHOrder!=null){
+ MogoLocation startStation = new MogoLocation();
+ startStation.setLongitude(currentOCHOrder.startSiteGcjPoint.get(0));
+ startStation.setLatitude(currentOCHOrder.startSiteGcjPoint.get(1));
+ MogoLocation endStation = new MogoLocation();
+ endStation.setLongitude(currentOCHOrder.endSiteGcjPoint.get(0));
+ endStation.setLatitude(currentOCHOrder.endSiteGcjPoint.get(1));
+ TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation,currentOCHOrder.lineId);
+ }
+ }
+
+ public void cleanStation(){
+ TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null,null,-1L);
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java
new file mode 100644
index 0000000000..6574a6ca89
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/model/TaxiModelLoopManager.java
@@ -0,0 +1,176 @@
+package com.mogo.och.taxi.model;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.taxi.constant.TaxiConst;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.ObservableEmitter;
+import io.reactivex.ObservableOnSubscribe;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.functions.Consumer;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created on 2021/9/10
+ *
+ * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
+ */
+public class TaxiModelLoopManager {
+
+ private static final String TAG = TaxiModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final TaxiModelLoopManager INSTANCE = new TaxiModelLoopManager();
+ }
+
+ public static TaxiModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
+ private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询
+ private Disposable mGrabResultDisposable; //抢单结果轮询
+ private Disposable mHeartbeatDisposable; //心跳轮询
+ private CompositeDisposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间
+
+ public void startInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "startInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
+ TaxiConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> TaxiModel.getInstance().queryInAndWaitOrders());
+ }
+
+ public void stopInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable.dispose();
+ mInAndWaitServiceDisposable = null;
+ }
+ }
+
+ public void startNewBookingOrderLoop() {
+ if (mNewBookingOrderDisposable != null && !mNewBookingOrderDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "startNewBookingOrderLoop()");
+ mNewBookingOrderDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
+ TaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> TaxiModel.getInstance().queryNewBookingOrder());
+ }
+
+ public void stopNewBookingOrderLoop() {
+ if (mNewBookingOrderDisposable != null) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopNewBookingOrderLoop()");
+ mNewBookingOrderDisposable.dispose();
+ mNewBookingOrderDisposable = null;
+ }
+ }
+
+ public void startGrabResultLoop() {
+ if (mGrabResultDisposable != null && !mGrabResultDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "startGrabResultLoop()");
+ mGrabResultDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
+ TaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> TaxiModel.getInstance().queryOrderGrabStatus());
+ }
+
+ public void stopGrabResultLoop() {
+ if (mGrabResultDisposable != null) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopGrabResultLoop()");
+ mGrabResultDisposable.dispose();
+ mGrabResultDisposable = null;
+ }
+ }
+
+ public void startHeartbeatLoop() {
+ if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "startHeartbeatLoop()");
+ mHeartbeatDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
+ TaxiConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> TaxiModel.getInstance().runCarHeartbeat());
+ }
+
+ public void stopHeartbeatLoop() {
+ if (mHeartbeatDisposable != null) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopHeartbeatLoop()");
+ mHeartbeatDisposable.dispose();
+ mHeartbeatDisposable = null;
+ }
+ }
+
+ public void startCalculateRouteInfoLoop() {
+
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "startCalculateRouteInfoLoop()");
+ if (mCalculateRouteDisposable != null) return;
+
+ mCalculateRouteDisposable = new CompositeDisposable();
+
+ Disposable disposable = loopDynamicCalculateRouteInfo()
+ .doOnSubscribe(new Consumer() {
+ @Override
+ public void accept(Disposable disposable) throws Exception {
+
+ }
+ }).doOnError(new Consumer() {
+ @Override
+ public void accept(Throwable throwable) throws Exception {
+ }
+ })
+ .delay(TaxiConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。
+ .subscribeOn(Schedulers.io())
+ .repeat() // repeat保证请求成功后能够重新订阅。
+ .retry() // retry保证请求失败后能重新订阅
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Consumer() {
+ @Override
+ public void accept(Integer integer) throws Exception {
+ }
+ });
+ mCalculateRouteDisposable.add(disposable);
+ }
+
+ private Observable loopDynamicCalculateRouteInfo(){
+ return Observable.create(new ObservableOnSubscribe() {
+ @Override
+ public void subscribe(ObservableEmitter emitter) throws Exception {
+ if (emitter.isDisposed()) return;
+ TaxiModel.getInstance().dynamicCalculateRouteInfo();
+ emitter.onComplete();
+ }
+ });
+ }
+
+ public void stopCalculateRouteInfoLoop() {
+ if (mCalculateRouteDisposable != null) {
+ CallerLogger.INSTANCE.i(M_TAXI + TAG, "stopCalculateRouteInfoLoop()");
+ mCalculateRouteDisposable.dispose();
+ mCalculateRouteDisposable = null;
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/LoginBusImpl.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/LoginBusImpl.kt
new file mode 100644
index 0000000000..c57492cd1e
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/LoginBusImpl.kt
@@ -0,0 +1,47 @@
+package com.mogo.och.taxi.network
+
+import android.content.Context
+import com.mogo.eagle.core.data.BaseData
+import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean
+import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean
+import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean
+import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean
+import com.mogo.och.common.module.biz.network.LoginDefaultManage
+import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
+
+class LoginBusImpl: LoginDefaultManage {
+
+ override fun getPhoneCode(
+ context: Context, phone: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ OchCommonServiceManager.getPhoneCode(context,phone,callback)
+ }
+
+ override fun gotoLoginBycode(
+ context: Context,
+ phone: String?,
+ code: String?,
+ location4Login: TaxiLoginReqBean.Location4Login?,
+ callback: OchCommonServiceCallback?
+ ) {
+ OchCommonServiceManager.gotoLoginBycode(context,phone,code,location4Login,callback)
+ }
+
+ override fun logout(
+ context: Context,
+ location4Login: TaxiLogoutReqBean.Location4Login?,
+ callback: OchCommonServiceCallback?
+ ) {
+ OchCommonServiceManager.logout(context,location4Login,callback)
+ }
+
+ override fun queryDriverServiceStatus(
+ context: Context,
+ callback: OchCommonServiceCallback?
+ ) {
+ OchCommonServiceManager.queryDriverServiceStatus(context,callback)
+ }
+
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/OchCommonServiceManager.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/OchCommonServiceManager.kt
new file mode 100644
index 0000000000..95d8c56cde
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/OchCommonServiceManager.kt
@@ -0,0 +1,108 @@
+package com.mogo.och.taxi.network
+
+import android.content.Context
+import com.mogo.och.common.module.biz.constant.OchCommonConst.Companion.getBaseUrl
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean
+import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean
+import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean
+import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean
+import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean
+import com.mogo.och.common.module.biz.constant.OchCommonConst
+import com.mogo.cloud.passport.MoGoAiCloudClient
+import com.mogo.eagle.core.data.BaseData
+import com.mogo.eagle.core.network.MoGoRetrofitFactory
+import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
+import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl
+import com.mogo.och.common.module.biz.network.interceptor.transformTry
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+object OchCommonServiceManager {
+
+ private const val TAG = "OchCommonServiceManager"
+
+ private val mOCHTaxiServiceApi: OchLoginServiceApi =
+ MoGoRetrofitFactory.getInstance(getBaseUrl()).create(
+ OchLoginServiceApi::class.java
+ )
+
+ /**
+ * 获取手机验证码
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun getPhoneCode(
+ context: Context, phone: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.getPhoneCode(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiLoginSmsReqBean(phone)
+ ).transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "getPhoneCode"))
+ }
+
+ /**
+ * 通过验证码登录
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun gotoLoginBycode(
+ context: Context, phone: String?, code: String?,
+ location4Login: TaxiLoginReqBean.Location4Login?,
+ callback: OchCommonServiceCallback?
+ ) {
+ val sn = MoGoAiCloudClientConfig.getInstance().sn
+ mOCHTaxiServiceApi.gotoLoginBycode4Taxi(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiLoginReqBean(phone, code, sn, location4Login)
+ ).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "gotoLoginBycode"))
+ }
+
+ /**
+ * 登出
+ */
+ @JvmStatic
+ fun logout(
+ context: Context,
+ location4Login: TaxiLogoutReqBean.Location4Login?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.logout4Taxi(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiLogoutReqBean(MoGoAiCloudClientConfig.getInstance().sn, location4Login)
+ ).transformTry().subscribe(OchCommonSubscribeImpl(context, callback, "logout"))
+ }
+
+ /**
+ * 接单状态和登录状态查询
+ *
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun queryDriverServiceStatus(
+ context: Context,
+ callback: OchCommonServiceCallback?
+ ) {
+ if (MoGoAiCloudClientConfig.getInstance().token.isEmpty()) {
+ callback?.onFail(OchCommonConst.WAIT_TAKEN, "等待令牌中请稍等")
+ MoGoAiCloudClient.getInstance().refreshToken()
+ return
+ }
+ mOCHTaxiServiceApi.queryDriverServiceStatusAndLoginStatus(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ MoGoAiCloudClientConfig.getInstance().sn
+ ).transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverServiceStatus"))
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/OchLoginServiceApi.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/OchLoginServiceApi.java
new file mode 100644
index 0000000000..19c9e85fbf
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/OchLoginServiceApi.java
@@ -0,0 +1,62 @@
+package com.mogo.och.taxi.network;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
+import com.mogo.och.common.module.biz.bean.TaxiLoginReqBean;
+import com.mogo.och.common.module.biz.bean.TaxiLoginRespBean;
+import com.mogo.och.common.module.biz.bean.TaxiLoginSmsReqBean;
+import com.mogo.och.common.module.biz.bean.TaxiLogoutReqBean;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Header;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车-出租车接口定义
+ */
+interface OchLoginServiceApi {
+ /**
+ * 获取手机验证码
+ *
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/driver/v2/driver/taxi/sendSms" )
+ Observable getPhoneCode(@Header("appId") String appId
+ , @Header("ticket") String ticket, @Body TaxiLoginSmsReqBean 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/startOperation" )
+ Observable gotoLoginBycode4Taxi(@Header("appId") String appId
+ , @Header("ticket") String ticket, @Body TaxiLoginReqBean data);
+
+ /**
+ * 登出接口
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/cab/flow/v1/driver/taxi/endOperation")
+ Observable logout4Taxi(@Header("appId") String appId, @Header("ticket") String ticket,
+ @Body TaxiLogoutReqBean data);
+
+ /**
+ * 接单状态和登录状态查询 出租车司机端、小巴车司机端、小巴车乘客端
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/operation/v1/driver/taxi/loginStatus")
+ Observable queryDriverServiceStatusAndLoginStatus(@Header ("appId") String appId
+ , @Header("ticket") String ticket, @Query("sn") String sn);
+
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java
new file mode 100644
index 0000000000..cbb3885cf6
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceApiNew.java
@@ -0,0 +1,308 @@
+package com.mogo.och.taxi.network;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.och.taxi.bean.CarHeartbeatReqBean;
+import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.bean.DriverStatusUpdateReqBean;
+import com.mogo.och.taxi.bean.OrderCancelReqBean;
+import com.mogo.och.taxi.bean.OrderGrabReqBean;
+import com.mogo.och.taxi.bean.OrderGrabRespBean;
+import com.mogo.och.taxi.bean.OrderGrabStatusQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryReqBean;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoReqBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.bean.OrderRouteUpdateReqBean;
+import com.mogo.och.taxi.bean.OrderStatusUpdateReqBean;
+import com.mogo.och.taxi.bean.OrdersInServiceQueryRespBean;
+import com.mogo.och.taxi.bean.OrdersListQueryReqBean;
+import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
+import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
+import com.mogo.och.taxi.bean.QueryOrderRouteResp;
+import com.mogo.och.taxi.bean.TaxiDataBaseRespBean;
+import com.mogo.och.taxi.bean.TaxiOrPassengerReadyReqBean;
+import com.mogo.och.taxi.bean.UpdateOrderDisAndTimeReqBean;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Header;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车-出租车接口定义
+ */
+interface TaxiServiceApiNew {
+
+ /**
+ * 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
+ @GET("/autopilot-car-hailing/order/v2/driver/taxi/orderInService/query")
+ Observable queryOrdersInAndWaitService(@Header("appId") String appId
+ , @Header("ticket") String ticket, @Query("sn") String sn);
+
+ /**
+ * 查询新到的预约单
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
+ @GET( "/autopilot-car-hailing/order/v2/driver/taxi/newBookingOrder/query" )
+ Observable queryNewBookingOrder(@Header ("appId") String appId
+ ,@Header("ticket") String ticket,@Query("sn") String sn);
+
+ /**
+ * (预约单)执行抢单动作
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
+ @POST( "/autopilot-car-hailing/order/v2/driver/taxi/grabOrder" )
+ Observable grabOrder(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrderGrabReqBean data);
+
+ /**
+ * (预约单)查询抢单结果
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
+ @POST( "/autopilot-car-hailing/order/v2/driver/taxi/grabStatus/query" )
+ Observable queryOrderGrabStatus(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrderGrabReqBean data);
+
+ /**
+ * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
+ @POST( "/autopilot-car-hailing/order/v2/driver/taxi/routeInfo/query" )
+ Observable queryOrderRouteInfo(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrderQueryRouteInfoReqBean data);
+
+ /**
+ * 通过orderId查询订单信息(用于本地已经有orderId时)
+ * @param data
+ * @return
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
+ @POST( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrderById" )
+ Observable queryOrderById(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrderQueryReqBean data);
+
+ /**
+ * 查询服务中订单信息(用于本地无orderId时)
+ * 如果有多条,只会返回时间最近的一条
+ * @param sn
+ * @return
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
+ @GET( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrderInService" )
+ Observable queryOrderInService(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Query("sn") String sn);
+
+ /**
+ * 取消订单
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
+ @POST("/autopilot-car-hailing/order/v2/driver/taxi/cancelOrder")
+ Observable cancelOrder(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrderCancelReqBean data);
+
+ /**
+ * 订单列表获取
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
+ @POST( "/autopilot-car-hailing/order/v2/driver/taxi/queryOrders" )
+ Observable queryOrdersList(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrdersListQueryReqBean data);
+
+ /**
+ * 订单状态更新
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
+// @POST( "/autopilot-car-hailing/order/v2/driver/taxi/order/updateStatus" )
+ @POST( "/autopilot-car-hailing/order/v2/vehicle/taxi/driver/updateStatus" )
+ Observable updateOrderStatus(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body OrderStatusUpdateReqBean data);
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
+ @POST( "/autopilot-car-hailing/location/v2/driver/taxi/heartbeat" )
+ Observable runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body CarHeartbeatReqBean data);
+
+ /**
+ * 查询司机服务数据
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
+ @GET( "/autopilot-car-hailing/order/v2/driver/taxi/serviceData/query" )
+ Observable queryServiceData(@Header ("appId") String appId
+ ,@Header("ticket") String ticket,@Query("sn") String sn);
+
+ /**
+ * 上传工控机返回的全路径规划数据
+ * @param appId
+ * @param ticket
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST("/autopilot-car-hailing/order/v2/driver/taxi/saveOrderRoute")
+// @POST("/mock/268/autopilot-car-hailing/order/v2/driver/taxi/orderRoute")
+ Observable updateOrderRoute(@Header ("appId") String appId
+ , @Header("ticket") String ticket, @Body OrderRouteUpdateReqBean data);
+
+ /**
+ * 上报订单剩余里程和剩余时间
+ * @param appId
+ * @param ticket
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST("/autopilot-car-hailing/order/v2/driver/taxi/reportOrderRemain")
+ Observable reportOrderRemain(@Header ("appId") String appId
+ , @Header("ticket") String ticket, @Body UpdateOrderDisAndTimeReqBean data);
+
+
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
+ @GET( "/autopilot-car-hailing/order/v2/driver/taxi/orderRoute" )
+ Observable queryOrderRoute(@Header ("appId") String appId
+ , @Header("ticket") String ticket, @Query("orderNo") String orderNo);
+
+ /**
+ * 司机端跳过乘客验证,订单状态流转为乘客已上车
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @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);
+
+ /**
+ * 暂停接单
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
+ @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/stopOrderServing" )
+ Observable stopOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body DriverStatusUpdateReqBean data);
+ /**
+ * 暂停接单
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
+ @POST( "/autopilot-car-hailing/cab/flow/v1/driver/taxi/resetOrderServing" )
+ Observable resetOrderServing(@Header ("appId") String appId,@Header("ticket") String ticket
+ ,@Body DriverStatusUpdateReqBean data);
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt
new file mode 100644
index 0000000000..63b5cfa751
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/network/TaxiServiceManager.kt
@@ -0,0 +1,497 @@
+package com.mogo.och.taxi.network
+
+import android.content.Context
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+import com.mogo.eagle.core.data.BaseData
+import com.mogo.eagle.core.network.MoGoRetrofitFactory
+import com.mogo.och.common.module.biz.constant.OchCommonConst
+import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
+import com.mogo.och.common.module.biz.network.OchCommonSubscribeImpl
+import com.mogo.och.common.module.biz.network.interceptor.transformTry
+import com.mogo.och.taxi.bean.*
+import io.reactivex.Observable
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+object TaxiServiceManager {
+
+
+ private var mOCHTaxiServiceApi: TaxiServiceApiNew =
+ MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
+ TaxiServiceApiNew::class.java
+ )
+
+ /**
+ * 查询全部服务中/待服务订单列表
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun queryOrdersInAndWaitService(
+ context: Context,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrdersInAndWaitService(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ MoGoAiCloudClientConfig.getInstance().sn
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersInAndWaitService"))
+ }
+
+ /**
+ * 查询新到的预约单
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun queryNewBookingOrder(
+ context: Context,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryNewBookingOrder(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ MoGoAiCloudClientConfig.getInstance().sn
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryNewBookingOrder"))
+ }
+
+ /**
+ * (预约单)执行抢单动作
+ * @param context
+ * @param orderNo
+ * @param callback
+ */
+ @JvmStatic
+ fun grabOrder(
+ context: Context, orderNo: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.grabOrder(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderGrabReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "grabOrder"))
+ }
+
+ /**
+ * (预约单)查询抢单结果
+ * @param context
+ * @param orderNo
+ * @param callback
+ */
+ @JvmStatic
+ fun queryOrderGrabStatus(
+ context: Context, orderNo: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrderGrabStatus(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderGrabReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderGrabStatus"))
+ }
+
+ /**
+ * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
+ * @param context
+ * @param orderNo
+ * @param callback
+ */
+ @JvmStatic
+ fun queryOrderRouteInfo(
+ context: Context, orderNo: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrderRouteInfo(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderQueryRouteInfoReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRouteInfo"))
+ }
+
+ /**
+ * 通过orderId查询订单信息(用于本地已经有orderId时)
+ * @param context
+ * @param orderNo
+ * @param callback
+ */
+ @JvmStatic
+ @Deprecated("v2.1_0930需求中暂不再使用此接口")
+ fun queryOrderById(
+ context: Context, orderNo: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrderById(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderQueryReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderById"))
+ }
+
+ /**
+ * 查询未完成态订单信息(用于本地无orderId时)
+ * 如果有多条,只会返回时间最近的一条
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ @Deprecated("v2.1_0930需求中暂不再使用此接口")
+ fun queryOrderInService(
+ context: Context,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrderInService(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ MoGoAiCloudClientConfig.getInstance().sn
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderInService"))
+ }
+
+ /**
+ * 司机取消订单
+ * @param context
+ * @param orderNo
+ * @param cancelType
+ * @param cancelReason
+ * @param callback
+ */
+ @JvmStatic
+ fun cancelOrder(
+ context: Context, orderNo: String?, cancelType: Int, cancelReason: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.cancelOrder(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderCancelReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, cancelType, cancelReason
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "cancelOrder"))
+ }
+
+ /**
+ * 订单列表获取
+ * @param context
+ * @param page
+ * @param size
+ * @param callback
+ */
+ @JvmStatic
+ fun queryOrdersList(
+ context: Context, page: Int, size: Int,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrdersList(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrdersListQueryReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, page, size
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrdersList"))
+ }
+
+ /**
+ * 订单状态更新
+ * @param context
+ * @param orderNo
+ * @param orderStatus
+ * @param callback
+ */
+ @JvmStatic
+ fun updateOrderStatus(
+ context: Context, orderNo: String?, orderStatus: Int,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.updateOrderStatus(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, orderStatus
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderStatus"))
+ }
+
+ /**
+ * 暂停接单
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun changeOrderServing(
+ context: Context, isOrdering: Boolean,
+ callback: OchCommonServiceCallback?
+ ) {
+ val baseDataObservable: Observable = if (isOrdering) { // 正在接单去暂停
+ mOCHTaxiServiceApi.stopOrderServing(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ DriverStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn
+ )
+ ).transformTry()
+ } else { // 没有接单去接单
+ mOCHTaxiServiceApi.resetOrderServing(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ DriverStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn
+ )
+ ).transformTry()
+ }
+ baseDataObservable
+ .subscribe(OchCommonSubscribeImpl(context, callback, "updateDriverServiceStatus"))
+ }
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param context
+ * @param lon
+ * @param lat
+ * @param callback
+ */
+ @JvmStatic
+ fun runCarHeartbeat(
+ context: Context, lon: Double, lat: Double,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.runCarHeartbeat(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ CarHeartbeatReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, lon, lat
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "runCarHeartbeat"))
+ }
+
+ /**
+ * 查询司机服务数据
+ * @param context
+ * @param callback
+ */
+ @JvmStatic
+ fun queryDriverServiceData(
+ context: Context,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryServiceData(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ MoGoAiCloudClientConfig.getInstance().sn
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryDriverServiceData"))
+ }
+
+ /**
+ * 根据订单上传工控机返回的全路径规划数据
+ * @param context
+ * @param orderNo
+ * @param callback
+ */
+ @JvmStatic
+ fun updateOrderRoute(
+ context: Context, orderNo: String?, points: List?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.updateOrderRoute(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ OrderRouteUpdateReqBean(orderNo, points)
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "updateOrderRoute"))
+ }
+
+ /**
+ * 上报剩余里程,时间
+ * @param context
+ * @param orderNo
+ * @param distance
+ * @param duration
+ * @param callback
+ */
+ @JvmStatic
+ fun reportOrderRemain(
+ context: Context,
+ orderNo: String?,
+ distance: Long,
+ duration: Long,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.reportOrderRemain(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ UpdateOrderDisAndTimeReqBean(orderNo, distance, duration)
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "reportOrderRemain"))
+ }
+
+ /**
+ * 查询订单全路径
+ * @param context
+ * @param orderNo
+ * @param callback
+ */
+ @JvmStatic
+ fun queryOrderRoute(
+ context: Context,
+ orderNo: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryOrderRoute(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ orderNo
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryOrderRoute"))
+ }
+ @JvmStatic
+ fun confirmAutopilotConditionByDriver(
+ context: Context,
+ orderNo: String?,
+ loc: TaxiOrPassengerReadyReqBean.Result?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.confirmAutopilotConditionByDriver(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiOrPassengerReadyReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "confirmAutopilotConditionByDriver"))
+ }
+ @JvmStatic
+ fun queryAutopilotStatus(
+ context: Context, orderNo: String?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.queryPilotStatus(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ orderNo
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "queryAutopilotStatus"))
+ }
+ @JvmStatic
+ fun updatePassengerHasBoardedStatus(
+ context: Context,
+ orderNo: String?,
+ loc: TaxiOrPassengerReadyReqBean.Result?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.updatePassengerHasBoardedStatus(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiOrPassengerReadyReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "updatePassengerHasBoardedStatus"))
+ }
+ @JvmStatic
+ fun startServicePilotDone(
+ context: Context,
+ orderNo: String?,
+ loc: TaxiOrPassengerReadyReqBean.Result?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.startServicePilotDone(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiOrPassengerReadyReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "startServicePilotDone"))
+ }
+ @JvmStatic
+ fun arrivedStartPoint(
+ context: Context,
+ orderNo: String?,
+ loc: TaxiOrPassengerReadyReqBean.Result?,
+ callback: OchCommonServiceCallback?
+ ) {
+ mOCHTaxiServiceApi.arrivedStartPoint(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiOrPassengerReadyReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "arrivedStartPoint"))
+ }
+ @JvmStatic
+ fun arriveTerminal(
+ context: Context,
+ orderNo: String?,
+ loc: TaxiOrPassengerReadyReqBean.Result?,
+ callback: OchCommonServiceCallback
+ ) {
+ mOCHTaxiServiceApi.arriveTerminal(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiOrPassengerReadyReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "arriveTerminal"))
+ }
+ @JvmStatic
+ fun orderCompleted(
+ context: Context,
+ orderNo: String?,
+ loc: TaxiOrPassengerReadyReqBean.Result?,
+ callback: OchCommonServiceCallback
+ ) {
+ mOCHTaxiServiceApi.orderCompleted(
+ MoGoAiCloudClientConfig.getInstance().serviceAppId,
+ MoGoAiCloudClientConfig.getInstance().token,
+ TaxiOrPassengerReadyReqBean(
+ MoGoAiCloudClientConfig.getInstance().sn, orderNo, loc
+ )
+ )
+ .transformTry()
+ .subscribe(OchCommonSubscribeImpl(context, callback, "orderCompleted"))
+ }
+
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java
new file mode 100644
index 0000000000..112ed99f50
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java
@@ -0,0 +1,77 @@
+package com.mogo.och.taxi.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.amap.api.maps.model.LatLng;
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
+import com.mogo.och.taxi.model.TaxiModel;
+import com.mogo.och.taxi.ui.TaxiRottingNaviFragment;
+
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 描述
+ */
+public class NaviPresenter extends Presenter implements IOCHTaxiAutopilotPlanningCallback {
+
+ private static final String TAG = NaviPresenter.class.getSimpleName();
+
+ public NaviPresenter(TaxiRottingNaviFragment view) {
+ super(view);
+ TaxiModel.getInstance().init(AbsMogoApplication.getApp());
+ initListeners();
+ }
+
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ CallerLogger.INSTANCE.d( M_TAXI + TAG, " onCreate" );
+ }
+
+ @Override
+ public void onDestroy( @NonNull LifecycleOwner owner ) {
+ super.onDestroy( owner );
+ }
+
+ private void initListeners() {
+ TaxiModel.getInstance().setMoGoAutopilotPlanningListener(this);
+ }
+
+ private void releaseListeners() {
+ TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
+ }
+
+ private void runOnUIThread( Runnable executor ) {
+ if ( executor == null ) {
+ return;
+ }
+ if ( Looper.myLooper() != Looper.getMainLooper() ) {
+ UiThreadHandler.post( executor );
+ } else {
+ executor.run();
+ }
+ }
+
+ @Override
+ public void setLineMarker(LatLng startStation, LatLng endStation) {
+ runOnUIThread(() -> mView.setLineMarker(startStation,endStation));
+ }
+
+ @Override
+ public void routeResult(List routeArrivied, List routeArriving, MogoLocation location) {
+ mView.routeResult(routeArrivied,routeArriving,location);
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java
new file mode 100644
index 0000000000..f97b97d72a
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiOperationalPresenter.java
@@ -0,0 +1,64 @@
+package com.mogo.och.taxi.presenter;
+
+import android.os.Looper;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.callback.ITaxiCarOperationalCallback;
+import com.mogo.och.taxi.model.TaxiModel;
+import com.mogo.och.taxi.ui.TaxiPersonalDialogFragment;
+
+import java.util.List;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+public class TaxiOperationalPresenter extends Presenter
+ implements ITaxiCarOperationalCallback {
+ public TaxiOperationalPresenter(TaxiPersonalDialogFragment view) {
+ super(view);
+ initListener();
+ }
+
+ private void initListener() {
+ TaxiModel.getInstance().setCarStatusCallback(this);
+ }
+
+ private void releaseListener(){
+ TaxiModel.getInstance().setCarStatusCallback(null);
+ }
+
+ @Override
+ public void onDestroy(@NonNull LifecycleOwner owner) {
+ super.onDestroy(owner);
+ releaseListener();
+ }
+
+ // 获取全部订单列表
+ public void queryOrdersList(int page, int size) {
+ TaxiModel.getInstance().queryOrdersList(page, size);
+ }
+
+ @Override
+ public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
+ runOnUIThread(() -> mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum));
+ }
+
+ @Override
+ public void onOrdersListPageRefresh(List ordersList) {
+ runOnUIThread(() -> mView.onOrdersListPageRefresh(ordersList));
+ }
+
+ private void runOnUIThread( Runnable executor ) {
+ if ( executor == null ) {
+ return;
+ }
+ if ( Looper.myLooper() != Looper.getMainLooper() ) {
+ UiThreadHandler.post( executor );
+ } else {
+ executor.run();
+ }
+ }
+
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java
new file mode 100644
index 0000000000..d53d3e16f3
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java
@@ -0,0 +1,370 @@
+package com.mogo.och.taxi.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.os.Build;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.common.module.biz.bean.DriverStatusQueryRespBean;
+import com.mogo.och.common.module.biz.callback.ILoginCallback;
+import com.mogo.och.common.module.biz.constant.LoginStatusManager;
+import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.callback.ITaxiADASStatusCallback;
+import com.mogo.och.taxi.callback.ITaxiControllerStatusCallback;
+import com.mogo.och.taxi.callback.ITaxiOrderStatusCallback;
+import com.mogo.och.taxi.constant.TaxiConst;
+import com.mogo.och.taxi.constant.TaxiDriverRoleEnum;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.constant.TaxtServingStatusManager;
+import com.mogo.och.taxi.model.TaxiModel;
+import com.mogo.och.taxi.ui.TaxiFragment;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 描述
+ */
+public class TaxiPresenter extends Presenter implements ITaxiADASStatusCallback,
+ ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback {
+
+ private static final String TAG = TaxiPresenter.class.getSimpleName();
+
+ private int preAutopilotStatus = 0;
+
+ public TaxiPresenter(TaxiFragment view) {
+ super(view);
+ TaxiModel.getInstance().init(AbsMogoApplication.getApp());
+ OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
+ initListeners();
+ }
+
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ CallerLogger.INSTANCE.d( M_TAXI + TAG, "网约车-出租车拿到订单" );
+ }
+
+ @Override
+ public void onDestroy( @NonNull LifecycleOwner owner ) {
+ super.onDestroy( owner );
+
+ releaseListeners();
+ TaxiModel.getInstance().release();
+ }
+
+ private void initListeners() {
+ TaxiModel.getInstance().setADASStatusCallback(this);
+ TaxiModel.getInstance().setControllerStatusCallback(this);
+ TaxiModel.getInstance().setOrderStatusCallback(this);
+ }
+
+ private void releaseListeners() {
+ TaxiModel.getInstance().setADASStatusCallback(null);
+ TaxiModel.getInstance().setControllerStatusCallback(null);
+ TaxiModel.getInstance().setOrderStatusCallback(null);
+ OCHAdasAbilityManager.getInstance().release();
+ TaxiModel.getInstance().setMoGoAutopilotPlanningListener(null);
+ }
+
+ private void runOnUIThread( Runnable executor ) {
+ if ( executor == null ) {
+ return;
+ }
+ if ( Looper.myLooper() != Looper.getMainLooper() ) {
+ UiThreadHandler.post( executor );
+ } else {
+ executor.run();
+ }
+ }
+
+ /**
+ * 开启自动驾驶 自驾模式
+ */
+ public void startAutoPilot() {
+ TaxiModel.getInstance().startAutoPilot();
+ }
+
+ /**
+ * 人工模式
+ */
+ public void startManualDrive(){
+ TaxiModel.getInstance().startServicePilotDone();
+ }
+
+ /**
+ * 跳过乘客验证环节
+ */
+ public void jumpPassengerCheckDone(){
+ TaxiModel.getInstance().jumpPassengerCheckDone();
+ }
+
+ /**
+ * 司机确认车辆环境可开启自动驾驶
+ */
+ public void confirmAutopilotConditionByDriver() {
+ TaxiModel.getInstance().confirmAutopilotConditionByDriver();
+ }
+
+ // 更新接单状态
+ public void updateCarStatus() {
+ TaxiModel.getInstance().updateCarStatus();
+ }
+
+
+ // 获取当前订单状态
+ public TaxiOrderStatusEnum getCurOrderStatus() {
+ return TaxiModel.getInstance().getCurOrderStatus();
+ }
+
+ // 取消当前订单
+ public void cancelCurOrder(int reasonType, String reason) {
+ TaxiModel.getInstance().cancelCurrentOrder(reasonType, reason);
+ }
+
+ // 取消待服务中订单
+ public void cancelOrderById(String orderNo, int reasonType, String reason) {
+ TaxiModel.getInstance().cancelOrderById(orderNo, reasonType, reason);
+ }
+
+ // 查询当前订单route信息:预估时间、里程等
+ public void queryCurOrderRouteInfo() {
+ TaxiModel.getInstance().queryCurOrderRouteInfo();
+ }
+
+ // 执行抢单动作
+ public void grabOrder() {
+ TaxiModel.getInstance().grabOrder();
+ }
+
+ // 关闭新到预约单
+ public void cancelNewBookingOrder() {
+ TaxiModel.getInstance().cancelNewBookingOrder();
+ }
+
+ //更新订单已完成状态
+ public void completeOrderService() {
+ TaxiModel.getInstance().orderCompleted();
+ }
+
+ // 登出
+ public void logout() {
+ TaxiModel.getInstance().logout();
+ }
+
+ //导航去订单目的地
+ public void startNaviToEndStation(boolean isShow){
+ TaxiModel.getInstance().startNaviToEndStation(isShow);
+ }
+
+ public void reportToEndDisAndTime(long lastSumLength, long duration){//米/秒
+ TaxiModel.getInstance().reportOrderRemain(lastSumLength,duration);
+ }
+
+ public void closeOrderByMan(){
+ TaxiModel.getInstance().arriveTerminal();
+ }
+
+ @Override
+ public void onAutopilotArriveEnd() {
+
+ }
+
+ @Override
+ public void onAutopilotEnable() {
+ runOnUIThread(() -> mView.updateAutopilotStatus(
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE));
+ preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE;
+ }
+
+ @Override
+ public void onAutopilotDisable() {
+ runOnUIThread(() -> mView.updateAutopilotStatus(
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE));
+ preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE;
+ }
+
+ @Override
+ public void onAutopilotRunning() {
+ if (preAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
+ runOnUIThread(() -> mView.updateAutopilotStatus(
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING));
+ }
+ preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING;
+ }
+
+
+ @Override
+ public void onManMachineCoDriving() {
+ runOnUIThread(() -> mView.onManMachineCoDriving(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING));
+ preAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING;
+ }
+
+ @Override
+ public void onStartAdasFailure() {
+ runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus());
+ }
+
+ @Override
+ public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) {
+
+ }
+
+ @Override
+ public void onOrdersWaitServiceChanged(@NonNull @NotNull List waitServiceList) {
+ runOnUIThread(() -> mView.onOrdersWaitServiceChanged(waitServiceList));
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ @Override
+ public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"order = "+order.toString());
+ if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus){
+ TaxiModel.getInstance().queryAutopilotStatus(true);
+ TaxiModel.getInstance().setStation();
+ }
+
+ if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
+ TaxiModel.getInstance().startDynamicCalculateRouteInfo();
+ TaxiModel.getInstance().setStation();
+ runOnUIThread(() -> {
+ mView.updateCtvAutopilotStatusTag(true);
+ CallerOrderListenerManager.INSTANCE.invokeOrderStatus(true);
+ });
+
+ }
+
+ if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus ||
+ TaxiOrderStatusEnum.Cancel.getCode() == order.orderStatus ||
+ TaxiOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
+ TaxiModel.getInstance().startOrStopCalculateRouteInfo(false);
+ TaxiModel.getInstance().cleanLineMarker();
+ TaxiModel.getInstance().cleanStation();
+ runOnUIThread(() -> {
+ if(TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus){
+ CallerOrderListenerManager.INSTANCE.invokeOrderStatus(false);
+ }
+ });
+ }
+ runOnUIThread(() -> mView.updateCurrentOrderStatusChanged(order));
+ }
+
+ @Override
+ public void onCurrentOrderCancelDone() {
+ runOnUIThread(() -> mView.onCurrentOrderCancelDone());
+ }
+
+ @Override
+ public void onOrderCancelDone(String orderNo) {
+ runOnUIThread(() -> mView.onOrderCancelDone(orderNo));
+ }
+
+ @Override
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
+ runOnUIThread(() -> mView.onCurrentOrderRouteInfoGot(routeInfo));
+ }
+
+ @Override
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond) {
+ }
+
+ @Override
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
+ runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters,timeInSecond));
+ }
+
+ @Override
+ public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
+ runOnUIThread(() -> mView.onNewBookingOrderGot(order));
+ }
+
+ @Override
+ public void onGrabOrderExecuteDone() {
+ runOnUIThread(() -> mView.onGrabOrderExecuteDone());
+ }
+
+ @Override
+ public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
+ runOnUIThread(() -> mView.onGrabOrderSuccess(order));
+ }
+
+ @Override
+ public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
+ runOnUIThread(() -> mView.onGrabOrderFailed(order));
+ }
+
+ @Override
+ public void onDriverHasCheckedPilotCondition(boolean isSafe) {
+ runOnUIThread(() -> mView.onCheckPilotConditionSafe(isSafe));
+ }
+
+ @Override
+ public void onNaviToEnd(boolean isAmap, boolean isShow) {
+ runOnUIThread( () -> mView.onNaviToEnd(isAmap,isShow));
+ }
+
+ @Override
+ public void onVRModeChanged(boolean isVRMode) {
+ runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
+ }
+
+ @Override
+ public void onCarLocationChanged(MogoLocation location) {
+ if (null != location){
+ runOnUIThread(() -> {
+ mView.updateSpeedView((float) location.getGnssSpeed());
+ });
+ }
+ }
+
+ @Override
+ public void startOpenAutopilot() {
+ runOnUIThread(() -> {
+ mView.startOrStopLoadingAnim(true);
+ });
+ }
+
+ @Override
+ public void loginSuccess(DriverStatusQueryRespBean data) {
+ //设置 接单状态
+ TaxtServingStatusManager.setOpenOrderStatus(data.data.servingStatus);
+ //设置 是否启动订单轮训
+ TaxiModel.getInstance().startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus());
+
+ // 设置当前用户角色
+ String role = "";
+ if (TaxiDriverRoleEnum.DEMO.getCode() == data.data.purpose) {
+ role = TaxiConst.DEMO_USER;
+ } else if (TaxiDriverRoleEnum.TEST.getCode() == data.data.purpose) {
+ role = TaxiConst.TEST_USER;
+ }
+ String finalRole = role;
+ runOnUIThread(() -> {
+ mView.updateOperationStatus(TaxtServingStatusManager.isOpeningOrderStatus(), finalRole);
+ });
+ }
+
+ @Override
+ public void loginFail(boolean isLogin) {
+
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java
new file mode 100644
index 0000000000..8b928582cb
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java
@@ -0,0 +1,668 @@
+package com.mogo.och.taxi.ui;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+import static com.mogo.och.taxi.constant.TaxiConst.TIMER_START_AUTOPILOT_INTERVAL;
+
+import android.animation.ObjectAnimator;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.Group;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager;
+import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
+import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView;
+import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxButtonView;
+import com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView;
+import com.mogo.eagle.core.function.view.MapBizView;
+import com.mogo.eagle.core.function.smp.view.SmallMapView;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.uicontroller.IMogoMapUIController;
+import com.mogo.map.uicontroller.VisualAngleMode;
+import com.mogo.och.common.module.utils.AnimatorDrawableUtil;
+import com.mogo.och.taxi.R;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+import bag_manager.BagManagerOuterClass;
+import mogo.telematics.pad.MessagePad;
+import record_cache.RecordPanelOuterClass;
+
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+public abstract class BaseTaxiTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener {
+
+ private static final String TAG = "BaseOchFragment";
+ private RelativeLayout ctvAutopilotStatusRL;
+ private ImageView mAnimFlowIv;
+ protected TextView tvOperationStatus;
+ protected TextView mDriverRole;
+ protected FrameLayout flStationPanelContainer;
+ private FrameLayout flNaviPanelContainer;
+ private MapBizView mapBizView;
+ private Group groupTestPanel;
+ private TextView mSpeedView;
+ private ImageView mAutopilotImage;
+ private TextView mAutopilotTv;
+ private LinearLayout mMapswitchBtn;
+ private ImageView mSwitchBtnIcon;
+ private ImageView mCloseNaviIcon;
+ protected RelativeLayout mSettingBtn;
+ protected LinearLayout mBadcaseBtn;
+ //消息盒子
+ protected DriverMsgBoxButtonView driverMsgBoxButtonView;
+ protected DriverMsgBoxListView viewDriverMsgBoxList;
+ protected DriverMsgBoxBubbleView viewDriverMsgBoxBubble;
+
+ protected TaxiAmapNaviFragment ochAmapNaviFragment = null;
+ protected TaxiRottingNaviFragment taxiRottingNaviFragment = null;
+ // protected TaxiTrafficLightView mTrafficLightView;
+
+ protected SmallMapView smallMapView;
+
+ private Handler mHandler = new Handler(Looper.getMainLooper());
+
+ private Integer[] startAutopilotDrawableIds = new Integer[]{
+ R.drawable.anim_flow_00000, R.drawable.anim_flow_00001, R.drawable.anim_flow_00002,
+ R.drawable.anim_flow_00003, R.drawable.anim_flow_00004, R.drawable.anim_flow_00005,
+ R.drawable.anim_flow_00006, R.drawable.anim_flow_00007, R.drawable.anim_flow_00008,
+ R.drawable.anim_flow_00009, R.drawable.anim_flow_00010, R.drawable.anim_flow_00011,
+ R.drawable.anim_flow_00012, R.drawable.anim_flow_00013, R.drawable.anim_flow_00014,
+ R.drawable.anim_flow_00015, R.drawable.anim_flow_00016, R.drawable.anim_flow_00017,
+ R.drawable.anim_flow_00018, R.drawable.anim_flow_00019, R.drawable.anim_flow_00020,
+ R.drawable.anim_flow_00021, R.drawable.anim_flow_00022, R.drawable.anim_flow_00023,
+ R.drawable.anim_flow_00024, R.drawable.anim_flow_00025, R.drawable.anim_flow_00026,
+ R.drawable.anim_flow_00027, R.drawable.anim_flow_00028, R.drawable.anim_flow_00029,
+ R.drawable.anim_flow_00030, R.drawable.anim_flow_00031, R.drawable.anim_flow_00032,
+ R.drawable.anim_flow_00033, R.drawable.anim_flow_00034, R.drawable.anim_flow_00035,
+ R.drawable.anim_flow_00036, R.drawable.anim_flow_00037, R.drawable.anim_flow_00038,
+ R.drawable.anim_flow_00039, R.drawable.anim_flow_00040, R.drawable.anim_flow_00041,
+ R.drawable.anim_flow_00042, R.drawable.anim_flow_00043, R.drawable.anim_flow_00044,
+ R.drawable.anim_flow_00045, R.drawable.anim_flow_00046, R.drawable.anim_flow_00047,
+ R.drawable.anim_flow_00048, R.drawable.anim_flow_00049, R.drawable.anim_flow_00050,
+ R.drawable.anim_flow_00051, R.drawable.anim_flow_00052, R.drawable.anim_flow_00053,
+ R.drawable.anim_flow_00054, R.drawable.anim_flow_00055, R.drawable.anim_flow_00056,
+ R.drawable.anim_flow_00057, R.drawable.anim_flow_00058, R.drawable.anim_flow_00059
+ };
+
+ private Integer[] startManCODrawableIds = new Integer[]{
+ R.drawable.anim_flow_man_co_00000, R.drawable.anim_flow_man_co_00001,
+ R.drawable.anim_flow_man_co_00002, R.drawable.anim_flow_man_co_00003,
+ R.drawable.anim_flow_man_co_00004, R.drawable.anim_flow_man_co_00005,
+ R.drawable.anim_flow_man_co_00006, R.drawable.anim_flow_man_co_00007,
+ R.drawable.anim_flow_man_co_00008, R.drawable.anim_flow_man_co_00009,
+ R.drawable.anim_flow_man_co_00010, R.drawable.anim_flow_man_co_00011,
+ R.drawable.anim_flow_man_co_00012, R.drawable.anim_flow_man_co_00013,
+ R.drawable.anim_flow_man_co_00014, R.drawable.anim_flow_man_co_00015,
+ R.drawable.anim_flow_man_co_00016, R.drawable.anim_flow_man_co_00017,
+ R.drawable.anim_flow_man_co_00018, R.drawable.anim_flow_man_co_00019,
+ R.drawable.anim_flow_man_co_00020, R.drawable.anim_flow_man_co_00021,
+ R.drawable.anim_flow_man_co_00022, R.drawable.anim_flow_man_co_00023,
+ R.drawable.anim_flow_man_co_00024, R.drawable.anim_flow_man_co_00025,
+ R.drawable.anim_flow_man_co_00026, R.drawable.anim_flow_man_co_00027,
+ R.drawable.anim_flow_man_co_00028, R.drawable.anim_flow_man_co_00029,
+ R.drawable.anim_flow_man_co_00030, R.drawable.anim_flow_man_co_00031,
+ R.drawable.anim_flow_man_co_00032, R.drawable.anim_flow_man_co_00033,
+ R.drawable.anim_flow_man_co_00034, R.drawable.anim_flow_man_co_00035,
+ R.drawable.anim_flow_man_co_00036, R.drawable.anim_flow_man_co_00037,
+ R.drawable.anim_flow_man_co_00038, R.drawable.anim_flow_man_co_00039,
+ R.drawable.anim_flow_man_co_00040, R.drawable.anim_flow_man_co_00041,
+ R.drawable.anim_flow_man_co_00042, R.drawable.anim_flow_man_co_00043,
+ R.drawable.anim_flow_man_co_00044, R.drawable.anim_flow_man_co_00045,
+ R.drawable.anim_flow_man_co_00046, R.drawable.anim_flow_man_co_00047,
+ R.drawable.anim_flow_man_co_00048, R.drawable.anim_flow_man_co_00049,
+ R.drawable.anim_flow_man_co_00050, R.drawable.anim_flow_man_co_00051,
+ R.drawable.anim_flow_man_co_00052, R.drawable.anim_flow_man_co_00053,
+ R.drawable.anim_flow_man_co_00054, R.drawable.anim_flow_man_co_00055,
+ R.drawable.anim_flow_man_co_00056, R.drawable.anim_flow_man_co_00057,
+ R.drawable.anim_flow_man_co_00058, R.drawable.anim_flow_man_co_00059
+ };
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_base_fragment;
+ }
+
+ private View panelView;
+
+ @Override
+ protected void initViews() {
+ mapBizView = findViewById(R.id.mapBizView);
+ groupTestPanel = findViewById(R.id.groupTestPanel);
+ ctvAutopilotStatusRL = findViewById(R.id.module_mogo_och_autopilot_status);
+ ctvAutopilotStatusRL.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
+ updateCtvAutopilotStatusTag(false);
+ mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
+ mAnimFlowIv = findViewById(R.id.anim_flow_iv);
+ mAutopilotTv = findViewById(R.id.module_och_autopilot_tv);
+ flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
+ driverMsgBoxButtonView = findViewById(R.id.viewDriverMsgBoxButton);
+ viewDriverMsgBoxList = findViewById(R.id.viewDriverMsgBoxList);
+ viewDriverMsgBoxBubble = findViewById(R.id.viewDriverMsgBoxBubble);
+ // mTrafficLightView = findViewById(R.id.taxi_traffic_light_view);
+ // CallerHmiManager.INSTANCE.setProxyTrafficLightView(mTrafficLightView);
+
+ mSpeedView = findViewById(R.id.module_mogo_och_speed_tv);
+ mCloseNaviIcon = findViewById(R.id.taxi_close_navi_icon);
+ flNaviPanelContainer = findViewById(R.id.module_mogo_och_navi_panel_container);
+ mSpeedView.setLongClickable(true); //调试按钮任意模式下都开
+
+ tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
+ mDriverRole = findViewById(R.id.taxi_driver_role_tv);
+
+ mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_layout);
+ mSwitchBtnIcon = findViewById(R.id.taxi_switch_icon);
+ updateSwitchMapIcon();
+ mMapswitchBtn.setOnClickListener(v -> {
+ //视角切换
+ long start = SystemClock.elapsedRealtime();
+ try {
+ IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
+ if (controller != null) {
+ //切换地图的远近视图
+ if (controller.getCurrentMapVisualAngle().isLongSight()) {
+ Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(true);
+ controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ mSwitchBtnIcon.setImageResource(R.drawable.taxi_switch_map_medium);
+ } else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
+ Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(false);
+ controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ mSwitchBtnIcon.setImageResource(R.drawable.taxi_switch_map_long);
+ } else {
+ mSwitchBtnIcon.setImageResource(R.drawable.taxi_switch_map_medium);
+ }
+ }
+ } finally {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "cost:" + (SystemClock.elapsedRealtime() - start));
+ }
+
+ });
+
+ mSettingBtn = findViewById(R.id.module_och_taxi_setting_layout);
+ mSettingBtn.setOnClickListener(v -> {
+ // TODO: 2021/12/9
+ CallerHmiManager.INSTANCE.showToolsView();
+ });
+
+ // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
+ mBadcaseBtn = findViewById(R.id.module_och_taxi_badcase_ll);
+ if (mBadcaseBtn != null) {
+ CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn);
+ CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this);
+ }
+
+ panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
+ ctvAutopilotStatusRL.setOnClickListener(new OnPreventFastClickListener() {
+ @Override
+ public void onClickImpl(View v) {
+ // 如果能自动驾驶,就自动驾驶,不能就提示
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() ==
+ IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) {
+ return; //远程代驾状态下不可开启自动驾驶,只能等远程代驾主动退出
+ } else if (!(boolean) ctvAutopilotStatusRL.getTag()) {
+ ToastUtils.showShort(getResources().getString(R.string.module_och_taxi_auto_disable_tip1));
+ } else {
+ startAutopilot();
+ }
+ }
+ });
+
+ // debug下调用测试面板 长按速度值 任意模式下调试都打开
+// if (DebugConfig.isDebug()) {
+ mSpeedView.setOnLongClickListener(v -> {
+ if (groupTestPanel.getVisibility() == View.VISIBLE) {
+ groupTestPanel.setVisibility(View.GONE);
+ } else {
+ groupTestPanel.setVisibility(View.VISIBLE);
+ }
+ return false;
+ });
+// }
+
+ onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
+
+ // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
+ findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
+
+ );
+
+ // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
+ findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
+
+ );
+
+ // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
+ findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
+
+ );
+
+ findViewById(R.id.btnAutopilotmanco).setOnClickListener(view ->
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING));
+
+ tvOperationStatus.setOnClickListener(view -> {
+ onChangeOperationStatus();
+ });
+ mCloseNaviIcon.setOnClickListener(v -> {
+ showAmapNaviToStationFragment(false);
+ showRottingToStationFragment(false);
+ });
+
+ driverMsgBoxButtonView.setClickListener(show -> {
+ if (show) {
+ viewDriverMsgBoxList.setVisibility(View.VISIBLE);
+ viewDriverMsgBoxList.notifyData();
+ viewDriverMsgBoxBubble.setVisibility(View.GONE);
+ viewDriverMsgBoxBubble.isShowData(false);
+ } else {
+ viewDriverMsgBoxList.setVisibility(View.GONE);
+ viewDriverMsgBoxBubble.setVisibility(View.VISIBLE);
+ viewDriverMsgBoxBubble.isShowData(true);
+ }
+ });
+
+ smallMapView = findViewById(R.id.smallMapView);
+ }
+
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ mapBizView.onCreate(savedInstanceState);
+ smallMapView.onCreateView(savedInstanceState);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mapBizView.onResume();
+ smallMapView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mapBizView.onPause();
+ smallMapView.onPause();
+ }
+
+ protected void onChangeOperationStatus() {
+
+ }
+
+ private void updateSwitchMapIcon() {
+ IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
+ if (controller != null) {
+ if (controller.getCurrentMapVisualAngle().isLongSight()) {
+ mSwitchBtnIcon.setImageResource(R.drawable.taxi_switch_map_long);
+ } else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
+ mSwitchBtnIcon.setImageResource(R.drawable.taxi_switch_map_medium);
+ } else {
+ mSwitchBtnIcon.setImageResource(R.drawable.taxi_switch_map_medium);
+ }
+ }
+ }
+
+ @Override
+ public void onLowMemory() {
+ super.onLowMemory();
+ mapBizView.onLowMemory();
+ }
+
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mapBizView.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public void onDestroyView() {
+ mapBizView.onDestroy();
+ super.onDestroyView();
+ CallerAutopilotRecordListenerManager.INSTANCE.removeListener(TAG);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ smallMapView.onDestroy();
+ }
+
+ @Override
+ public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) {
+ }
+
+ @Override
+ public void onAutopilotRecordConfig(@NonNull MessagePad.RecordDataConfig config) {
+ }
+
+ @Override
+ public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) {
+ }
+
+ /**
+ * 改变自动驾驶状态
+ *
+ * @param status 2 - running 1 - enable 2 - disable
+ */
+ private int mPrevAPStatus = -1;
+
+ public void onAutopilotStatusChanged(int status) {
+ getActivity().runOnUiThread(() -> {
+ 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;
+ }
+ // 3. 其他过程直接更新
+ startOrStopLoadingAnim(false);
+ autopilotStatusAnimchanged(status);
+ mPrevAPStatus = status;
+ });
+ }
+
+ public void stopAnimAndUpdateBtnStatus() {
+ startOrStopLoadingAnim(false);
+ startAutopilotDone(false);
+ }
+
+ public void onManMachineCoDriving(int manMachineCoDriving) {
+ if (mPrevAPStatus != manMachineCoDriving) {
+ autopilotStatusAnimchanged(manMachineCoDriving);
+ }
+ mPrevAPStatus = manMachineCoDriving;
+ }
+
+ public void updateCtvAutopilotStatusTag(boolean tag) {
+ ctvAutopilotStatusRL.setTag(tag);
+ }
+
+ public void onCheckPilotConditionSafe(boolean isSafe) {
+ updateCtvAutopilotStatusTag(isSafe);
+ if (isSafe) {
+ updateOrderBottomBtnUI();
+ }
+ }
+
+ protected abstract void updateOrderBottomBtnUI();
+
+ private AnimatorDrawableUtil animatorDrawableUtil = null;
+
+ public void autopilotStatusAnimchanged(int status) {
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+
+ if (animatorDrawableUtil == null) {
+ animatorDrawableUtil = new AnimatorDrawableUtil();
+ }
+ animatorDrawableUtil.setAnimation(mAnimFlowIv, Arrays.asList(startAutopilotDrawableIds));
+ animatorDrawableUtil.start(true, 100, null);
+
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+ if (animatorDrawableUtil != null) {
+ animatorDrawableUtil.stop();
+ mAnimFlowIv.setImageResource(0);
+ }
+
+// ctvAutopilotStatusRL.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
+ animatorDrawableUtil = null;
+ } else if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == status) {
+ mAutopilotTv.setText("远程代驾");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+ if (animatorDrawableUtil == null) {
+ animatorDrawableUtil = new AnimatorDrawableUtil();
+ }
+ animatorDrawableUtil.setAnimation(mAnimFlowIv, Arrays.asList(startManCODrawableIds));
+ animatorDrawableUtil.start(true, 100, null);
+
+ } else {
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_disable));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_disable);
+ if (animatorDrawableUtil != null) {
+ animatorDrawableUtil.stop();
+ mAnimFlowIv.setImageResource(0);
+ }
+
+// ctvAutopilotStatusRL.setBackground(getResources().getDrawable(R.drawable.taxi_ic_autopilot_bg));
+ animatorDrawableUtil = null;
+ }
+
+ }
+
+ private void startAutopilotDone(boolean success) {
+ if (autopilotLoadingAnimator != null) {
+ autopilotLoadingAnimator.end();
+ mAutopilotImage.clearAnimation();
+ autopilotLoadingAnimator = null;
+ }
+ if (success) {
+ mAutopilotTv.setText("成功");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_success);
+ } else {
+ mAutopilotTv.setText("失败");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_failed);
+ }
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ startOrStopLoadingAnim(false);
+ onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
+ }
+ }, 1000L);
+ }
+
+ public boolean isStarting = false;
+ private ObjectAnimator autopilotLoadingAnimator;
+
+ public void startOrStopLoadingAnim(boolean start) {
+ if (start) {
+ isStarting = true;
+ mAutopilotTv.setText("启动中");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_loading);
+ if (autopilotLoadingAnimator == null) {
+ autopilotLoadingAnimator = ObjectAnimator.ofFloat(mAutopilotImage,
+ "rotation", 0f, 360f);
+ }
+ autopilotLoadingAnimator.setInterpolator(new LinearInterpolator());
+ autopilotLoadingAnimator.setRepeatCount(-1);//无限循环
+ autopilotLoadingAnimator.setStartDelay(100);
+ autopilotLoadingAnimator.setDuration(1000);//设置持续时间
+ autopilotLoadingAnimator.start();//动画开始
+
+ startingAutoApilotCountDown();
+
+ } else {
+ isStarting = false;
+ if (autopilotLoadingAnimator != null) {
+ autopilotLoadingAnimator.end();
+ mAutopilotImage.clearAnimation();
+ autopilotLoadingAnimator = null;
+ }
+ }
+ }
+
+ private void startingAutoApilotCountDown() {
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() { //未启动成功10s后做处理
+ if (isStarting) { //判断动画是否在进行
+ //并且根据状态来设置自动驾驶启动成功还是失败
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getState()
+ == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ startAutopilotDone(true);
+ } else {
+ startAutopilotDone(false);
+ }
+ }
+
+ }
+ }, TIMER_START_AUTOPILOT_INTERVAL);
+ }
+
+ public void hidPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.GONE);
+ });
+ }
+
+ public void showPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public View getPanelView() {
+ return panelView;
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 重新开启自动驾驶
+ */
+ public abstract void startAutopilot();
+
+
+ public void changeOperationViewVisible(int visible) {
+ getActivity().runOnUiThread(() -> {
+ if (tvOperationStatus == null) {
+ return;
+ }
+ tvOperationStatus.setVisibility(visible);
+ });
+ }
+
+ public void updateSpeedView(float newSpeed) {
+ int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
+ mSpeedView.setText(String.valueOf(speed));
+ }
+
+ @Override
+ public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
+ //todo ui 切换
+ }
+
+ protected void showAmapNaviToStationFragment(boolean isShow) {
+
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ closeAmapViewIFHadeAdd();
+ if (isShow) {
+ closeRouteViewIFHadeAdd();
+// if (ochNaviFragment == null){
+ ochAmapNaviFragment = TaxiAmapNaviFragment.newInstance();
+// }
+ if (ochAmapNaviFragment.isAdded()) {
+ return;
+ }
+ transaction.add(R.id.module_mogo_och_navi_panel_container, ochAmapNaviFragment).show(ochAmapNaviFragment);
+ transaction.commitAllowingStateLoss();
+ mCloseNaviIcon.setVisibility(View.VISIBLE);
+ flNaviPanelContainer.setVisibility(View.VISIBLE);
+ smallMapView.setVisibility(View.GONE);
+ } else {
+ mCloseNaviIcon.setVisibility(View.GONE);
+ flNaviPanelContainer.setVisibility(View.GONE);
+ smallMapView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void closeAmapViewIFHadeAdd() {
+ if (ochAmapNaviFragment != null) {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ ochAmapNaviFragment.onDestroy();
+ transaction.remove(ochAmapNaviFragment);
+ transaction.commitAllowingStateLoss();
+ ochAmapNaviFragment = null;
+ }
+ }
+
+ private void closeRouteViewIFHadeAdd() {
+ if (taxiRottingNaviFragment != null) {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ taxiRottingNaviFragment.onDestroy();
+ transaction.remove(taxiRottingNaviFragment);
+ transaction.commitAllowingStateLoss();
+ taxiRottingNaviFragment = null;
+ }
+ }
+
+ protected void showRottingToStationFragment(boolean isShow) {
+
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (isShow) {
+ closeAmapViewIFHadeAdd();
+// if (ochNaviFragment == null){
+ taxiRottingNaviFragment = TaxiRottingNaviFragment.newInstance();
+// }
+ if (taxiRottingNaviFragment.isAdded()) {
+ return;
+ }
+ transaction.add(R.id.module_mogo_och_navi_panel_container, taxiRottingNaviFragment).show(taxiRottingNaviFragment);
+ transaction.commitAllowingStateLoss();
+ mCloseNaviIcon.setVisibility(View.VISIBLE);
+ flNaviPanelContainer.setVisibility(View.VISIBLE);
+ smallMapView.setVisibility(View.GONE);
+ } else {
+ closeRouteViewIFHadeAdd();
+ mCloseNaviIcon.setVisibility(View.GONE);
+ flNaviPanelContainer.setVisibility(View.GONE);
+ smallMapView.setVisibility(View.VISIBLE);
+ }
+ }
+
+
+ public abstract void startNaviToEndStation(boolean isShow);
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/BaseTaxiUIFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/BaseTaxiUIFragment.java
new file mode 100644
index 0000000000..013b27bf3e
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/BaseTaxiUIFragment.java
@@ -0,0 +1,50 @@
+package com.mogo.och.taxi.ui;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/9
+ */
+public abstract class BaseTaxiUIFragment extends Fragment {
+ private View mRootView;
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ if (mRootView == null) {
+ mRootView = inflater.inflate(getLayoutId(), container, false);
+ } else {
+ ViewGroup viewGroup = (ViewGroup) mRootView.getParent();
+ if (viewGroup != null) {
+ viewGroup.removeView(mRootView);
+ }
+ }
+ initViews(mRootView);
+ initViews(savedInstanceState);
+ return mRootView;
+ }
+ /**
+ * 布局资源
+ *
+ * @return
+ */
+ protected abstract int getLayoutId();
+
+ protected abstract void initViews(View view);
+
+ protected void initViews(Bundle savedInstanceState) {
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ mRootView = null;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.java
new file mode 100644
index 0000000000..cf589373ef
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiMapDirectionView.java
@@ -0,0 +1,23 @@
+package com.mogo.och.taxi.ui;
+
+/**
+ * @author xiaoyuzhou
+ * @date 2021/6/24 11:33 上午
+ */
+public interface ITaxiMapDirectionView {
+
+ /**
+ * 绘制路径线
+ */
+ void drawablePolyline();
+
+ /**
+ * 清除路径线
+ */
+ void clearPolyline();
+
+ /**
+ * 设置路径中起终点marker
+ */
+ void setLineMarker();
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiView.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiView.java
new file mode 100644
index 0000000000..a45a30f184
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/ITaxiView.java
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.ui;
+
+import com.mogo.commons.mvp.IView;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 描述
+ */
+interface ITaxiView extends IView {
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.java
new file mode 100644
index 0000000000..f112a4f47a
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiAmapNaviFragment.java
@@ -0,0 +1,217 @@
+package com.mogo.och.taxi.ui;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.os.Bundle;
+import android.view.View;
+
+import com.amap.api.navi.AMapNaviViewListener;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.common.module.map.AmapNaviToDestinationModel;
+import com.mogo.och.common.module.map.ICommonNaviChangedCallback;
+import com.mogo.och.common.module.map.CommonAmapNaviVIew;
+import com.mogo.och.taxi.R;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/30
+ */
+public class TaxiAmapNaviFragment extends BaseTaxiUIFragment implements AMapNaviViewListener {
+
+ private CommonAmapNaviVIew mAMapNaviView;
+ private ICommonNaviChangedCallback mNaviToStartInfoCallback;
+ public static TaxiAmapNaviFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ TaxiAmapNaviFragment fragment = new TaxiAmapNaviFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_amap_navi_view;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ mAMapNaviView = view.findViewById(R.id.navi_view);
+ }
+
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ if (mAMapNaviView != null)
+ mAMapNaviView.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mAMapNaviView != null)
+ mAMapNaviView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (mAMapNaviView != null)
+ mAMapNaviView.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ AmapNaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(false);
+ if (mAMapNaviView != null){
+ mAMapNaviView.onDestroy();
+ }
+
+ if (mNaviToStartInfoCallback != null){
+ mNaviToStartInfoCallback = null;
+ }
+ }
+
+ @Override
+ public void onNaviSetting() {
+ //底部导航设置点击回调
+ }
+
+ @Override
+ public void onNaviCancel() {
+ }
+
+ @Override
+ public void onNaviMapMode(int naviMode) {
+ //导航态车头模式,0:车头朝上状态;1:正北朝上模式。
+ }
+
+ @Override
+ public void onNaviTurnClick() {
+ //转弯view的点击回调
+ }
+
+ @Override
+ public void onNextRoadClick() {
+ //下一个道路View点击回调
+ }
+
+
+ @Override
+ public void onScanViewButtonClick() {
+ //全览按钮点击回调
+ }
+
+
+ @Override
+ public void onLockMap(boolean isLock) {
+ //锁地图状态发生变化时回调
+ }
+
+ @Override
+ public void onNaviViewLoaded() {
+ CallerLogger.INSTANCE.d(M_TAXI + "wlx", "导航页面加载成功");
+ CallerLogger.INSTANCE.d(M_TAXI + "wlx", "请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑");
+ }
+
+ @Override
+ public void onMapTypeChanged(int i) {
+
+ }
+
+ @Override
+ public void onNaviViewShowMode(int i) {
+
+ }
+
+ @Override
+ public boolean onNaviBackClick() {
+ return false;
+ }
+
+ /**
+ * 车道信息说明:
+ *
+ * 0xFF, 无对应车道
+ * 0, 直行
+ * 1, 左转
+ * 2, 直行+左转
+ * 3, 右转
+ * 4, 直行+右转
+ * 5, 左掉头
+ * 6, 左转+右转
+ * 7, 直行+左转+右转
+ * 8, 右掉头
+ * 9, 直行+左掉头
+ * 10, 直行+右掉头
+ * 11, 左转+左掉头
+ * 12, 右转+右掉头
+ * 13, 直行+扩展
+ * 14, 左转+左掉头+扩展
+ * 15, 保留
+ * 16, 直行+左转+左掉头
+ * 17, 右转+左掉头
+ * 18, 左转+右转+左掉头
+ * 19, 直行+右转+左掉头
+ * 20, 左转+右掉头
+ * 21, 公交车道
+ * 22, 空车道
+ * 23 可变车道
+ */
+
+ String[] array = {
+ "直行车道"
+ , "左转车道"
+ , "左转或直行车道"
+ , "右转车道"
+ , "右转或直行车道"
+ , "左掉头车道"
+ , "左转或者右转车道"
+ , " 左转或右转或直行车道"
+ , "右转掉头车道"
+ , "直行或左转掉头车道"
+ , "直行或右转掉头车道"
+ , "左转或左掉头车道"
+ , "右转或右掉头车道"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择该车道"
+ , "直行+左转+左掉头车道"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+
+ String[] actions = {
+ "直行"
+ , "左转"
+ , "左转或直行"
+ , "右转"
+ , "右转或这行"
+ , "左掉头"
+ , "左转或者右转"
+ , " 左转或右转或直行"
+ , "右转掉头"
+ , "直行或左转掉头"
+ , "直行或右转掉头"
+ , "左转或左掉头"
+ , "右转或右掉头"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择"
+ , "直行+左转+左掉头"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingServerdOrdersFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingServerdOrdersFragment.java
new file mode 100644
index 0000000000..dfedd99cbf
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiBeingServerdOrdersFragment.java
@@ -0,0 +1,829 @@
+package com.mogo.och.taxi.ui;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.Html;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.RequiresApi;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.amap.api.navi.model.NaviLatLng;
+import com.mogo.eagle.core.data.map.CenterLine;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager;
+import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.overlay.IMoGoOverlayManager;
+import com.mogo.map.overlay.core.Level;
+import com.mogo.map.overlay.point.Point;
+import com.mogo.map.uicontroller.IMogoMapUIController;
+import com.mogo.och.common.module.map.AmapNaviToDestinationModel;
+import com.mogo.och.common.module.map.ICommonNaviChangedCallback;
+import com.mogo.och.common.module.utils.DateTimeUtil;
+import com.mogo.och.common.module.utils.NumberFormatUtil;
+import com.mogo.och.common.module.utils.OCHThreadPoolManager;
+import com.mogo.och.common.module.voice.VoiceNotice;
+import com.mogo.och.common.module.wigets.OCHCommitDialog;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.constant.TaxiConst;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.model.TaxiModel;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ * 正在进行中订单
+ */
+public class TaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment
+ implements View.OnClickListener, ICommonNaviChangedCallback {
+
+ public static final String TAG = "OCHTaxiBeingServerd";
+ private static Activity mActivity;
+ private static TaxiFragment mTaxiFragment;
+ private String mOrderNo;
+ private volatile int mTtsLessThan200Tip = 0;//离终点200米提示播报
+ private OrderQueryRespBean.Result mCurrentOrder = null;
+ private boolean isFirstStartAutopilotDone = true;
+
+ private TextView mOrderStatus;
+ private ImageView mOrderCancel;
+
+ private TextView mOrderServerStatus;
+ private ConstraintLayout mOrderStartModeBtn;
+ private TextView mAutoPilotBtn;
+ private TextView mManualBtn;
+
+ private ConstraintLayout mBeingOrderLayout;
+ private ConstraintLayout mContentModule3;
+ private ConstraintLayout mContentModule2;
+ private TextView mDistanceAndTime3;
+ private TextView mDistanceAndTime2;
+ private TextView mStationTv2;
+ private TextView mOrderOtherContent3;
+ private TextView mArrivedStartTimeTv32;
+ private TextView mTitleTV2;
+
+ private LinearLayout mContentModule31;
+ private TextView mStationTv31;
+ private ConstraintLayout mContentModule32;
+ private TextView mStationTv32;
+ private TextView mArrivedStationTitleTv32;
+ private TextView mGoAheadStationTitleTv31;
+ private TextView mCatchStationTitleTv31;
+ private ImageView mNaviStartIcon;
+ private ImageView mNaviToEndIcon;
+ private TextView mPassengerNum;
+ private TextView mPassengerPhone;
+ private ConstraintLayout mPassengerInfoLayout;
+
+ private TextView mNoDatasTv;
+
+ private ConstraintLayout mNoDataView;
+
+ private volatile int saveOrderState = -1;
+
+ public static TaxiBeingServerdOrdersFragment newInstance(Activity activity, TaxiFragment taxiFragment) {
+ mActivity = activity;
+ mTaxiFragment = taxiFragment;
+ Bundle args = new Bundle();
+
+ TaxiBeingServerdOrdersFragment fragment = new TaxiBeingServerdOrdersFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_being_order;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ mOrderStatus = view.findViewById(R.id.module_och_taxi_order_status);
+ mOrderCancel = view.findViewById(R.id.module_och_taxi_order_cancel_iv);
+
+ mOrderServerStatus = view.findViewById(R.id.module_och_taxi_order_server_status_tv);
+ mOrderStartModeBtn = view.findViewById(R.id.taxi_start_mode_btn);
+ mAutoPilotBtn = view.findViewById(R.id.taxi_start_by_auto);
+ mManualBtn = view.findViewById(R.id.taxi_start_by_manual);
+
+ mBeingOrderLayout = view.findViewById(R.id.module_och_taxi_being_order_content);
+ mContentModule2 = view.findViewById(R.id.module_och_taxi_order_status_station_2);
+ mContentModule3 = view.findViewById(R.id.module_och_taxi_order_status_station_3);
+ mDistanceAndTime2 = view.findViewById(R.id.module_och_taxi_order_distance_anchor_2);
+ mContentModule31 = view.findViewById(R.id.module_och_taxi_order_go_ahead_station_31);
+ mContentModule32 = view.findViewById(R.id.module_och_taxi_order_arrive_station_32);
+ mStationTv2 = view.findViewById(R.id.module_och_taxi_order_station_2);
+ mStationTv31 = view.findViewById(R.id.module_och_taxi_order_start_station_31);
+ mStationTv32 = view.findViewById(R.id.module_och_taxi_order_end_station_32);
+ mOrderOtherContent3 = view.findViewById(R.id.module_och_taxi_order_other_content_3);
+ mDistanceAndTime3 = view.findViewById(R.id.module_och_taxi_order_distance_anchor_3);
+ mArrivedStartTimeTv32 = view.findViewById(R.id.module_och_taxi_order_had_arrived_time_32);
+ mTitleTV2 = view.findViewById(R.id.module_och_taxi_order_station_title_2);
+ mCatchStationTitleTv31 = view.findViewById(R.id.go_ahead_station_catch_31);
+ mGoAheadStationTitleTv31 = view.findViewById(R.id.go_ahead_station_31);
+ mArrivedStationTitleTv32 = view.findViewById(R.id.arrive_station_32);
+
+ mPassengerInfoLayout = view.findViewById(R.id.module_och_taxi_order_passenger_data);
+ mPassengerNum = view.findViewById(R.id.taxi_passenger_num);
+ mPassengerPhone = view.findViewById(R.id.taxi_passenger_phone);
+
+ mNoDatasTv = view.findViewById(R.id.no_order_data_tv);
+ mNoDataView = view.findViewById(R.id.being_no_data_view);
+
+ initOnClickListener();
+
+ initNaviView(view);
+
+ isHaveBeingOrder(false);
+
+ //任意模式下调试信息都打开
+ initOrderTestBar(view);
+ }
+
+ private void initOnClickListener() {
+ mOrderCancel.setOnClickListener(this);
+ mOrderServerStatus.setOnClickListener(this);
+ mAutoPilotBtn.setOnClickListener(this);
+ mManualBtn.setOnClickListener(this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+
+ private void initNaviView(View view) {
+ mNaviStartIcon = view.findViewById(R.id.module_och_taxi_navi_iv);
+ mNaviStartIcon.setOnClickListener(this);
+
+ mNaviToEndIcon = view.findViewById(R.id.module_och_taxi_navi_end_iv);
+ mNaviToEndIcon.setOnClickListener(this);
+
+ }
+
+ /**
+ * 初始化订单信息
+ */
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ try {
+ if (order == null) return;
+ if (order.orderStatus == TaxiOrderStatusEnum.JourneyCompleted.getCode()) {
+ mCurrentOrder = null;
+ isHaveBeingOrder(false);
+ mDistanceAndTime2.setText("距离 - - 公里,用时 - - 分");
+ mDistanceAndTime3.setText("距离 - - 公里,用时 - - 分");
+ return;
+ }
+ mOrderNo = order.orderNo;
+ onOrderStatusChanged(order);
+ if (TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus) {
+
+ showOrHideOrderModeBtn(false);
+
+ mTaxiFragment.queryCurOrderRouteInfo();
+ mContentModule3.setVisibility(View.GONE);
+ mContentModule2.setVisibility(View.VISIBLE);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "已经达到终点");
+ mOrderStatus.setText(R.string.module_och_taxi_arrive_at_end_station2);
+ updateOrderBottomBtn(getString(R.string.module_och_taxi_order_server_end),
+ Color.parseColor("#FFFFFF"),
+ Color.parseColor("#FF1D5EF3"),
+ true);
+ mTitleTV2.setText("送乘客至");
+ mStationTv2.setText(order.endSiteAddr);
+
+ } else if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "已经去往终点");
+
+ showOrHideOrderModeBtn(false);
+
+ mContentModule3.setVisibility(View.GONE);
+ mContentModule2.setVisibility(View.VISIBLE);
+ mOrderStatus.setText(R.string.module_och_taxi_on_the_way_2_end_station);
+
+ updateOrderBottomBtn(getString(R.string.module_och_taxi_order_close),
+ Color.parseColor("#FFFFFF"),
+ Color.parseColor("#FF1D5EF3"),
+ true);
+ mTitleTV2.setText("送乘客至");
+ mStationTv2.setText(order.endSiteAddr);
+ } else if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus
+ || TaxiOrderStatusEnum.ArriveAtStart.getCode() == order.orderStatus){
+
+ mContentModule2.setVisibility(View.GONE);
+ mContentModule3.setVisibility(View.VISIBLE);
+ mArrivedStartTimeTv32.setVisibility(View.VISIBLE);
+ mContentModule32.setVisibility(View.VISIBLE);
+ mContentModule31.setVisibility(View.GONE);
+ mOrderOtherContent3.setVisibility(View.GONE);
+
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ String currentHM = DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.HH_mm);
+ String currentDay = DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd);
+ String strHtml11 = "已于
"
+ + "" + currentHM + ""
+ + "" + " " + "到达乘客上车地点";
+ mArrivedStartTimeTv32.setLineHeight(60);
+ mArrivedStartTimeTv32.setText(Html.fromHtml(strHtml11));
+
+ mArrivedStationTitleTv32.setText("送乘客至");
+ mStationTv32.setText(order.endSiteAddr);
+ currentCale.add(Calendar.MINUTE, 10);
+ String strHtml13 = "";
+ if (currentDay.equals(DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd))) {
+ strHtml13 = "免费等待至 "
+ + "" + DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.HH_mm) + "";
+
+ } else {
+ strHtml13 = "免费等待至"
+ + "" + DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.MM_dd_HH_mm) + "";
+ }
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml13));
+
+ if (TaxiOrderStatusEnum.ArriveAtStart.getCode() == order.orderStatus){
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "车辆已经达到起点");
+ mPassengerInfoLayout.setVisibility(View.VISIBLE);
+ mPassengerNum.setText(order.passengerNum + "人");
+ mPassengerPhone.setText(order.passengerPhone);
+ mOrderStatus.setText(R.string.module_och_taxi_waiting);
+
+ updateOrderBottomBtn(getString(R.string.module_och_taxi_order_server_start_wait_check),
+ Color.parseColor("#FFFFFF"),
+ Color.parseColor("#FF1D5EF3"),
+ true);
+
+ showOrHideOrderModeBtn(false);
+ }else if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus ){
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "乘客已上车验证成功");
+
+ mPassengerInfoLayout.setVisibility(View.GONE);
+ mOrderStatus.setText(R.string.module_och_taxi_user_check_success);
+
+ updateOrderBottomBtn(getString(R.string.module_och_taxi_order_server_start),
+ Color.parseColor("#FFFFFF"),
+ Color.parseColor("#FF1D5EF3"),
+ true);
+
+ showOrHideOrderModeBtn(true);
+ }
+
+ }else if (TaxiModel.getInstance().checkCurrentOCHOrder()) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "前往乘客上车地点");
+ mContentModule2.setVisibility(View.GONE);
+ mContentModule3.setVisibility(View.VISIBLE);
+ mContentModule31.setVisibility(View.VISIBLE);
+ mArrivedStartTimeTv32.setVisibility(View.GONE);
+ mContentModule32.setVisibility(View.GONE);
+ mOrderOtherContent3.setVisibility(View.VISIBLE);
+ mDistanceAndTime3.setVisibility(View.VISIBLE);
+ mPassengerInfoLayout.setVisibility(View.VISIBLE);
+ mPassengerNum.setText(order.passengerNum + "人");
+ mPassengerPhone.setText(order.passengerPhone);
+ mOrderStatus.setText(R.string.module_och_taxi_new_order);
+
+ showOrHideOrderModeBtn(false);
+
+ updateOrderBottomBtn(getString(R.string.module_och_taxi_order_server_start),
+ Color.parseColor("#4DFFFFFF"),
+ Color.parseColor("#4D1D5EF3"),
+ false);
+
+ mGoAheadStationTitleTv31.setText("前往");
+ mCatchStationTitleTv31.setText("接乘客");
+ mStationTv31.setText(order.startSiteAddr);
+
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ Calendar startCale = DateTimeUtil.formatLongToCalendar(order.bookingTime);
+ String currentDay = DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd);
+ String startDay = DateTimeUtil.formatCalendarToString(startCale, DateTimeUtil.yyyy_MM_dd);
+ String strHtml1 = "";
+ if (currentDay.equals(startDay)) {
+ strHtml1 = "乘客将于
"
+ + "" + DateTimeUtil.formatCalendarToString(startCale, DateTimeUtil.HH_mm) + ""
+ + " 用车";
+ } else {
+ strHtml1 = "乘客将于
"
+ + "" + DateTimeUtil.formatCalendarToString(startCale, DateTimeUtil.MM_dd_HH_mm) + ""
+ + " 用车";
+ }
+ mOrderOtherContent3.setText(Html.fromHtml(strHtml1));
+ }
+ }catch (NullPointerException e){ //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
+ TaxiModel.getInstance().clearCurrentOCHOrder();
+ }
+ }
+
+ private void showOrHideOrderModeBtn(boolean isShow) {
+ if (isShow){
+ mOrderStartModeBtn.setVisibility(View.VISIBLE);
+ mOrderServerStatus.setVisibility(View.GONE);
+ }else {
+ mOrderStartModeBtn.setVisibility(View.GONE);
+ mOrderServerStatus.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void startNaviToStation(boolean isVoicePlay, double stationLat, double stationLng) {
+ AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+
+ double mCurLatitude = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLatitude();
+ double mCurLongitude =CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLongitude();
+
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "currentLatLng=" + mCurLatitude + " " +mCurLongitude);
+ NaviLatLng startNaviLatLng = new NaviLatLng(mCurLatitude, mCurLongitude);
+ NaviLatLng endNaviLatLng = new NaviLatLng(stationLat, stationLng);
+ AmapNaviToDestinationModel.getInstance(getContext()).initAMapNavi(startNaviLatLng, endNaviLatLng);
+ AmapNaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(isVoicePlay);
+ AmapNaviToDestinationModel.getInstance(getContext()).setOCHTaciNaviChangedCallback(this);
+ }
+
+ private void showOrHideNavi(boolean isShow) {
+ if (!isShow) {
+ mNaviStartIcon.setVisibility(View.GONE);
+ mNaviToEndIcon.setVisibility(View.GONE);
+ AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ mTaxiFragment.showAmapNaviToStationFragment(false);
+ mTaxiFragment.showRottingToStationFragment(false);
+ }
+ }
+
+ /**
+ * 剩余里程和剩余时间
+ * @param meters m
+ * @param timeInSecond 秒
+ */
+ public void updateDistanceAndTime(long meters, long timeInSecond) {
+// CallerLogger.INSTANCE.d(M_TAXI + TAG,"meters = "+meters+"timeInSecond ="+timeInSecond);
+ String dis = "0";
+ String disUnit = "公里";
+ if (meters > 0){
+ if (meters / 1000 < 1){
+ disUnit = "米";
+ dis = String.valueOf(Math.round(meters));
+ }else {
+ disUnit = "公里";
+ dis = NumberFormatUtil.formatLong((double)meters / 1000);
+ }
+ }
+ int min = (int)Math.ceil((double)timeInSecond/ 60f);
+ String strHtml2 = "里程 " + "" + dis + "" + " "+disUnit+""
+ + ",剩余 " + "" + min + "" + " 分钟";
+ try {
+ if (mCurrentOrder != null && mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.getCode()) { //前往上车点
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml2));
+ if (mNaviStartIcon.getVisibility() == View.GONE){
+ mNaviStartIcon.setVisibility(View.VISIBLE);
+ }
+
+ } else if (mCurrentOrder != null && mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) { //前往终点 时间单位是分钟
+ if (mNaviToEndIcon.getVisibility() == View.GONE){
+ mNaviToEndIcon.setVisibility(View.VISIBLE);
+ }
+
+ if (mTtsLessThan200Tip < 1 && meters <= 250 && meters > 150){
+ speekVoice200mTipsOnce();
+ }
+ mDistanceAndTime2.setText(Html.fromHtml(strHtml2));
+ if (isFirstStartAutopilotDone){
+ VoiceNotice.showNotice(String.format(getResources()
+ .getString(R.string.module_och_taxi_order_server_start_auto_tip),
+ dis,disUnit,min));
+ isFirstStartAutopilotDone = false;
+ }
+ }
+ }catch (NullPointerException e){
+
+ }
+ }
+
+ private void speekVoice200mTipsOnce() {
+ mTtsLessThan200Tip = 1;
+ VoiceNotice.showNotice(getResources().getString(R.string.module_och_taxi_order_arrive_end_200m_tip));
+ }
+
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {// 单位 米, 秒
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "durationToEnd = " + routeInfo.durationToEnd);
+
+ String dis = "0";
+ long distance = routeInfo.distanceToEnd;
+ long duration = routeInfo.durationToEnd;
+
+ if (routeInfo.distanceToEnd > 0){
+
+ dis = NumberFormatUtil.formatLong( (double) distance/ 1000);
+ }
+
+ String strHtml2 = "全程 " + "" + dis + "" + " 公里"
+ + ",总用时 " + "" + (int)Math.ceil( (double) duration/ 60) + "" + " 分钟";
+ if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) {
+ mDistanceAndTime2.setText(Html.fromHtml(strHtml2));
+ } else if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) {
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml2));
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ }
+
+ private void startOrEndService() {
+ if (mCurrentOrder == null) return;
+ 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();
+ //VoiceNotice.showNotice(getResources().getString(R.string.module_och_taxi_order_server_completed_tip));
+ }else if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == mCurrentOrder.orderStatus){//前往目的地过程中可提前结束行程
+ //自驾中提示,接管后才能结束
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getState()
+ == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
+ ToastUtils.showLong(R.string.taxi_switch_line_btn_warning1);
+ }else {
+ closeOrderDialog();
+ }
+ }
+ }
+
+ private void closeOrderDialog() {
+ OCHCommitDialog.Builder builder = new OCHCommitDialog.Builder();
+ OCHCommitDialog closeOrderDialog = builder
+ .title(getString(R.string.dialog_order_close_title))
+ .tips(getString(R.string.dialog_order_close_content))
+ .confirmStr(getString(R.string.dialog_order_close_confirm))
+ .cancelStr(getString(R.string.dialog_order_close_cancel))
+ .build(getContext());
+ closeOrderDialog.setClickListener(new OCHCommitDialog.ClickListener() {
+ @Override
+ public void confirm() {
+ if (mTaxiFragment != null) mTaxiFragment.closeOrderByMan();
+ }
+
+ @Override
+ public void cancel() {
+ closeOrderDialog.dismiss();
+ }
+ });
+ closeOrderDialog.show();
+ }
+
+ public void onOrderStatusChanged(OrderQueryRespBean.Result order) {
+ int status = order.orderStatus;
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "status==" + status);
+ mCurrentOrder = order;
+ mActivity.runOnUiThread(() -> {
+ if (status == TaxiOrderStatusEnum.None.getCode() || status == TaxiOrderStatusEnum.Cancel.getCode() || status == TaxiOrderStatusEnum.JourneyCompleted.getCode()) {
+ isHaveBeingOrder(false);
+ mCurrentOrder = null;
+ clearOrderTag();
+ } else {
+ isHaveBeingOrder(true);
+ }
+ if (status != saveOrderState) {
+ TaxiOrderStatusEnum ochStatus = TaxiOrderStatusEnum.valueOf(status);
+ switch (ochStatus) {
+ case OnTheWayToStart:
+ mOrderCancel.setVisibility(View.VISIBLE);
+ VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_new_order));
+ mTtsLessThan200Tip = 0;
+ isFirstStartAutopilotDone = true;
+ double orderStartStationLat = order.startSiteGcjPoint.get(1);
+ double orderStartStationLng = order.startSiteGcjPoint.get(0);
+ startNaviToStation(false, orderStartStationLat, orderStartStationLng);
+ setOrRemoveMapMaker(true, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker);
+ setOrRemoveMapMaker(true, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker);
+ break;
+ case Cancel:
+ mCurrentOrder = null;
+ mTtsLessThan200Tip = 0;
+ isFirstStartAutopilotDone = true;
+ mOrderCancel.setVisibility(View.VISIBLE);
+ //VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel));
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker);
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker);
+ clearSmallMapRouteLine();
+ break;
+ case ArriveAtStart:
+ case UserArriveAtStart:
+ mTtsLessThan200Tip = 0;
+ isFirstStartAutopilotDone = true;
+ mOrderCancel.setVisibility(View.VISIBLE);
+ if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == ochStatus.getCode()){
+ VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text_check_success));
+ }else {
+ VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text));
+ }
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(true, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker);
+ setOrRemoveMapMaker(true, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker);
+ break;
+ case OnTheWayToEnd:
+// showNotice("欢迎使用蘑菇智行");
+ mOrderCancel.setVisibility(View.VISIBLE);
+// double orderEndStationLat = order.endSiteGcjPoint.get(1);
+// double orderEndStationLng = order.endSiteGcjPoint.get(0);
+// startNaviToStation(false, orderEndStationLat, orderEndStationLng);
+ if (mTaxiFragment != null) {
+ showNaviToEndStationFragment(false);
+ }
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker);
+ setOrRemoveMapMaker(true, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker);
+ break;
+ case ArriveAtEnd:
+ mTtsLessThan200Tip = 0;
+ mOrderCancel.setVisibility(View.GONE);
+ VoiceNotice.showNotice(mActivity.getString(R.string.module_och_taxi_order_auto_arrive_end_tip));
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.raw.star_marker);
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.raw.end_marker);
+ clearSmallMapRouteLine();
+ break;
+ case JourneyCompleted:
+ mCurrentOrder = null;
+ mTtsLessThan200Tip = 0;
+ isFirstStartAutopilotDone = true;
+ mOrderCancel.setVisibility(View.GONE);
+ VoiceNotice.showNotice("感谢您使用蘑菇智行,再见~");
+ showOrHideNavi(false);
+ break;
+ }
+ }
+ saveOrderState = status;
+ });
+ }
+
+ private void clearOrderTag() {
+ saveOrderState = -1;
+ mDistanceAndTime2.setText("距离 - - 公里,用时 - - 分");
+ mDistanceAndTime3.setText("距离 - - 公里,用时 - - 分");
+ }
+
+ /**
+ * 是否有正在进行的订单,进行UI显示
+ *
+ * @param being
+ */
+ public void isHaveBeingOrder(boolean being) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "isHaveBeingOrder = " + being);
+ try {
+ if (being) {
+ mNoDataView.setVisibility(View.GONE);
+ mBeingOrderLayout.setVisibility(View.VISIBLE);
+ mTaxiFragment.changeOperationViewVisible(View.GONE);
+ clearSmallMapRouteLine();
+ } else {
+ mNoDataView.setVisibility(View.VISIBLE);
+ mNoDatasTv.setText("暂无进行中订单");
+ mBeingOrderLayout.setVisibility(View.GONE);
+ mTaxiFragment.changeOperationViewVisible(View.VISIBLE);
+ }
+
+ }catch (NullPointerException e){ //可能会出现订单信息已经轮询回来,但进行中页面控件还未初始化完成的情况
+ TaxiModel.getInstance().clearCurrentOCHOrder();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.module_och_taxi_order_server_status_tv) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, mOrderServerStatus.getText().toString());
+ startOrEndService();
+ } else if (v.getId() == R.id.module_och_taxi_order_cancel_iv) {
+ new TaxiOrderCancelDialog(mTaxiFragment, mActivity, mOrderNo, saveOrderState).show();
+ } else if (v.getId() == R.id.module_och_taxi_navi_iv) {
+ if (mTaxiFragment != null) {
+ showNaviToStartStationFragment(true);
+ }
+ } else if (v.getId() == R.id.module_och_taxi_navi_end_iv){
+ // TODO: 2021/11/30 打开去往乘客下车点的导航页面
+ if (mTaxiFragment != null) {
+ showNaviToEndStationFragment(true);
+ }
+ }else if (v.getId() == R.id.taxi_start_by_auto){//自驾模式
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "自驾模式");
+ mOrderStartModeBtn.setTag(0);
+ startOrEndService();
+ } else if (v.getId() == R.id.taxi_start_by_manual){//人工模式
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "人工模式");
+ mOrderStartModeBtn.setTag(1);
+ mTaxiFragment.confirmAutopilotConditionByDriver();
+ }
+ }
+
+ /**
+ * 显示/隐藏 前往乘客上车点的导航
+ *
+ * @param isShow
+ */
+ private void showNaviToStartStationFragment(boolean isShow) {
+ if (mCurrentOrder != null &&
+ mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.getCode()){
+ double orderStartStationLat = mCurrentOrder.startSiteGcjPoint.get(1);
+ double orderStartStationLng = mCurrentOrder.startSiteGcjPoint.get(0);
+ mTaxiFragment.showAmapNaviToStationFragment(isShow);
+ startNaviToStation(isShow, orderStartStationLat, orderStartStationLng);
+ }
+ }
+
+ /**
+ * 显示/隐藏 前往乘客目的地的导航
+ *
+ * @param isShow
+ */
+ private void showNaviToEndStationFragment(boolean isShow) {
+ mTaxiFragment.startNaviToEndStation(isShow);
+ }
+
+
+ public void onCurrentOrderCancelDone() {
+ //去除起终点
+ if (mCurrentOrder != null){
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_START_MAP_MAKER,mCurrentOrder.startSitePoint,R.raw.star_marker);
+ setOrRemoveMapMaker(false, TaxiConst.TAXI_END_MAP_MAKER,mCurrentOrder.endSitePoint,R.raw.end_marker);
+ }
+ clearSmallMapRouteLine();
+ //提交取消订单后的回调
+ ToastUtils.showShort("订单取消成功");
+ //更新界面
+ isHaveBeingOrder(false);
+ showOrHideNavi(false);
+ clearOrderTag();
+ }
+
+ private void clearSmallMapRouteLine() {
+// CallerSmpManager.clearPolyline();
+ }
+
+ /**
+ * 订单流转debug START
+ */
+ private void initOrderTestBar(View view) {
+ mOrderStatus.setOnLongClickListener(v -> {
+ mTaxiFragment.clickTestBar();
+ return false;
+ });
+ }
+
+ @Override
+ public void onCurrentNaviDistAndTimeChanged(int meters, long timeInSecond) {
+ updateDistanceAndTime(meters, timeInSecond);
+ if (mCurrentOrder != null
+ && mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()){
+ mTaxiFragment.reportToEndDisAndTime(meters, timeInSecond);
+ }
+ }
+
+ @Override
+ public void reInitNaviAmap(boolean isPlay, boolean isRestart) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "isPlay = " + isPlay + ", isRestart=" + isRestart);
+ if (!isRestart) {
+ mTaxiFragment.showAmapNaviToStationFragment(false);
+ return;
+ }
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (mCurrentOrder != null &&
+ mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.getCode()) {
+ double orderStartStationLat = mCurrentOrder.startSiteGcjPoint.get(1);
+ double orderStartStationLng = mCurrentOrder.startSiteGcjPoint.get(0);
+ startNaviToStation(false, orderStartStationLat, orderStartStationLng);
+ }
+ }
+ }, 2000);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (mCurrentOrder != null &&
+ mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToStart.getCode()) {
+ if (mNaviStartIcon.getVisibility() == View.GONE) {
+ mNaviStartIcon.setVisibility(View.VISIBLE);
+ }
+ }
+ if (mCurrentOrder != null &&
+ mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()){
+ if (mNaviToEndIcon.getVisibility() == View.GONE) {
+ mNaviToEndIcon.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+ }, 3000);
+ }
+
+ public void onNaviToEndAmap(boolean isShow) {
+ if (mCurrentOrder != null &&
+ mCurrentOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()){
+ double orderEndStationLat = mCurrentOrder.endSiteGcjPoint.get(1);
+ double orderEndStationLng = mCurrentOrder.endSiteGcjPoint.get(0);
+ mTaxiFragment.showAmapNaviToStationFragment(isShow);
+ startNaviToStation(isShow,orderEndStationLat,orderEndStationLng);
+ }
+ }
+
+ /**
+ * 绘制地图起点终点
+ * @param isAdd
+ * @param uuid
+ * @param station
+ */
+ private void setOrRemoveMapMaker(boolean isAdd, String uuid, List station,int resourceId){
+ if (isAdd){
+ //开启线程执行起终点marker设置
+ Runnable setMapMarkerRunnable = () -> {
+ CallerLogger.INSTANCE.d(M_TAXI + "setMapMaker= " + Thread.currentThread().getName(),
+ uuid + "=latitude=" + station.get(1) + ",longitude=" + station.get(0));
+
+ Point.Options.Builder builder = new Point.Options.Builder(TaxiConst.TYPE_MARKER_TAXI_ORDER, Level.MAP_MARKER)
+ .setId(uuid)
+ .anchor(0.5f, 0.5f)
+ .set3DMode(true)
+ .isUseGps(true)
+ .controlAngle(true)
+ .icon3DRes(resourceId)
+ .latitude(station.get(1))
+ .longitude(station.get(0));
+ IMogoMapUIController mapUIController = CallerMapUIServiceManager.INSTANCE.getMapUIController();
+ if (mapUIController != null) {
+ CenterLine centerLine = mapUIController.getCenterLineInfo(station.get(0)
+ , station.get(1), -1);
+ if (null != centerLine) {// 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致
+ Double angle = centerLine.getAngle();
+ if (angle != null) {
+ builder.rotate(angle.floatValue());
+ }
+ }
+ }
+ IMoGoOverlayManager overlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager();
+ if (overlayManager != null) {
+ overlayManager.showOrUpdatePoint(builder.build());
+ }
+ };
+ OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable);
+ }else {
+ //开启线程移除起终点marker设置
+ Runnable removeMapMarkerRunnable = () -> {
+ CallerLogger.INSTANCE.d(M_TAXI + "RemoveMapMaker=" + Thread.currentThread().getName(),
+ uuid + "=latitude=" + station.get(1) + ",longitude=" + station.get(0));
+// Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerManager(AbsMogoApplication.getApp())).removeMarkers(uuid);
+ IMoGoOverlayManager overlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager();
+ if (overlayManager != null) {
+ overlayManager.removePoint(uuid);
+ }
+ };
+ OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable);
+ }
+ }
+
+ public void updateOrderBottomBtnUI() {
+ try {
+ if ((int)mOrderStartModeBtn.getTag() == 1){//人工
+ mTaxiFragment.startManualDirve();
+ return;
+ }
+ ToastUtils.showLong(getResources().getString(
+ R.string.module_och_taxi_order_choose_start_autopilot_tip));
+ showOrHideOrderModeBtn(false);
+ updateOrderBottomBtn(getString(R.string.module_och_taxi_order_server_wait_passenger_start),
+ Color.parseColor("#4DFFFFFF"),
+ Color.parseColor("#FF1D5EF3"),
+ false);
+ }catch (NullPointerException e){
+ mTaxiFragment.confirmAutopilotConditionByDriver();
+ }
+ }
+
+ public void updateOrderBottomBtn(String txt, int txtColorId, int bgColorId,boolean isClickable){
+ mOrderServerStatus.setText(txt);
+ mOrderServerStatus.setTextColor(txtColorId);
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(bgColorId);
+ mOrderServerStatus.setClickable(isClickable);
+ }
+ /**
+ * END
+ */
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java
new file mode 100644
index 0000000000..9127fb8a22
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java
@@ -0,0 +1,445 @@
+package com.mogo.och.taxi.ui;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.mogo.commons.module.status.MogoStatusManager;
+import com.mogo.eagle.core.data.temp.EventLogout;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.common.module.biz.constant.OchCommonConst;
+import com.mogo.och.common.module.biz.provider.LoginService;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.model.TaxiModel;
+import com.mogo.och.taxi.network.LoginBusImpl;
+import com.mogo.och.taxi.presenter.TaxiPresenter;
+import com.mogo.och.taxi.utils.TPRouteDataTestUtils;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+import bag_manager.BagManagerOuterClass;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 网约车-出租车UI
+ */
+public class TaxiFragment extends BaseTaxiTabFragment implements ITaxiView {
+
+ public static final String TAG = "TaxiFragment";
+
+ public static TaxiFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ TaxiFragment fragment = new TaxiFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ private WeakReference grabOrderFragmentWR;
+ private WeakReference serverOrdersFragmentWR;
+ private WeakReference personalDialogFragment = null;
+ private LoginService loginService;
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation();
+ if(loginService!=null){
+ loginService.registerFragment(this, getPresenter(),new LoginBusImpl());
+ }
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ EventBus.getDefault().register(this);
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.taxi_panel;
+ }
+
+ @Override
+ public void startAutopilot() {
+ // 在自动驾驶中,或者自己确认车辆环境可开启自动驾驶 则可点击
+ if ((mPresenter.getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd ||
+ mPresenter.getCurOrderStatus() == TaxiOrderStatusEnum.UserArriveAtStart)
+ && !isStarting) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "startAutopilot");
+ mPresenter.startAutoPilot();
+ }
+ }
+
+ @Override
+ public void startNaviToEndStation(boolean isShow) {
+ mPresenter.startNaviToEndStation(isShow);
+ }
+
+ @Override
+ public String getTagName() {
+ return "TaxiFragment";
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ protected void initViews() {
+ super.initViews();
+ initFragment();
+ hidPanel();
+ switchVRFlatMode(MogoStatusManager.getInstance().isVrMode());
+
+ tvOperationStatus.setVisibility(View.VISIBLE);
+ initOrderTestBar();
+ }
+
+ private void initFragment() {
+ serverOrdersFragmentWR = new WeakReference<>(TaxiServerOrdersFragment.newInstance());
+ grabOrderFragmentWR = new WeakReference<>(TaxiGrabOrderFragment.newInstance());
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ //默认显示OCHTaxiServerOrdersFragment
+ transaction.add(R.id.fragment_container, serverOrdersFragmentWR.get()).show(serverOrdersFragmentWR.get());
+ transaction.add(R.id.fragment_container, grabOrderFragmentWR.get()).hide(grabOrderFragmentWR.get());
+ transaction.commitAllowingStateLoss();
+ }
+
+ private void showGrabFragmentAndUpdate() {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (grabOrderFragmentWR == null || grabOrderFragmentWR.get() == null) {
+ grabOrderFragmentWR = new WeakReference<>(TaxiGrabOrderFragment.newInstance());
+ transaction.add(R.id.fragment_container, grabOrderFragmentWR.get())
+ .show(grabOrderFragmentWR.get()).commitAllowingStateLoss();
+ } else {
+ transaction.show(grabOrderFragmentWR.get()).hide(serverOrdersFragmentWR.get()).commitAllowingStateLoss();
+ }
+ }
+
+ public void showServerFragmentAndUpdate() {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (serverOrdersFragmentWR == null || serverOrdersFragmentWR.get() == null) {
+ serverOrdersFragmentWR = new WeakReference<>(TaxiServerOrdersFragment.newInstance());
+ transaction.add(R.id.fragment_container, serverOrdersFragmentWR.get())
+ .show(serverOrdersFragmentWR.get());
+ } else {
+ transaction.show(serverOrdersFragmentWR.get()).hide(grabOrderFragmentWR.get()).commitAllowingStateLoss();
+ }
+ }
+
+ @NonNull
+ @Override
+ protected TaxiPresenter createPresenter() {
+ return new TaxiPresenter(this);
+ }
+
+ @Override
+ protected void onChangeOperationStatus() {
+ super.onChangeOperationStatus();
+ mPresenter.updateCarStatus();
+ }
+
+ public void switchVRFlatMode(boolean isVRMode) {
+ if (mRootView != null) {
+ mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ loginService.unRegisterFragment();
+ loginService = null;
+ EventBus.getDefault().unregister(this);
+ }
+
+ /**
+ * 状态变更
+ * @param inOperation true 可以接单 false 暂停接单
+ * @param role 测试车辆:测试 演示车辆:V 运营车辆: ""空
+ */
+ public void updateOperationStatus(boolean inOperation,String role) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "onOperationChanged:" + inOperation);
+ if (inOperation) {
+ if (!TextUtils.isEmpty(role)){
+ mDriverRole.setVisibility(View.VISIBLE);
+ mDriverRole.setText(role);
+ }else {
+ mDriverRole.setVisibility(View.GONE);
+ }
+ tvOperationStatus.setText("暂停接单");
+ tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.shape_size_operation_back), null, null, null);
+ showPanel();
+ } else {
+ mDriverRole.setVisibility(View.GONE);
+ tvOperationStatus.setText("接单");
+ tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.shape_size_operation_out), null, null, null);
+ hidPanel();
+ }
+ }
+
+ @Override
+ public void onMapLoaded() {
+ }
+
+ public void updateAutopilotStatus(int status) {
+ onAutopilotStatusChanged(status);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ if (serverOrdersFragmentWR != null && serverOrdersFragmentWR.get() != null) {
+ serverOrdersFragmentWR.get().updateCurrentOrderStatusChanged(order);
+ }
+ updateTaxiTestBarInfo(); //更新调试bar中信息
+ }
+
+ public void confirmAutopilotConditionByDriver(){
+ mPresenter.confirmAutopilotConditionByDriver();
+ }
+
+ public void jumpPassengerCheckDone(){
+ mPresenter.jumpPassengerCheckDone();
+ }
+
+ public void completeOrderService() {
+ mPresenter.completeOrderService();
+ }
+
+ public void startManualDirve(){
+ mPresenter.startManualDrive();
+ }
+
+ public void cancelCurOrder(int reasonType, String reaso) {
+ mPresenter.cancelCurOrder(reasonType, reaso);
+ }
+
+ public void cancelOrderById(String orderNo, int reasonType, String reason) {
+ mPresenter.cancelOrderById(orderNo, reasonType, reason);
+ }
+
+ public void onCurrentOrderCancelDone(){
+ startOrStopLoadingAnim(false);
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().onCurrentOrderCancelDone();
+ }
+
+ public void onOrderCancelDone(String orderNo) {
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().onOrderCancelDone(orderNo);
+ }
+
+ @Override
+ protected void updateOrderBottomBtnUI() {
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().updateOrderBottomBtnUI();
+ }
+
+ public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
+ if (null == order) return;
+ showGrabFragmentAndUpdate();
+ grabOrderFragmentWR.get().updateGrabOrder(order);
+ }
+
+ public void grabOrder() {
+ mPresenter.grabOrder();
+ }
+
+ public void cancelNewBookingOrder() {
+ mPresenter.cancelNewBookingOrder();
+ showServerFragmentAndUpdate();
+ }
+
+ public void onGrabOrderExecuteDone() {
+ if (null == grabOrderFragmentWR || grabOrderFragmentWR.get() == null) return;
+ grabOrderFragmentWR.get().onGrabOrderExecuteDone();
+ }
+
+ public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
+ if (null == grabOrderFragmentWR || grabOrderFragmentWR.get() == null) return;
+ if (null == order) {
+ showServerFragmentAndUpdate();
+ return;
+ }
+ showGrabFragmentAndUpdate();
+ grabOrderFragmentWR.get().onGrabOrderSuccess();
+ }
+
+ public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
+ if (order == null) {
+ showServerFragmentAndUpdate();
+ return;
+ }
+ if (null == grabOrderFragmentWR || grabOrderFragmentWR.get() == null) return;
+ showGrabFragmentAndUpdate();
+ grabOrderFragmentWR.get().onGrabOrderFailed();
+ }
+
+ public void onNaviToEnd(boolean isAmap , boolean isShow){
+ if (isAmap){
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().onNaviToEndAmap(isShow);
+ }else if (isShow){ //使用rotting数据
+ showRottingToStationFragment(true);
+ }else {
+ showAmapNaviToStationFragment(false);
+ }
+ }
+
+ public void closeOrderByMan(){
+ mPresenter.closeOrderByMan();
+ }
+
+ /**
+ * 高德计算出来的到达目的地的剩余里程和时间
+ * @param meters
+ * @param timeInSecond
+ */
+ public void reportToEndDisAndTime(int meters, long timeInSecond){ //米/秒
+ mPresenter.reportToEndDisAndTime(Long.parseLong(String.valueOf(meters)),timeInSecond);
+ }
+
+
+ public void onOrdersWaitServiceChanged(List waitServiceList) {
+ if (null == waitServiceList) return;
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().onOrdersWaitServiceChanged(waitServiceList);
+ }
+
+ public void queryCurOrderRouteInfo() {
+ mPresenter.queryCurOrderRouteInfo();
+ }
+
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().onCurrentOrderRouteInfoGot(routeInfo);
+ }
+
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
+ if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return;
+ serverOrdersFragmentWR.get().onCurrentOrderDistToEndChanged(meters, timeInSecond);
+ }
+
+ /**
+ * 订单流转debug START
+ */
+ public void initOrderTestBar() {
+ findViewById(R.id.test_bar_to_start).setOnClickListener(v -> {
+ TaxiModel.getInstance().setArriveAtStartStation();
+ });
+ findViewById(R.id.test_bar_to_end).setOnClickListener(v -> {
+ 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 -> {
+ if (!isStarting){
+ mPresenter.startAutoPilot();
+ }
+ TaxiModel.getInstance().setOnTheWayToEndStation();
+ });
+ findViewById(R.id.test_bar_route).setOnClickListener(v -> {
+ testRouteInfoUpload();
+ });
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void changeOverview(EventLogout eventLogout){
+ if (eventLogout.getMessgae() == EventLogout.LOGOUT_TYPE){
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"changeOverview Event消息去登出");
+ mPresenter.logout();
+ }
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void openOperationalInfoView(EventLogout eventLogout){
+ if (eventLogout.getMessgae() == EventLogout.PERSONAL_TYPE){
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"openOperationalInfoView Event个人中心");
+ openOperationalInfoView();
+ }
+ }
+
+ private void openOperationalInfoView(){
+ personalDialogFragment = new WeakReference<>(new TaxiPersonalDialogFragment());
+ personalDialogFragment.get().show(getActivity().getSupportFragmentManager(), "service_data");
+ }
+
+ private void testRouteInfoUpload() {
+ TPRouteDataTestUtils.converToRouteData();
+ }
+
+ //region Taxi调试信息:订单、线路、轨迹等信息
+ private View testBar;
+ private TextView testCurOrderId;
+ private TextView testCurLineId;
+ private TextView testCurTrajMd5;
+ private TextView testCurStopMd5;
+ private TextView testCurTrajMd5DPQP;
+ private TextView testCurStopMd5DPQP;
+
+ public void clickTestBar() {
+ if (testBar == null) {
+ testBar = findViewById(R.id.module_och_taxi_order_status_change_test_bar);
+ testCurOrderId = findViewById(R.id.test_bar_current_order_id);
+ testCurLineId = findViewById(R.id.test_bar_current_line_id);
+ testCurTrajMd5 = findViewById(R.id.test_bar_current_traj_md5);
+ testCurStopMd5 = findViewById(R.id.test_bar_current_stop_md5);
+ testCurTrajMd5DPQP = findViewById(R.id.test_bar_current_traj_md5_dpqp);
+ testCurStopMd5DPQP = findViewById(R.id.test_bar_current_stop_md5_dpqp);
+ }
+
+ if (testBar.getVisibility() == View.VISIBLE) {
+ testBar.setVisibility(View.GONE);
+ } else {
+ OrderQueryRespBean.Result order = TaxiModel.getInstance().getCurrentOCHOrder();
+ testCurOrderId.setText("orderNo:" + (order == null ? "" : String.valueOf(order.orderNo)));
+ testCurLineId.setText("lineId:" + (order == null ? "" : String.valueOf(order.lineId)));
+ testCurTrajMd5.setText("TMd5:" + (order == null ? "" : order.csvFileMd5));
+ testCurStopMd5.setText("SMd5:" + (order == null ? "" : order.txtFileMd5));
+ testCurTrajMd5DPQP.setText("TMd5DPQP:" + (order == null ? "" : order.csvFileMd5DPQP));
+ testCurStopMd5DPQP.setText("SMd5DPQP:" + (order == null ? "" : order.txtFileMd5DPQP));
+ testBar.setVisibility(View.VISIBLE);
+ }
+ }
+
+ private void updateTaxiTestBarInfo() {
+ if (testBar != null && testBar.getVisibility() == View.VISIBLE) {
+ OrderQueryRespBean.Result order = TaxiModel.getInstance().getCurrentOCHOrder();
+ testCurOrderId.setText("orderNo:" + (order == null ? "" : String.valueOf(order.orderNo)));
+ testCurLineId.setText("lineId:" + (order == null ? "" : String.valueOf(order.lineId)));
+ testCurTrajMd5.setText("TMd5:" + (order == null ? "" : order.csvFileMd5));
+ testCurStopMd5.setText("SMd5:" + (order == null ? "" : order.txtFileMd5));
+ testCurTrajMd5DPQP.setText("TMd5DPQP:" + (order == null ? "" : order.csvFileMd5DPQP));
+ testCurStopMd5DPQP.setText("SMd5DPQP:" + (order == null ? "" : order.txtFileMd5DPQP));
+ }
+ }
+
+ @Override
+ public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) {
+ }
+ //endregion
+
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java
new file mode 100644
index 0000000000..bde0c5a017
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java
@@ -0,0 +1,194 @@
+package com.mogo.och.taxi.ui;
+
+import android.graphics.Color;
+import android.graphics.drawable.AnimationDrawable;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.common.module.utils.DateTimeUtil;
+import com.mogo.och.common.module.voice.VoiceNotice;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+
+import java.util.Calendar;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/9
+ */
+public class TaxiGrabOrderFragment extends BaseTaxiUIFragment implements View.OnClickListener {
+
+ private TextView mOrderReserverTime;
+ private TextView mOrderGrabBt;
+ private TextView mOrderStartStation;
+ private TextView mOrderEndStation;
+ private TextView mOrderStartTitle;
+ private TextView mOrderEndTitle;
+ private ImageView mOrderCancelIv;
+ private ImageView mGrabResultAnimView;
+ private AnimationDrawable mGrabSuccessAnim;
+ private AnimationDrawable mGrabFailureAnim;
+ private CountDownTimer countDownTimer = null;
+
+ public static TaxiGrabOrderFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ TaxiGrabOrderFragment fragment = new TaxiGrabOrderFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_order_grab_view;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ mOrderReserverTime = view.findViewById(R.id.grab_order_reserver_time);
+ mOrderCancelIv = view.findViewById(R.id.grab_order_cancel_iv);
+ mOrderGrabBt = view.findViewById(R.id.grab_order_tv);
+ mOrderStartStation = view.findViewById(R.id.grab_order_start_station);
+ mOrderEndStation = view.findViewById(R.id.grab_order_end_station);
+ mOrderEndTitle = view.findViewById(R.id.grab_order_end_station_title);
+ mOrderStartTitle = view.findViewById(R.id.grab_order_start_station_title);
+ mGrabResultAnimView = view.findViewById(R.id.grab_result_anim);
+ mGrabResultAnimView.setVisibility(View.GONE);
+ mOrderEndTitle.setVisibility(View.VISIBLE);
+ mOrderStartTitle.setVisibility(View.VISIBLE);
+
+ mOrderCancelIv.setOnClickListener(this);
+ mOrderGrabBt.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.grab_order_cancel_iv){//关闭抢单,如果是在抢单中,则只关闭界面,还继续抢单
+ if (mOrderGrabBt.getText().toString().equals("抢单中...")){
+ getOchTaxiFragment().showServerFragmentAndUpdate();
+ return;
+ }
+ if (null != countDownTimer){
+ countDownTimer.cancel();
+ }
+ VoiceNotice.stopCurrentTts();//中断当前在播语音
+ getOchTaxiFragment().cancelNewBookingOrder();
+ }else if (v.getId() == R.id.grab_order_tv){
+ if (!mOrderGrabBt.getText().toString().equals("抢单中...")){
+ getOchTaxiFragment().grabOrder();
+ return;
+ }
+ }
+ }
+ private TaxiFragment getOchTaxiFragment(){
+ return (TaxiFragment)getParentFragment();
+ }
+ public void updateGrabOrder(OrderQueryRespBean.Result order){
+ mGrabResultAnimView.setVisibility(View.GONE);
+ Calendar calendar = DateTimeUtil.formatLongToCalendar(order.bookingTime);
+ if (DateTimeUtil.compareDateIsCurrentDay(calendar)){
+ mOrderReserverTime.setText("用车时间:今天 "+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm));
+ VoiceNotice.showNotice("预约单,今天"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm)+"从"
+ +order.startSiteAddr+"到"+order.endSiteAddr);
+ }else {
+ mOrderReserverTime.setText("用车时间:"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.MM_dd_HH_mm));
+ VoiceNotice.showNotice("预约单,"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.MM_dd)+"从"
+ +order.startSiteAddr+"到"+order.endSiteAddr);
+ }
+ mOrderStartStation.setText(order.startSiteAddr);
+ mOrderEndStation.setText(order.endSiteAddr);
+ mOrderGrabBt.setClickable(true);
+ mOrderGrabBt.setTextColor(Color.parseColor("#FFFFFF"));
+ ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)mOrderGrabBt.getLayoutParams();
+ lp.bottomMargin = 3;
+ mOrderGrabBt.setLayoutParams(lp);
+ mOrderGrabBt.setBackground(getResources().getDrawable(R.drawable.shape_size_grab_order_bt));
+ mOrderGrabBt.setText("抢单(10S)"); //开始倒计时任务
+ countDownTimer = new CountDownTimer(11000,1000){
+
+ @Override
+ public void onTick(long millisUntilFinished) {
+ mOrderGrabBt.setText("抢单"+"("+millisUntilFinished/1000+")");
+ }
+
+ @Override
+ public void onFinish() {//结束倒计时,不抢单
+ cancel();
+ getOchTaxiFragment().cancelNewBookingOrder();
+ }
+ }.start();
+ }
+ public void onGrabOrderExecuteDone(){//进入抢单状态,btn样式改变,并不可点击
+ if (null != countDownTimer){
+ countDownTimer.cancel();
+ }
+ mOrderGrabBt.setText("抢单中...");
+ ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)mOrderGrabBt.getLayoutParams();
+ lp.bottomMargin = 40;
+ mOrderGrabBt.setLayoutParams(lp);
+ mOrderGrabBt.setTextColor(Color.parseColor("#181D6D"));
+ mOrderGrabBt.setBackground(getResources().getDrawable(R.drawable.taxi_grabing_order_btn_bg));
+ mOrderGrabBt.setClickable(false);
+ }
+// 接单成功,语音播报“抢单成功,请合理安排后续行程接送乘客”
+// 接单未成功,语音播报“接单失败,请继续接单”
+ public void onGrabOrderSuccess(){//抢单成功,更新btn 和 动画 语音
+ VoiceNotice.showNotice("抢单成功,请合理安排后续行程接送乘客");
+ mGrabResultAnimView.setVisibility(View.VISIBLE);
+ mGrabResultAnimView.setImageDrawable(getResources().getDrawable(R.drawable.grab_success_anmi_flow));
+ mOrderGrabBt.setClickable(false);
+ mOrderGrabBt.setText("抢单成功!");
+ mGrabSuccessAnim = (AnimationDrawable)mGrabResultAnimView.getDrawable();
+ if (mGrabSuccessAnim.isOneShot()){
+ return;
+ }
+ mGrabSuccessAnim.start();
+ //开启动画结束的监听
+ long delayMillis = mGrabSuccessAnim.getDuration(0) * mGrabSuccessAnim.getNumberOfFrames();
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (null != mGrabSuccessAnim && mGrabSuccessAnim.isRunning()){
+ mGrabSuccessAnim.stop();
+ }
+ // if (mGrabSuccessAnim.getFrame(mGrabSuccessAnim.getNumberOfFrames()-1) == mGrabSuccessAnim.getCurrent()){
+ getOchTaxiFragment().showServerFragmentAndUpdate();
+// }
+ }
+ },delayMillis);
+ //开启动画结束的监听
+ }
+ public void onGrabOrderFailed(){//抢单失败,更新btn 和 动画 语音
+ VoiceNotice.showNotice("接单失败,请继续接单");
+ mGrabResultAnimView.setVisibility(View.VISIBLE);
+ mGrabResultAnimView.setImageDrawable(getResources().getDrawable(R.drawable.grab_failure_anmi_flow));
+ mOrderGrabBt.setClickable(false);
+ mOrderGrabBt.setText("抢单失败!");
+ mGrabFailureAnim = (AnimationDrawable)mGrabResultAnimView.getDrawable();
+ mGrabFailureAnim.start();
+ //开启动画结束的监听
+ long delayMillis = mGrabFailureAnim.getDuration(0) * mGrabFailureAnim.getNumberOfFrames();
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (null != mGrabFailureAnim && mGrabFailureAnim.isRunning()){
+ mGrabFailureAnim.stop();
+ }
+ getOchTaxiFragment().showServerFragmentAndUpdate();
+ }
+ },delayMillis);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (countDownTimer != null) countDownTimer.cancel();
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt
new file mode 100644
index 0000000000..5718ed6a16
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt
@@ -0,0 +1,289 @@
+package com.mogo.och.taxi.ui
+
+import android.content.Context
+import android.os.Bundle
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.MotionEvent
+import android.widget.RelativeLayout
+import com.amap.api.maps.AMap
+import com.amap.api.maps.CameraUpdateFactory
+import com.amap.api.maps.TextureMapView
+import com.amap.api.maps.model.BitmapDescriptor
+import com.amap.api.maps.model.BitmapDescriptorFactory
+import com.amap.api.maps.model.CameraPosition
+import com.amap.api.maps.model.CustomMapStyleOptions
+import com.amap.api.maps.model.LatLng
+import com.amap.api.maps.model.LatLngBounds
+import com.amap.api.maps.model.Marker
+import com.amap.api.maps.model.MarkerOptions
+import com.amap.api.maps.model.Polyline
+import com.amap.api.maps.model.PolylineOptions
+import com.mogo.eagle.core.data.map.MogoLocation
+import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
+import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
+import com.mogo.och.taxi.R
+import com.mogo.och.taxi.utils.TaxiMapAssetStyleUtil
+
+/**
+ * taxi司机端前往目的地小地图导航
+ */
+class TaxiMapDirectionView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener,
+ ITaxiMapDirectionView, AMap.OnCameraChangeListener {
+ private lateinit var mAMapNaviView: TextureMapView
+ private lateinit var mAMap: AMap
+ private var mCarMarker: Marker? = null
+ private lateinit var mStartMarker: Marker
+ private lateinit var mEndMarker: Marker
+ private val zoomLevel = 13
+ private val routeArrivied: MutableList = ArrayList()
+ private val routeArriving: MutableList = ArrayList()
+ private var location: MogoLocation? = null
+ private var startStation: LatLng? = null
+ private var endStation: LatLng? = null
+ private var mPolyline: Polyline? = null
+ var textureList: MutableList = ArrayList()
+ var texIndexList: MutableList = ArrayList()
+ private var mArrivedRes: BitmapDescriptor? = null
+ private var mUnArrivedRes: BitmapDescriptor? = null
+
+ init {
+ try {
+ initView(context)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ private fun initView(context: Context) {
+ d(SceneConstant.M_TAXI + TAG, "initView")
+ val smpView = LayoutInflater.from(context).inflate(R.layout.taxi_map_view, this)
+ mAMapNaviView = smpView.findViewById(R.id.taxi_amap_view)
+ initAMapView()
+
+ // 注册定位监听
+ CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, this)
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ // 注册定位监听
+ CallerChassisLocationGCJ02ListenerManager.removeListener(TAG)
+ }
+
+ private fun initAMapView() {
+ val mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel.toFloat())
+ mAMap = mAMapNaviView.map
+ // 设置导航地图模式,aMap是地图控制器对象。
+ mAMap.mapType = AMap.MAP_TYPE_NIGHT
+
+ // 关闭显示实时路况图层,aMap是地图控制器对象。
+ mAMap.isTrafficEnabled = false
+
+ // 设置 锚点 图标
+ mCarMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_car)).anchor(0.5f, 0.5f))
+ mStartMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_view_dir_start)))
+ mEndMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_view_dir_end)))
+ mStartMarker.isVisible = false
+ mEndMarker.isVisible = false
+ mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_arrived)
+ mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_un_arrive)
+
+ // 加载自定义样式
+ val customMapStyleOptions = CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(TaxiMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
+ .setStyleExtraData(
+ TaxiMapAssetStyleUtil.getAssetsExtraStyle(
+ context,
+ "map_style_extra.data"
+ )
+ )
+ // 设置自定义样式
+ mAMap.setCustomMapStyle(customMapStyleOptions)
+
+ //设置希望展示的地图缩放级别
+ mAMap.moveCamera(mCameraUpdate)
+
+ // 设置地图的样式
+ mAMap.uiSettings.apply {
+ isZoomControlsEnabled = false // 地图缩放级别的交换按钮
+ setAllGesturesEnabled(false) // 所有手势
+ isMyLocationButtonEnabled = false // 显示默认的定位按钮
+ setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可
+ }
+ mAMap.setOnMapLoadedListener(AMap.OnMapLoadedListener {
+ d(SceneConstant.M_TAXI + TAG, "smp---onMapLoaded")
+ // 加载自定义样式
+ val customMapStyleOptions = CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(TaxiMapAssetStyleUtil.getAssetsStyle(context, "map_style.data"))
+ .setStyleExtraData(
+ TaxiMapAssetStyleUtil.getAssetsExtraStyle(
+ context,
+ "map_style_extra.data"
+ )
+ )
+ // 设置自定义样式
+ mAMap.setCustomMapStyle(customMapStyleOptions)
+ mAMapNaviView.map.setPointToCenter(
+ mAMapNaviView.width / 2,
+ mAMapNaviView.height / 2
+ )
+ })
+
+ //设置地图状态的监听接口
+ mAMap.setOnCameraChangeListener(this)
+ }
+
+ override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
+ return true
+ }
+
+ override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
+ if (mogoLocation == null) {
+ return
+ }
+ try {
+ val currentLatLng = LatLng(mogoLocation.latitude, mogoLocation.longitude)
+ if (mPolyline != null && mPolyline!!.points.size > 1) {
+ val points = mPolyline!!.points
+ //圈定地图显示范围
+ val endLatLng = points[points.size - 1]
+ //存放经纬度
+ val boundsBuilder = LatLngBounds.Builder()
+ boundsBuilder.include(currentLatLng)
+ boundsBuilder.include(endLatLng)
+ //第二个参数为四周留空宽度
+ mAMap.moveCamera(
+ CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)
+ )
+ } else {
+ //设置希望展示的地图缩放级别
+ val cameraPosition = CameraPosition.Builder()
+ .target(mCarMarker!!.position).tilt(0f).bearing(mogoLocation.heading.toFloat())
+ .zoom(zoomLevel.toFloat()).build()
+ mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
+ }
+ //更新车辆位置
+ if (mCarMarker != null) {
+ mCarMarker!!.rotateAngle = (360 - mogoLocation.heading).toFloat()
+ mCarMarker!!.position = currentLatLng
+ mCarMarker!!.setToTop()
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ override fun setLineMarker() {
+ if (mStartMarker.isVisible && mEndMarker.isVisible
+ ) {
+ return
+ }
+ if (startStation != null && endStation != null) {
+ // 设置开始结束Marker位置
+ mStartMarker.position = startStation
+ mStartMarker.isVisible = true
+ mEndMarker.position = endStation
+ mEndMarker.isVisible = true
+ }
+ }
+
+ override fun drawablePolyline() {
+ if (routeArrivied.isEmpty() && routeArriving.isEmpty()) {
+ d(SceneConstant.M_TAXI + TAG, "没有点")
+ return
+ }
+ texIndexList.clear()
+ val allPoints = ArrayList(routeArrivied)
+ for (i in routeArrivied.indices) {
+ if (routeArrivied.size > 1 && i < routeArrivied.size - 1) {
+ texIndexList.add(0)
+ }
+ }
+ texIndexList.add(0)
+ allPoints.add(LatLng(location!!.latitude, location!!.longitude))
+ allPoints.addAll(routeArriving)
+ for (ignored in routeArrivied) {
+ texIndexList.add(1)
+ }
+ if (mPolyline != null) {
+ mPolyline!!.points = allPoints
+ mPolyline!!.options.customTextureIndex = texIndexList
+ return
+ }
+ if(textureList.isEmpty()) {
+ textureList.add(mArrivedRes)
+ textureList.add(mUnArrivedRes)
+ }
+ //设置线段纹理
+ val polylineOptions = PolylineOptions().apply {
+ addAll(allPoints)
+ isUseTexture = true
+ width(15f)
+ lineCapType(PolylineOptions.LineCapType.LineCapRound)
+ customTextureList = textureList
+ customTextureIndex = texIndexList
+ }
+
+ // 绘制线
+ mPolyline = mAMap.addPolyline(polylineOptions)
+ }
+
+ override fun clearPolyline() {
+ if (mPolyline != null) {
+ mPolyline!!.remove()
+ mPolyline = null
+ }
+ mStartMarker.isVisible = false
+ mEndMarker.isVisible = false
+ }
+
+ fun onCreateView(savedInstanceState: Bundle?) {
+ mAMapNaviView.onCreate(savedInstanceState)
+ }
+
+ fun onResume() {
+ mAMapNaviView.onResume()
+ }
+
+ fun onPause() {
+ mAMapNaviView.onPause()
+ }
+
+ fun onDestroy() {
+ mAMapNaviView.onDestroy()
+ }
+
+ fun setStartMarkAndEndMark(startStation: LatLng?, endStation: LatLng?) {
+ this.startStation = startStation
+ this.endStation = endStation
+ }
+
+ fun setCoordinatesLatLng(
+ routeArrivied: List?,
+ routeArriving: List?,
+ location: MogoLocation?
+ ) {
+ this.routeArrivied.clear()
+ this.routeArrivied.addAll(routeArrivied!!)
+ this.routeArriving.clear()
+ this.routeArriving.addAll(routeArriving!!)
+ this.location = location
+ }
+
+ override fun onCameraChange(cameraPosition: CameraPosition) {}
+ override fun onCameraChangeFinish(cameraPosition: CameraPosition) {}
+
+ companion object {
+ //小地图名称
+ const val TAG = "TaxiMapDirectionView"
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.java
new file mode 100644
index 0000000000..aaea75f515
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOperationDatasFragment.java
@@ -0,0 +1,136 @@
+package com.mogo.och.taxi.ui;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.Html;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.mogo.och.common.module.utils.DateTimeUtil;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.model.TaxiModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/10
+ */
+public class TaxiOperationDatasFragment extends BaseTaxiUIFragment {
+
+ private RecyclerView mRecyclerView;
+ private static Context mContext;
+ private List mDurationData = new ArrayList<>();
+ private List mOrderNumData = new ArrayList<>();
+ private List mData = new ArrayList<>();
+ private static int mType = 0;//0: 运营时长 1:运营单数
+ private OperationDataAdapter mAdapter;
+
+ public static TaxiOperationDatasFragment newInstance(Context context, int type) {
+ mContext = context;
+ mType = type;
+ Bundle args = new Bundle();
+ TaxiOperationDatasFragment fragment = new TaxiOperationDatasFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_operation_data_view;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ mRecyclerView = view.findViewById(R.id.operation_data_recycler_view);
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
+ mAdapter = new OperationDataAdapter(mContext, mData);
+ mRecyclerView.setAdapter(mAdapter);
+ initDatas();
+ }
+
+ private void initDatas() {
+ TaxiModel.getInstance().queryDriverServiceData();
+ }
+
+ public void setmType(int type) {
+ mType = type;
+ mData.clear();
+ if (mType == 0){
+ mData.addAll(mDurationData);
+ }else if (mType == 1){
+ mData.addAll(mOrderNumData);
+ }
+ if (mAdapter != null) mAdapter.notifyDataSetChanged();
+ }
+
+ public void updateData(long dailyTimeDuration, long dailyOrderNum) {
+ mDurationData.clear();
+ mOrderNumData.clear();
+ mData.clear();
+ mDurationData.add(dailyTimeDuration);
+ mOrderNumData.add(dailyOrderNum);
+ mData.addAll(mDurationData);
+ if (mAdapter != null) mAdapter.notifyDataSetChanged();
+ }
+
+ class OperationDataAdapter extends RecyclerView.Adapter {
+ private List datas;
+ private Context context;
+
+ public OperationDataAdapter(Context context, List datas) {
+ this.datas = datas;
+ this.context = context;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(context).inflate(R.layout.taxi_operation_data_item_view, parent, false);
+ OperationDataViewHolder viewHolder = new OperationDataViewHolder(view);
+ return viewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof OperationDataViewHolder) {
+ OperationDataViewHolder viewHolder = (OperationDataViewHolder) holder;
+ if (0 == mType){
+ String hourData = TextUtils.isEmpty(DateTimeUtil.secondsToHourStr(datas.get(position))) ? "0": DateTimeUtil.secondsToHourStr(datas.get(position));
+ String minuteData = DateTimeUtil.secondsToMinuteStr(datas.get(position));
+ String data = "" + hourData + " 时 " + "" + minuteData + " 分";
+ viewHolder.operationDataTv.setText(Html.fromHtml(data));
+ viewHolder.operationDataTitle.setText("今日在线时长");
+ }else if (1 == mType){
+ String data = "" + String.valueOf(datas.get(position)) + "" + " 单" + "";
+ viewHolder.operationDataTv.setText(Html.fromHtml(data));
+ viewHolder.operationDataTitle.setText("今日订单完成数");
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return datas.size();
+ }
+ }
+
+ class OperationDataViewHolder extends RecyclerView.ViewHolder {
+ private TextView operationDataTv;
+ private TextView operationDataTitle;
+
+ public OperationDataViewHolder(@NonNull View itemView) {
+ super(itemView);
+ operationDataTv = itemView.findViewById(R.id.operation_data_tv);
+ operationDataTitle = itemView.findViewById(R.id.operation_data_title_tv);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java
new file mode 100644
index 0000000000..95aef7ecdb
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiOrderCancelDialog.java
@@ -0,0 +1,231 @@
+package com.mogo.och.taxi.ui;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.Display;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
+import android.widget.TextView;
+
+import androidx.annotation.RequiresApi;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.constant.TaxiOrderCancelReasons;
+
+import java.lang.ref.WeakReference;
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/18
+ */
+public class TaxiOrderCancelDialog extends AlertDialog implements View.OnClickListener,AdapterView.OnItemClickListener {
+
+ private static final String TAG = "OCHTaxiOrderCancelDial";
+ protected WeakReference contextWeakReference;
+ private GridView mContentView;
+ private TextView mCancelCommitTv;
+ private TextView mDialogCancelTv;
+ private String mCurrentReason = "";
+ private ContentAdapter mContentAdapter;
+ private int mOrderStatus;//1:预约单,其他为即时单的状态, 主要是控制乘客上车 乘客下车这几个选项的显示
+ private String[] mContentArrays;
+ private WeakReference mOchTaxiFragmentWeak;
+ private String mOrderNo;
+
+ protected TaxiOrderCancelDialog(TaxiFragment fragment, Context context, String orderNo, int orderStatus) {
+ super(context,R.style.OrderCancelDialog);
+ mOrderNo = orderNo;
+ mOchTaxiFragmentWeak = new WeakReference<>(fragment);
+ this.mOrderStatus = orderStatus;
+ contextWeakReference = new WeakReference<>(context);
+ initReasonArray();
+ }
+
+ private void initReasonArray() {
+ if (1 == mOrderStatus) {
+ mContentArrays = new String[]{TaxiOrderCancelReasons.BookPassengerCancel.getMsg(), TaxiOrderCancelReasons.CarBroken.getMsg(),
+ TaxiOrderCancelReasons.BookJourneyConflict.getMsg(), TaxiOrderCancelReasons.BatteryLow.getMsg(),
+ TaxiOrderCancelReasons.BookOther.getMsg()};
+ return;
+ }
+ TaxiOrderStatusEnum ochStatus = TaxiOrderStatusEnum.valueOf(mOrderStatus);
+ switch (ochStatus) {
+ case OnTheWayToStart:
+ mContentArrays = new String[]{TaxiOrderCancelReasons.CarBroken.getMsg(), TaxiOrderCancelReasons.DeviceBroken.getMsg(),
+ TaxiOrderCancelReasons.BatteryLow.getMsg(), TaxiOrderCancelReasons.DriverIsIll.getMsg(),
+ TaxiOrderCancelReasons.StartStationFaraway.getMsg(), TaxiOrderCancelReasons.Other.getMsg(),
+ TaxiOrderCancelReasons.PassengerCancel.getMsg()};
+ break;
+ case ArriveAtStart:
+ mContentArrays = new String[]{TaxiOrderCancelReasons.CarBroken.getMsg(), TaxiOrderCancelReasons.DeviceBroken.getMsg(),
+ TaxiOrderCancelReasons.BatteryLow.getMsg(), TaxiOrderCancelReasons.DriverIsIll.getMsg(),
+ TaxiOrderCancelReasons.PassengerNotArrive.getMsg(),TaxiOrderCancelReasons.UnContractPassenger.getMsg(),
+ TaxiOrderCancelReasons.PassengerCancel.getMsg(),TaxiOrderCancelReasons.Other.getMsg()};
+ break;
+ case OnTheWayToEnd:
+ case ArriveAtEnd:
+ mContentArrays = new String[]{TaxiOrderCancelReasons.CarBroken.getMsg(), TaxiOrderCancelReasons.DeviceBroken.getMsg(),
+ TaxiOrderCancelReasons.BatteryLow.getMsg(), TaxiOrderCancelReasons.DriverIsIll.getMsg(),
+ TaxiOrderCancelReasons.PassengerStopOver.getMsg(),TaxiOrderCancelReasons.Other.getMsg()};
+ break;
+ default:
+ mContentArrays = new String[]{TaxiOrderCancelReasons.CarBroken.getMsg(), TaxiOrderCancelReasons.DeviceBroken.getMsg(),
+ TaxiOrderCancelReasons.BatteryLow.getMsg(), TaxiOrderCancelReasons.DriverIsIll.getMsg(),
+ TaxiOrderCancelReasons.PassengerNotArrive.getMsg(), TaxiOrderCancelReasons.PassengerStopOver.getMsg(),
+ TaxiOrderCancelReasons.Other.getMsg()};
+ break;
+
+ }
+ }
+
+ protected TaxiOrderCancelDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
+ super(context, cancelable, cancelListener);
+ }
+
+ protected TaxiOrderCancelDialog(Context context, int themeResId) {
+ super(context, themeResId);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().setBackgroundDrawableResource(R.drawable.taxi_order_cancel_dialog_bg);
+ setContentView(R.layout.taxi_order_cancel_view);
+ initView();
+ setCancelable(false);
+ setCanceledOnTouchOutside(false);
+
+ initWindowView();
+ }
+
+ private void initWindowView() {
+ Window window = getWindow();
+ //dialog padding 去掉
+ window.getDecorView().setPadding(0,0,0,0);
+ window.setDimAmount(0.5f);
+ window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));//设置背景, 不然显示不全
+
+ WindowManager.LayoutParams params = window.getAttributes();
+ window.setGravity(Gravity.CENTER);
+ WindowManager m = window.getWindowManager();
+ Display d = m.getDefaultDisplay();
+ params.height = d.getHeight() - 500;
+ window.setAttributes(params);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ private void initView() {
+ mContentView = findViewById(R.id.module_och_taxi_order_cancel_content_gv);
+ mCancelCommitTv = findViewById(R.id.order_cancel_commit_tv);
+ mDialogCancelTv = findViewById(R.id.order_dialog_cancel_tv);
+ mContentAdapter = new ContentAdapter(contextWeakReference.get(), mContentArrays);
+ mContentView.setAdapter(mContentAdapter);
+ mContentView.setSelector(new ColorDrawable(Color.TRANSPARENT));
+ mContentView.setOnItemClickListener(this);
+ mCancelCommitTv.setOnClickListener(this);
+ mDialogCancelTv.setOnClickListener(this);
+ mContentView.setOnItemClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.order_cancel_commit_tv) {//bt commit
+ if (!TextUtils.isEmpty(mCurrentReason) && TaxiOrderCancelReasons.getType(mCurrentReason) != 0) {
+ if (1 == mOrderStatus){//预约单
+ mOchTaxiFragmentWeak.get().cancelOrderById(mOrderNo, TaxiOrderCancelReasons.getType(mCurrentReason),mCurrentReason);
+ }else {//即时单
+ mOchTaxiFragmentWeak.get().cancelCurOrder(TaxiOrderCancelReasons.getType(mCurrentReason),mCurrentReason);
+ }
+ dismiss();
+ }else {
+ ToastUtils.showShort("取消原因不能为空");
+ }
+ }else if (v.getId() == R.id.order_dialog_cancel_tv){//close icon
+ mCurrentReason = "";
+ dismiss();
+ }
+ }
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"mCurrentReason ="+ mContentArrays[position]);
+ mCurrentReason = mContentArrays[position];
+// GradientDrawable background = (GradientDrawable) mCancelBt.getBackground();//GradientDrawable是Drawable的子类
+// background.setColor(Color.parseColor("#2B6EFF"));
+// mCancelBt.setTextColor(Color.parseColor("#FFFFFF"));
+// mCancelBt.setClickable(true);
+ mContentAdapter.notifyCurrentReasons(mCurrentReason);
+ }
+
+ class ContentAdapter extends BaseAdapter{
+
+ private Context context;
+ private String[] datas;
+ private LayoutInflater layoutInflater;
+ private String currentReasons = "";
+
+ public ContentAdapter(Context context, String[] array){
+ this.context = context;
+ datas = array;
+ layoutInflater = LayoutInflater.from(context);
+ }
+ @Override
+ public int getCount() {
+ return datas.length;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return datas[position];
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder viewHolder = null;
+ if (convertView == null){
+ convertView = layoutInflater.inflate(R.layout.taxi_order_checkbox_item,null);
+ viewHolder = new ViewHolder();
+ viewHolder.checkBoxTv = convertView.findViewById(R.id.item_checkbox);
+ convertView.setTag(viewHolder);
+ }else {
+ viewHolder = (ViewHolder) convertView.getTag();
+ }
+ viewHolder.checkBoxTv.setText(datas[position]);
+ if(viewHolder.checkBoxTv.getText().toString().equals(currentReasons)){
+ viewHolder.checkBoxTv.setCompoundDrawablesWithIntrinsicBounds(context.getResources().getDrawable(R.drawable.shape_size_taxi_selected_btn),null,null,null);
+ }else {
+ viewHolder.checkBoxTv.setCompoundDrawablesWithIntrinsicBounds(context.getResources().getDrawable(R.drawable.shape_size_taxi_unselected_btn),null,null,null);
+ }
+ return convertView;
+ }
+ public void notifyCurrentReasons(String reason){
+ currentReasons = reason;
+ notifyDataSetChanged();
+ }
+ class ViewHolder {
+ TextView checkBoxTv;
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java
new file mode 100644
index 0000000000..fe488af13e
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java
@@ -0,0 +1,529 @@
+package com.mogo.och.taxi.ui;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Point;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager.widget.ViewPager;
+
+import com.google.android.material.tabs.TabLayout;
+import com.mogo.commons.mvp.MvpDialogFragment;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.common.module.utils.DateTimeUtil;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.constant.TaxiOrderTypeEnum;
+import com.mogo.och.taxi.presenter.TaxiOperationalPresenter;
+import com.mogo.och.taxi.ui.base.AvoidLeakDialog;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import me.jessyan.autosize.utils.AutoSizeUtils;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/18
+ */
+public class TaxiPersonalDialogFragment extends
+ MvpDialogFragment
+ implements View.OnClickListener {
+
+ private final static String TAG = "OCHTaxiOrdersDialog";
+
+ private RelativeLayout mOperationDataRl;
+ private ImageView mCloseIv;
+ private RecyclerView mOrdersRv;
+ private Button mShowOrdersBt;
+ private TabLayout mOperationTab;
+ private ViewPager mOperationViewPager;
+ private OrderAdapter mAdapter;
+ private ConstraintLayout mNoDatas;
+ private List orders = new ArrayList<>();
+ private String[] mTabTitles = {"在线时长","订单完成数"};
+ private List fragments = new ArrayList<>();
+ private int mNextPage = 1;//订单列表分页从1开始
+ private int mPerPageSize = 10;
+ private static TaxiFragment mTaxiFragment;
+ private static boolean serverHadNoData = false;
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ AvoidLeakDialog dialog = new AvoidLeakDialog(getContext());
+ dialog.setHostFragmentReference(this);
+ return dialog;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_orders_list_view;
+ }
+
+ @Override
+ protected void initViews() {
+ initView();
+ }
+
+ @NonNull
+ @Override
+ protected TaxiOperationalPresenter createPresenter() {
+ return new TaxiOperationalPresenter(this);
+ }
+
+ @Override
+ public String getTagName() {
+ return TAG;
+ }
+
+ @Override
+ public void dismissAllowingStateLoss() {
+ super.dismissAllowingStateLoss();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ setCancelable(false);
+ getDialog().setCanceledOnTouchOutside(true);
+ Window window = getDialog().getWindow();
+ //dialog padding 去掉
+ window.getDecorView().setPadding(0,0,0,0);
+ window.setDimAmount(0f);
+ WindowManager.LayoutParams params = window.getAttributes();
+ params.x = 0;
+ params.y = 0;
+ WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
+ Point point = new Point();
+ windowManager.getDefaultDisplay().getSize(point);
+ params.width = (int)(point.x * 0.375);
+ params.height = ViewGroup.LayoutParams.MATCH_PARENT;
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"width= "+params.width+"height= "+params.height);
+ window.setAttributes(params);
+ window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));//设置背景, 不然显示不全
+ window.setGravity(Gravity.LEFT|Gravity.BOTTOM);
+ }
+ private void initView() {
+ initOperationTabDatas();
+ mCloseIv = findViewById(R.id.module_och_taxi_order_list_close_iv);
+ mOperationDataRl = findViewById(R.id.module_och_taxi_operation_data_rl);
+ mShowOrdersBt = findViewById(R.id.module_och_taxi_order_list_show_bt);
+ mOrdersRv = findViewById(R.id.module_och_taxi_order_list);
+
+ mNoDatas = findViewById(R.id.no_order_data_view);
+ ImageView imageView = findViewById(R.id.no_order_data_iv);
+ imageView.setImageResource(R.drawable.no_order_data);
+ ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)imageView.getLayoutParams();
+ params.width = 480;
+ params.height = 480;
+ imageView.setLayoutParams(params);
+
+ mOrdersRv.setVisibility(View.GONE);
+ mNoDatas.setVisibility(View.GONE);
+
+ mShowOrdersBt.setOnClickListener(this);
+
+ mCloseIv.setOnClickListener(this);
+
+ }
+
+ private void initOperationTabDatas() {
+ mOperationTab = findViewById(R.id.operation_data_tablayout);
+ mOperationViewPager = findViewById(R.id.operation_data_viewpager);
+ for (int i= 0;i < mTabTitles.length; i++){
+ TabLayout.Tab tab = mOperationTab.newTab();
+ tab.view.setBackgroundColor(Color.parseColor("#00000000"));
+ View tabView = View.inflate(getContext(),R.layout.taxi_operation_tab_item_custom,null);
+ TextView tv = tabView.findViewById(R.id.operation_tab_title);
+ tv.setText(mTabTitles[i]);
+ tab.setCustomView(tabView);
+ if (0 == i){
+ mOperationTab.addTab(tab,true);
+ changeOperationTabLayoutTabUI(tab,true);
+ fragments.add(TaxiOperationDatasFragment.newInstance(getActivity(),0));
+ }else if (1 == i){
+ mOperationTab.addTab(tab);
+ changeOperationTabLayoutTabUI(tab,false);
+ fragments.add(TaxiOperationDatasFragment.newInstance(getActivity(),1));
+ }
+ }
+ mOperationTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onTabSelected(TabLayout.Tab tab) {
+ mOperationViewPager.setCurrentItem(tab.getPosition());
+ changeOperationTabLayoutTabUI(tab,true);
+ fragments.get(tab.getPosition()).setmType(tab.getPosition());
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onTabUnselected(TabLayout.Tab tab) {
+ changeOperationTabLayoutTabUI(tab,false);
+ }
+
+ @Override
+ public void onTabReselected(TabLayout.Tab tab) {
+
+ }
+ });
+ mOperationViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ mOperationTab.getTabAt(position).select();
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ }
+ });
+ mOperationViewPager.setAdapter(new OrdersOperationFragmentAdapter(
+ getChildFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT));
+ fragments.get(0).setmType(0);
+ }
+
+ public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum){
+ for (int i=0; i< fragments.size();i++){
+ fragments.get(i).updateData(dailyTimeDuration,dailyOrderNum);
+ }
+ }
+
+ private void changeOperationTabLayoutTabUI(TabLayout.Tab tab, boolean isSelected) {
+ TextView textView = (TextView) tab.getCustomView().findViewById(R.id.operation_tab_title);
+ ImageView imageView = (ImageView) tab.getCustomView().findViewById(R.id.operation_tab_line_iv);
+ if (isSelected){
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(getContext(),46));
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"SelectTv = "+ textView.getText());
+ textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+ textView.setTextColor(Color.parseColor("#FFFFFF"));
+ imageView.setImageDrawable(getResources().getDrawable(R.drawable.taxi_driver_operation_tab_line));
+ }else {
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(getContext(),40));
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"unSelectTv = "+ textView.getText());
+ textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
+ textView.setTextColor(Color.parseColor("#A7B6F0"));
+ imageView.setImageDrawable(null);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.module_och_taxi_order_list_close_iv){
+ dismiss();
+ }else {
+ mOrdersRv.setVisibility(View.VISIBLE);
+ mOperationDataRl.setVisibility(View.GONE);
+ mNoDatas.setVisibility(View.GONE);
+ initOrdersView();
+ mPresenter.queryOrdersList(mNextPage, mPerPageSize);
+ }
+ }
+
+ private void initOrdersView() {
+ mAdapter = new OrderAdapter(getContext(),orders);
+ LinearLayoutManager manager = new LinearLayoutManager(getContext());
+ mOrdersRv.setLayoutManager(manager);
+ mOrdersRv.addOnScrollListener(new OnTaxiOrderRvOnScrollListener() {
+ @Override
+ public void onLoadMore() {
+ if (!serverHadNoData){
+ mPresenter.queryOrdersList(mNextPage, mPerPageSize);
+ }
+ }
+ });
+ mOrdersRv.setAdapter(mAdapter);
+ }
+
+ public void onOrdersListPageRefresh(List ordersList){
+ try {
+ if (null == ordersList && mNextPage == 0 ||
+ (ordersList != null && ordersList.size() == 0)){//无数据
+ mOrdersRv.setVisibility(View.GONE);
+ mNoDatas.setVisibility(View.VISIBLE);
+ return;
+ }
+ mOrdersRv.setVisibility(View.VISIBLE);
+ mNoDatas.setVisibility(View.GONE);
+ if ((null == ordersList) || (ordersList.size() < mPerPageSize && mNextPage > 0)){//已经没有更多数据,提示无数据
+ //已经没有更多数据
+ serverHadNoData = true;
+ orders.addAll(ordersList);
+ mAdapter.notifyDataSetChanged();
+ mNextPage = mNextPage +1;
+ return;
+ }
+ serverHadNoData = false;
+ orders.addAll(ordersList);
+ if(mAdapter!=null) {
+ mAdapter.notifyDataSetChanged();
+ }
+ mNextPage = mNextPage +1;
+ }catch (Exception e){
+ e.fillInStackTrace();
+ }
+ }
+
+ class OrderAdapter extends RecyclerView.Adapter{
+ private static final int ORDER_DETAIL_ITEM = 0;
+ private static final int DAY_GROUP_ITEM = 1;
+ private Context context;
+ List orders;
+ public OrderAdapter(Context context,List datas){
+ this.context = context;
+ this.orders = datas;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == ORDER_DETAIL_ITEM){
+ View view = LayoutInflater.from(context).inflate(R.layout.taxi_orders_list_item,parent,false);
+ OrderDetailViewHolder viewHolder = new OrderDetailViewHolder(view);
+ return viewHolder;
+ }else if (viewType == DAY_GROUP_ITEM){
+ View view = LayoutInflater.from(context).inflate(R.layout.taxi_orders_list_day_item,parent,false);
+ DayGroupViewHolder viewHolder = new DayGroupViewHolder(view);
+ return viewHolder;
+ }
+ return null;
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ OrderQueryRespBean.Result queryRespBean = orders.get(position);
+ if (null == queryRespBean) return;
+ if (holder instanceof DayGroupViewHolder){
+ DayGroupViewHolder groupViewHolder = (DayGroupViewHolder)holder;
+ groupViewHolder.dayGroupTv.setText(DateTimeUtil.getYMDTime(queryRespBean.createTime));
+ bindOrderDetailData(queryRespBean,groupViewHolder.orderTimeTv,groupViewHolder.startStationTv,groupViewHolder.endStationTv,
+ groupViewHolder.orderStatusBt,groupViewHolder.orderTypeBt,groupViewHolder.orderNumTv);
+ if (isNoLineItem(position)){
+ groupViewHolder.dividerLine.setVisibility(View.VISIBLE);
+ }else {
+ groupViewHolder.dividerLine.setVisibility(View.GONE);
+ }
+ if (position == orders.size()-1 && serverHadNoData){
+ groupViewHolder.mBootNoDataView.setVisibility(View.VISIBLE);
+ }else {
+ groupViewHolder.mBootNoDataView.setVisibility(View.GONE);
+ }
+ }else if (holder instanceof OrderDetailViewHolder){
+ OrderDetailViewHolder detailViewHolder = (OrderDetailViewHolder)holder;
+ bindOrderDetailData(queryRespBean,detailViewHolder.orderTimeTv,detailViewHolder.startStationTv,detailViewHolder.endStationTv,
+ detailViewHolder.orderStatusBt,detailViewHolder.orderTypeBt,detailViewHolder.orderNumTv);
+ if (isNoLineItem(position)){
+ detailViewHolder.dividerLine.setVisibility(View.VISIBLE);
+ }else {
+ detailViewHolder.dividerLine.setVisibility(View.GONE);
+ }
+ if (position == orders.size()-1 && serverHadNoData){
+ detailViewHolder.mBootNoDataView.setVisibility(View.VISIBLE);
+ }else {
+ detailViewHolder.mBootNoDataView.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ //第一个要显示时间
+ if (position == 0){
+ return DAY_GROUP_ITEM;
+ }
+ String currentDate = DateTimeUtil.getYMDTime(orders.get(position).createTime);//获取当前订单时间
+ int prevIndex = position - 1;
+ String preDate = DateTimeUtil.getYMDTime(orders.get(prevIndex).createTime);
+ boolean isDifferent = !preDate.equals(currentDate);//前一个订单的日期跟第二个订单的日期是否一致
+ return isDifferent ? DAY_GROUP_ITEM : ORDER_DETAIL_ITEM;//一样订单详情, 不一样新添加分组
+ }
+
+ private boolean isNoLineItem(int position){
+ if (position == orders.size() -1){
+ return false;
+ }else {
+ String currentDate = DateTimeUtil.getYMDTime(orders.get(position).createTime);//获取当前订单时间
+ int nextIndex = position + 1;
+ String preDate = DateTimeUtil.getYMDTime(orders.get(nextIndex).createTime);
+ boolean isDifferent = preDate.equals(currentDate);//订单跟后一个订单是否是同一天
+ return isDifferent;//一样有划分线, 不一样没有划分线
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return orders.size();
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private void bindOrderDetailData(OrderQueryRespBean.Result queryRespBean, TextView orderTimeTv, TextView startStationTv, TextView endStationTv,
+ Button orderStatusBt, Button orderTypeBt, TextView orderNumTv){
+ Calendar calendar= Calendar.getInstance();
+ calendar.setTimeInMillis(queryRespBean.createTime);
+ orderTimeTv.setText(DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm));
+ startStationTv.setText(queryRespBean.startSiteAddr);
+ endStationTv.setText(queryRespBean.endSiteAddr);
+ orderStatusBt.setText(getOrderStatus(queryRespBean.orderStatus,orderStatusBt));
+ orderTypeBt.setText(getOrderType(queryRespBean.orderType,orderTypeBt));
+ orderNumTv.setText("订单编号:"+String.valueOf(queryRespBean.orderNo));
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private String getOrderStatus(int status, Button button){
+ TaxiOrderStatusEnum orderStatus = TaxiOrderStatusEnum.valueOf(status);
+ switch (orderStatus){
+ case JourneyCompleted:
+ button.setBackground(context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg));
+ return "已完成";
+ case Cancel:
+ button.setBackground(context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg));
+ return "已取消";
+ default:
+ button.setBackground(context.getDrawable(R.drawable.taxi_order_button_status_bg));
+ return "服务中";
+ }
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private String getOrderType(int type, Button button){
+ if (type == TaxiOrderTypeEnum.Reserved.getType()){
+ button.setBackground(context.getDrawable(R.drawable.taxi_order_button_type_reserver_bg));
+ return "预约单";
+ }else{
+ button.setBackground(context.getDrawable(R.drawable.taxi_order_button_type_bg));
+ return "即时单";
+ }
+ }
+
+ }
+
+ class OrderDetailViewHolder extends RecyclerView.ViewHolder{
+
+ protected TextView orderTimeTv;
+ protected Button orderStatusBt;
+ protected TextView startStationTv;
+ protected TextView endStationTv;
+ protected TextView orderNumTv;
+ protected Button orderTypeBt;
+ protected View dividerLine;
+ protected View mBootNoDataView;
+
+ public OrderDetailViewHolder(@NonNull View itemView) {
+ super(itemView);
+ orderTimeTv = itemView.findViewById(R.id.order_time_hm_tv);
+ orderStatusBt = itemView.findViewById(R.id.order_status_bt);
+ startStationTv = itemView.findViewById(R.id.grab_order_start_station);
+ endStationTv = itemView.findViewById(R.id.grab_order_end_station);
+ orderNumTv = itemView.findViewById(R.id.order_num);
+ orderTypeBt = itemView.findViewById(R.id.order_type_bt);
+ dividerLine = itemView.findViewById(R.id.module_och_taxi_order_divider);
+ mBootNoDataView = itemView.findViewById(R.id.boot_refresh_no_data_view);
+ }
+ }
+
+ class DayGroupViewHolder extends OrderDetailViewHolder{
+
+ private TextView dayGroupTv;
+ public DayGroupViewHolder(@NonNull View itemView) {
+ super(itemView);
+ dayGroupTv = itemView.findViewById(R.id.order_day_tv);
+ }
+ }
+
+ abstract class OnTaxiOrderRvOnScrollListener extends RecyclerView.OnScrollListener{
+
+ private boolean isUpwardSliding = false;
+
+ @Override
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+ RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
+ //不滑动
+ if (manager instanceof LinearLayoutManager && newState == SCROLL_STATE_IDLE){
+ LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager;
+ int lastItemPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
+ int itemCount = linearLayoutManager.getItemCount();
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"lastItemPosition=="+lastItemPosition+",itemCount=="+itemCount);
+ //向上滑动到最后一个
+ if ((lastItemPosition == itemCount-1) && isUpwardSliding){
+ onLoadMore();
+ }
+ }
+ }
+
+ @Override
+ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
+ isUpwardSliding = dy > 0;
+ }
+ public abstract void onLoadMore();
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ mNextPage = 0;
+ orders.clear();
+ }
+
+ private class OrdersOperationFragmentAdapter extends FragmentPagerAdapter{
+
+ public OrdersOperationFragmentAdapter(@NonNull FragmentManager fm, int behavior) {
+ super(fm, behavior);
+ }
+
+ @NonNull
+ @Override
+ public Fragment getItem(int position) {
+ return fragments.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return fragments.size();
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return mTabTitles[position];
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrdersFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrdersFragment.java
new file mode 100644
index 0000000000..0796ebd2e9
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiReserveOrdersFragment.java
@@ -0,0 +1,182 @@
+package com.mogo.och.taxi.ui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.och.common.module.utils.DateTimeUtil;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/2
+ * 待服务订单列表
+ */
+public class TaxiReserveOrdersFragment extends BaseTaxiUIFragment {
+
+ private RecyclerView mRecyclerView;
+ private TextView mNodataTv;
+ private ConstraintLayout mNoDataView;
+ private View mBootRefreshNoDataView;
+ private List mDatas = new ArrayList<>();
+ private ToBeServedOrdersAdapter mAdapter;
+ private static TaxiFragment mTaxiFragment;
+ private static Activity mActivity;
+ private boolean isUpwardSliding = false;
+
+ public static TaxiReserveOrdersFragment newInstance(Activity activity, TaxiFragment taxiFragment){
+ mActivity = activity;
+ mTaxiFragment = taxiFragment;
+ Bundle args = new Bundle();
+ TaxiReserveOrdersFragment fragment = new TaxiReserveOrdersFragment();
+ fragment.setArguments( args );
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_reserve_orders;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ mRecyclerView = view.findViewById(R.id.order_to_be_served_rv);
+ mNodataTv = view.findViewById(R.id.no_order_data_tv);
+ mNoDataView = view.findViewById(R.id.no_order_data_view);
+ mNodataTv.setText("暂无待服务订单");
+ mBootRefreshNoDataView = view.findViewById(R.id.list_boot_refresh_no_data_view);
+ mBootRefreshNoDataView.setVisibility(View.GONE);
+ mAdapter = new ToBeServedOrdersAdapter(getActivity(),mDatas);
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(getParentFragment().getActivity()));
+ mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+ @Override
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+ RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
+ //不滑动
+ if (manager instanceof LinearLayoutManager && newState == SCROLL_STATE_IDLE){
+ LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager;
+ int lastItemPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
+ int itemCount = manager.getItemCount();
+ if ((lastItemPosition == itemCount-1) && !isUpwardSliding){
+ //显示没有更多数据
+ mBootRefreshNoDataView.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+
+ @Override
+ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
+ isUpwardSliding = dy > 0;
+ }
+ });
+ mRecyclerView.setAdapter(mAdapter);
+ }
+ public void onOrdersWaitServiceChanged(List waitServiceList){//待服务订单展示
+ if (waitServiceList.size() == 0){
+ showNoDataTip();
+ return;
+ }
+ mNoDataView.setVisibility(View.GONE);
+ mRecyclerView.setVisibility(View.VISIBLE);
+ mDatas.clear();
+ mDatas.addAll(waitServiceList);
+ mAdapter.notifyDataSetChanged();
+ }
+
+ private void showNoDataTip() {
+ mBootRefreshNoDataView.setVisibility(View.GONE);
+ mNoDataView.setVisibility(View.VISIBLE);
+ mRecyclerView.setVisibility(View.GONE);
+ }
+
+ class ToBeServedOrdersAdapter extends RecyclerView.Adapter{
+ private List datas;
+ private Context context;
+ public ToBeServedOrdersAdapter(Context context, List datas){
+ this.datas = datas;
+ this.context = context;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(context).inflate(R.layout.taxi_order_reserve_item,parent,false);
+ ToBeServedOrdersViewHolder viewHolder = new ToBeServedOrdersViewHolder(view);
+ return viewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (datas != null && datas.size() >0 ){
+ ToBeServedOrdersViewHolder viewHolder = (ToBeServedOrdersViewHolder)holder;
+ OrderQueryRespBean.Result order = datas.get(position);
+ Calendar calendar = DateTimeUtil.formatLongToCalendar(order.bookingTime);
+ if (DateTimeUtil.compareDateIsCurrentDay(calendar)){
+ viewHolder.orderTime.setText("用车时间:今天"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm));
+ }else {
+ viewHolder.orderTime.setText("用车时间:"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.MM_dd_HH_mm));
+ }
+ viewHolder.orderCancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ new TaxiOrderCancelDialog(mTaxiFragment,context,order.orderNo,1).show();
+ }
+ });
+ viewHolder.startStation.setText(order.startSiteAddr);
+ viewHolder.endStation.setText(order.endSiteAddr);
+ if (position == mDatas.size() -1){
+ viewHolder.deliverLine.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return datas.size();
+ }
+ }
+ class ToBeServedOrdersViewHolder extends RecyclerView.ViewHolder{
+ TextView orderTime;
+ ImageView orderCancel;
+ TextView startStation;
+ TextView endStation;
+ View deliverLine;
+ public ToBeServedOrdersViewHolder(@NonNull View itemView) {
+ super(itemView);
+ orderTime = itemView.findViewById(R.id.to_be_order_time);
+ orderCancel = itemView.findViewById(R.id.to_be_order_cancel_iv);
+ startStation = itemView.findViewById(R.id.base_start_station);
+ endStation = itemView.findViewById(R.id.base_end_station);
+ deliverLine = itemView.findViewById(R.id.to_be_order_divider);
+ }
+ }
+ public void onOrderCancelDone(String orderNo){
+ ToastUtils.showShort("订单取消成功");
+ for (int i=0; i< mDatas.size();i++){
+ OrderQueryRespBean.Result result = mDatas.get(i);
+ if (orderNo.equals(result.orderNo)){
+ mDatas.remove(i);
+ mAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java
new file mode 100644
index 0000000000..003c211eaa
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java
@@ -0,0 +1,113 @@
+package com.mogo.och.taxi.ui;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.amap.api.maps.model.LatLng;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.presenter.NaviPresenter;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/30
+ */
+public class TaxiRottingNaviFragment extends MvpFragment {
+
+ private final String TAG = TaxiRottingNaviFragment.class.getSimpleName();
+
+ private TaxiMapDirectionView mMapDirectionView;
+ public static TaxiRottingNaviFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ TaxiRottingNaviFragment fragment = new TaxiRottingNaviFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_rotting_navi_view;
+ }
+
+ @Override
+ public String getTagName() {
+ return TAG;
+ }
+
+ @Override
+ protected void initViews() {
+
+ }
+
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ mMapDirectionView = mRootView.findViewById(R.id.rotting_navi_view);
+ mMapDirectionView.onCreateView(savedInstanceState);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mMapDirectionView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mMapDirectionView.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+
+ if (mMapDirectionView != null){
+ mMapDirectionView.onDestroy();
+ }
+ }
+
+ @NonNull
+ @Override
+ protected NaviPresenter createPresenter() {
+ return new NaviPresenter(this);
+ }
+
+ public void routeResult(List routeArrivied, List routeArriving, MogoLocation location){
+ if ((routeArrivied.size()+routeArriving.size()) > 0) {
+ drawablePolylineByRoute(routeArrivied,routeArriving,location);
+ } else {
+ clearPolyline();
+ }
+ }
+
+ public void setLineMarker(LatLng startStation, LatLng endStation){
+ if (startStation!=null&&endStation!=null) {
+ if (mMapDirectionView != null) {
+ mMapDirectionView.setStartMarkAndEndMark(startStation,endStation);
+ UiThreadHandler.post(() -> mMapDirectionView.setLineMarker());
+ }
+ } else {
+ clearPolyline();
+ }
+ }
+
+ public void drawablePolylineByRoute(List routeArrivied, List routeArriving, MogoLocation location){
+ if (mMapDirectionView != null){
+ mMapDirectionView.setCoordinatesLatLng(routeArrivied,routeArriving,location);
+ UiThreadHandler.post(() -> mMapDirectionView.drawablePolyline());
+ }
+ }
+ private void clearPolyline() {
+ if (mMapDirectionView != null) {
+ UiThreadHandler.post(() -> mMapDirectionView.clearPolyline());
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java
new file mode 100644
index 0000000000..91007e4705
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/TaxiServerOrdersFragment.java
@@ -0,0 +1,226 @@
+package com.mogo.och.taxi.ui;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.viewpager.widget.ViewPager;
+
+import com.google.android.material.tabs.TabLayout;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import me.jessyan.autosize.AutoSize;
+import me.jessyan.autosize.utils.AutoSizeUtils;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 网约车-出租车UI
+ */
+public class TaxiServerOrdersFragment extends BaseTaxiUIFragment {
+
+ public static final String TAG = "TaxiFragment";
+
+ public static TaxiServerOrdersFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ TaxiServerOrdersFragment fragment = new TaxiServerOrdersFragment();
+ fragment.setArguments( args );
+ return fragment;
+ }
+ private FragmentTransaction mFragmentTransaction;
+ private TabLayout mTaxiOrderTab;
+ private TextView mWaitOrderSum;
+ private ViewPager mTaxiOrderPager;
+ private String[] mTabTitles = {"进行中","待服务"};
+ private List fragments = new ArrayList<>();
+ private TaxiBeingServerdOrdersFragment beingServerdOrdersFragment = null;
+ private TaxiReserveOrdersFragment reserveOrdersFragment = null;
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_server_orders_panel;
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ protected void initViews(View view) {
+ initOrderTab(view);
+ }
+
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private void initOrderTab(View view) {
+ mWaitOrderSum = view.findViewById(R.id.wait_order_num);
+ mTaxiOrderTab = view.findViewById(R.id.module_och_taxi_tab);
+ mTaxiOrderPager = view.findViewById(R.id.module_och_taxi_view_pager);
+ for (int i= 0;i < mTabTitles.length; i++){
+ TabLayout.Tab tab = mTaxiOrderTab.newTab();
+ tab.view.setBackgroundColor(Color.parseColor("#00000000"));
+ TextView tabView = (TextView) View.inflate(getActivity(),R.layout.taxi_tab_item_custom,null);
+ tabView.setText(mTabTitles[i]);
+ tabView.setHeight(AutoSizeUtils.dp2px(getContext(),120));
+ tab.setCustomView(tabView);
+ if (0 == i){
+ mTaxiOrderTab.addTab(tab,true);
+ changeTabLayoutTabUI(tab,true);
+ beingServerdOrdersFragment = TaxiBeingServerdOrdersFragment.newInstance(getActivity(),(TaxiFragment) getParentFragment());
+ fragments.add(beingServerdOrdersFragment);
+ }else if (1 == i){
+ mTaxiOrderTab.addTab(tab);
+ changeTabLayoutTabUI(tab,false);
+ reserveOrdersFragment = TaxiReserveOrdersFragment.newInstance(getActivity(),(TaxiFragment) getParentFragment());
+ fragments.add(reserveOrdersFragment);
+ }
+
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"activity="+getActivity());
+ mTaxiOrderTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onTabSelected(TabLayout.Tab tab) {
+ mTaxiOrderPager.setCurrentItem(tab.getPosition());
+ changeTabLayoutTabUI(tab,true);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void onTabUnselected(TabLayout.Tab tab) {
+ changeTabLayoutTabUI(tab,false);
+ }
+
+ @Override
+ public void onTabReselected(TabLayout.Tab tab) {
+
+ }
+ });
+ mTaxiOrderPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ mTaxiOrderTab.getTabAt(position).select();
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ }
+ });
+ mTaxiOrderPager.setAdapter(new OrdersFragmentAdapter(getChildFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT));
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private void changeTabLayoutTabUI(TabLayout.Tab tab, boolean isSelected){
+ TextView textView = (TextView) tab.getCustomView().findViewById(R.id.tab_title);
+ if (isSelected){
+ textView.setBackground(getActivity().getDrawable(R.drawable.taxi_driver_tab_item_bg));
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(getContext(),40));
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"SelectTv = "+ textView.getText());
+ textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+ textView.setTextColor(Color.parseColor("#FFFFFF"));
+ }else {
+ textView.setBackground(null);
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(getContext(),36));
+ CallerLogger.INSTANCE.d(M_TAXI + TAG,"unSelectTv = "+ textView.getText());
+ textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
+ textView.setTextColor(Color.parseColor("#CCD4F5"));
+ }
+ }
+
+ class OrdersFragmentAdapter extends FragmentPagerAdapter{
+
+ private FragmentManager fragmentManager;
+
+ public OrdersFragmentAdapter(@NonNull FragmentManager fm, int behavior) {
+ super(fm, behavior);
+ this.fragmentManager = fm;
+ }
+
+ @NonNull
+ @Override
+ public Fragment getItem(int position) {
+ CallerLogger.INSTANCE.d( M_TAXI + TAG, "getItem="+position);
+ return fragments.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return fragments.size();
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getPageTitle(int position) {
+ CallerLogger.INSTANCE.d( M_TAXI + TAG, "getPageTitle="+position);
+ return mTabTitles[position];
+ }
+ }
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order){
+ if (beingServerdOrdersFragment != null){
+ mTaxiOrderTab.getTabAt(0).select();
+ beingServerdOrdersFragment.updateCurrentOrderStatusChanged(order);
+ }
+ }
+ public void onOrdersWaitServiceChanged(List waitServiceList){
+ if (waitServiceList.size() == 0){
+ mWaitOrderSum.setVisibility(View.GONE);
+ }else {
+ mWaitOrderSum.setText(String.valueOf(waitServiceList.size()));
+ mWaitOrderSum.setVisibility(View.VISIBLE);
+ }
+ if (null == reserveOrdersFragment) return;
+ reserveOrdersFragment.onOrdersWaitServiceChanged(waitServiceList);
+ }
+ public void onOrderCancelDone(String orderNo){
+ if (null == reserveOrdersFragment) return;
+ reserveOrdersFragment.onOrderCancelDone(orderNo);
+ }
+ public void onCurrentOrderCancelDone(){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.onCurrentOrderCancelDone();
+ }
+
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.updateDistanceAndTime(meters,timeInSecond);
+ }
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.onCurrentOrderRouteInfoGot(routeInfo);
+ }
+
+ public void updateOrderBottomBtnUI() {
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.updateOrderBottomBtnUI();
+ }
+
+ public void onNaviToEndAmap(boolean isShow){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.onNaviToEndAmap(isShow);
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/base/AvoidLeakDialog.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/base/AvoidLeakDialog.java
new file mode 100644
index 0000000000..e332766931
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/ui/base/AvoidLeakDialog.java
@@ -0,0 +1,54 @@
+package com.mogo.och.taxi.ui.base;
+
+import android.app.Dialog;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import java.lang.ref.WeakReference;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/9/1
+ */
+public class AvoidLeakDialog extends Dialog {
+
+ private WeakReference hostFragmentReference;
+
+ public void setHostFragmentReference(DialogFragment hostFragment) {
+ this.hostFragmentReference = new WeakReference<>(hostFragment);
+ }
+
+ public AvoidLeakDialog(@NonNull Context context) {
+ super(context);
+ }
+
+ public AvoidLeakDialog(@NonNull Context context, int themeResId) {
+ super(context, themeResId);
+ }
+
+ protected AvoidLeakDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
+ super(context, cancelable, cancelListener);
+ }
+
+ @Override
+ public void setOnCancelListener(@Nullable OnCancelListener listener) {
+ }
+
+ @Override
+ public void setOnDismissListener(@Nullable OnDismissListener listener) {
+ }
+
+ @Override
+ public void setOnShowListener(@Nullable OnShowListener listener) {
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ if (null != hostFragmentReference && null != hostFragmentReference.get()) {
+ hostFragmentReference.get().dismissAllowingStateLoss();
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/DimenUtil.kt b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/DimenUtil.kt
new file mode 100644
index 0000000000..0ef16d740a
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/DimenUtil.kt
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.utils
+
+import android.content.res.Resources
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ */
+object DimenUtil{
+ fun dp2px(value:Float):Float{
+ return (0.5f + value * Resources.getSystem().displayMetrics.density)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/OrderUtil.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/OrderUtil.java
new file mode 100644
index 0000000000..4c61f04ebb
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/OrderUtil.java
@@ -0,0 +1,22 @@
+package com.mogo.och.taxi.utils;
+
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created on 2021/9/11
+ */
+public class OrderUtil {
+
+ // 判断两个list中的订单是否相同:依据orderId
+ public static boolean haveSameOrders(List list1,
+ List list2) {
+ OrderQueryRespBean.Result[] arr1 = list1.toArray(new OrderQueryRespBean.Result[]{});
+ OrderQueryRespBean.Result[] arr2 = list2.toArray(new OrderQueryRespBean.Result[]{});
+ Arrays.sort(arr1);
+ Arrays.sort(arr1);
+ return Arrays.equals(arr1,arr2);
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/PermissionUtil.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/PermissionUtil.java
new file mode 100644
index 0000000000..121533db99
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/PermissionUtil.java
@@ -0,0 +1,37 @@
+package com.mogo.och.taxi.utils;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.location.LocationManager;
+import android.os.Build;
+
+import androidx.core.content.ContextCompat;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/7
+ */
+public class PermissionUtil {
+
+ public static boolean checkPermission(Context context,String... permissons) {
+
+ for (String permisson : permissons) {
+ if ((ContextCompat.checkSelfPermission(context,
+ permisson) != PackageManager.PERMISSION_GRANTED)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isLocServiceEnable(Context context) {
+ LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
+ boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
+ boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
+ if (gps || network) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TPRouteDataTestUtils.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TPRouteDataTestUtils.java
new file mode 100644
index 0000000000..5adc1a9531
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TPRouteDataTestUtils.java
@@ -0,0 +1,46 @@
+package com.mogo.och.taxi.utils;
+
+import com.mogo.och.taxi.model.TaxiModel;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/4/13
+ */
+public class TPRouteDataTestUtils {
+
+ static String jsonStr ="{\n" +
+ " \"models\": [\n" +
+ " {\n" +
+ " \"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927760268911,\"lon\":116.73512607061035,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927736555187,\"lon\":116.73498243020299,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927135941599,\"lon\":116.73482951462647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199260672670036,\"lon\":116.73468429259535,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199251260349946,\"lon\":116.73453933465,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924691997577,\"lon\":116.7343756435551,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199247953493625,\"lon\":116.73421240809087,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924986849947,\"lon\":116.73400425509712,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199249431152175,\"lon\":116.73378579041055,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199248921305724,\"lon\":116.73357811807278,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925012387371,\"lon\":116.73337650020184,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252270195075,\"lon\":116.73318223781153,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992521615169,\"lon\":116.73298632625203,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925202633083,\"lon\":116.73279582043983,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199261230205735,\"lon\":116.73263403473568,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199327991681926,\"lon\":116.73251962434813,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19944850496711,\"lon\":116.73249661840195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199582026896415,\"lon\":116.73251038561487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199743326352014,\"lon\":116.73253087453938,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199908347167394,\"lon\":116.73255070500186,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200065950595445,\"lon\":116.7325720694418,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20022747460407,\"lon\":116.73259461416663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384057310536,\"lon\":116.73261575018056,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20053849777916,\"lon\":116.73263451936387,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200696919444624,\"lon\":116.7326540541723,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2008524952796,\"lon\":116.7326743511824,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20101429705625,\"lon\":116.73269393580199,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118279997041,\"lon\":116.73271564378308,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201342388452076,\"lon\":116.73273653366076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201476063822355,\"lon\":116.73275292393079,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163479199852,\"lon\":116.73277440686762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181243476041,\"lon\":116.7328052766508,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201991767093304,\"lon\":116.7328453845644,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20215573733484,\"lon\":116.73287624009339,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202313648759784,\"lon\":116.73289887933315,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434745374454,\"lon\":116.7329182210956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253164952098,\"lon\":116.73297539811277,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258043275509,\"lon\":116.73312335324984,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258233576585,\"lon\":116.73331077089557,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20257107560234,\"lon\":116.73351244039137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202561578580514,\"lon\":116.73370176209845,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20256256788661,\"lon\":116.73391325024126,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20255633158834,\"lon\":116.73413195000244,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202543311179575,\"lon\":116.73436614303907,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253067346457,\"lon\":116.73458032609663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20251776111356,\"lon\":116.73477082198242,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202503997557805,\"lon\":116.73498624001282,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20249129260376,\"lon\":116.73518976336872,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247877796589,\"lon\":116.73537786253135,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246651610268,\"lon\":116.73559239130266,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245754388014,\"lon\":116.73574239922202,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20244749208,\"lon\":116.73589674090469,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243806550113,\"lon\":116.73607057284322,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243550556816,\"lon\":116.73628106525871,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243654127756,\"lon\":116.7364949950665,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243738221016,\"lon\":116.7367061649993,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243672476754,\"lon\":116.73691115930336,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243590788176,\"lon\":116.73710722104272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202436434375336,\"lon\":116.73730688607075,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243749821501,\"lon\":116.73750140347998,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243625962803,\"lon\":116.73771330926793,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434515480725,\"lon\":116.73791895606205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024326561388,\"lon\":116.73815206945737,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243092086137,\"lon\":116.73838655528765,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202430876006126,\"lon\":116.73861890759498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242914053177,\"lon\":116.73882029918758,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242843336561,\"lon\":116.73904465495175,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242661219026,\"lon\":116.73922453252953,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426462811076,\"lon\":116.7393708046956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242687134937,\"lon\":116.73954685547025,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242694967377,\"lon\":116.73975021183773,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202424630601236,\"lon\":116.73999740812975,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202422502184625,\"lon\":116.74028266774337,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202419634158936,\"lon\":116.7405942561498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241975959762,\"lon\":116.7409069557092,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241920524113,\"lon\":116.74120156191647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241765540262,\"lon\":116.74149288504978,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241569149764,\"lon\":116.7418080096762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202414529497084,\"lon\":116.74210262897205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241419532155,\"lon\":116.74241767661879,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202413879360954,\"lon\":116.7427571218185,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241287045245,\"lon\":116.7431284691325,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241214965105,\"lon\":116.74343354359334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241141271715,\"lon\":116.7437220210538,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024080520075,\"lon\":116.74399113498052,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202391714280026,\"lon\":116.74427625698272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20238163805639,\"lon\":116.74452083315958,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379293010274,\"lon\":116.74475703837204,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379007817086,\"lon\":116.7449961645494,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20237814181231,\"lon\":116.7452036063558,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202375477619896,\"lon\":116.74539567654291,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2023632396621,\"lon\":116.74555457589031,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20229396554444,\"lon\":116.7456716047369,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20217800547467,\"lon\":116.74574081942625,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202047498095304,\"lon\":116.74573659255675,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20188573786706,\"lon\":116.74571018281719,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201738240263026,\"lon\":116.74568463148606,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20157507049073,\"lon\":116.74565525041498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20137985142042,\"lon\":116.745619970576,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201187335613575,\"lon\":116.74558631350607,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20098251429043,\"lon\":116.74555055587679,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2007748533628,\"lon\":116.74551426934663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20057082986032,\"lon\":116.74547749663195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20036944224329,\"lon\":116.74544156175533,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016365229035,\"lon\":116.74540577510051,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1999958572445,\"lon\":116.74537505807076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19984100521566,\"lon\":116.7453433678602,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1996863960282,\"lon\":116.74529675648621,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19953919567943,\"lon\":116.74525916493474,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19940587189373,\"lon\":116.74523402869453,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19929047792381,\"lon\":116.74518617038383,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922141745155,\"lon\":116.74506912884067,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920798885308,\"lon\":116.744896716334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920912644279,\"lon\":116.74467216715483,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199209186509314,\"lon\":116.74448257515108,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920910709997,\"lon\":116.74430613406223,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992100786082,\"lon\":116.74410888316238,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921081961254,\"lon\":116.74391968819582,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921040855518,\"lon\":116.7437082083402,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921085053439,\"lon\":116.74346931155634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921197237373,\"lon\":116.74325149697013,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921248248983,\"lon\":116.74301103786591,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992139724646,\"lon\":116.74277237066539,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215818352386,\"lon\":116.74253219408898,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216175018876,\"lon\":116.74228853120842,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215970354246,\"lon\":116.74204663206451,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216627492966,\"lon\":116.74183871233049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921789170398,\"lon\":116.74165788334192,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922000138535,\"lon\":116.74144512197054,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199221559127494,\"lon\":116.741249370491,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922287231889,\"lon\":116.7410525810756,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922229019589,\"lon\":116.74085266662037,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992216995901,\"lon\":116.74061957723823,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922263073874,\"lon\":116.74041638149129,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922478093337,\"lon\":116.7402123910757,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199227066091595,\"lon\":116.74003419421553,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199228634241756,\"lon\":116.73985841944678,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922951636012,\"lon\":116.7397079274105,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252095329484,\"lon\":116.73956265582487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199346162997905,\"lon\":116.73944690416265,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199470799628024,\"lon\":116.73941941053417,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19962513314346,\"lon\":116.7394280706812,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199780626058924,\"lon\":116.73944255215424,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199961525343376,\"lon\":116.73945856750177,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016196947193,\"lon\":116.73947572081121,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384479551936,\"lon\":116.7394949225795,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200595083817475,\"lon\":116.73951027963179,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200792203321086,\"lon\":116.73952526850614,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200985930701684,\"lon\":116.73954125209579,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20115978977055,\"lon\":116.73955610094161,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201321019536124,\"lon\":116.7395695239138,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20147117943043,\"lon\":116.7395823299481,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163699848565,\"lon\":116.73959633422596,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20178484338371,\"lon\":116.7396085776486,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201962185646316,\"lon\":116.73962351991214,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021018923927,\"lon\":116.7396354059821,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2022137620686,\"lon\":116.73964348380458,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20232600820075,\"lon\":116.73961190446633,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241090270993,\"lon\":116.73951649703137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245777783807,\"lon\":116.73937664238166,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246906634823,\"lon\":116.73920146119093,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470916682884,\"lon\":116.73898763065634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247034830421,\"lon\":116.73878158418357,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246978204673,\"lon\":116.73857680142473,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247082638905,\"lon\":116.73834517890637,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202471943178196,\"lon\":116.7381047689514,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247131648035,\"lon\":116.73787761484981,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470799473765,\"lon\":116.73766230702478,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247013054322,\"lon\":116.73743619407796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246999515433,\"lon\":116.73724916823292,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247199652478,\"lon\":116.73704888970806,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202473960263525,\"lon\":116.73684083235807,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202474504753205,\"lon\":116.73665462440796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247501354581,\"lon\":116.73650710371837,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246541231906,\"lon\":116.73635807696789,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426768984274,\"lon\":116.73622283382787,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20236638788854,\"lon\":116.73610589402243,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20227106919894,\"lon\":116.73600895001849,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021428343084,\"lon\":116.73596816020945,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20197815580698,\"lon\":116.73594623645097,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181789535303,\"lon\":116.73593148707488,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201667906886954,\"lon\":116.73591743008926,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201505897730755,\"lon\":116.7359002912543,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20135083580946,\"lon\":116.73588579696379,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118617904595,\"lon\":116.73586970398149,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20102374028594,\"lon\":116.73585314703226,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20085554043743,\"lon\":116.73583763953049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20069451888229,\"lon\":116.73582073901778,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200530837344964,\"lon\":116.73580314359012,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2003608457064,\"lon\":116.73578183888779,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20021770046798,\"lon\":116.73575292592922,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20003454701824,\"lon\":116.7357174959358,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19986125116602,\"lon\":116.73569499961796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19969408518737,\"lon\":116.73567725223492,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19955533048882,\"lon\":116.73566375985422,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19943174810538,\"lon\":116.73564927714162,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19933167546824,\"lon\":116.735595995086,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199280357603875,\"lon\":116.73546293260645,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927848361656,\"lon\":116.73531579486274,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19928127892504,\"lon\":116.73505848474375,\"speed\": 0.0\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+ public static void converToRouteData(){
+ List list = new ArrayList<>();
+
+ try {
+ JSONObject jsonObject = new JSONObject(jsonStr);
+ JSONArray jsonElements = jsonObject.getJSONArray("models");
+ for (int i = 0; i < jsonElements.length(); i++) {
+ JSONObject s = jsonElements.getJSONObject(i);
+ MessagePad.Location.Builder builder = MessagePad.Location.newBuilder();
+ builder.setLatitude(s.getDouble("lat"));
+ builder.setLongitude(s.getDouble("lon"));
+ list.add(builder.build());
+ }
+// TaxiModel.getInstance().updateOrderRoute(list);
+ TaxiModel.getInstance().updateOrderRouteInfo(list);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java
new file mode 100644
index 0000000000..c43e4617c6
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java
@@ -0,0 +1,149 @@
+package com.mogo.och.taxi.utils;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+import android.text.TextUtils;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.app.AppConfigInfo;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.commons.utils.MogoAnalyticUtils;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.constant.TaxiConst;
+
+import java.util.HashMap;
+
+/**
+ * OCH Taxi埋点工具
+ *
+ * Created on 2022/3/24
+ */
+public class TaxiAnalyticsManager {
+
+ private static final class SingletonHolder {
+ private static final TaxiAnalyticsManager INSTANCE = new TaxiAnalyticsManager();
+ }
+
+ public static TaxiAnalyticsManager getInstance() {
+ return TaxiAnalyticsManager.SingletonHolder.INSTANCE;
+ }
+
+
+
+ private String mStartAutopilotKey;
+ private HashMap mStartAutopilotParams = new HashMap<>();
+
+ private Runnable startAutopilotRunnable = () -> {
+ // 15s内未开启,上报失败埋点
+ triggerStartAutopilotFailureEvent("", "15s后app等待超时");
+ };
+
+ public void triggerStartAutopilotFailureEventByAdas(String failCode, String failMsg){
+ removeWaitingCallback();
+ triggerStartAutopilotFailureEvent(failCode, failMsg);
+ }
+
+ private void removeWaitingCallback() {
+ if (startAutopilotRunnable != null) {
+ UiThreadHandler.removeCallbacks(startAutopilotRunnable);
+ }
+ }
+
+ private void triggerStartAutopilotFailureEvent(String failCode, String failMsg){
+ if (mStartAutopilotParams.isEmpty()) return;
+
+ CallerLogger.INSTANCE.e(M_TAXI + "triggerStartAutopilotFailureEvent", failMsg);
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() !=
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_FAILURE_CODE, failCode);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_FAILURE_MSG,
+ failMsg);
+ }
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_RESULT,
+ CallerAutoPilotStatusListenerManager.INSTANCE.getState() ==
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
+
+ clearStartAutopilotParams();//清空参数数据,防止误传
+ }
+
+ private void clearStartAutopilotParams(){
+ mStartAutopilotParams.clear();
+ }
+
+ public void clearStartAutopilotFailureMSG(){
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_FAILURE_CODE, "");
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_FAILURE_MSG, "");
+ }
+
+ /**
+ * 触发'开启自动驾驶'埋点流程
+ * 开启自动驾驶,15s内成功则发送成功埋点,否则发送失败埋点
+ * @param restart false(点击'开始服务'启动)/true(接管后点击'自动驾驶'按钮启动)
+ * @param send 是否直接发送埋点(15s内开启成功则直接发送成功埋点)
+ */
+ public void triggerStartAutopilotEvent(
+ boolean restart, boolean send, String startName, String endName, long lineId, String orderNo) {
+ mStartAutopilotKey = restart ?
+ TaxiConst.EVENT_KEY_RESTART_AUTOPILOT : TaxiConst.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(TaxiConst.EVENT_PARAM_SN, sn);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_ENV_ONLINE,
+ DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_TIME, dateTime);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_NAME, startName);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_END_NAME, endName);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_LINE_ID, lineId);
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_ORDER_NUMBER, orderNo);
+
+// CallerLogger.INSTANCE.d(M_TAXI + "埋点==","restart = "+restart+", send= "+send);
+
+ if (send) {
+ if (mStartAutopilotParams.isEmpty()) return;
+ // 开启成功,上报埋点
+ clearStartAutopilotFailureMSG();
+ removeWaitingCallback();
+ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_RESULT, true);
+ MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
+
+ clearStartAutopilotParams();//清空参数数据,防止误传
+ } else {
+ UiThreadHandler.postDelayed(startAutopilotRunnable, TaxiConst.LOOP_PERIOD_15S);
+ }
+ }
+
+ /**
+ * 触发"无法开启自驾已知异常"埋点
+ * @param startName
+ * @param endName
+ * @param orderNo
+ */
+ public void triggerUnableStartAPReasonEvent(String startName, String endName, String orderNo,
+ String reason) {
+ String sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ String plateNum = AppConfigInfo.INSTANCE.getPlateNumber();
+ String dateTime = DateTimeUtils.getTimeText(
+ System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss);
+
+ HashMap params = new HashMap<>();
+
+ params.put(TaxiConst.EVENT_PARAM_SN, sn);
+ params.put(TaxiConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
+ params.put(TaxiConst.EVENT_PARAM_ENV_ONLINE,
+ DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
+ params.put(TaxiConst.EVENT_PARAM_TIME, dateTime);
+ params.put(TaxiConst.EVENT_PARAM_START_NAME, startName);
+ params.put(TaxiConst.EVENT_PARAM_END_NAME, endName);
+ params.put(TaxiConst.EVENT_PARAM_ORDER_NUMBER, orderNo);
+ params.put(TaxiConst.EVENT_PARAM_UNABLE_START_REASON, reason);
+ MogoAnalyticUtils.INSTANCE.track(TaxiConst.EVENT_KEY_AP_UNABLE_START_REASON, params);
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiMapAssetStyleUtil.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiMapAssetStyleUtil.java
new file mode 100644
index 0000000000..4e991eda96
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiMapAssetStyleUtil.java
@@ -0,0 +1,61 @@
+package com.mogo.och.taxi.utils;
+
+
+import android.content.Context;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @author donghongyu
+ * @date 12/18/20 5:37 PM
+ */
+public class TaxiMapAssetStyleUtil {
+
+ public static byte[] getAssetsStyle(Context context,String fileName) {
+ byte[] buffer1 = null;
+ InputStream is1 = null;
+ try {
+ is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style.data
+ int lenght1 = is1.available();
+ buffer1 = new byte[lenght1];
+ is1.read(buffer1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (is1 != null) {
+ is1.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer1;
+ }
+
+
+ public static byte[] getAssetsExtraStyle(Context context, String fileName) {
+ byte[] buffer1 = null;
+ InputStream is1 = null;
+ try {
+ is1 = context.getResources().getAssets().open(fileName); //eg. over_view_style_extra.data
+ int lenght1 = is1.available();
+ buffer1 = new byte[lenght1];
+ is1.read(buffer1);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (is1 != null) {
+ is1.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer1;
+ }
+
+
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java
new file mode 100644
index 0000000000..8d58a0199e
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/java/com/mogo/och/taxi/utils/TaxiTrajectoryManager.java
@@ -0,0 +1,207 @@
+package com.mogo.och.taxi.utils;
+
+import androidx.annotation.Nullable;
+
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.GsonUtils;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.constant.TaxiConst;
+import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
+import com.mogo.och.taxi.model.TaxiModel;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import mogo_msg.MogoReportMsg;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI;
+
+/**
+ * Taxi轨迹管理:给MEC下发用于轨迹下载的信息
+ * Created on 2022/6/22
+ */
+public class TaxiTrajectoryManager {
+ private static final String TAG = TaxiTrajectoryManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final TaxiTrajectoryManager INSTANCE = new TaxiTrajectoryManager();
+ }
+
+ public static TaxiTrajectoryManager getInstance() {
+ return TaxiTrajectoryManager.SingletonHolder.INSTANCE;
+ }
+
+ private AutopilotControlParameters.AutoPilotLine mAutoPilotLine = null;
+ private Disposable mSendReqDisposable = null;
+ private String mPrevOrderNo = "";
+
+ public TaxiTrajectoryManager() {
+ mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(-1,
+ "", "", "", "", 0, "",
+ "", "", "", "", 0);
+ }
+
+ /**
+ * 同步订单信息
+ */
+ public void syncTrajectoryInfo() {
+ OrderQueryRespBean.Result orderInfo = TaxiModel.getInstance().getCurrentOCHOrder();
+ if (orderInfo == null || orderInfo.orderStatus >= TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "syncTrajectoryInfo() stop.");
+ stopTrajReqLoop();
+ } else {
+ if (mPrevOrderNo.equals(orderInfo.orderNo)) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "syncTrajectoryInfo() 重复订单.");
+ } else {
+ mPrevOrderNo = orderInfo.orderNo;
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "syncTrajectoryInfo() start.");
+ startTrajReqLoop();
+ }
+ }
+ }
+
+ /**
+ * 接口MEC反馈的常规信息(MAP v2.5.0新增轨迹相关信息)
+ * @param guardianInfo
+ */
+ public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) {
+ if (guardianInfo == null || !guardianInfo.hasCode()) return;
+ if ("ISYS_INIT_TRAJECTORY_START".equals(guardianInfo.getCode())) {
+ // 1. 轨迹管理_轨迹开始下载(本地已有对应轨迹也触发)
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onAutopilotGuardian() 轨迹开始下载");
+ // ToastUtils.showShort("轨迹开始下载");
+ stopTrajReqLoop();
+ } else if ("ISYS_INIT_TRAJECTORY_SUCCESS".equals(guardianInfo.getCode())) {
+ // 2. 轨迹管理_轨迹下载成功(本地已有对应轨迹也触发)
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onAutopilotGuardian() 轨迹下载成功");
+ // ToastUtils.showShort("轨迹下载成功");
+ stopTrajReqLoop();
+ } else if ("ISYS_INIT_TRAJECTORY_FAILURE".equals(guardianInfo.getCode())) {
+ // 3. 轨迹管理_轨迹下载失败,本地无对应轨迹
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onAutopilotGuardian() " +
+ "轨迹下载失败,本地无对应轨迹");
+ // ToastUtils.showShort("轨迹下载失败,本地无对应轨迹");
+ } else if ("ISYS_INIT_TRAJECTORY_WARNING".equals(guardianInfo.getCode())) {
+ // 4. 轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onAutopilotGuardian() " +
+ "轨迹下载失败,本地有对应轨迹,认为成功");
+ // ToastUtils.showShort("轨迹下载失败,本地有对应轨迹,认为成功");
+ } else if ("ISYS_INIT_TRAJECTORY_TIMEOUT".equals(guardianInfo.getCode())) {
+ // 5. 轨迹管理_轨迹下载超时
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "onAutopilotGuardian() 轨迹下载超时");
+ // ToastUtils.showShort("轨迹下载超时");
+ }
+ }
+
+ private void setupAutoPilotLine() {
+ OrderQueryRespBean.Result order = TaxiModel.getInstance().getCurrentOCHOrder();
+ if (order == null) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG,
+ "setupAutoPilotLine(): orderInfo is null.");
+ return;
+ } else {
+ if (mAutoPilotLine == null) {
+ mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(order.lineId,
+ order.csvFileUrl, order.csvFileMd5, order.txtFileUrl, order.txtFileMd5,
+ order.contrailSaveTime, order.carModel,
+ order.csvFileUrlDPQP, order.csvFileMd5DPQP, order.txtFileUrlDPQP, order.txtFileMd5DPQP,
+ order.contrailSaveTimeDPQP);
+ } else {
+ mAutoPilotLine.setLineId(order.lineId);
+ mAutoPilotLine.setTrajUrl(order.csvFileUrl);
+ mAutoPilotLine.setTrajMd5(order.csvFileMd5);
+ mAutoPilotLine.setStopUrl(order.txtFileUrl);
+ mAutoPilotLine.setStopMd5(order.txtFileMd5);
+ mAutoPilotLine.setTimestamp(order.contrailSaveTime);
+ mAutoPilotLine.setVehicleModel(order.carModel);
+ mAutoPilotLine.setTrajUrl_dpqp(order.csvFileUrlDPQP);
+ mAutoPilotLine.setTrajMd5_dpqp(order.csvFileMd5DPQP);
+ mAutoPilotLine.setStopUrl_dpqp(order.txtFileUrlDPQP);
+ mAutoPilotLine.setStopMd5_dpqp(order.txtFileMd5DPQP);
+ mAutoPilotLine.setTimestamp_dpqp(order.contrailSaveTimeDPQP);
+ }
+ }
+ }
+
+ private void clearAutoPilotLine() {
+ if (mAutoPilotLine == null) return;
+ mAutoPilotLine.setLineId(-1);
+ mAutoPilotLine.setTrajUrl("");
+ mAutoPilotLine.setTrajMd5("");
+ mAutoPilotLine.setStopUrl("");
+ mAutoPilotLine.setStopMd5("");
+ mAutoPilotLine.setTimestamp(0);
+ mAutoPilotLine.setVehicleModel("");
+ mAutoPilotLine.setTrajUrl_dpqp("");
+ mAutoPilotLine.setTrajMd5_dpqp("");
+ mAutoPilotLine.setStopUrl_dpqp("");
+ mAutoPilotLine.setStopMd5_dpqp("");
+ mAutoPilotLine.setTimestamp_dpqp(0);
+ }
+
+ private void startTrajReqLoop() {
+ if (mSendReqDisposable != null && !mSendReqDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "startTrajReqLoop()");
+ setupAutoPilotLine();
+ mSendReqDisposable = Observable.interval(TaxiConst.LOOP_DELAY,
+ TaxiConst.LOOP_PERIOD_10S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> {
+ if (aLong > TaxiConst.LOOP_SEND_TRAJ_TIMES) {
+ mPrevOrderNo = ""; //重发超时后将mPrevOrderNo置空,这样订单进入下个状态时还可以重发
+ stopTrajReqLoop();
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "loop sendTrajectoryReq: " + aLong);
+ sendTrajectoryReq();
+ });
+ }
+
+ private void stopTrajReqLoop() {
+ if (mSendReqDisposable != null) {
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "stopTrajReqLoop()");
+ mSendReqDisposable.dispose();
+ mSendReqDisposable = null;
+ clearAutoPilotLine();
+ }
+ }
+
+ private void sendTrajectoryReq() {
+ if (mAutoPilotLine == null) {
+ CallerLogger.INSTANCE.e(M_TAXI + TAG, "sendTrajectoryReq(): mAutoPilotLine is null!!!");
+ return;
+ }
+
+ // TODO: 2022/6/24
+ // test1
+// mAutoPilotLine.setLineId(148);
+// mAutoPilotLine.setTrajUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/e27c20c2da32481021d934c3ef084536/traj_148.csv");
+// mAutoPilotLine.setTrajMd5("e27c20c2da32481021d934c3ef084536");
+// mAutoPilotLine.setStopUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/6224c9dd2c0e2bd990c6482c0464de45/stop_148.txt");
+// mAutoPilotLine.setStopMd5("6224c9dd2c0e2bd990c6482c0464de45");
+// mAutoPilotLine.setTimestamp(1654596000000L); //20220607 18:00
+// mAutoPilotLine.setVehicleModel("红旗H9");
+
+ // test2
+// mAutoPilotLine.setLineId(148);
+// mAutoPilotLine.setTrajUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/8654497cf918be461a59c7ad8e22920d/traj_148.csv");
+// mAutoPilotLine.setTrajMd5("8654497cf918be461a59c7ad8e22920d");
+// mAutoPilotLine.setStopUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/1bb098b244922649bf3e7bada0d3950f/stop_148.txt");
+// mAutoPilotLine.setStopMd5("1bb098b244922649bf3e7bada0d3950f");
+// mAutoPilotLine.setTimestamp(1654761600000L); //20220609 16:00
+// mAutoPilotLine.setVehicleModel("红旗H9");
+
+ CallerAutoPilotControlManager.INSTANCE.sendTrajectoryDownloadReq(mAutoPilotLine);
+ CallerLogger.INSTANCE.d(M_TAXI + TAG, "sendTrajectoryReq(): "
+ + GsonUtils.toJson(mAutoPilotLine));
+ }
+}
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/color/taxi_autopilot_text_color_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/color/taxi_autopilot_text_color_selector.xml
new file mode 100644
index 0000000000..16cef94271
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/color/taxi_autopilot_text_color_selector.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/end_maker_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/end_maker_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00001.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00001.png
new file mode 100644
index 0000000000..a45d5016fa
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00001.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00002.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00002.png
new file mode 100644
index 0000000000..cdb7a7a6a9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00002.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00003.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00003.png
new file mode 100644
index 0000000000..d23de4ef53
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00003.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00004.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00004.png
new file mode 100644
index 0000000000..c3c8cb6ec6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00004.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00005.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00005.png
new file mode 100644
index 0000000000..c3c8cb6ec6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00005.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00006.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00006.png
new file mode 100644
index 0000000000..c3c8cb6ec6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00006.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00007.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00007.png
new file mode 100644
index 0000000000..815f83bf47
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00007.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00008.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00008.png
new file mode 100644
index 0000000000..2771e6cef3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00008.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00009.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00009.png
new file mode 100644
index 0000000000..f66b6a0d55
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00009.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00010.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00010.png
new file mode 100644
index 0000000000..bab043383a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00010.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00011.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00011.png
new file mode 100644
index 0000000000..dde1edcb4d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00011.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00012.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00012.png
new file mode 100644
index 0000000000..f9d513b742
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00012.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00013.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00013.png
new file mode 100644
index 0000000000..813fbfe3b2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00013.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00014.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00014.png
new file mode 100644
index 0000000000..820eda75e2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00014.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00015.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00015.png
new file mode 100644
index 0000000000..544aeac6f3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00015.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00016.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00016.png
new file mode 100644
index 0000000000..7173a3c9f9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00016.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00017.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00017.png
new file mode 100644
index 0000000000..518bb6d32d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00017.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00018.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00018.png
new file mode 100644
index 0000000000..52cb8e1bab
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00018.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00019.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00019.png
new file mode 100644
index 0000000000..df48bba777
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00019.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00020.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00020.png
new file mode 100644
index 0000000000..ac35dd6e89
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00020.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00021.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00021.png
new file mode 100644
index 0000000000..2b553e8263
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00021.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00022.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00022.png
new file mode 100644
index 0000000000..79f25eaef8
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00022.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00023.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00023.png
new file mode 100644
index 0000000000..2f5cd12f81
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00023.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00024.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00024.png
new file mode 100644
index 0000000000..820eda75e2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00024.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00025.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00025.png
new file mode 100644
index 0000000000..bfd6fc9aee
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00025.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00026.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00026.png
new file mode 100644
index 0000000000..96671ead5a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00026.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00027.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00027.png
new file mode 100644
index 0000000000..8a16ccea5c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00027.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00028.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00028.png
new file mode 100644
index 0000000000..af98dbd5d3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00028.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00029.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00029.png
new file mode 100644
index 0000000000..b05765193b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00029.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00030.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00030.png
new file mode 100644
index 0000000000..dbf91b1e26
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00030.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00031.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00031.png
new file mode 100644
index 0000000000..6e3bd8cf35
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00031.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00032.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00032.png
new file mode 100644
index 0000000000..c3c8cb6ec6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00032.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00033.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00033.png
new file mode 100644
index 0000000000..815f83bf47
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00033.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00034.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00034.png
new file mode 100644
index 0000000000..2771e6cef3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00034.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00035.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00035.png
new file mode 100644
index 0000000000..f66b6a0d55
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00035.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00036.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00036.png
new file mode 100644
index 0000000000..bab043383a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00036.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00037.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00037.png
new file mode 100644
index 0000000000..dde1edcb4d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00037.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00038.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00038.png
new file mode 100644
index 0000000000..f9d513b742
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00038.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00039.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00039.png
new file mode 100644
index 0000000000..813fbfe3b2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00039.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00040.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00040.png
new file mode 100644
index 0000000000..820eda75e2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00040.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00041.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00041.png
new file mode 100644
index 0000000000..544aeac6f3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00041.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00042.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00042.png
new file mode 100644
index 0000000000..7173a3c9f9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00042.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00043.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00043.png
new file mode 100644
index 0000000000..6dd8ca6079
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00043.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00044.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00044.png
new file mode 100644
index 0000000000..c3c8cb6ec6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00044.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00045.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00045.png
new file mode 100644
index 0000000000..d1c3e43a46
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/heart_00045.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_ai_normal_och.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_ai_normal_och.png
new file mode 100755
index 0000000000..e98738b192
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_ai_normal_och.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_ai_select_och.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_ai_select_och.png
new file mode 100755
index 0000000000..d3e0107c02
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_ai_select_och.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_bad_case_normal_och.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_bad_case_normal_och.png
new file mode 100755
index 0000000000..c0a978fc2b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_bad_case_normal_och.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_bad_case_select_och.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_bad_case_select_och.png
new file mode 100755
index 0000000000..ebacf3a11a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_bad_case_select_och.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_station_start_end.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png
new file mode 100644
index 0000000000..27cb9285d3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/no_order_data.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/no_order_data.png
new file mode 100644
index 0000000000..0e61996d3f
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/no_order_data.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/order_drive_mode_bg.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/order_drive_mode_bg.png
new file mode 100644
index 0000000000..ec754b829f
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/order_drive_mode_bg.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/start_maker_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/start_maker_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00001.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00001.png
new file mode 100644
index 0000000000..0e2c5b1db9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00001.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00002.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00002.png
new file mode 100644
index 0000000000..317bc9d185
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00002.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00003.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00003.png
new file mode 100644
index 0000000000..743c950458
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00003.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00004.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00004.png
new file mode 100644
index 0000000000..5e2e72b97d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00004.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00005.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00005.png
new file mode 100644
index 0000000000..5e3f4087d0
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00005.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00006.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00006.png
new file mode 100644
index 0000000000..069d93edcd
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00006.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00007.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00007.png
new file mode 100644
index 0000000000..0c4a13be2a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00007.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00008.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00008.png
new file mode 100644
index 0000000000..3e1a8cd7f9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00008.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00009.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00009.png
new file mode 100644
index 0000000000..ba1d7bd275
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00009.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00010.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00010.png
new file mode 100644
index 0000000000..7a371cfcff
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00010.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00011.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00011.png
new file mode 100644
index 0000000000..eb7d2d5e4b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00011.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00012.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00012.png
new file mode 100644
index 0000000000..ec5dc4b49a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00012.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00013.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00013.png
new file mode 100644
index 0000000000..d19f752212
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00013.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00014.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00014.png
new file mode 100644
index 0000000000..3c5f8afd16
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00014.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00015.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00015.png
new file mode 100644
index 0000000000..d63cfc7e6c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00015.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00016.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00016.png
new file mode 100644
index 0000000000..a13bbea6da
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00016.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00017.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00017.png
new file mode 100644
index 0000000000..b80f8b07d8
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00017.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00018.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00018.png
new file mode 100644
index 0000000000..c9887df6a9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00018.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00019.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00019.png
new file mode 100644
index 0000000000..c8bc1850f8
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00019.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00020.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00020.png
new file mode 100644
index 0000000000..01f4d95b8d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00020.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00021.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00021.png
new file mode 100644
index 0000000000..d21124dcc0
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00021.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00022.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00022.png
new file mode 100644
index 0000000000..8c9a4d9e62
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00022.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00023.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00023.png
new file mode 100644
index 0000000000..587fdbb097
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00023.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00024.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00024.png
new file mode 100644
index 0000000000..1913a44095
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00024.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00025.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00025.png
new file mode 100644
index 0000000000..be85d5037a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00025.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00026.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00026.png
new file mode 100644
index 0000000000..40bd64d32a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00026.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00027.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00027.png
new file mode 100644
index 0000000000..ed4862fc94
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00027.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00028.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00028.png
new file mode 100644
index 0000000000..24f9605b4c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00028.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00029.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00029.png
new file mode 100644
index 0000000000..5886329415
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00029.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00030.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00030.png
new file mode 100644
index 0000000000..e5309cf535
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00030.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00031.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00031.png
new file mode 100644
index 0000000000..9d5034a29e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00031.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00032.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00032.png
new file mode 100644
index 0000000000..0d8177691a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00032.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00033.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00033.png
new file mode 100644
index 0000000000..7cbd992f9f
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00033.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00034.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00034.png
new file mode 100644
index 0000000000..617050c90d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00034.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00035.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00035.png
new file mode 100644
index 0000000000..e2222d7b54
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00035.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00036.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00036.png
new file mode 100644
index 0000000000..c189fbec50
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00036.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00037.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00037.png
new file mode 100644
index 0000000000..608da06dfb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00037.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00038.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00038.png
new file mode 100644
index 0000000000..6477259f2a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00038.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00039.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00039.png
new file mode 100644
index 0000000000..c5bfee922b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00039.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00040.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00040.png
new file mode 100644
index 0000000000..c5cca129d0
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00040.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00041.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00041.png
new file mode 100644
index 0000000000..eea120cbf6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00041.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00042.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00042.png
new file mode 100644
index 0000000000..a7ce8a753e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00042.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00043.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00043.png
new file mode 100644
index 0000000000..e552f4f5b0
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00043.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00044.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00044.png
new file mode 100644
index 0000000000..6beab6b438
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00044.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00045.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00045.png
new file mode 100644
index 0000000000..31fdcc6f45
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/success_00045.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_autopilot_bg_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_autopilot_bg_selector.xml
new file mode 100644
index 0000000000..8ba3d1a9d8
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_autopilot_bg_selector.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_autopilot_status_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_autopilot_status_bg.xml
new file mode 100644
index 0000000000..e323eca4c3
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_autopilot_status_bg.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_back_btn.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_back_btn.png
new file mode 100644
index 0000000000..35e13ff68c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_back_btn.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png
new file mode 100644
index 0000000000..75c26c3d71
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png
new file mode 100644
index 0000000000..8b4b579b56
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_slide_block.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_slide_block.png
new file mode 100644
index 0000000000..8ffd0abe52
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_base_slide_block.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png
new file mode 100644
index 0000000000..56525e7ed2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_dot_line.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_dot_line.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png
new file mode 100644
index 0000000000..0c73689e8e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png
new file mode 100644
index 0000000000..e9f6d32873
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png
new file mode 100644
index 0000000000..650c5132c2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png
new file mode 100644
index 0000000000..e300c1038c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png
new file mode 100644
index 0000000000..88b524d007
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png
new file mode 100644
index 0000000000..5e3b7c7a06
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png
new file mode 100644
index 0000000000..3f1a233b35
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png
new file mode 100644
index 0000000000..f26800ecbf
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png
new file mode 100644
index 0000000000..a75cc835fa
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png
new file mode 100644
index 0000000000..38584a971e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png
new file mode 100644
index 0000000000..539e106058
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_bg.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_bg.png
new file mode 100644
index 0000000000..ef5a5ea880
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_bg.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_bg_pressed.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_bg_pressed.png
new file mode 100644
index 0000000000..39194f8e55
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_bg_pressed.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png
new file mode 100644
index 0000000000..695515a366
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_failed.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_failed.png
new file mode 100644
index 0000000000..3347b2bfc2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_failed.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_loading.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_loading.png
new file mode 100644
index 0000000000..a71cf9a4f9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_loading.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_success.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_success.png
new file mode 100644
index 0000000000..dd7dc2d6b2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_ic_autopilot_success.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_light_green_nor.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_light_green_nor.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_light_red_nor.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_light_red_nor.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_lightyellow_nor.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_arrow_arrived.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_arrow_arrived.png
new file mode 100644
index 0000000000..36ef2e88d3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_arrow_arrived.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_arrow_un_arrive.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_arrow_un_arrive.png
new file mode 100644
index 0000000000..baa35592cb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_arrow_un_arrive.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_car.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_car.png
new file mode 100644
index 0000000000..dedaf093e9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_car.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_view_dir_end.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_view_dir_end.png
new file mode 100644
index 0000000000..a81336d4c2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_view_dir_end.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_view_dir_start.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_view_dir_start.png
new file mode 100644
index 0000000000..3cee184981
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_map_view_dir_start.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_masking.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_masking.png
new file mode 100644
index 0000000000..b33738106e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_masking.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png
new file mode 100644
index 0000000000..a83b7c9e74
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png
new file mode 100755
index 0000000000..1b96799531
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_icon.png
new file mode 100644
index 0000000000..bd4e6ccde4
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png
new file mode 100644
index 0000000000..7f758d5999
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png
new file mode 100644
index 0000000000..8311715c9a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png
new file mode 100644
index 0000000000..370b61de38
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png
new file mode 100644
index 0000000000..8311715c9a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_list_page.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_list_page.png
new file mode 100644
index 0000000000..2a814bbfa9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_order_list_page.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_out_btn.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_out_btn.png
new file mode 100644
index 0000000000..a3a771d686
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_out_btn.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_personal_btn.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_personal_btn.png
new file mode 100644
index 0000000000..0cb863cecb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_personal_btn.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png
new file mode 100644
index 0000000000..ffda52cbdb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_selected_btn.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_selected_btn.png
new file mode 100644
index 0000000000..2ff45e6bba
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_selected_btn.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_setting_btn_bg.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_setting_btn_bg.png
new file mode 100644
index 0000000000..a21f54cc53
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_speed_bg.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_speed_bg.png
new file mode 100644
index 0000000000..62942a7a42
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_speed_bg.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_speed_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_speed_selector.xml
new file mode 100644
index 0000000000..c87ede1476
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_speed_selector.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_switch_map_long.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_switch_map_long.png
new file mode 100755
index 0000000000..cf3e5a3778
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_switch_map_long.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_switch_map_medium.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_switch_map_medium.png
new file mode 100755
index 0000000000..bdc2725468
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_switch_map_medium.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_unselect_btn.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_unselect_btn.png
new file mode 100644
index 0000000000..6936596ebb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable-xhdpi/taxi_unselect_btn.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/ai_collect_selector_och.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/ai_collect_selector_och.xml
new file mode 100755
index 0000000000..a130b0115b
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/ai_collect_selector_och.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00000.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00000.png
new file mode 100644
index 0000000000..b71bd0d040
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00000.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00001.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00001.png
new file mode 100644
index 0000000000..c2ef6ba069
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00001.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00002.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00002.png
new file mode 100644
index 0000000000..3ddb02cd12
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00002.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00003.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00003.png
new file mode 100644
index 0000000000..191f809256
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00003.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00004.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00004.png
new file mode 100644
index 0000000000..c3a1dc0a27
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00004.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00005.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00005.png
new file mode 100644
index 0000000000..5c20c76fe1
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00005.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00006.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00006.png
new file mode 100644
index 0000000000..195edee2ff
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00006.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00007.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00007.png
new file mode 100644
index 0000000000..693630b658
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00007.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00008.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00008.png
new file mode 100644
index 0000000000..d4b8ceab85
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00008.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00009.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00009.png
new file mode 100644
index 0000000000..6e4706a238
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00009.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00010.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00010.png
new file mode 100644
index 0000000000..f8350ebc4e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00010.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00011.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00011.png
new file mode 100644
index 0000000000..33bb429f93
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00011.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00012.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00012.png
new file mode 100644
index 0000000000..ae5a6bf520
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00012.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00013.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00013.png
new file mode 100644
index 0000000000..aafcbc5122
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00013.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00014.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00014.png
new file mode 100644
index 0000000000..494f1e989b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00014.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00015.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00015.png
new file mode 100644
index 0000000000..d8ae01fa79
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00015.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00016.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00016.png
new file mode 100644
index 0000000000..fac9c3acce
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00016.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00017.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00017.png
new file mode 100644
index 0000000000..f2e7e29e0c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00017.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00018.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00018.png
new file mode 100644
index 0000000000..f01c9de1f1
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00018.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00019.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00019.png
new file mode 100644
index 0000000000..1e570e8da5
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00019.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00020.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00020.png
new file mode 100644
index 0000000000..86aeabc0cc
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00020.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00021.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00021.png
new file mode 100644
index 0000000000..b1f5bf7471
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00021.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00022.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00022.png
new file mode 100644
index 0000000000..72be9d9104
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00022.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00023.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00023.png
new file mode 100644
index 0000000000..1d5b705848
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00023.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00024.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00024.png
new file mode 100644
index 0000000000..367516ea95
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00024.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00025.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00025.png
new file mode 100644
index 0000000000..1d0353e635
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00025.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00026.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00026.png
new file mode 100644
index 0000000000..52945e2c17
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00026.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00027.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00027.png
new file mode 100644
index 0000000000..7a338bd064
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00027.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00028.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00028.png
new file mode 100644
index 0000000000..78dc703a46
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00028.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00029.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00029.png
new file mode 100644
index 0000000000..58a450edc1
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00029.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00030.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00030.png
new file mode 100644
index 0000000000..49d04f78be
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00030.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00031.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00031.png
new file mode 100644
index 0000000000..c473265692
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00031.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00032.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00032.png
new file mode 100644
index 0000000000..baf0ced1fa
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00032.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00033.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00033.png
new file mode 100644
index 0000000000..3b75e5db6b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00033.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00034.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00034.png
new file mode 100644
index 0000000000..ca66176618
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00034.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00035.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00035.png
new file mode 100644
index 0000000000..e858b504e2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00035.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00036.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00036.png
new file mode 100644
index 0000000000..75dfc4dd21
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00036.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00037.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00037.png
new file mode 100644
index 0000000000..bd6c98b3ff
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00037.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00038.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00038.png
new file mode 100644
index 0000000000..bb98916b1b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00038.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00039.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00039.png
new file mode 100644
index 0000000000..9e0c60b41b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00039.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00040.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00040.png
new file mode 100644
index 0000000000..fb59f9763c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00040.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00041.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00041.png
new file mode 100644
index 0000000000..26fb304d99
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00041.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00042.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00042.png
new file mode 100644
index 0000000000..9e86fa3b7b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00042.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00043.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00043.png
new file mode 100644
index 0000000000..9ac13d48c5
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00043.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00044.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00044.png
new file mode 100644
index 0000000000..cfc8198864
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00044.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00045.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00045.png
new file mode 100644
index 0000000000..352acbb165
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00045.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00046.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00046.png
new file mode 100644
index 0000000000..cc62f17b67
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00046.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00047.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00047.png
new file mode 100644
index 0000000000..e96c51d714
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00047.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00048.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00048.png
new file mode 100644
index 0000000000..a9f4a1ff5f
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00048.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00049.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00049.png
new file mode 100644
index 0000000000..22346bd12a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00049.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00050.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00050.png
new file mode 100644
index 0000000000..cb2512ad6a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00050.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00051.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00051.png
new file mode 100644
index 0000000000..dfb322b959
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00051.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00052.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00052.png
new file mode 100644
index 0000000000..9e8147e189
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00052.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00053.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00053.png
new file mode 100644
index 0000000000..3f261747a8
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00053.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00054.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00054.png
new file mode 100644
index 0000000000..d794d2f3bb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00054.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00055.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00055.png
new file mode 100644
index 0000000000..4d6dc4e91f
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00055.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00056.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00056.png
new file mode 100644
index 0000000000..473273f2a6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00056.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00057.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00057.png
new file mode 100644
index 0000000000..990b4b5503
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00057.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00058.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00058.png
new file mode 100644
index 0000000000..022e80d1d3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00058.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00059.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00059.png
new file mode 100644
index 0000000000..efb86c5569
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_00059.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00000.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00000.png
new file mode 100755
index 0000000000..22ba4eaf3b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00000.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00001.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00001.png
new file mode 100755
index 0000000000..ce611901b2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00001.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00002.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00002.png
new file mode 100755
index 0000000000..244c3e0517
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00002.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00003.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00003.png
new file mode 100755
index 0000000000..c51f8ac566
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00003.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00004.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00004.png
new file mode 100755
index 0000000000..ea16dfd223
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00004.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00005.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00005.png
new file mode 100755
index 0000000000..087438db35
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00005.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00006.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00006.png
new file mode 100755
index 0000000000..297b485e1b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00006.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00007.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00007.png
new file mode 100755
index 0000000000..c916ef48f9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00007.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00008.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00008.png
new file mode 100755
index 0000000000..d73767b6f5
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00008.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00009.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00009.png
new file mode 100755
index 0000000000..5f6ce673db
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00009.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00010.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00010.png
new file mode 100755
index 0000000000..690bf7df44
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00010.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00011.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00011.png
new file mode 100755
index 0000000000..8aa7b996b6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00011.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00012.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00012.png
new file mode 100755
index 0000000000..9ca8dbe784
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00012.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00013.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00013.png
new file mode 100755
index 0000000000..388db958a9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00013.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00014.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00014.png
new file mode 100755
index 0000000000..e97f052fb1
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00014.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00015.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00015.png
new file mode 100755
index 0000000000..08681b174c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00015.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00016.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00016.png
new file mode 100755
index 0000000000..feb9460dd5
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00016.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00017.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00017.png
new file mode 100755
index 0000000000..7a057db668
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00017.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00018.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00018.png
new file mode 100755
index 0000000000..27ff3cc600
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00018.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00019.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00019.png
new file mode 100755
index 0000000000..2c99dd5dc9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00019.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00020.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00020.png
new file mode 100755
index 0000000000..16cdb4bfab
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00020.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00021.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00021.png
new file mode 100755
index 0000000000..b784e1e4c6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00021.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00022.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00022.png
new file mode 100755
index 0000000000..627f4c9d06
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00022.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00023.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00023.png
new file mode 100755
index 0000000000..46da8e7b5f
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00023.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00024.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00024.png
new file mode 100755
index 0000000000..bcdd8963a8
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00024.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00025.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00025.png
new file mode 100755
index 0000000000..4950874cc5
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00025.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00026.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00026.png
new file mode 100755
index 0000000000..db24fdd89e
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00026.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00027.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00027.png
new file mode 100755
index 0000000000..b3b3358577
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00027.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00028.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00028.png
new file mode 100755
index 0000000000..fc79d79547
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00028.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00029.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00029.png
new file mode 100755
index 0000000000..584e0725f0
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00029.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00030.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00030.png
new file mode 100755
index 0000000000..e2027cfc7c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00030.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00031.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00031.png
new file mode 100755
index 0000000000..ff69d8e339
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00031.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00032.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00032.png
new file mode 100755
index 0000000000..c13fe25962
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00032.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00033.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00033.png
new file mode 100755
index 0000000000..02036b0e57
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00033.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00034.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00034.png
new file mode 100755
index 0000000000..e29d990854
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00034.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00035.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00035.png
new file mode 100755
index 0000000000..114d54e626
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00035.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00036.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00036.png
new file mode 100755
index 0000000000..e44f7aba6a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00036.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00037.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00037.png
new file mode 100755
index 0000000000..4a718e8b89
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00037.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00038.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00038.png
new file mode 100755
index 0000000000..43c70793e4
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00038.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00039.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00039.png
new file mode 100755
index 0000000000..5f909f1271
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00039.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00040.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00040.png
new file mode 100755
index 0000000000..de2b95946b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00040.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00041.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00041.png
new file mode 100755
index 0000000000..be65eb18bd
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00041.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00042.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00042.png
new file mode 100755
index 0000000000..b74820d9ab
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00042.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00043.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00043.png
new file mode 100755
index 0000000000..d751c5a8f6
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00043.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00044.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00044.png
new file mode 100755
index 0000000000..c8c3fe019a
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00044.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00045.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00045.png
new file mode 100755
index 0000000000..79b1f778b9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00045.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00046.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00046.png
new file mode 100755
index 0000000000..66cbb1a8bf
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00046.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00047.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00047.png
new file mode 100755
index 0000000000..e75559ba2b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00047.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00048.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00048.png
new file mode 100755
index 0000000000..0fa9cf95f3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00048.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00049.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00049.png
new file mode 100755
index 0000000000..7445350b68
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00049.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00050.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00050.png
new file mode 100755
index 0000000000..0e4c83c1b3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00050.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00051.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00051.png
new file mode 100755
index 0000000000..1b05dfb2c4
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00051.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00052.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00052.png
new file mode 100755
index 0000000000..64f3974bb3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00052.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00053.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00053.png
new file mode 100755
index 0000000000..9199dda1df
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00053.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00054.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00054.png
new file mode 100755
index 0000000000..fcc0fa446c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00054.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00055.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00055.png
new file mode 100755
index 0000000000..a0ac37b605
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00055.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00056.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00056.png
new file mode 100755
index 0000000000..4879de18eb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00056.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00057.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00057.png
new file mode 100755
index 0000000000..b60bc68114
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00057.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00058.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00058.png
new file mode 100755
index 0000000000..5dc3945a0c
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00058.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00059.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00059.png
new file mode 100755
index 0000000000..626c936ee2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/anim_flow_man_co_00059.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/bad_case_selector_och.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/bad_case_selector_och.xml
new file mode 100755
index 0000000000..fbc6c83a08
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/bad_case_selector_och.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/bg_taxi_traffic_light_background.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/bg_taxi_traffic_light_background.xml
new file mode 100644
index 0000000000..d93d55da56
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/bg_taxi_traffic_light_background.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/grab_failure_anmi_flow.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/grab_failure_anmi_flow.xml
new file mode 100644
index 0000000000..5a0649a2c5
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/grab_failure_anmi_flow.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/grab_success_anmi_flow.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/grab_success_anmi_flow.xml
new file mode 100644
index 0000000000..0447f8441d
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/grab_success_anmi_flow.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/img_taxi_operation_status_bg.9.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/img_taxi_operation_status_bg.9.png
new file mode 100644
index 0000000000..0af2b9db73
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/img_taxi_operation_status_bg.9.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_grab_order_bt.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_grab_order_bt.xml
new file mode 100644
index 0000000000..8659116cbc
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_grab_order_bt.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_operation_back.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_operation_back.xml
new file mode 100644
index 0000000000..ec1ff5c06d
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_operation_back.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_operation_out.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_operation_out.xml
new file mode 100644
index 0000000000..b505323904
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_operation_out.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_see_all_order.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_see_all_order.xml
new file mode 100644
index 0000000000..09e02705e4
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_see_all_order.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_taxi_selected_btn.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_taxi_selected_btn.xml
new file mode 100644
index 0000000000..ac27d621f3
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_taxi_selected_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_taxi_unselected_btn.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_taxi_unselected_btn.xml
new file mode 100644
index 0000000000..b29cd86d64
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/shape_size_taxi_unselected_btn.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg.xml
new file mode 100644
index 0000000000..e323eca4c3
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg_check.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg_check.png
new file mode 100644
index 0000000000..28857974b5
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg_check.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg_nor.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg_nor.png
new file mode 100644
index 0000000000..f7d4f92c4b
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_autopilot_status_bg_nor.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_base_autopilot_status_icon_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_base_autopilot_status_icon_selector.xml
new file mode 100644
index 0000000000..58aca03b29
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_base_autopilot_status_icon_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_cancel_button_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_cancel_button_bg.xml
new file mode 100644
index 0000000000..60eb252eab
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_cancel_button_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_checkbox_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_checkbox_selector.xml
new file mode 100644
index 0000000000..adc3fce148
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_checkbox_selector.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_grab_order_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_grab_order_bg.xml
new file mode 100644
index 0000000000..b59f68a14b
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_grab_order_bg.xml
@@ -0,0 +1,35 @@
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_grabing_order_btn_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_grabing_order_btn_bg.xml
new file mode 100644
index 0000000000..4e5a7642d4
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_grabing_order_btn_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_line_bg1.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_line_bg1.xml
new file mode 100644
index 0000000000..7fcd53f564
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_line_bg1.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_line_bg2.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_line_bg2.xml
new file mode 100644
index 0000000000..e0861580ee
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_line_bg2.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_arrow_arrived.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_arrow_arrived.png
new file mode 100644
index 0000000000..36ef2e88d3
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_arrow_arrived.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_arrow_un_arrive.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_arrow_un_arrive.png
new file mode 100644
index 0000000000..baa35592cb
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_arrow_un_arrive.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_car.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_car.png
new file mode 100644
index 0000000000..dedaf093e9
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_car.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_view_dir_end.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_view_dir_end.png
new file mode 100644
index 0000000000..a81336d4c2
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_view_dir_end.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_view_dir_start.png b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_view_dir_start.png
new file mode 100644
index 0000000000..3cee184981
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_map_view_dir_start.png differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_data_item_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_data_item_bg.xml
new file mode 100644
index 0000000000..d81e0cd834
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_data_item_bg.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_bg.xml
new file mode 100644
index 0000000000..f4769a12ce
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_bg.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_bg_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_bg_selector.xml
new file mode 100755
index 0000000000..15d6e4cec9
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_bg_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_select_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_select_bg.xml
new file mode 100644
index 0000000000..f617cd9fce
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_operation_status_select_bg.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_bg.xml
new file mode 100644
index 0000000000..f5efecaa11
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_bg.xml
@@ -0,0 +1,35 @@
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_status_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_status_bg.xml
new file mode 100644
index 0000000000..c0b127ce27
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_status_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml
new file mode 100644
index 0000000000..71d6873641
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_type_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_type_bg.xml
new file mode 100644
index 0000000000..3dc16fc865
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_type_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml
new file mode 100644
index 0000000000..f029529adc
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml
new file mode 100644
index 0000000000..7d8f9d8621
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_viewpager_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_viewpager_bg.xml
new file mode 100644
index 0000000000..3b20f9cbe8
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_order_viewpager_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_panel_bkg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_panel_bkg.xml
new file mode 100644
index 0000000000..323940f31b
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_panel_bkg.xml
@@ -0,0 +1,25 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_panel_distance_bkg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_panel_distance_bkg.xml
new file mode 100644
index 0000000000..c2046ded94
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_panel_distance_bkg.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_setting_tip_red_cir_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_setting_tip_red_cir_bg.xml
new file mode 100644
index 0000000000..2c07ab2a64
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_setting_tip_red_cir_bg.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_show_orders_bg.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_show_orders_bg.xml
new file mode 100644
index 0000000000..e5981a10d7
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_show_orders_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_speed_selector.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_speed_selector.xml
new file mode 100644
index 0000000000..c87ede1476
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/drawable/taxi_speed_selector.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/auto_or_manual_btn_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/auto_or_manual_btn_view.xml
new file mode 100644
index 0000000000..42d12d25ad
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/auto_or_manual_btn_view.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_amap_navi_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_amap_navi_view.xml
new file mode 100644
index 0000000000..b6d0282e06
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_amap_navi_view.xml
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml
new file mode 100644
index 0000000000..7eee534d3c
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_base_fragment.xml
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_being_order.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_being_order.xml
new file mode 100644
index 0000000000..0001414e85
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_being_order.xml
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_map_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_map_view.xml
new file mode 100644
index 0000000000..07a25f406b
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_map_view.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_no_data_common_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_no_data_common_view.xml
new file mode 100644
index 0000000000..9ccbe981ef
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_no_data_common_view.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_data_item_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_data_item_view.xml
new file mode 100644
index 0000000000..30f972ca38
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_data_item_view.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_data_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_data_view.xml
new file mode 100644
index 0000000000..04c3b385de
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_data_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_tab_item_custom.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_tab_item_custom.xml
new file mode 100644
index 0000000000..7db8cad308
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_operation_tab_item_custom.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_cancel_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_cancel_view.xml
new file mode 100644
index 0000000000..0be1796d6d
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_cancel_view.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_checkbox_item.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_checkbox_item.xml
new file mode 100644
index 0000000000..6cc1730044
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_checkbox_item.xml
@@ -0,0 +1,10 @@
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_grab_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_grab_view.xml
new file mode 100644
index 0000000000..96f9445fe9
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_grab_view.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_list_boot_no_data_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_list_boot_no_data_view.xml
new file mode 100644
index 0000000000..47f9446ca7
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_list_boot_no_data_view.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_reserve_item.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_reserve_item.xml
new file mode 100644
index 0000000000..1890c0baa1
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_order_reserve_item.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_day_item.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_day_item.xml
new file mode 100644
index 0000000000..c5e9947df0
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_day_item.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_item.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_item.xml
new file mode 100644
index 0000000000..b9d6794ace
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_item.xml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_view.xml
new file mode 100644
index 0000000000..8d04684ac7
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_orders_list_view.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_panel.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_panel.xml
new file mode 100644
index 0000000000..56a2f1ecc5
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_panel.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_reserve_orders.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_reserve_orders.xml
new file mode 100644
index 0000000000..bf4905e7f0
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_reserve_orders.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_rotting_navi_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_rotting_navi_view.xml
new file mode 100644
index 0000000000..2afe4b0610
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_rotting_navi_view.xml
@@ -0,0 +1,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_server_orders_panel.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_server_orders_panel.xml
new file mode 100644
index 0000000000..b52c347f82
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_server_orders_panel.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_tab_item_custom.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_tab_item_custom.xml
new file mode 100644
index 0000000000..859589df62
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_tab_item_custom.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_traffic_light_view.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_traffic_light_view.xml
new file mode 100644
index 0000000000..5156e30f3c
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/layout/taxi_traffic_light_view.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/raw/end_marker.nt3d b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/end_marker.nt3d
new file mode 100644
index 0000000000..be6057c547
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/end_marker.nt3d differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/raw/star_marker.nt3d b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/star_marker.nt3d
new file mode 100644
index 0000000000..c6e546fc31
Binary files /dev/null and b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/star_marker.nt3d differ
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order.json b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order.json
new file mode 100644
index 0000000000..e8d0819d3f
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order.json
@@ -0,0 +1,22 @@
+{
+ "drivingRoutes": [
+ {
+ "lat": 40.197234,
+ "lon": 116.74143,
+ "siteId": "1.0",
+ "siteName": "万集东门站"
+ },
+ {
+ "lat": 40.1953113732,
+ "lon": 116.729134342,
+ "siteId": "2.0",
+ "siteName": "市政府前街18号"
+ }
+ ],
+ "endStation": "市政府前街18号",
+ "orderDispatchType": 1,
+ "orderNo": "CZ20210430000005",
+ "orderType": 9,
+ "startStation": "万集东门站",
+ "travelDistance": 0.6
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order_detail.json b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order_detail.json
new file mode 100644
index 0000000000..7d62fcacb7
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order_detail.json
@@ -0,0 +1,39 @@
+{
+ "code": 0,
+ "msg": "",
+ "detailMsg": "",
+ "result": {
+ "_id": "5352c1d2c9d84ab3ab9ecf1e47e13bdd",
+ "orderNo": "CZ20210427000016",
+ "orderType": 9,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 10000,
+ "startStation": "0409第一站",
+ "startStationCoordinate": [
+ 116.7389159039,
+ 40.1992312592
+ ],
+ "endStationId": 21,
+ "endStation": "第二十一站",
+ "endStationCoordinate": [
+ 116.737866,
+ 40.19646
+ ],
+ "orderDispatchType": 1,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "Apr 27, 2021 8:55:44 PM",
+ "arrivedStartStationTime": "",
+ "arrivedEndStationTime": "",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "Apr 27, 2021 8:55:44 PM",
+ "updateTime": "Apr 27, 2021 8:55:56 PM",
+ "personNum": 1,
+ "travelDistance": 0.3,
+ "vehicleColour": "黑色",
+ "lastBrandName": "",
+ "headImgUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83ep4YkeZqjiazTK87NQtYp6KMYvAdJcxNpxyJ2gibeNNheH1HFaJdX4hB15eIR3zZdGMWNanKzIn460w/132"
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order_state_update.json b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order_state_update.json
new file mode 100644
index 0000000000..9ee3d17f02
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/raw/taxi_order_state_update.json
@@ -0,0 +1,10 @@
+{
+ "endStation": "市政府前街18号",
+ "endStationId": "2.0",
+ "orderDispatchType": 7,
+ "orderNo": "CZ20210430000005",
+ "orderType": 9,
+ "startStation": "万集东门站",
+ "startStationId": "1.0",
+ "travelDistance": 0.6
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/values/colors.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..3aa7cfc710
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/values/colors.xml
@@ -0,0 +1,28 @@
+
+
+ #FFFFFF
+ #707DBE
+ #8198E8
+ #8198E8
+ #8198E8
+ #FFFFFF
+ #FF2B6EFF
+ #FF3B4577
+ #80000000
+
+ #FFFFFF
+ #99FFFFFF
+ #FF52BBFF
+
+ #4DFFFFFF
+
+ #FFFFA28B
+ #FFDA1100
+ #FF60FFD3
+ #FF006D43
+ #FFFFE198
+ #FFFF9B00
+
+ #657EE2
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/values/dimens.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..089ad7c16f
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/values/dimens.xml
@@ -0,0 +1,122 @@
+
+
+
+ 40dp
+ 40dp
+ 46dp
+ 24dp
+
+ 530dp
+ 492dp
+
+ 20dp
+ 20dp
+ 70dp
+ 130dp
+ 93dp
+ 150dp
+ 70dp
+
+ 24dp
+ 460dp
+ 140dp
+
+ 102dp
+ 102dp
+
+ 83dp
+
+ 40dp
+ 466dp
+ 414dp
+
+
+
+ 46dp
+ 13dp
+ 12dp
+ 350dp
+
+
+ 560dp
+ 910dp
+
+
+ 460dp
+ 30dp
+
+
+ 15dp
+ 25dp
+ 25dp
+ 32dp
+
+
+ 1dp
+ 20dp
+ 20dp
+ 20dp
+
+
+ 140dp
+ 20dp
+ 41dp
+ 17dp
+ 41dp
+
+
+ 42dp
+ 32dp
+ 32dp
+ 84dp
+ 3dp
+
+
+ 20dp
+ 32dp
+ 36dp
+
+
+ 17dp
+ 31.5dp
+
+
+ 800dp
+ 222dp
+ 1120dp
+ 162dp
+ 446dp
+ 400dp
+ 160dp
+ 432dp
+ 64dp
+ 616dp
+ 132dp
+ 300dp
+ 240dp
+ 400dp
+ 160dp
+ 280dp
+ 120dp
+
+ 220dp
+ 420dp
+ 220dp
+
+ 16dp
+
+ 225dp
+ 154dp
+ 60dp
+ 40dp
+ 23dp
+ 210dp
+ 120dp
+ 15dp
+ 17dp
+ 154dp
+ 130dp
+ 60dp
+
+ 34dp
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/values/strings.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..d6c8d2edd2
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/values/strings.xml
@@ -0,0 +1,52 @@
+
+
+ 确认上车,行程开始
+ 到达站点,乘客已下车
+ 预计里程
+ 3.2 km
+ 请携带好随身物品,注意侧后\n方来车,感谢体验蘑菇智行自\n动驾驶车!
+ 即将到达目的地,请您携带好随身物品,安全下车。
+ 送乘客至目的地
+ 等待乘客上车
+ 乘客已上车
+ 已到达乘客下车点
+ 订单已完成
+ 请选择取消订单的理由
+ 出现异常情况时,可选择原因无责取消订单:
+ 确认
+ 开始服务
+ 自驾模式
+ 安全模式
+ 跳过乘客验证
+ 等待乘客开始行程
+ 请等待乘客启动自动驾驶,或您自行启动
+ 服务完成
+ 结束行程
+
+ 提示
+ 您确认要结束行程吗
+ 确认
+ 取消
+
+
+ 自动驾驶状态为0不可用
+ 司机端未确认可以开启自动驾驶
+
+ 网络异常,请稍后重试
+ 请求出现异常,请稍后重试
+
+
+
+ 乘客验证成功,请开始行程
+ 已到达上车站点,等待乘客上车
+ 前往乘客上车地点
+ 订单已取消
+ 车辆已停稳,请携带好随身物品,下车请注意安全
+ 您好,本次行程共%1$s%2$s,预计需要%3$d分钟,我们即将出发。出于安全考虑,建议您尽量不要与安全员交谈,后排落座,并系好安全带
+ 即将到达目的地,请拿好随身物品,准备下车
+ 您好,我们已到达目的地,本次体验结束。车辆停稳,请带好随身物品,谨防遗漏。感谢您的乘坐
+
+ 自动驾驶状态中,不可结束路线
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-unmanned/src/main/res/values/styles.xml b/OCH/mogo-och-taxi-unmanned/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..4dc523b396
--- /dev/null
+++ b/OCH/mogo-och-taxi-unmanned/src/main/res/values/styles.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file