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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +