diff --git a/OCH/README.md b/OCH/README.md
new file mode 100644
index 0000000000..56d1764db2
--- /dev/null
+++ b/OCH/README.md
@@ -0,0 +1,7 @@
+# 网约车(Online Car Hailing)
+
+## 小巴
+
+## 出租车
+
+## 无实现
\ No newline at end of file
diff --git a/foudations/mogo-base-websocket-sdk/.gitignore b/OCH/mogo-och-bus/.gitignore
similarity index 100%
rename from foudations/mogo-base-websocket-sdk/.gitignore
rename to OCH/mogo-och-bus/.gitignore
diff --git a/modules/mogo-module-adas/build.gradle b/OCH/mogo-och-bus/build.gradle
similarity index 57%
rename from modules/mogo-module-adas/build.gradle
rename to OCH/mogo-och-bus/build.gradle
index a020fac9b5..c4d26e2410 100644
--- a/modules/mogo-module-adas/build.gradle
+++ b/OCH/mogo-och-bus/build.gradle
@@ -1,10 +1,8 @@
-plugins {
- id 'com.android.library'
- id 'kotlin-android'
- id 'kotlin-android-extensions'
- id 'kotlin-kapt'
- id 'com.alibaba.arouter'
-}
+apply plugin: 'com.android.library'
+apply plugin: 'com.alibaba.arouter'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
// buildToolsVersion rootProject.ext.android.buildToolsVersion
@@ -14,21 +12,14 @@ android {
versionCode Integer.valueOf(VERSION_CODE)
versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- consumerProguardFiles 'consumer-rules.pro'
- //ARouter apt 参数
- kapt {
- useBuildCache = false
- arguments {
- arg("AROUTER_MODULE_NAME", project.getName())
- }
- }
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments = [AROUTER_MODULE_NAME: project.getName()]
+ }
}
}
@@ -36,44 +27,44 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
+
+ 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
+ annotationProcessor rootProject.ext.dependencies.aroutercompiler
implementation rootProject.ext.dependencies.androidxconstraintlayout
+
+ implementation rootProject.ext.dependencies.rxjava
implementation rootProject.ext.dependencies.rxandroid
- implementation rootProject.ext.dependencies.arouter
- kapt rootProject.ext.dependencies.aroutercompiler
-
- // 现有的ADAS的通讯SDK,需要将里面的东西融合到我们项目中
- compileOnly rootProject.ext.dependencies.adasapi
-
- api rootProject.ext.dependencies.adasHigh
- implementation rootProject.ext.dependencies.mogoami
-
- annotationProcessor rootProject.ext.dependencies.aroutercompiler
+ implementation rootProject.ext.dependencies.androidxrecyclerview
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
- api rootProject.ext.dependencies.mogoutils
- api rootProject.ext.dependencies.mogocommons
- api rootProject.ext.dependencies.mogoserviceapi
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogocommons
implementation rootProject.ext.dependencies.modulecommon
-
implementation rootProject.ext.dependencies.mogo_core_data
- implementation rootProject.ext.dependencies.mogo_core_utils
- implementation rootProject.ext.dependencies.mogo_core_function_api
implementation rootProject.ext.dependencies.mogo_core_function_call
- } else {
- api project(":foudations:mogo-utils")
- api project(":foudations:mogo-commons")
- api project(':services:mogo-service-api')
+ }else {
+ implementation project(":core:mogo-core-utils")
+ implementation project(":foudations:mogo-commons")
implementation project(':modules:mogo-module-common')
-
implementation project(':core:mogo-core-data')
- implementation project(':core:mogo-core-utils')
- implementation project(':core:mogo-core-function-api')
implementation project(':core:mogo-core-function-call')
}
}
-apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/libraries/map-autonavi/consumer-rules.pro b/OCH/mogo-och-bus/consumer-rules.pro
similarity index 100%
rename from libraries/map-autonavi/consumer-rules.pro
rename to OCH/mogo-och-bus/consumer-rules.pro
diff --git a/OCH/mogo-och-bus/gradle.properties b/OCH/mogo-och-bus/gradle.properties
new file mode 100644
index 0000000000..dd5c44ee62
--- /dev/null
+++ b/OCH/mogo-och-bus/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.och
+POM_ARTIFACT_ID=och-bus
+VERSION_CODE=1
diff --git a/OCH/mogo-och-bus/libs/pinyin4j-2.5.1.jar b/OCH/mogo-och-bus/libs/pinyin4j-2.5.1.jar
new file mode 100644
index 0000000000..8446c53fce
Binary files /dev/null and b/OCH/mogo-och-bus/libs/pinyin4j-2.5.1.jar differ
diff --git a/foudations/mogo-base-websocket-sdk/proguard-rules.pro b/OCH/mogo-och-bus/proguard-rules.pro
similarity index 100%
rename from foudations/mogo-base-websocket-sdk/proguard-rules.pro
rename to OCH/mogo-och-bus/proguard-rules.pro
diff --git a/modules/mogo-module-adas/src/main/AndroidManifest.xml b/OCH/mogo-och-bus/src/main/AndroidManifest.xml
similarity index 55%
rename from modules/mogo-module-adas/src/main/AndroidManifest.xml
rename to OCH/mogo-och-bus/src/main/AndroidManifest.xml
index e6c2b1f20c..8f40dcf1a5 100644
--- a/modules/mogo-module-adas/src/main/AndroidManifest.xml
+++ b/OCH/mogo-och-bus/src/main/AndroidManifest.xml
@@ -1,12 +1,12 @@
-
-
+ package="com.mogo.och.bus">
-
+
+
-
+
+
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/IMogoOCH.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/IMogoOCH.java
new file mode 100644
index 0000000000..073f7fcc29
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/IMogoOCH.java
@@ -0,0 +1,24 @@
+package com.mogo.och.bus;
+
+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-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java
new file mode 100644
index 0000000000..4154e95528
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java
@@ -0,0 +1,111 @@
+package com.mogo.och.bus;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.bus.constant.OchBusConst;
+import com.mogo.och.bus.fragment.OchBusFragment;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * 网约车小巴业务实现入口
+ *
+ * @author tongchenfei
+ */
+@Route(path = OchBusConst.PATH)
+public class OchBusProvider implements IMogoOCH {
+ private static final String TAG = "OchBusProvider";
+ private OchBusFragment busFragment;
+ private int containerId;
+ private FragmentActivity activity;
+
+ /**
+ * 进入鹰眼模式,设置手势缩放地图失效
+ */
+ private void stepIntoVrMode(){
+ Logger.d( TAG, "进入vr模式" );
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getMapServiceApi()
+ .getMapUIController()
+ .openVrMode(false);
+ }
+
+ @Override
+ public void init(Context context) {
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus", StatusDescriptor.VR_MODE, statusChangedListener);
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("OchBus", StatusDescriptor.TOP_VIEW, statusChangedListener);
+ }
+
+ private void showFragment() {
+ if (busFragment == null) {
+ Logger.d(TAG, "准备add fragment======");
+ busFragment = new OchBusFragment();
+ activity.getSupportFragmentManager().beginTransaction().add(containerId, busFragment).commitAllowingStateLoss();
+ return;
+ }
+ Logger.d(TAG, "准备show fragment");
+ activity.getSupportFragmentManager().beginTransaction().show(busFragment).commitAllowingStateLoss();
+ }
+
+ private void hideFragment() {
+ if (busFragment != null) {
+ Logger.d(TAG, "准备hide fragment");
+ activity.getSupportFragmentManager().beginTransaction().hide(busFragment).commitAllowingStateLoss();
+ }
+
+ }
+
+ private final IMogoStatusChangedListener statusChangedListener = (descriptor, isTrue) -> {
+ if (descriptor == StatusDescriptor.VR_MODE) {
+ // 进入vr模式默认显示网约车小巴fragment
+ if (isTrue) {
+ showFragment();
+ } else {
+ hideFragment();
+ }
+ } else if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() && descriptor == StatusDescriptor.TOP_VIEW) {
+ // topView进行展示时推出网约车界面,但是不隐藏整个fragment
+ if (busFragment != null && isTrue) {
+ busFragment.hideOchBus();
+ }
+ }
+ };
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
+
+ this.containerId = integer;
+ this.activity = fragmentActivity;
+
+ UiThreadHandler.postDelayed(this::stepIntoVrMode, 5_000L );
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java
new file mode 100644
index 0000000000..abaf285126
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/adapter/OchBusStationAdapter.java
@@ -0,0 +1,127 @@
+package com.mogo.och.bus.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.mogo.och.bus.R;
+import com.mogo.och.bus.bean.OchBusStation;
+import com.mogo.och.bus.constant.OchBusConst;
+import com.mogo.och.bus.view.VerticalDashLineView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Station Panel 中的车站列表adapter
+ *
+ * @author tongchenfei
+ */
+public class OchBusStationAdapter extends RecyclerView.Adapter {
+ private final Context context;
+ private final List stationList = new ArrayList<>();
+ private int currentStation;
+
+ public OchBusStationAdapter(Context context) {
+ this.context = context;
+ }
+
+ public void refreshStationList(List stationList) {
+ this.stationList.clear();
+ this.stationList.addAll(stationList);
+ for (int i = 0; i < stationList.size(); i++) {
+ OchBusStation station = stationList.get(i);
+ if (station.getDrivingStatus() == OchBusConst.STATION_STATUS_ARRIVING || station.getDrivingStatus() == OchBusConst.STATION_STATUS_STOPPED ) {
+ currentStation = i;
+ break;
+ }
+ }
+ notifyDataSetChanged();
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_och_bus_station, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+// Logger.d("OchBusStationAdapter", "position: " + position + " currPos: " + currentStation + " station: " + stationList.get(position));
+ holder.tvStationName.setText(stationList.get(position).getName());
+ if (position == currentStation) {
+ if (currentStation == 0) {
+ // 在起始点
+ holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_arrived_station_name_text_color));
+ holder.ivIcon.setImageResource(R.drawable.bus_icon_arrived_station);
+ holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
+ } else {
+ holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_current_station_name_text_color));
+ holder.ivIcon.setImageResource(R.drawable.bus_icon_arriving_station);
+ holder.vDashTop.setGradient(context.getResources().getColor(R.color.bus_arriving_start_dash_color), context.getResources().getColor(R.color.bus_arriving_end_dash_color));
+ holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
+ }
+ } else if (position < currentStation) {
+ // 驶过
+ holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_arrived_station_name_text_color));
+ holder.ivIcon.setImageResource(R.drawable.bus_icon_arrived_station);
+ if (position == currentStation - 1) {
+ holder.vDashBottom.setGradient(context.getResources().getColor(R.color.bus_leaving_start_dash_color), context.getResources().getColor(R.color.bus_leaving_end_dash_color));
+ holder.vDashTop.setColor(context.getResources().getColor(R.color.bus_arrived_dash_color));
+ } else {
+ holder.vDashTop.setColor(context.getResources().getColor(R.color.bus_arrived_dash_color));
+ holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_arrived_dash_color));
+ }
+ } else {
+ holder.tvStationName.setTextColor(context.getResources().getColor(R.color.bus_not_arrive_station_name_text_color));
+ holder.ivIcon.setImageResource(R.drawable.bus_icon_not_arrive_station);
+ holder.vDashTop.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
+ holder.vDashBottom.setColor(context.getResources().getColor(R.color.bus_not_arrive_dash_color));
+ }
+
+ if (position == 0) {
+ holder.tvStationNotice.setText("起点");
+ holder.tvStationNotice.setVisibility(View.VISIBLE);
+ holder.vDashTop.setVisibility(View.GONE);
+ holder.vDashBottom.setVisibility(View.VISIBLE);
+ } else if (position == getItemCount() - 1) {
+ holder.tvStationNotice.setText("终点");
+ holder.tvStationNotice.setVisibility(View.VISIBLE);
+ holder.vDashTop.setVisibility(View.VISIBLE);
+ holder.vDashBottom.setVisibility(View.GONE);
+ } else {
+ holder.tvStationNotice.setVisibility(View.GONE);
+ holder.vDashTop.setVisibility(View.VISIBLE);
+ holder.vDashBottom.setVisibility(View.VISIBLE);
+
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return stationList.size();
+ }
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ ImageView ivIcon;
+ TextView tvStationName;
+ TextView tvStationNotice;
+ VerticalDashLineView vDashBottom, vDashTop;
+
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ivIcon = itemView.findViewById(R.id.module_mogo_och_bus_station_icon);
+ tvStationName = itemView.findViewById(R.id.module_mogo_och_bus_station_name);
+ tvStationNotice = itemView.findViewById(R.id.module_mogo_och_bus_station_notice);
+ vDashTop = itemView.findViewById(R.id.module_mogo_och_bus_station_top_dash);
+ vDashBottom = itemView.findViewById(R.id.module_mogo_och_bus_station_bottom_dash);
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java
new file mode 100644
index 0000000000..c85a2d0b82
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/CarHeartbeatReqBean.java
@@ -0,0 +1,26 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.och.bus.constant.OchBusConst;
+
+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) (OchBusConst.LOOP_PERIOD_60S / 1000);
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusRequest.java
new file mode 100644
index 0000000000..fcc762be44
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusRequest.java
@@ -0,0 +1,43 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+class OchBusOperationStatusRequest {
+
+ private String sn;
+ private double lat;
+ private double lon;
+ public OchBusOperationStatusRequest(double lon, double lat) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lat = lat;
+ this.lon = lon;
+ }
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusResponse.java
new file mode 100644
index 0000000000..fd60cc3b4d
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOperationStatusResponse.java
@@ -0,0 +1,20 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态返回参数
+ */
+public class OchBusOperationStatusResponse extends BaseData {
+
+ public Result data;
+
+ public static class Result {
+
+ public int serviceStatus;//0:已收车,1:已出车
+
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrder.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrder.java
new file mode 100644
index 0000000000..1e509dfccf
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrder.java
@@ -0,0 +1,86 @@
+package com.mogo.och.bus.bean;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 小巴订单
+ */
+public class OchBusOrder {
+
+ /**
+ * orderId number
+ * passengerPhone string 下单用户电话
+ * startStationId integer 开始站点
+ * startStationName string
+ * endStationId integer 结束站点
+ * endStationName string
+ */
+
+ private long orderId;
+ private String passengerPhone;
+ private int startStationId;//乘客上车点
+ private String startStationName;
+ private String endStationName;
+ private int endStationId;//乘客下车点
+
+ public void setOrderId(long orderId) {
+ this.orderId = orderId;
+ }
+
+ public void setPassengerPhone(String passengerPhone) {
+ this.passengerPhone = passengerPhone;
+ }
+
+ public void setStartStationId(int startStationId) {
+ this.startStationId = startStationId;
+ }
+
+ public void setStartStationName(String startStationName) {
+ this.startStationName = startStationName;
+ }
+
+ public void setEndStationName(String endStationName) {
+ this.endStationName = endStationName;
+ }
+
+ public void setEndStationId(int endStationId) {
+ this.endStationId = endStationId;
+ }
+
+ public long getOrderId() {
+ return orderId;
+ }
+
+ public String getPassengerPhone() {
+ return passengerPhone;
+ }
+
+ public int getStartStationId() {
+ return startStationId;
+ }
+
+ public String getStartStationName() {
+ return startStationName;
+ }
+
+ public String getEndStationName() {
+ return endStationName;
+ }
+
+ public int getEndStationId() {
+ return endStationId;
+ }
+
+ @Override
+ public String toString() {
+ return "OchBusOrder{" +
+ "orderId=" + orderId +
+ ", passengerPhone='" + passengerPhone + '\'' +
+ ", startStationId=" + startStationId +
+ ", startStationName='" + startStationName + '\'' +
+ ", endStationName='" + endStationName + '\'' +
+ ", endStationId=" + endStationId +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrdersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrdersResponse.java
new file mode 100644
index 0000000000..252858472b
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusOrdersResponse.java
@@ -0,0 +1,23 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/19
+ */
+public class OchBusOrdersResponse extends BaseData {
+ public Result data;
+ public static class Result{
+ public List orders;
+ }
+
+ @Override
+ public String toString() {
+ return "OchBusOrdersResponse{" +
+ "data=" + data +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusQueryLineStationsRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusQueryLineStationsRequest.java
new file mode 100644
index 0000000000..fdd0d7461e
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusQueryLineStationsRequest.java
@@ -0,0 +1,63 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 根据车机行驶线路站点信息
+ */
+class OchBusQueryLineStationsRequest {
+
+ private String sn;
+ private double lat;
+ private double lon;
+ private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus
+ // 0 - 关闭、1 - 启动
+// public String status;
+ public OchBusQueryLineStationsRequest(double lon, double lat,boolean markDrivingStatus) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lat = lat;
+ this.lon = lon;
+ this.markDrivingStatus = markDrivingStatus;
+ }
+
+ public boolean isMarkDrivingStatus() {
+ return markDrivingStatus;
+ }
+
+ public void setMarkDrivingStatus(boolean markDrivingStatus) {
+ this.markDrivingStatus = markDrivingStatus;
+ }
+
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+ // public OchBusOperationStatusRequest shutdown() {
+// status = "0";
+// return this;
+// }
+//
+// public OchBusOperationStatusRequest launch() {
+// status = "1";
+// return this;
+// }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusResetDrivingLineRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusResetDrivingLineRequest.java
new file mode 100644
index 0000000000..4faf1980a8
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusResetDrivingLineRequest.java
@@ -0,0 +1,18 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/18
+ */
+public class OchBusResetDrivingLineRequest {
+ public String sn;
+ public int lineId; //切换到的线路id
+
+ public OchBusResetDrivingLineRequest(int lineId) {
+ sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lineId = lineId;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java
new file mode 100644
index 0000000000..0b7c31b096
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResponse.java
@@ -0,0 +1,27 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * 网约车小巴路线接口请求响应结果
+ *
+ * @author tongchenfei
+ */
+public class OchBusRoutesResponse extends BaseData {
+ private OchBusRoutesResult data;
+
+ public OchBusRoutesResult getResult() {
+ return data;
+ }
+
+ public void setResult(OchBusRoutesResult data) {
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return "OchBusRoutesResponse{" +
+ "data=" + data +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java
new file mode 100644
index 0000000000..c55f12b3db
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusRoutesResult.java
@@ -0,0 +1,45 @@
+package com.mogo.och.bus.bean;
+
+import java.util.List;
+
+/**
+ * 网约车小巴路线接口返回接口数据封装
+ *
+ * @author tongchenfei
+ */
+public class OchBusRoutesResult {
+ private List sites;
+ private int lineId;
+ private String name;
+ private int lineType; //线路类型,0:环形
+ private String description;
+ private int status;
+
+ public int getLineId() {
+ return lineId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getSites() {
+ return sites;
+ }
+
+ public void setSite(List site) {
+ this.sites = sites;
+ }
+
+ @Override
+ public String toString() {
+ return "OchBusRoutesResult{" +
+ "sites=" + sites +
+ ", lineId=" + lineId +
+ ", name='" + name + '\'' +
+ ", lineType=" + lineType +
+ ", description='" + description + '\'' +
+ ", status=" + status +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java
new file mode 100644
index 0000000000..e70d321a40
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusStation.java
@@ -0,0 +1,152 @@
+package com.mogo.och.bus.bean;
+
+/**
+ * 单个网约车小巴车站信息
+ *
+ * @author tongchenfei
+ */
+public class OchBusStation {
+// private int lineId;
+// private int siteId;
+// private String siteName;
+// private String cityCode;
+// private String areaCode;
+// private String areaName;
+// private double lat;
+// private double lon;
+// private String siteDesc;
+// private int siteState;
+// private int isCurrentSite;// @see OchBusConst 是否是当前站 1:是 2:下一站 0:普通站
+// private int siteColor;
+// private String peoples;
+// private int ifStop; // 是否需要停靠、1需要、0不需要
+
+
+ private String name;
+ private String description;
+ private String cityCode;
+ private double lon; //高精坐标
+ private double lat; //高精坐标
+ private int businessType; //站点类型,9:taxi,10:bus
+ private int status;
+ private int siteId;
+ private int seq;
+ private int drivingStatus;//行驶信息,0初始值;1已经过;2当前站;3未到站
+ private int ifStop = 1; // 是否需要停靠、1需要、0不需要 // TODO: 2021/10/19 原来站点里有设计是否需要停靠字段,现设计暂无,默认都需要停靠
+ private boolean leaving;
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setCityCode(String cityCode) {
+ this.cityCode = cityCode;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setBusinessType(int businessType) {
+ this.businessType = businessType;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public void setSiteId(int siteId) {
+ this.siteId = siteId;
+ }
+
+ public void setSeq(int seq) {
+ this.seq = seq;
+ }
+
+ public void setDrivingStatus(int drivingStatus) {
+ this.drivingStatus = drivingStatus;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getCityCode() {
+ return cityCode;
+ }
+
+
+ public int getBusinessType() {
+ return businessType;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public int getSiteId() {
+ return siteId;
+ }
+
+ public int getSeq() {
+ return seq;
+ }
+
+ public int getDrivingStatus() {
+ return drivingStatus;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public void setIfStop(int ifStop) {
+ this.ifStop = ifStop;
+ }
+
+ public int getIfStop() {
+ return ifStop;
+ }
+
+ public void setLeaving(boolean leaving) {
+ this.leaving = leaving;
+ }
+
+ public boolean isLeaving() {
+ return leaving;
+ }
+
+ @Override
+ public String toString() {
+ return "OchBusStation{" +
+ "name='" + name + '\'' +
+ ", description='" + description + '\'' +
+ ", cityCode='" + cityCode + '\'' +
+ ", lon=" + lon +
+ ", lat=" + lat +
+ ", businessType=" + businessType +
+ ", status=" + status +
+ ", siteId=" + siteId +
+ ", seq=" + seq +
+ ", drivingStatus=" + drivingStatus +
+ ", ifStop=" + ifStop +
+ ", leaving=" + leaving +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusUpdateSiteStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusUpdateSiteStatusRequest.java
new file mode 100644
index 0000000000..ed5923c905
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/OchBusUpdateSiteStatusRequest.java
@@ -0,0 +1,27 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+public class OchBusUpdateSiteStatusRequest {
+
+ public String sn;
+ public int seq;//站点序号
+ public int siteId;//站点id
+ public double lon;
+ public double lat;
+
+ public OchBusUpdateSiteStatusRequest(int seq, int siteId, double lon, double lat) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.seq = seq;
+ this.siteId = siteId;
+ this.lon = lon;
+ this.lat = lat;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersRequest.java
new file mode 100644
index 0000000000..9c50552d11
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersRequest.java
@@ -0,0 +1,37 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * 查询下车乘客请求参数
+ *
+ * @author tongchenfei
+ */
+public class QueryLeaveAwayPassengersRequest {
+ private String sn;
+ private int seq; //站点在线路中的序号
+ private int siteId; //站点id
+
+ public QueryLeaveAwayPassengersRequest(int seq, int siteId) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.seq = seq;
+ this.siteId = siteId;
+ }
+
+ public void setSeq(int seq) {
+ this.seq = seq;
+ }
+
+ public void setSiteId(int siteId) {
+ this.siteId = siteId;
+ }
+
+ public int getSeq() {
+ return seq;
+ }
+
+ public int getSiteId() {
+ return siteId;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java
new file mode 100644
index 0000000000..1a38e7e2eb
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryLeaveAwayPassengersResponse.java
@@ -0,0 +1,60 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/26
+ *
+ * 到站查询下车乘客
+ */
+class QueryLeaveAwayPassengersResponse extends BaseData {
+
+ public Result data;
+
+ public static class Result {
+
+ public List< LeaveAwayPassenger > orders;
+ }
+
+ public static class LeaveAwayPassenger {
+ /**
+ * orderId: 订单id
+ * orderStatus: 订单状态
+ * orderType:订单类型:0及时,1预约
+ * bookingTime:预计用车时间
+ * businessType:订单运营类型 9:taxi,10:bus
+ * startSiteId: 起点站点id
+ * userPhone: 乘客联系方式
+ * startSitePoint:开始站点坐标
+ * startSiteAddr:开始地址
+ * endSiteId:结束站点id
+ * endSitePoint:结束站点坐标
+ * carNumber:车牌号
+ * createTime: 创建时间
+ * startTime:开始时间
+ * startSiteGcjPoint:高精坐标
+ * endSiteGcjPoint:
+ */
+//todo 目前是需要乘客电话来通知乘客下车 目前后台没有乘客信息userPhone
+ public long orderId;
+ public int orderStatus;
+ public int orderType;
+ public long bookingTime;
+ public int businessType;
+ public int startSiteId;
+ public String passengerPhone;
+ public List startSitePoint;
+ public String startSiteAddr;
+ public int endSiteId;
+ public List endSitePoint;
+ public String carNumber;
+ public long createTime;
+ public long startTime;
+ public List< Double > startSiteGcjPoint;
+ public List< Double > endSiteGcjPoint;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryOchBusOperationStatusRequest.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryOchBusOperationStatusRequest.java
new file mode 100644
index 0000000000..ceaf72c7f8
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/bean/QueryOchBusOperationStatusRequest.java
@@ -0,0 +1,21 @@
+package com.mogo.och.bus.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+class QueryOchBusOperationStatusRequest {
+
+ public String sn;
+
+
+ public QueryOchBusOperationStatusRequest() {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/CarOperationStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/CarOperationStatusCallback.java
new file mode 100644
index 0000000000..0e9cd198da
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/CarOperationStatusCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.bus.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface CarOperationStatusCallback {
+ void changeOperationStatus(boolean changeStatus);
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IOCHBusControllerStatusCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IOCHBusControllerStatusCallback.java
new file mode 100644
index 0000000000..1e7bd30279
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/IOCHBusControllerStatusCallback.java
@@ -0,0 +1,17 @@
+package com.mogo.och.bus.callback;
+
+import android.location.Location;
+
+/**
+ * Created on 2021/9/10
+ *
+ * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
+ */
+public interface IOCHBusControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(Location location);
+ //开始开启自动驾驶
+ void startOpenAutopilot();
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/RefreshBusStationsCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/RefreshBusStationsCallback.java
new file mode 100644
index 0000000000..bc59a7ba79
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/RefreshBusStationsCallback.java
@@ -0,0 +1,13 @@
+package com.mogo.och.bus.callback;
+
+import com.mogo.och.bus.bean.OchBusStation;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface RefreshBusStationsCallback {
+ void refreshBusStations(List stationList, int currentStation, int nextStation,boolean isArrived);
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/SlidePannelHideCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/SlidePannelHideCallback.java
new file mode 100644
index 0000000000..11dd2f0d36
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/callback/SlidePannelHideCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.bus.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface SlidePannelHideCallback {
+ void hideSlidePanel();
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt
new file mode 100644
index 0000000000..a85ea7ae3f
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/OchBusConst.kt
@@ -0,0 +1,49 @@
+package com.mogo.och.bus.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class OchBusConst {
+ companion object {
+
+ private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
+ private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
+ private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
+
+ @JvmStatic
+ fun getBaseUrl(): String {
+ return when (DebugConfig.getNetMode()) {
+ DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
+ DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
+ DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
+ else -> BASE_URL_OCH_RELEASE
+ }
+ }
+
+ // OCH arouter 路由path
+ const val PATH = "/och/api"
+
+ // 测试用的广播
+ const val BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY = "sceneType"
+ // 无状态
+ const val STATION_STATUS_IDLE = 0
+ // 已过站(历史站)
+ const val STATION_STATUS_LEAVING = 1
+ // 到站(当前站)
+ const val STATION_STATUS_STOPPED = 2
+ // 未到站(未到站)
+ const val STATION_STATUS_ARRIVING = 3
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ //起点UUID
+ const val BUS_START_MAP_MAKER = "bus_start_map_maker";
+ //终点UUID
+ const val BUS_END_MAP_MAKER = "bus_end_map_maker";
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java
new file mode 100644
index 0000000000..5423cd0db1
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java
@@ -0,0 +1,451 @@
+package com.mogo.och.bus.fragment;
+
+import android.animation.ObjectAnimator;
+import android.content.Intent;
+import android.graphics.Color;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.Group;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.uicontroller.VisualAngleMode;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.constants.DataTypes;
+import com.mogo.module.common.view.OnPreventFastClickListener;
+import com.mogo.och.bus.R;
+import com.mogo.och.bus.view.BusArcView;
+import com.mogo.och.bus.view.SlidePanelView;
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+public abstract class BaseOchBusTabFragment> extends MvpFragment implements IMogoMapListener {
+
+ private static final String TAG = "BaseOchFragment";
+
+ protected SlidePanelView slidePanelView;
+ private RelativeLayout ctvAutopilotStatus;
+ private ImageView ctvAutopilotStatusIv;
+ private TextView ctvAutopilotStatusTv;
+ protected TextView tvOperationStatus;
+ protected LinearLayout mSettingBtn;
+ protected ImageView mBadcaseBtn;
+ public boolean isOperationStatus;//false-收车,true-出车
+ private FrameLayout flStationPanelContainer;
+ private Group groupTestPanel;
+ private FrameLayout flSpeed;
+ private BusArcView mouduleArc;
+
+ public static final String TYPE_ENTRANCE = "entrance";
+
+ //远景和中景的切换
+ private ImageView mSwitchMapModeImage;
+ private FrameLayout mSwitchMapModeLayout;
+ private TextView mSwitchText;
+
+ private ObjectAnimator autopilotLoadingAnimator;
+ /**
+ * 滑动按钮触发的事件
+ */
+ private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> {
+ // 此处做一个代理,处理一下共有情况
+ if (getSlidePanelOnEndListener() != null) {
+ getSlidePanelOnEndListener().moveToEnd();
+ }
+ };
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.bus_base_fragment;
+ }
+
+ private View panelView;
+
+ @Override
+ protected void initViews() {
+ groupTestPanel = findViewById(R.id.groupTestPanel);
+ slidePanelView = findViewById(R.id.module_mogo_och_slide_panel);
+ ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
+ ctvAutopilotStatusIv = findViewById(R.id.bus_autopilot_btn_iv);
+ ctvAutopilotStatusTv = findViewById(R.id.bus_autopolot_btn_tv);
+ flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
+
+ tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
+
+ flSpeed = (FrameLayout) findViewById(R.id.fl_speed);
+ mouduleArc = (BusArcView) findViewById(R.id.bus_arc);
+
+ panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
+ slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener);
+
+ mSwitchMapModeLayout = findViewById(R.id.bus_switch_model_layout);
+ mSwitchMapModeImage = findViewById(R.id.bus_switch_model_icon);
+ mSwitchText = findViewById(R.id.bus_switch_model_text);
+
+ mSwitchMapModeLayout.setOnClickListener(new OnPreventFastClickListener(){
+
+ @Override
+ public void onClickImpl(View v) {
+ //切换地图的远近视图
+ if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isLongSight()) {
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).visibleAllMarkers();
+ MogoApisHandler.getInstance().getApis().getMapServiceApi()
+ .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ mSwitchText.setText(R.string.bus_map_model_normal);
+ } else if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isMediumSight()) {
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS);
+ MogoApisHandler.getInstance().getApis().getMapServiceApi()
+ .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ mSwitchText.setText(R.string.bus_map_model_faster);
+ }
+ }
+ });
+
+ if (DebugConfig.isDebug()) {
+ mouduleArc.setLongClickable(true);
+ mouduleArc.setOnLongClickListener(v -> {
+ Log.d(TAG,"长按显示状态工具栏");
+ Intent intent = new Intent();
+ intent.putExtra("oper", 52);
+ MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent);
+ return true;
+ });
+ }
+ initListener();
+ ctvAutopilotStatus.setOnClickListener(v -> {
+ // 如果能自动驾驶,就自动驾驶,不能就提示
+// if (MogoApisHandler.getInstance().getApis().getAdasControllerApi().getAutopilotStatus() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
+// return;
+// }
+// if (autopilotLoadingAnimator != null){
+// TipToast.shortTip("正在开启自动驾驶。。。");
+// return;
+// }
+ restartAutopilot();
+ });
+
+ // debug下调用测试面板
+ if (DebugConfig.isDebug()) {
+ ctvAutopilotStatus.setOnLongClickListener(v -> {
+ if (groupTestPanel.getVisibility() == View.VISIBLE) {
+ groupTestPanel.setVisibility(View.GONE);
+ } else {
+ groupTestPanel.setVisibility(View.VISIBLE);
+ }
+ return true;
+ });
+ }
+ onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState(),false);
+ // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
+ findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用")
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
+ );
+
+ // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
+ findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, "能使用")
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
+ );
+
+ // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
+ findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, "Running")
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
+ );
+
+ // 模拟 自动驾驶网约车回调数据
+ findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi().mockOchStatus(-1, "Arrived")
+ debugArrivedStation()
+ );
+
+ tvOperationStatus.setOnClickListener(view -> {
+ onChangeOperationStatus();
+ });
+
+ mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout);
+ mSettingBtn.setOnClickListener(v -> {
+ // TODO: 2021/12/9
+ CallerHmiManager.INSTANCE.showToolsView();
+ });
+
+ // mBadcaseBtn的visible显示逻辑在showBadcaseEntrance内处理
+ mBadcaseBtn = findViewById(R.id.module_mogo_och_badcase_iv);
+ CallerHmiManager.INSTANCE.registerBadCaseCallback(
+ () -> { // onShow()
+ return mBadcaseBtn; },
+ () -> { // onHide()
+ return null; });
+ }
+
+ /**
+ * 测试到站
+ */
+ protected abstract void debugArrivedStation();
+
+ private void initListener() {
+ MogoApisHandler.getInstance().getApis().getRegisterCenterApi().registerMogoMapListener(TYPE_ENTRANCE, this);
+ }
+
+ protected void onChangeOperationStatus() {
+
+ }
+
+
+ /**
+ * 展示滑动按钮
+ *
+ * @param text 指定的文字
+ */
+ public void showSlidePanle(String text) {
+ if (isOperationStatus) {
+ getActivity().runOnUiThread(() -> {
+ slidePanelView.setText(text);
+ slidePanelView.setVisibility(View.VISIBLE);
+ });
+ }
+ }
+
+ /**
+ * 隐藏滑动按钮
+ */
+ public void hideSlidePanel() {
+ getActivity().runOnUiThread(() -> {
+ slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ public void showNotice(String notice) {
+ getActivity().runOnUiThread(() -> {
+ AIAssist.getInstance(getContext()).speakTTSVoice(notice);
+ });
+ }
+
+ /**
+ * 改变自动驾驶状态
+ * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
+ */
+ public void onAutopilotStatusChanged(int autopilotStatus,boolean isAnimateRunning) {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setChecked(isInAutopilot);
+ changeAutopilotBtnView(autopilotStatus,isAnimateRunning);
+ });
+ }
+
+ private void changeAutopilotBtnView(int autopilotStatus,boolean isAnimateRunning) {
+ Logger.d( TAG, "onStateChangeChangeAutopilotBtnView: " + autopilotStatus +"isAnimateRunning = "+isAnimateRunning);
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+ == autopilotStatus) {//0不可用
+ if (isAnimateRunning){
+ stopAutopilotAnimation();
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_wrong_autopilot_icon);
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_failure_tv));
+ ctvAutopilotStatus.setFocusableInTouchMode(false);
+ ctvAutopilotStatus.setSelected(false);
+ }
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_disable));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_disable_autopilot_icon);
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+// ctvAutopilotStatus.setPressed(false);
+ }
+ },1000);
+
+ }else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE
+ == autopilotStatus){//1可用
+ if (isAnimateRunning){
+ return;
+ }
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+// ctvAutopilotStatus.setPressed(true);
+ }else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
+ == autopilotStatus){//2 running
+ if (isAnimateRunning){
+ stopAutopilotAnimation();
+ }
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_right_autopilot_icon);
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_success_tv));
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(false);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_ic_autopilot);
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatus.setSelected(true);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+// ctvAutopilotStatus.setPressed(false);
+ }
+ },1000);
+ }
+ }
+
+ /**
+ * 隐藏【自动驾驶】按钮
+ */
+ public void hideAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setVisibility(View.GONE);
+// slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ /**
+ * 展示【自动驾驶】按钮
+ */
+ public void showAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+ ctvAutopilotStatus.setVisibility(View.VISIBLE);
+ if (isOperationStatus) {
+ slidePanelView.setVisibility(View.VISIBLE);
+ } else {
+ slidePanelView.setVisibility(View.GONE);
+ }
+ });
+ }
+
+ public void hidPanel(){
+ getActivity().runOnUiThread(()->{
+ flStationPanelContainer.setVisibility(View.GONE);
+ });
+ }
+
+ public void showPanel(){
+ getActivity().runOnUiThread(()->{
+ flStationPanelContainer.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public View getPanelView() {
+ return panelView;
+ }
+
+ public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
+ return null;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 重新开启自动驾驶
+ */
+ public abstract void restartAutopilot();
+
+ /**
+ * 模拟自动驾驶返回状态
+ * @param status
+ */
+ public abstract void debugAutoPilotStatus(int status);
+
+ /**
+ * 开启自动驾驶中间动画
+ */
+ public void startAutopilotAnimation() {
+// if (MogoApisHandler.getInstance().getApis().getAdasControllerApi().getAutopilotStatus() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.bus_loading_autopilot_tv));
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal));
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+ ctvAutopilotStatusIv.setImageResource(R.drawable.bus_loading_autopilot_icon);
+ if (autopilotLoadingAnimator == null){
+ autopilotLoadingAnimator = ObjectAnimator.ofFloat(ctvAutopilotStatusIv,"rotation", 0f,360f);
+ autopilotLoadingAnimator.setInterpolator(new LinearInterpolator());
+ autopilotLoadingAnimator.setRepeatCount(-1);//无限循环
+ autopilotLoadingAnimator.setDuration(1000);//设置持续时间
+ }
+ autopilotLoadingAnimator.start();//动画开始
+ // autopilotLoadingAnimator.setStartDelay(500);//循环开始延迟
+
+// }
+ }
+ /**
+ * 停止自动驾驶中间动画
+ */
+ public void stopAutopilotAnimation() {
+ if (autopilotLoadingAnimator != null){
+ autopilotLoadingAnimator.end();
+ ctvAutopilotStatusIv.clearAnimation();
+ autopilotLoadingAnimator = null;
+ }
+ }
+
+ /**
+ * 迈速表实时更新
+ * @param newSpeed
+ */
+ public void updateSpeedView(float newSpeed){
+ int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
+ mouduleArc.setArcColor(Color.parseColor(speed > 60 ? "#DB3137" : "#3E77F6"));
+ mouduleArc.setValues(speed);
+ flSpeed.setBackgroundResource(speed > 60 ? R.drawable.bus_yi_biao_pan_bg_speeding : R.drawable.bus_yi_biao_pan_bg_nor);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ MogoApisHandler.getInstance().getApis().getRegisterCenterApi().unregisterMogoMapListener(TYPE_ENTRANCE);
+ }
+
+ @Override
+ public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
+ if (visualAngleMode.isMediumSight()) {
+ mSwitchMapModeLayout.setVisibility(View.VISIBLE);
+ } else if (visualAngleMode.isLongSight()) {
+ mSwitchMapModeLayout.setVisibility(View.VISIBLE);
+ } else if (visualAngleMode.isCloseSight()) {
+ mSwitchMapModeLayout.setVisibility(View.GONE);
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java
new file mode 100644
index 0000000000..83491d952f
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/OchBusFragment.java
@@ -0,0 +1,331 @@
+package com.mogo.och.bus.fragment;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.map.marker.MogoMarkerOptions;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.bus.R;
+import com.mogo.och.bus.bean.OchBusStation;
+import com.mogo.och.bus.constant.OchBusConst;
+import com.mogo.och.bus.presenter.OchBusPresenter;
+import com.mogo.och.bus.view.SlidePanelView;
+
+import java.util.List;
+
+
+/**
+ * 网约车小巴界面
+ *
+ * @author tongchenfei
+ */
+public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBusPresenter > implements SlidePanelView.OnSlidePanelMoveToEndListener {
+ private static final String TAG = "OchBusFragment";
+
+ private TextView mCurrentStationName;
+ private TextView mStartStationFlag;
+ private TextView mNextStationName;
+ private TextView mEndStationFlag;
+ private TextView mDebugArrive;
+
+ private View mBus;
+
+ private OchBusStation startStation = null;
+ private OchBusStation endStation = null;
+
+ @Override
+ public String getTagName() {
+ return "OchBusFragment";
+ }
+
+ @Override
+ protected void initViews() {
+ super.initViews();
+ mBus = findViewById( R.id.module_och_bus_tag );
+ mCurrentStationName = findViewById( R.id.module_och_bus_current_station );
+ mStartStationFlag = findViewById( R.id.module_och_bus_start_station_tag );
+ mNextStationName = findViewById( R.id.module_och_bus_order_end_station );
+ mEndStationFlag = findViewById( R.id.module_och_bus_end_station_tag );
+
+ mDebugArrive = findViewById(R.id.module_och_bus_arrive_station);
+
+ if ( DebugConfig.isDebug() ) {
+ mBus.setOnClickListener( view -> {
+ TipToast.shortTip( "重置了车站状态" );
+ mPresenter.queryBusRoutes();
+ } );
+
+ mBus.setOnLongClickListener( view -> {
+ getActivity().finish();
+ return true;
+ } );
+
+ }
+ mCurrentStationName.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+// if (DebugConfig.isDebug()){
+ if (mDebugArrive.getVisibility() == View.VISIBLE){
+ mDebugArrive.setVisibility(View.GONE);
+ }else {
+ mDebugArrive.setVisibility(View.VISIBLE);
+ }
+// }
+ return false;
+ }
+ });
+
+ findViewById(R.id.module_och_bus_arrive_station).setOnClickListener(view ->{ //到站
+ mPresenter.onAutopilotArriveAtStation(null);
+ });
+
+ Logger.d( TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+ // 初始化的时候设置 UI 按钮状态
+ switch ( CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() ) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
+ hideAutopilotBiz();
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
+ showAutopilotBiz();
+ onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE ,false);
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
+ showAutopilotBiz();
+ onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ,false);
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ protected void debugArrivedStation() {
+ mPresenter.onAutopilotArriveAtStation(null);
+ }
+
+ @NonNull
+ @Override
+ protected OchBusPresenter createPresenter() {
+ return new OchBusPresenter( this );
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+
+ /**
+ * 根据站点列表信息刷新车站面板,滑块面板
+ *
+ * @param stationList 车站列表信息
+ * @param currentStation 当前站点
+ * @param nextStation 下个站点
+ */
+ public void refreshBusStations( List< OchBusStation > stationList, int currentStation, int nextStation ,boolean isArrived) {
+ if ( getActivity() == null ) {
+ return;
+ }
+ getActivity().runOnUiThread( () -> {
+ if ( stationList == null ) {
+ // 获取小巴数据失败
+ return;
+ }
+
+ // 渲染小巴路线数据
+ renderCurrentStationStatus( stationList, currentStation, nextStation ,isArrived);
+ } );
+ }
+
+ /**
+ * 重新刷新站点信息
+ */
+ private void renderCurrentStationStatus( List< OchBusStation > stationList, int currentStation, int nextStation ,boolean isArrived) {
+ Log.d("MapMaker= ","currentStation="+currentStation+",nextStation="+nextStation+"isArrived="+isArrived);
+ String currentStationName = null;
+ String nextStationName = null;
+ int startStationFlagVisibility = View.INVISIBLE;
+ int endStationFlagVisibility = View.INVISIBLE;
+
+ boolean isArriveEndStation = false;
+ boolean isArriveAtStation = false;
+ boolean isArriveAtStartStation = false;
+
+ // 获取当前站点的名称
+ currentStationName = stationList.get( currentStation ).getName();
+
+ startStation = stationList.get(0);
+ endStation = stationList.get(stationList.size() - 1);
+
+ // 是否到达起点
+ if ( currentStation == 0 ) {
+ startStationFlagVisibility = View.VISIBLE;
+ isArriveAtStartStation = true;
+ mStartStationFlag.setText( "始" );
+// Log.d("MapMaker= ","起点=");
+ setOrRemoveMapMaker(true, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat(),startStation.getLon(),R.drawable.icon_station_start_end);
+ setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end);
+ } else if ( currentStation > 0 && currentStation < stationList.size() - 1 ) {// 是否到达站点
+// Log.d("MapMaker= ","中间=");
+ isArriveAtStation = true;
+ setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat(),startStation.getLon(),R.drawable.icon_station_start_end);
+ setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end);
+ } else if ( currentStation == stationList.size() - 1 ) {// 是否到达终点
+// Log.d("MapMaker= ","终点=");
+ isArriveEndStation = true;
+ nextStationName = "--";
+ mStartStationFlag.setText( "终" );
+ startStationFlagVisibility = View.VISIBLE;
+ endStationFlagVisibility = View.INVISIBLE;
+ setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat(),startStation.getLon(),R.drawable.icon_station_start_end);
+ if (isArrived){
+ setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end);
+ }else {
+ setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat(),endStation.getLon(),R.drawable.icon_station_start_end);
+ }
+ }
+
+ // 获取下一站点名称
+ if ( nextStation > currentStation && nextStation <= stationList.size() - 1 ) {
+ nextStationName = stationList.get( nextStation ).getName();
+ }
+
+ // 是否到达终点
+ if ( nextStation == stationList.size() - 1 ) {
+ endStationFlagVisibility = View.VISIBLE;
+ }
+
+ // 重置滑动按钮文字
+ if ( isArriveEndStation ) {
+ showSlidePanle( "单程结束" );
+ } else if ( isArriveAtStartStation ) {
+ showSlidePanle( "滑动出发" );
+ } else if ( isArriveAtStation ) {
+ showSlidePanle( "滑动出发" );
+ }
+
+ mCurrentStationName.setText( currentStationName );
+ mNextStationName.setText( nextStationName );
+ mStartStationFlag.setVisibility( startStationFlagVisibility );
+ mEndStationFlag.setVisibility( endStationFlagVisibility );
+ }
+
+ public void hideOchBus() {
+// tvNotice.setVisibility(View.GONE);
+ }
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.fragment_och_bus;
+ }
+
+ @Override
+ public void restartAutopilot() {
+ mPresenter.restartAutopilot();
+ }
+
+ @Override
+ public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
+ return this;
+ }
+
+ @Override
+ public void moveToEnd() {
+ // 开启自动驾驶到下一站
+ mPresenter.autoDriveToNextStation(false);
+ }
+
+ /**
+ * 设置自动驾驶可用状态
+ */
+ public void onAutopilotEnableChange( boolean isEnable ) {
+ if ( isEnable ) {
+ showAutopilotBiz();
+ } else {
+ hideAutopilotBiz();
+ }
+ }
+
+ @Override
+ protected void onChangeOperationStatus() {
+ super.onChangeOperationStatus();
+ mPresenter.onChangeOperationStatus();
+ }
+
+ /**
+ * 修改经营状态
+ * @param launch true-收车,false-出车
+ */
+ public void changeOperationStatus( boolean launch ) {
+ isOperationStatus = launch;
+ if ( launch ) {
+ // 出车的时候重制站点状态
+ mPresenter.queryBusRoutes();
+ tvOperationStatus.setText( "收车" );
+ showSlidePanle("滑动出发");
+ showPanel();
+ } else {
+ AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
+ tvOperationStatus.setText("出车");
+ hideSlidePanel();
+ hidPanel();
+
+ //移除起点终点
+ if (null != startStation){
+ setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat()
+ ,startStation.getLon(),R.drawable.icon_station_start_end);
+ }
+ if (null != endStation){
+ setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat()
+ ,endStation.getLon(),R.drawable.icon_station_start_end);
+ }
+ }
+ }
+
+ /**
+ * VR模式切换
+ * @param isVRMode
+ */
+ public void onVRModeChanged(boolean isVRMode) {
+ if (mRootView != null) {
+ mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
+ }
+ }
+ /**
+ * 绘制地图起点终点
+ * @param isAdd
+ * @param uuid
+ * @param iconId
+ */
+ private void setOrRemoveMapMaker(boolean isAdd, String uuid,double lat,double longi, int iconId){
+ if (isAdd){
+ Log.d("setMapMaker= ",uuid+"=latitude="+lat+",longitude="+longi);
+ MogoMarkerOptions options = new MogoMarkerOptions();
+ options.anchorColor("#000000");//不设置报错,暂时随便设置个
+ options.setGps(true);//使用wgs 必须设置true
+ options.scale(0.15f);
+ Bitmap bitmap = BitmapFactory.decodeResource(AbsMogoApplication.getApp().getResources(), iconId, null);
+ options.icon(bitmap);
+ options.latitude(lat);
+ options.longitude(longi);
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).addMarker(uuid, options);
+ }else {
+ Log.d("RemoveMapMaker=",uuid+"=latitude="+lat+",longitude="+longi);
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(uuid);
+ }
+ }
+ public void debugAutoPilotStatus(int status){
+ mPresenter.debugAutoPilotStatus(status);
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java
new file mode 100644
index 0000000000..8c0ab8181a
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/IOchBusApiService.java
@@ -0,0 +1,126 @@
+package com.mogo.och.bus.net;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.och.bus.bean.CarHeartbeatReqBean;
+import com.mogo.och.bus.bean.OchBusOperationStatusRequest;
+import com.mogo.och.bus.bean.OchBusQueryLineStationsRequest;
+import com.mogo.och.bus.bean.OchBusOperationStatusResponse;
+import com.mogo.och.bus.bean.OchBusOrdersResponse;
+import com.mogo.och.bus.bean.OchBusRoutesResponse;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.bus.bean.OchBusResetDrivingLineRequest;
+import com.mogo.och.bus.bean.OchBusUpdateSiteStatusRequest;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * 小巴车相关接口
+ *
+ * @author tongchenfei
+ *
+ * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072
+ */
+public interface IOchBusApiService {
+
+ /**
+ * 根据车机坐标获取所在区域全部站点信息
+ *
+ * @param request 请求参数
+ * @return 接口返回数据
+ */
+ @Headers( {"Content-Type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
+// @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
+ Observable< OchBusRoutesResponse > querySiteByCoordinate(@Body OchBusQueryLineStationsRequest request);
+
+ /**
+ * 重置巴士路线: 点击小巴车tab 或者出车后会使用
+ *
+ * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的
+ * @return 返回值是重置后的车站列表
+ */
+ @Headers( {"Content-Type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/bus/api/drivingLine/reset" )
+// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" )
+ Observable< OchBusRoutesResponse > debugResetStationStatus(@Body OchBusResetDrivingLineRequest request);
+
+ /**
+ * 离站,通知服务器
+ * @param request
+ * @return
+ */
+ @Headers({"Content-Type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/bus/api/driving/away")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away")
+ Observable< OchBusRoutesResponse > leaveStation(@Body OchBusUpdateSiteStatusRequest request);
+
+ /**
+ * 到站 更新到站信息
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/bus/api/driving/attachSite")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite")
+ Observable< BaseData > arriveSiteStation(@Body OchBusUpdateSiteStatusRequest request);
+
+
+ /**
+ * 到站查询下车乘客
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
+ Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Body QueryLeaveAwayPassengersRequest request);
+
+ /**
+ * 出车
+ * @param request
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST("/autopilot-car-hailing/bus/api/startTakeOrder")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder")
+ Observable startTakeOrder(@Body OchBusOperationStatusRequest request);
+
+ /**
+ * 收车
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/bus/api/stopTakeOrder")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder")
+ Observable stopTakeOrder(@Body OchBusOperationStatusRequest request);
+
+ /**
+ * 查询小巴出车/收车状态
+ * @param sn
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @GET("/autopilot-car-hailing/bus/api/takeOrderStatus/query")
+// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query")
+ Observable queryOperationStatus(@Query("sn") String sn);
+
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @GET("/autopilot-car-hailing/bus/api/servicingOrders/query")
+// @GET("/mock/268/autopilot-car-hailing/bus/api/servicingOrders/query")
+ Observable queryBusOrders(@Query("sn") String sn);
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
+ Observable runCarHeartbeat(@Body CarHeartbeatReqBean data);
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java
new file mode 100644
index 0000000000..b5de475b95
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHBusServiceManager.java
@@ -0,0 +1,238 @@
+package com.mogo.och.bus.net;
+
+import android.content.Context;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.network.RequestOptions;
+import com.mogo.eagle.core.network.SubscribeImpl;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.bus.bean.CarHeartbeatReqBean;
+import com.mogo.och.bus.bean.OchBusOperationStatusRequest;
+import com.mogo.och.bus.bean.OchBusOperationStatusResponse;
+import com.mogo.och.bus.bean.OchBusOrdersResponse;
+import com.mogo.och.bus.bean.OchBusQueryLineStationsRequest;
+import com.mogo.och.bus.bean.OchBusResetDrivingLineRequest;
+import com.mogo.och.bus.bean.OchBusRoutesResponse;
+import com.mogo.och.bus.bean.OchBusUpdateSiteStatusRequest;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersRequest;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.bus.constant.OchBusConst;
+import com.mogo.och.bus.presenter.OchBusOrderModel;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/20
+ */
+public class OCHBusServiceManager {
+ private static final String TAG = OCHBusServiceManager.class.getSimpleName();
+ private IOchBusApiService mService;
+
+ private String baseUrl = OchBusConst.getBaseUrl();
+ private static final class SingletonHolder {
+ private static final OCHBusServiceManager INSTANCE = new OCHBusServiceManager();
+ }
+ public static OCHBusServiceManager getInstance(){
+ return SingletonHolder.INSTANCE;
+ }
+ private OCHBusServiceManager(){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+
+ /**
+ * 查询小巴车线路
+ * @param context
+ * @param callback
+ */
+ public void queryBusRoutes(Context context,OCHServiceCallback callback) {
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ //获取当前高德坐标
+
+ mService.querySiteByCoordinate( new OchBusQueryLineStationsRequest(OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude,true))
+ .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
+ .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate"));
+ }
+
+ /**
+ * 重置线路站点
+ * @param context
+ * @param lineId
+ * @param callback
+ */
+ public void debugResetStationStatus(Context context,int lineId,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.debugResetStationStatus(new OchBusResetDrivingLineRequest(lineId))
+ .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"debugResetStationStatus"));
+ }
+
+ /**
+ * 离站上报
+ * @param context
+ * @param seq
+ * @param siteId
+ * @param callback
+ */
+ public void leaveStation(Context context,int seq,int siteId,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.leaveStation(new OchBusUpdateSiteStatusRequest(seq,siteId,OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
+ }
+
+ /**
+ * 到站更新站点状态
+ * @param context
+ * @param seq
+ * @param siteId
+ * @param callback
+ */
+ public void arriveSiteStation(Context context,int seq,int siteId,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.arriveSiteStation(new OchBusUpdateSiteStatusRequest(seq,siteId,OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"leaveStation"));
+ }
+
+ /**
+ * 查询下车乘客
+ * @param context
+ * @param seq
+ * @param siteId
+ * @param callback
+ */
+ public void queryStationLeaveAwayPassengers(Context context,int seq,int siteId,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.queryStationLeaveAwayPassengers( new QueryLeaveAwayPassengersRequest(seq,siteId))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers"));
+ }
+
+ /**
+ * 收车
+ * @param context
+ * @param callback
+ */
+ public void stopTakeOrder(Context context,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.stopTakeOrder(new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder"));
+ }
+
+ /**
+ * 出车
+ * @param context
+ * @param callback
+ */
+ public void startTakeOrder(Context context,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.startTakeOrder(new OchBusOperationStatusRequest(OchBusOrderModel.getInstance().mLongitude,OchBusOrderModel.getInstance().mLatitude))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"startTakeOrder"));
+ }
+
+ /**
+ * 查询出车/收车状态
+ * @param context
+ * @param callback
+ */
+ public void queryOperationStatus(Context context,OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus"));
+ }
+
+ /**
+ * 查询小巴车订单
+ * @param context
+ * @param callback
+ */
+ public void queryBusOrders(Context context, OCHServiceCallback callback){
+ if (mService == null){
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IOchBusApiService.class, baseUrl);
+ }
+ mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"queryBusOrders"));
+ }
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param context
+ * @param lon
+ * @param lat
+ * @param callback
+ */
+ public void runCarHeartbeat(Context context, double lon, double lat,
+ OCHServiceCallback callback) {
+ if ( mService == null ) {
+ mService = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(IOchBusApiService.class, baseUrl);
+ }
+ mService.runCarHeartbeat(new CarHeartbeatReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
+ }
+
+ private SubscribeImpl getSubscribeImpl(Context context, OCHServiceCallback callback, String apiName){
+ return new SubscribeImpl(RequestOptions.create(context)){
+ @Override
+ public void onSuccess(T o) {
+ super.onSuccess(o);
+ Logger.e(TAG,apiName + ": onSuccess() " + o.msg);
+ if (callback != null) {
+ callback.onSuccess(o);
+ }
+ }
+
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ Logger.e(TAG,apiName + ": onError() " +"msg="+ message+" code="+code);
+ if (callback != null) {
+ callback.onFail("msg="+ message+" code="+code);
+ }
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ Logger.e(TAG,apiName + ": onError() " +" e="+e.getMessage());
+ if (callback != null) {
+ callback.onFail(e.getMessage());
+ }
+ }
+ };
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHServiceCallback.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHServiceCallback.java
new file mode 100644
index 0000000000..a243248570
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/net/OCHServiceCallback.java
@@ -0,0 +1,15 @@
+package com.mogo.och.bus.net;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/20
+ */
+public interface OCHServiceCallback< T >{
+ void onSuccess(T o);
+
+ void onFail(String failMsg);
+
+ default void onError() {
+
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusModelLoopManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusModelLoopManager.java
new file mode 100644
index 0000000000..c21d6d9302
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusModelLoopManager.java
@@ -0,0 +1,52 @@
+package com.mogo.och.bus.presenter;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.och.bus.constant.OchBusConst;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created on 2021/11/22
+ *
+ * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
+ */
+public class OchBusModelLoopManager {
+
+ private static final String TAG = OchBusModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final OchBusModelLoopManager INSTANCE = new OchBusModelLoopManager();
+ }
+
+ public static OchBusModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mHeartbeatDisposable; //心跳轮询
+
+ public void startHeartbeatLoop() {
+ if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startHeartbeatLoop()");
+ mHeartbeatDisposable = Observable.interval(OchBusConst.LOOP_DELAY,
+ OchBusConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> OchBusOrderModel.getInstance().runCarHeartbeat());
+ }
+
+ public void stopHeartbeatLoop() {
+ if (mHeartbeatDisposable != null) {
+ Logger.i(TAG, "stopHeartbeatLoop()");
+ mHeartbeatDisposable.dispose();
+ mHeartbeatDisposable = null;
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java
new file mode 100644
index 0000000000..28ffdba68d
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusOrderModel.java
@@ -0,0 +1,797 @@
+package com.mogo.och.bus.presenter;
+
+import static com.mogo.och.bus.constant.OchBusConst.STATION_STATUS_STOPPED;
+
+import android.content.Context;
+import android.location.Location;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.navi.IMogoCarLocationChangedListener2;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.bus.bean.OchBusOperationStatusResponse;
+import com.mogo.och.bus.bean.OchBusOrder;
+import com.mogo.och.bus.bean.OchBusOrdersResponse;
+import com.mogo.och.bus.bean.OchBusRoutesResponse;
+import com.mogo.och.bus.bean.OchBusRoutesResult;
+import com.mogo.och.bus.bean.OchBusStation;
+import com.mogo.och.bus.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.bus.callback.CarOperationStatusCallback;
+import com.mogo.och.bus.callback.IOCHBusControllerStatusCallback;
+import com.mogo.och.bus.callback.RefreshBusStationsCallback;
+import com.mogo.och.bus.callback.SlidePannelHideCallback;
+import com.mogo.och.bus.constant.OchBusConst;
+import com.mogo.och.bus.net.OCHBusServiceManager;
+import com.mogo.och.bus.net.OCHServiceCallback;
+import com.mogo.och.bus.util.PinYinUtil;
+import com.mogo.service.IMogoServiceApis;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.exceptions.UndeliverableException;
+import io.reactivex.functions.Consumer;
+import io.reactivex.plugins.RxJavaPlugins;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 小巴订单管理
+ */
+public class OchBusOrderModel {
+ private final String TAG = OchBusOrderModel.class.getSimpleName();
+ private int currentLineId = -1;
+ private int currentStationIndex = 0; //因为服务端和前台对于当前站不一致,所以设置两个current index, 一个用于前台展示, 一个用于服务端接口请求
+ private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
+ /**
+ * 运营状态、后端更具运营状态来判断车辆是否派单
+ */
+ private boolean mIsWorking = false;
+ private static volatile OchBusOrderModel sInstance;
+ public double mLongitude = 0;
+ public double mLatitude = 0;
+ private Context mContext;
+ private Disposable mBusOrdersDisposable; //定时轮询小巴车订单
+ private List prevBusOrderIds = new ArrayList<>();
+ private final List< OchBusStation > stationList = new ArrayList<>();
+ private OchBusRoutesResult ochBusRoutesResult = null;
+ /**
+ * 用来表示是否正在开往下一站
+ */
+ private boolean isGoingToNextStation = false;
+ // 运营类型
+ private static final int VEHICLE_TYPE = 10;
+ private static final int MSG_QUERY_BUS_STATION = 1001;
+ private static final long QUERY_BUS_STATION_DELAY = 5000;
+
+ private CarOperationStatusCallback carOperationStatusCallback;
+ private RefreshBusStationsCallback refreshBusStationsCallback;
+ private SlidePannelHideCallback slidePannelHideCallback;
+ private IOCHBusControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+
+ private boolean hadQueryLeaveAwayPassager = false;
+
+ private final Handler handler = new Handler(new Handler.Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ if ( msg.what == MSG_QUERY_BUS_STATION ) {
+ OchBusOrderModel.getInstance().queryBusRoutes();
+ return true;
+ }
+ return false;
+ }
+ });
+ public static OchBusOrderModel getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( OchBusOrderModel.class ) {
+ if ( sInstance == null ) {
+ sInstance = new OchBusOrderModel();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ private OchBusOrderModel() {
+
+ }
+ public void init() {
+ mContext = AbsMogoApplication.getApp();
+ // 2021/10/20 衡阳小巴业务,使用LenovoPad时需要此app自己获取坐标并上传
+ String productFlavor = DebugConfig.getProductFlavor();
+ if (productFlavor != null && productFlavor.contains("fPadLenovoOchBus")) {
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener );
+ }
+
+ //2022.1.28
+ // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
+ // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with
+ RxJavaPlugins.setErrorHandler(new Consumer() {
+ @Override
+ public void accept(Throwable e) {
+ if (e instanceof UndeliverableException) {
+ e = e.getCause();
+ Log.d(TAG,"UndeliverableException");
+ }
+ if ((e instanceof IOException)) {//
+ // fine, irrelevant network problem or API that throws on cancellation
+ Log.d(TAG,"IOException");
+ return;
+ }
+ if (e instanceof InterruptedException) {
+ // fine, some blocking code was interrupted by a dispose call
+ Log.d(TAG,"InterruptedException");
+ return;
+ }
+ if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
+ // that's likely a bug in the application
+ Log.d(TAG,"NullPointerException or IllegalArgumentException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ if (e instanceof IllegalStateException) {
+ // that's a bug in RxJava or in a custom operator
+ Log.d(TAG,"IllegalStateException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ Log.d(TAG,"Undeliverable exception");
+ }
+ });
+
+ //2021/10/20 轮询小巴车订单,暂时用来播报
+ startLoopBusOrders();
+ }
+
+ public void setCarOperationStatusCallback(CarOperationStatusCallback callback){
+ this.carOperationStatusCallback = callback;
+ }
+ public void setRefreshBusStationsCallback(RefreshBusStationsCallback callback){
+ this.refreshBusStationsCallback = callback;
+ }
+ public void setSlidePannelHideCallback(SlidePannelHideCallback callback){
+ this.slidePannelHideCallback = callback;
+ }
+ public void setControllerStatusCallback(IOCHBusControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+ /**
+ * 轮询bus待服务订单
+ */
+ private void startLoopBusOrders() {
+ if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) {
+ return;
+ }
+ mBusOrdersDisposable = Observable.interval(OchBusConst.LOOP_DELAY,
+ OchBusConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> queryBusOrders());
+ }
+
+ private void queryBusOrders() {
+ OCHBusServiceManager.getInstance().queryBusOrders(mContext, new OCHServiceCallback() {
+ @Override
+ public void onSuccess(OchBusOrdersResponse o) {
+ if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) {
+ Logger.d( TAG, "获取到bus订单数据: " + o.data.orders.toString() );
+ List busOrders = o.data.orders;
+ for (int i = 0; i < busOrders.size(); i++) {
+ OchBusOrder order = busOrders.get(i);
+ if (order == null) return;
+ if (TextUtils.isEmpty(order.getPassengerPhone())) return;
+ if (prevBusOrderIds.contains(order.getOrderId())) continue;
+ try {
+ String tailNum = null;
+ try {
+ tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ tailNum = order.getPassengerPhone();
+ }
+ Logger.d(TAG, "TTS:" + tailNum);
+ AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum + " 上车站点为 " + order.getStartStationName());
+ prevBusOrderIds.add(order.getOrderId());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ public void release(){
+ if (mBusOrdersDisposable != null) {
+ mBusOrdersDisposable.dispose();
+ }
+ startOrStopOrderLoop(false);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ // 注销到达起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+ }
+ private Object readResolve() {
+ // 阻止反序列化,必须实现 Serializable 接口
+ return sInstance;
+ }
+ private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+ // 自车定位
+ private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
+
+ @Override
+ public void onCarLocationChanged2( Location location ) {
+// Log.d(TAG,"location = "+location.getLongitude()+","+location.getLatitude());
+ IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
+ MogoLocation mogoLocation = new MogoLocation();
+ mogoLocation.setAccuracy(location.getAccuracy());
+ mogoLocation.setProvider(location.getProvider());
+ mogoLocation.setLongitude(location.getLongitude());
+ mogoLocation.setLatitude(location.getLatitude());
+ mogoLocation.setSpeed(location.getSpeed());
+ mogoLocation.setBearing(location.getBearing());
+ // TODO: 2021/9/2 因0830新版server后台只能过滤locType=1&&satellites>=4的定位数据,暂固化值,后续优化
+ mogoLocation.setLocType(1);
+ mogoLocation.setSatellite(4);
+ /**
+ * TODO: 2021/10/20
+ * 因ALocationClient实际无坐标返回,所以此处从custom map中AMapViewWrapper获取坐标并反馈回用于坐标上传
+ * {@link com.mogo.map.impl.custom.location.ALocationClient}
+ */
+ apis.getLocationInfoApi().provideLocation(mogoLocation);
+
+ mLongitude = location.getLongitude();
+ mLatitude = location.getLatitude();
+
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(location);
+ }
+ }
+ };
+ /**
+ * 查询小巴路线
+ */
+ public void queryBusRoutes() {
+ Logger.d( TAG, "查询小巴路线");
+ OCHBusServiceManager.getInstance().queryBusRoutes(mContext, new OCHServiceCallback() {
+ @Override
+ public void onSuccess(OchBusRoutesResponse data) {
+ if ( data == null
+ || data.getResult() == null
+ || data.getResult().getSites() == null
+ || data.getResult().getSites().isEmpty() ) {
+ return;
+ }
+ Logger.d( TAG, "获取到小巴路线数据: " + data );
+ renderBusStationsStatus( data.getResult());
+ }
+ @Override
+ public void onFail(String failMsg) {
+ // 重复请求小巴路线,直至成功
+ queryBusStationDelay();
+ }
+ });
+
+ }
+
+ /**
+ * 测试、重置站点状态
+ */
+ public void debugResetStationStatus() {
+ Logger.d( TAG, "测试、重置站点状态");
+ OCHBusServiceManager.getInstance().debugResetStationStatus(mContext, currentLineId, new OCHServiceCallback() {
+ @Override
+ public void onSuccess(OchBusRoutesResponse o) {
+ Logger.d(TAG, "获取到小巴路线数据: " + o);
+ isGoingToNextStation = false;
+ if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) {
+ return;
+ }
+ renderBusStationsStatus(o.getResult());
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ // 重复请求小巴路线,直至成功
+ queryBusStationDelay();
+ }
+ });
+
+ }
+ /**
+ * 离站上报
+ */
+ public void leaveStation(boolean isOneWayOver,boolean isRestart){
+ Log.d(TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex);
+ OCHBusServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq(), stationList.get(backgroundCurrentStationIndex).getSiteId(), new OCHServiceCallback() {
+ @Override
+ public void onSuccess(OchBusRoutesResponse o) {
+ if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) {
+ return;
+ }
+ if (!isOneWayOver){
+ Logger.d( TAG, "自动驾驶开启开往下一站====" );
+ //需要更改当前站和下一站的状态 然后渲染
+ RenderLeaveStationSuccess(o.getResult(),isRestart);
+ }else {
+ Logger.d( TAG, "单程真的结束了====" );
+ isGoingToNextStation = false;
+ currentStationIndex = 0;
+ backgroundCurrentStationIndex = 0;
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ queryBusRoutes();
+ }
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+ });
+ }
+ /**
+ * 离站上报成功后渲染站点
+ * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
+ * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染
+ */
+ private void RenderLeaveStationSuccess(OchBusRoutesResult result,boolean isRestart) {
+ renderBusStationsStatus(result);
+ if (slidePannelHideCallback != null) {
+ slidePannelHideCallback.hideSlidePanel();
+ }
+ //开启自动驾驶
+ startAutopilot(isRestart);
+ if (isGoingToNextStation) {
+ // 为了避免恢复自动驾驶时重复的接口请求
+ return;
+ }
+ isGoingToNextStation = true;
+ AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" );
+ }
+
+ private void startAutopilot(boolean isRestart) {
+ OchBusStation currentStation = stationList.get( currentStationIndex -1);
+ OchBusStation nextStation = stationList.get( currentStationIndex);
+
+// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+// == Integer.parseInt(DebugConfig.getAutoPilotStatus())) {
+// TipToast.shortTip("自动驾驶状态为不可用!");
+// }
+ AutopilotControlParameters currentAutopilot = new AutopilotControlParameters();
+ currentAutopilot.isSpeakVoice = !isRestart;
+ currentAutopilot.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName());
+ currentAutopilot.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName());
+ currentAutopilot.startLatLon = new AutopilotControlParameters.AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() );
+ currentAutopilot.endLatLon = new AutopilotControlParameters.AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() );
+ currentAutopilot.vehicleType = VEHICLE_TYPE;
+ Logger.d( TAG, "开启自动驾驶====" + currentAutopilot.toString()
+ +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName());
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(currentAutopilot);
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.startOpenAutopilot();
+ }
+ }
+
+ /**
+ * 到站后重置站点状态
+ */
+ private void arriveSiteStation(boolean isRestart) {
+ Log.d(TAG,"arriveSiteStation-currentStationIndex = "+currentStationIndex);
+ OCHBusServiceManager.getInstance().arriveSiteStation(mContext, stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId()
+ , new OCHServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ Log.d(TAG,"arriveSiteStation success");
+ if (!isRestart){
+ renderArriveBusStation();
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+ });
+ }
+
+ private void renderArriveBusStation() {
+ List< OchBusStation > site = ochBusRoutesResult.getSites();
+ if (site != null && site.size() > 0){
+ backgroundCurrentStationIndex = currentStationIndex;
+ if (refreshBusStationsCallback != null){
+ refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex, getNextStopStation(),true);
+ }
+ }
+ }
+
+ /**
+ * 查询到站下车乘客
+ */
+ private void queryStationLeaveAwayPassengers() {
+ Logger.d( TAG, "查询到站下车乘客");
+
+ OCHBusServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext, stationList.get(currentStationIndex).getSeq(), stationList.get(currentStationIndex).getSiteId()
+ , new OCHServiceCallback() {
+ @Override
+ public void onSuccess(QueryLeaveAwayPassengersResponse o) {
+ hadQueryLeaveAwayPassager = true;
+ arriveSiteStation(false);
+ playLeavePassengersMsg( o );
+ queryBusOrders();
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ hadQueryLeaveAwayPassager = true;
+ arriveSiteStation(false);
+ }
+ });
+ }
+ /**
+ * 收车
+ */
+ public void stopTakeOrder(){
+ OCHBusServiceManager.getInstance().stopTakeOrder(mContext, new OCHServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ mIsWorking = !mIsWorking;
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ startOrStopOrderLoop(mIsWorking);
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }else {
+ TipToast.shortTip(failMsg);
+ }
+ }
+ });
+ }
+ /**
+ * 出车
+ */
+ public void startTakeOrder(){
+ OCHBusServiceManager.getInstance().startTakeOrder(mContext, new OCHServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ mIsWorking = !mIsWorking;
+ startOrStopOrderLoop(mIsWorking);
+ if ( stationList != null && stationList.size() > 0 ) {
+ AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往" + stationList.get( currentStationIndex ).getName() + "站点" );
+ }
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ queryBusRoutes();
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }else {
+ TipToast.shortTip(failMsg);
+ }
+ }
+ });
+ }
+ /**
+ * 查询运营状态
+ */
+ public void queryOperationStatus() {
+ Logger.d( TAG, "查询运营状态");
+ OCHBusServiceManager.getInstance().queryOperationStatus(mContext, new OCHServiceCallback() {
+ @Override
+ public void onSuccess(OchBusOperationStatusResponse o) {
+ if ( o.data != null ) {
+ mIsWorking = o.data.serviceStatus == 1;
+ Logger.d( TAG, "查询运营状态 result.status: " + o.data.serviceStatus);
+ startOrStopOrderLoop(mIsWorking);
+ }
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+ });
+ }
+ /**
+ * 开启自动驾驶到下一站
+ */
+ public void autoDriveToNextStation( boolean isRestart ) {
+ if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) {
+ // 当前站是最后一站,结束当前行程
+ travelOver();
+ return;
+ }
+ leaveStation(false,isRestart);
+ }
+ /**
+ * 渲染站点信息
+ * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
+ * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理current index,不能直接渲染
+ * @param result
+ */
+ private void renderBusStationsStatus(OchBusRoutesResult result) {
+ if (result == null) return;
+ ochBusRoutesResult = result;
+ List< OchBusStation > site = result.getSites();
+ currentLineId = result.getLineId();
+ stationList.clear();
+ stationList.addAll( site );
+ for ( int i = 0; i < stationList.size(); i++ ) {
+ OchBusStation s = stationList.get( i );
+ // 是否正在开往下一站
+ if ( s.isLeaving()) {
+ isGoingToNextStation = true;
+ }
+ // 当前站点信息
+ if (s.getDrivingStatus() == STATION_STATUS_STOPPED ) {
+ currentStationIndex = i;
+ break;
+ }
+ }
+ backgroundCurrentStationIndex = currentStationIndex;
+ OchBusStation currentStation = stationList.get(currentStationIndex);
+ Logger.d( TAG, "渲染站点信息服务端currentStationIndex="+currentStationIndex+" isLeaving()="+currentStation.isLeaving());
+ if (currentStationIndex == 0 && !currentStation.isLeaving()){//当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态,订单开始站下在始发站的状态流转有问题
+ arriveSiteStation(true);
+ }
+ // 美化是否开始
+ if (FunctionBuildConfig.isDemoMode && ((currentStationIndex > 0 && currentStationIndex < stationList.size()-1)
+ || (stationList.get(0).isLeaving() || stationList.get(stationList.size() -1).isLeaving()))){//行驶过程中设置美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ Logger.d(TAG, "美化模式-ignore:置为true(每次滑动出发)");
+ }
+ if (refreshBusStationsCallback != null){
+ if (currentStation.isLeaving()){//如果服务端的当前站是leaving状态,展示当前站需要+1
+ currentStationIndex ++;
+ refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex, getNextStopStation(),false);
+ }else{
+ refreshBusStationsCallback.refreshBusStations(stationList, currentStationIndex, getNextStopStation(),true);
+ }
+ }
+ if ( currentStation.isLeaving() && slidePannelHideCallback != null) {
+ slidePannelHideCallback.hideSlidePanel();
+ }
+ }
+
+ /**
+ * 重置下一站
+ *
+ * @param lastStopStation
+ */
+ private void resetNextStopStation( int lastStopStation ) {
+ Logger.d( TAG, "重置下一站");
+ int nextStopStation = getNextStopStation();
+ if ( nextStopStation < 0 ) {
+ return;
+ }
+ if ( lastStopStation <= nextStopStation || nextStopStation <= currentStationIndex ) {
+ return;
+ }
+ if ( CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
+ == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ) {
+ // 自动驾驶中动态设置下一个停靠站点/
+ autoDriveToNextStation( true );
+ }
+ }
+ /**
+ * 根据订单状态、获取下一站靠站的的站点
+ *
+ * @return -1 当前已是最后一个站点
+ */
+ private int getNextStopStation() {
+ if ( currentStationIndex >= stationList.size() - 1 ) {
+ return -1;
+ }
+ int nextStationIndex = currentStationIndex + 1;
+ for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) {
+ if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) {
+ break;
+ }
+ break;
+ }
+ return nextStationIndex;
+ }
+ /**
+ * 延时查询站点信心
+ */
+ private void queryBusStationDelay() {
+ handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY );
+ }
+
+ /**
+ * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
+ */
+ public void restartAutopilot() {
+ Logger.d( TAG, "重启自动驾驶===" + isGoingToNextStation );
+ if ( isGoingToNextStation ) {
+ autoDriveToNextStation( true );
+ }
+ }
+ /**
+ * 播报下车乘客信息
+ *
+ * @param awayPassengersResponse
+ */
+ private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) {
+ Logger.d( TAG, "播报下车乘客信息currentStationIndex="+currentStationIndex);
+
+ if ( currentStationIndex > stationList.size() - 1 ) {
+ return;
+ }
+ String station = stationList.get( currentStationIndex ).getName();
+ StringBuilder builder = new StringBuilder( "已到达" );
+ builder.append( station );
+ if ( !station.endsWith( "站" ) ) {
+ builder.append( "站" );
+ }
+ if ( awayPassengersResponse == null || awayPassengersResponse.data == null || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) {
+ Logger.d( TAG, "播报下车乘客信息为null");
+ } else {
+ builder.append( ",请尾号为 " );
+ for ( QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders ) {
+ if ( leaveAwayPassenger == null ) {
+ continue;
+ }
+ String tailNum = null;
+ try {
+ tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ tailNum = leaveAwayPassenger.passengerPhone;
+ }
+ builder.append( tailNum ).append( "。" );
+ }
+ builder.append( "的乘客下车" );
+ }
+ builder.append(",带好随身物品,下车请注意安全");
+ Logger.d(TAG, "TTS:" + builder.toString());
+ AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() );
+ }
+ /**
+ * 修改小巴运营状态
+ */
+ public void onChangeOperationStatus() {
+ Logger.d( TAG, "修改小巴运营状态");
+ if (isWorking()){//收车
+ stopTakeOrder();
+ }else {//出车
+ startTakeOrder();
+ }
+ }
+ /**
+ * 行程结束
+ */
+ private void travelOver() {
+// Logger.d( TAG, "行程结束");
+
+ if ( currentStationIndex >= stationList.size() ) {
+ Logger.e( TAG, "travel over index out of station list" );
+ return;
+ }
+ Logger.d( TAG, "单程结束====" );
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" );
+ leaveStation(true,true);
+ }
+ public boolean isWorking() {
+ return mIsWorking;
+ }
+ /**
+ * 到站
+ * @param data
+ */
+ public void onArriveAt( AutopilotStationInfo data){
+ if ( currentStationIndex > stationList.size() - 1 ) {
+ Logger.e( TAG, "到站异常,取消后续操作结束" );
+ return;
+ }
+ if (FunctionBuildConfig.isDemoMode && currentStationIndex == stationList.size() - 1){//到达最后一站结束美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+ Logger.d(TAG, "美化模式-ignore:置为false(到最后一站)");
+ }
+ Logger.d( TAG, "到站====currentStationIndex=" + currentStationIndex);
+ isGoingToNextStation = false;
+ // 到达站点后,更新站点状态
+// currentStationIndex = getNextStopStation();
+ queryStationLeaveAwayPassengers();
+ UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单
+ @Override
+ public void run() {
+ if (!hadQueryLeaveAwayPassager){
+ arriveSiteStation(false);
+ }
+ hadQueryLeaveAwayPassager = false;
+ }
+ },1500);
+ }
+ public boolean isGoingToNextStation() {
+ return isGoingToNextStation;
+ }
+
+ // 车机端上传心跳数据(只在出车状态时上传)
+ public void runCarHeartbeat() {
+ OCHBusServiceManager.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
+ new OCHServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ private void startOrStopOrderLoop(boolean start) {
+ Logger.d(TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ OchBusModelLoopManager.getInstance().startHeartbeatLoop();
+ } else {
+ OchBusModelLoopManager.getInstance().stopHeartbeatLoop();
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java
new file mode 100644
index 0000000000..f5a0301b04
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java
@@ -0,0 +1,265 @@
+package com.mogo.och.bus.presenter;
+import android.location.Location;
+import android.os.Looper;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.bus.bean.OchBusStation;
+import com.mogo.och.bus.callback.CarOperationStatusCallback;
+import com.mogo.och.bus.callback.IOCHBusControllerStatusCallback;
+import com.mogo.och.bus.callback.RefreshBusStationsCallback;
+import com.mogo.och.bus.callback.SlidePannelHideCallback;
+import com.mogo.och.bus.fragment.OchBusFragment;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 网约车小巴
+ *
+ * @author tongchenfei
+ */
+public class OchBusPresenter extends Presenter< OchBusFragment > implements CarOperationStatusCallback, RefreshBusStationsCallback, SlidePannelHideCallback, IMoGoAutopilotStatusListener, IOCHBusControllerStatusCallback {
+ private static final String TAG = "OchBusPresenter";
+ private int currentAutopilotStatus = -1;
+ private boolean isAnimateRunning = false;
+ private List mStationList = new ArrayList<>();
+ private int mCurrentStation = 0;
+
+ public OchBusPresenter( OchBusFragment view ) {
+ super( view );
+ //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
+ CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
+ OchBusOrderModel.getInstance().init();
+ }
+
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ OchBusOrderModel.getInstance().queryOperationStatus();
+ OchBusOrderModel.getInstance().queryBusRoutes();
+ initModelListener();
+ }
+ @Override
+ public void onDestroy(@NonNull LifecycleOwner owner) {
+ super.onDestroy(owner);
+ OchBusOrderModel.getInstance().release();
+ releaseListener();
+ }
+ public void initModelListener(){
+ OchBusOrderModel.getInstance().setCarOperationStatusCallback(this);
+ OchBusOrderModel.getInstance().setRefreshBusStationsCallback(this);
+ OchBusOrderModel.getInstance().setSlidePannelHideCallback(this);
+ OchBusOrderModel.getInstance().setControllerStatusCallback(this);
+ }
+ public void releaseListener(){
+ OchBusOrderModel.getInstance().setCarOperationStatusCallback(null);
+ OchBusOrderModel.getInstance().setRefreshBusStationsCallback(null);
+ OchBusOrderModel.getInstance().setSlidePannelHideCallback(null);
+ OchBusOrderModel.getInstance().setControllerStatusCallback(null);
+ }
+ public void queryBusRoutes(){
+ OchBusOrderModel.getInstance().queryBusRoutes();
+ }
+ public void debugResetStationStatus(){
+ OchBusOrderModel.getInstance().debugResetStationStatus();
+ }
+ public void autoDriveToNextStation(boolean isRestart){
+ currentAutopilotStatus = -1;
+ OchBusOrderModel.getInstance().autoDriveToNextStation(isRestart);
+ }
+ public void restartAutopilot(){
+ currentAutopilotStatus = -1;
+ OchBusOrderModel.getInstance().restartAutopilot();
+ }
+ public void onChangeOperationStatus(){
+ OchBusOrderModel.getInstance().onChangeOperationStatus();
+ }
+
+ @Override
+ public void changeOperationStatus(boolean changeStatus) {
+ if (mView != null) {
+ mView.changeOperationStatus(changeStatus);
+ }
+ }
+
+ @Override
+ public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) {
+ mStationList.clear();
+ mStationList.addAll(stationList);
+ mCurrentStation = currentStation;
+ functionDemoModeChange();
+ Log.d("OchBusOrderModel ="," mCurrentStation ="+mCurrentStation);
+ if ( mView != null ) {
+ mView.refreshBusStations( stationList, currentStation, nextStation ,isArrived);
+ }
+ }
+
+ private void functionDemoModeChange() {
+// Log.d("OchBusOrderModel ="," functionDemoModeChange ="+mCurrentStation);
+ if (FunctionBuildConfig.isDemoMode
+ && (
+ (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1)
+ || (
+ (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1)
+ && OchBusOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ){
+ mView.onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ,false);
+ }
+ }
+
+ @Override
+ public void hideSlidePanel() {
+ if (mView != null){
+ mView.hideSlidePanel();
+ }
+ }
+
+ @Override
+ public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo autopilotStationInfo) {
+ OchBusOrderModel.getInstance().onArriveAt(autopilotStationInfo);
+ }
+
+ @Override
+ public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) {
+
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+
+ }
+
+ @Override
+ public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
+ if (autopilotStatusInfo == null) return;
+ int state = autopilotStatusInfo.getState();
+ Logger.d( TAG, "onStateChange: " + state +"currentAutopilotStatus = "+currentAutopilotStatus);
+ switch ( state ) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){
+ if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){//2-->1语音提示
+// AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" );
+ }
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE;
+ // 设置UI【自动驾驶】按钮是否展示
+ mView.onAutopilotEnableChange( true );
+ if ( OchBusOrderModel.getInstance().isGoingToNextStation() ) {
+ mView.hideSlidePanel();
+ }
+ if (FunctionBuildConfig.isDemoMode
+ && (
+ (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1)
+ || (
+ (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1)
+ && OchBusOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ){
+ Log.d("OchBusOrderModel=","有美化功能");
+ return;
+ }
+ // 改变UI自动驾驶状态
+ mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning);
+ }
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
+ runOnUIThread(()->mView.stopAutopilotAnimation());
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING;
+ // 改变UI自动驾驶状态
+ mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning);
+ }
+ isAnimateRunning = false;
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
+ if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){//2-->0语音提示
+// AIAssist.getInstance( getContext() ).speakTTSVoice( "自动驾驶已停止,请人工接管" );
+ }
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE;
+ if (FunctionBuildConfig.isDemoMode
+ && (
+ (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1)
+ || (
+ (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1)
+ && OchBusOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ){
+ Log.d("OchBusOrderModel=","有美化功能");
+ return;
+ }
+ mView.onAutopilotEnableChange( false );
+ mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning);
+ }
+ isAnimateRunning = false;
+ break;
+ default:
+ mView.onAutopilotEnableChange( false );
+ break;
+ }
+ }
+
+ @Override
+ public void onVRModeChanged(boolean isVRMode) {
+ runOnUIThread(() -> mView.onVRModeChanged(isVRMode));
+ }
+
+ @Override
+ public void onCarLocationChanged(Location location) {
+ if (null != location){
+ runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
+ }
+ }
+
+ @Override
+ public void startOpenAutopilot() {
+ isAnimateRunning = true;
+ runOnUIThread(()->mView.startAutopilotAnimation());
+ // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
+// UiThreadHandler.postDelayed(new Runnable() {
+// @Override
+// public void run() {
+// debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+// }
+// },2300);
+ }
+
+ private void runOnUIThread( Runnable executor ) {
+ if ( executor == null ) {
+ return;
+ }
+ if ( Looper.myLooper() != Looper.getMainLooper() ) {
+ UiThreadHandler.post( executor );
+ } else {
+ executor.run();
+ }
+ }
+
+ /**
+ * 测试使用
+ * @param status
+ */
+ public void debugAutoPilotStatus(int status){
+ AutopilotStatusInfo info = new AutopilotStatusInfo();
+ info.setState(status);
+ onAutopilotStatusResponse(info);
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestOchBusBroadcastReceiver.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestOchBusBroadcastReceiver.java
new file mode 100644
index 0000000000..132b5a87a6
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/receiver/TestOchBusBroadcastReceiver.java
@@ -0,0 +1,40 @@
+package com.mogo.och.bus.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.och.bus.constant.OchBusConst;
+
+/**
+ * 测试小巴车的场景
+ *
+ * @author donghongyu
+ * @date 4/26/21 12:08 PM
+ */
+public class TestOchBusBroadcastReceiver extends BroadcastReceiver {
+ private static final String TAG = "TestOchBusBroadcastReceiver";
+
+ private Context mContext;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ this.mContext = context;
+ int sceneType = intent.getIntExtra(OchBusConst.BROADCAST_TEST_BUS_CONTROL_TYPE_EXTRA_KEY, 0);
+ Logger.d(TAG, "sceneType:" + sceneType);
+
+ // 分发场景
+ dispatchSceneTest(sceneType);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void dispatchSceneTest(int sceneType) {
+
+ }
+
+
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/PinYinUtil.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/PinYinUtil.java
new file mode 100644
index 0000000000..aa826c9a68
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/PinYinUtil.java
@@ -0,0 +1,31 @@
+package com.mogo.och.bus.util;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/26
+ */
+public class PinYinUtil {
+ /**
+ * 得到中文字符串首字母
+ * @param str 需要转化的中文字符串
+ * @return 大写首字母缩写的字符串
+ */
+ public static String getPinYinHeadChar(String str) {
+ str = str.replaceAll("[\\p{P}‘’“”|+=¥$<>^~~]", "");
+ StringBuilder convert = new StringBuilder();
+ for (int j = 0; j < str.length(); j++) {
+ char word = str.charAt(j);
+ String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
+ if (pinyinArray != null) {
+ convert.append(pinyinArray[0].charAt(0));
+ } else {
+ if (!"".equals(String.valueOf(word).trim())){
+ convert.append(word);
+ }
+ }
+ }
+ return convert.toString().trim().toUpperCase();
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java
new file mode 100644
index 0000000000..2fd6a41ce5
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/BusArcView.java
@@ -0,0 +1,190 @@
+package com.mogo.och.bus.view;
+
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Typeface;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+import com.mogo.och.bus.R;
+
+/**
+ * created by wujifei on 2021/3/24 16:20
+ * describe:
+ */
+public class BusArcView extends View {
+
+ //中心的文字描述
+ private String mDes = "km/h";
+ //根据数据显示的圆弧Paint
+ private Paint mArcPaint;
+ //圆弧颜色
+ private int mArcColor;
+ //圆弧的画笔的宽度
+ private float mStrokeWith = getResources().getDimension(R.dimen.bus_ext_arcView_stroke_with);
+ //文字描述的paint
+ private Paint mTextPaint;
+
+ //当前进度夹角大小
+ private float mIncludedAngle = 0;
+ //当前数据
+ private int currentValue;
+ //最大数据
+ private int maxValue = 240;
+ //圆弧背景的开始和结束间的夹角大小
+ private float mAngle = 270;
+ //上次绘制圆弧夹角
+ private float lastAngle = 0;
+
+ public BusArcView(Context context) {
+ this(context, null);
+ }
+
+ public BusArcView(Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public BusArcView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ //初始化paint
+ initPaint();
+ //绘制弧度
+ drawArc(canvas);
+ //绘制文本
+ drawText(canvas);
+ }
+
+ private void drawText(Canvas canvas) {
+ Rect mRect = new Rect();
+ String mValue = String.valueOf(currentValue);
+ mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+ //绘制中心的数值
+ mTextPaint.getTextBounds(mValue, 0, mValue.length(), mRect);
+ canvas.drawText(mValue, getWidth() / 2, getHeight() / 2 + mRect.height() / 2 - 10, mTextPaint);
+
+ mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
+ //绘制中心文字描述
+ mTextPaint.setTextSize(getResources().getDimension(R.dimen.bus_ext_arcView_des_text_size));
+ mTextPaint.getTextBounds(mDes, 0, mDes.length(), mRect);
+ canvas.drawText(mDes, getWidth() / 2, getHeight() * 17 / 20 + mRect.height() / 2, mTextPaint);
+ }
+
+ private void drawArc(Canvas canvas) {
+ //绘制圆弧背景
+ RectF mRectF = new RectF(mStrokeWith, mStrokeWith, getWidth() - mStrokeWith, getHeight() - mStrokeWith);
+ canvas.drawArc(mRectF, 135, mAngle, false, mArcPaint);
+
+ //绘制当前数值对应的圆弧
+ mArcPaint.setColor(mArcColor);
+ //根据当前数据绘制对应的圆弧
+ canvas.drawArc(mRectF, 135, mIncludedAngle, false, mArcPaint);
+ }
+
+ private void initPaint() {
+ //圆弧的paint
+ mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ //抗锯齿
+ mArcPaint.setAntiAlias(true);
+ mArcPaint.setColor(Color.parseColor("#151D4C"));
+ //设置透明度(数值为0-255)
+ mArcPaint.setAlpha(100);
+ //设置画笔的画出的形状
+ mArcPaint.setStrokeJoin(Paint.Join.ROUND);
+ mArcPaint.setStrokeCap(Paint.Cap.ROUND);
+ //设置画笔类型
+ mArcPaint.setStyle(Paint.Style.STROKE);
+ //画笔宽度
+ mArcPaint.setStrokeWidth(mStrokeWith);
+
+ //中心文字的paint
+ mTextPaint = new Paint();
+ mTextPaint.setAntiAlias(true);
+ mTextPaint.setColor(Color.parseColor("#FFFFFF"));
+ //设置文本的对齐方式
+ mTextPaint.setTextAlign(Paint.Align.CENTER);
+ //mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen.dp_12));
+ mTextPaint.setTextSize(getResources().getDimension(R.dimen.bus_ext_arcView_center_text_size));
+
+ }
+
+
+ /**
+ * 为绘制弧度及数据设置动画
+ *
+ * @param startAngle 开始的弧度
+ * @param currentAngle 需要绘制的弧度
+ * @param time 动画执行的时长
+ */
+ private void setAnimation(float startAngle, float currentAngle, int time) {
+ //绘制当前数据对应的圆弧的动画效果
+ ValueAnimator progressAnimator = ValueAnimator.ofFloat(startAngle, currentAngle);
+ progressAnimator.setDuration(time);
+ progressAnimator.setTarget(mIncludedAngle);
+ progressAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mIncludedAngle = (float) animation.getAnimatedValue();
+ //重新绘制,不然不会出现效果
+ postInvalidate();
+ }
+ });
+ //开始执行动画
+ progressAnimator.start();
+ }
+
+
+ /**
+ * 设置弧形颜色
+ *
+ * @param value 颜色值
+ */
+ public void setArcColor(int value) {
+ mArcColor = value;
+ }
+
+ /**
+ * 设置数据
+ *
+ * @param value 当前绘制的值
+ */
+ public void setValues(int value) {
+ //完全覆盖
+ if (value > maxValue) {
+ value = maxValue;
+ }
+ if (value < 0) {
+ value = 0;
+ }
+ currentValue = value;
+ //计算弧度比重
+ float scale = (float) currentValue / maxValue;
+ //计算弧度
+ float currentAngle = scale * mAngle;
+ //开始执行动画
+ setAnimation(lastAngle, currentAngle, 1000);
+ lastAngle = currentAngle;
+ //重新绘制
+ postInvalidate();
+ }
+
+
+ private float dp2px(float dp) {
+ DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
+ return dp * metrics.density;
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/NoTouchConstraintLayout.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/NoTouchConstraintLayout.java
new file mode 100644
index 0000000000..558a515bd9
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/NoTouchConstraintLayout.java
@@ -0,0 +1,37 @@
+package com.mogo.och.bus.view;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.mogo.commons.debug.DebugConfig;
+
+/**
+ * 强制拦截所有touch时间的约束布局
+ *
+ * @author tongchenfei
+ */
+public class NoTouchConstraintLayout extends ConstraintLayout {
+ public NoTouchConstraintLayout(Context context) {
+ super(context);
+ }
+
+ public NoTouchConstraintLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public NoTouchConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if(DebugConfig.isDebug()){
+ return super.onInterceptTouchEvent(ev);
+ }else {
+ return true;
+ }
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java
new file mode 100644
index 0000000000..53d27b181b
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java
@@ -0,0 +1,264 @@
+package com.mogo.och.bus.view;
+
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.LinearGradient;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.animation.DecelerateInterpolator;
+
+import androidx.annotation.Nullable;
+
+import com.mogo.och.bus.R;
+
+/**
+ * 滑块滑动面板
+ *
+ * @author tongchenfei
+ */
+public class SlidePanelView extends View {
+ private static final String TAG = "SlidePanelView";
+
+ public SlidePanelView(Context context) {
+ this(context, null);
+ }
+
+ public SlidePanelView(Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public SlidePanelView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.SlidePanelView);
+ textSize = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_textSize, textSize);
+ BLOCK_START_X = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_BLOCK_START_X, BLOCK_START_X);
+ BLOCK_START_Y = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_BLOCK_START_Y, BLOCK_START_Y);
+ NORMAL_TEXT_MARGIN_LEFT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_NORMAL_TEXT_MARGIN_LEFT, NORMAL_TEXT_MARGIN_LEFT);
+ NORMAL_TEXT_MARGIN_RIGHT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_NORMAL_TEXT_MARGIN_RIGHT, NORMAL_TEXT_MARGIN_RIGHT);
+ SHORT_TEXT_MARGIN_LEFT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_SHORT_TEXT_MARGIN_LEFT, SHORT_TEXT_MARGIN_LEFT);
+ SHORT_TEXT_MARGIN_RIGHT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_SHORT_TEXT_MARGIN_RIGHT, SHORT_TEXT_MARGIN_RIGHT);
+ init();
+ }
+
+ private final Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Paint blockPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+ private static int textSize = 40;
+ private static int BLOCK_START_X = 15;
+ private static int BLOCK_START_Y = 15;
+ private static int NORMAL_TEXT_MARGIN_LEFT = 40;
+ private static int NORMAL_TEXT_MARGIN_RIGHT = 60;
+ private static int SHORT_TEXT_MARGIN_LEFT = 60;
+ private static int SHORT_TEXT_MARGIN_RIGHT = 70;
+
+ private int textMarginLeft = NORMAL_TEXT_MARGIN_LEFT;
+ private int textMarginRight = NORMAL_TEXT_MARGIN_RIGHT;
+
+ private OnSlidePanelMoveToEndListener moveToEndListener;
+
+ private int blockWidth = 0;
+ private int blockOffset = 0;
+
+ private float lastX;
+ private boolean isToEnd = false;
+
+ private static final String STRING_SLIDE_TO_RIGHT = "向右滑动";
+ private RectF bgRectF;
+ private Bitmap bmBlock;
+
+ private final Matrix gradientMatrix = new Matrix();
+ private float matrixTranslate;
+ private final Rect textRect = new Rect();
+ private LinearGradient textGradient;
+
+ private ObjectAnimator matrixAnim;
+
+ private String blockText = STRING_SLIDE_TO_RIGHT;
+ private Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics();
+
+ private static final int GRADIENT_OFFSET = 200;
+
+ public void setOnSlidePanelMoveToEndListener(OnSlidePanelMoveToEndListener moveToEndListener) {
+ this.moveToEndListener = moveToEndListener;
+ }
+
+ private void setBlockOffset(int blockOffset) {
+ this.blockOffset = blockOffset;
+ invalidate();
+ }
+
+ private void setMatrixTranslate(float matrixTranslate) {
+ this.matrixTranslate = matrixTranslate;
+ invalidate();
+ }
+
+ public void setText(String text) {
+ this.blockText = text;
+ requestLayout();
+ invalidate();
+ }
+
+ private void init() {
+ bgPaint.setColor(Color.parseColor("#CC0F1325"));
+ bgPaint.setStyle(Paint.Style.FILL);
+
+ textPaint.setStyle(Paint.Style.FILL);
+ textPaint.setTextSize(textSize);
+ textPaint.setTextAlign(Paint.Align.LEFT);
+ textGradient = new LinearGradient(-GRADIENT_OFFSET, 0, 0, 0, new int[]{0x33ffffff, 0xffffffff, 0x33ffffff}, null, Shader.TileMode.CLAMP);
+ textGradient.setLocalMatrix(gradientMatrix);
+ textPaint.setShader(textGradient);
+ textPaint.getFontMetrics(blockTextMetrics);
+
+ bmBlock = BitmapFactory.decodeResource(getResources(), R.drawable.bus_base_slide_block);
+ blockWidth = bmBlock.getWidth();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int widthSize;
+ int heightSize;
+
+ if (blockText.length() < 5) {
+ textMarginLeft = SHORT_TEXT_MARGIN_LEFT;
+ textMarginRight = SHORT_TEXT_MARGIN_RIGHT;
+ } else {
+ textMarginLeft = NORMAL_TEXT_MARGIN_LEFT;
+ textMarginRight = NORMAL_TEXT_MARGIN_RIGHT;
+ }
+
+ if (widthMode == MeasureSpec.AT_MOST) {
+ // 宽度根据图片大小,字符串长度,各种间隔确定
+ // 高度根据图片大小和上下间隔确定
+ textPaint.getTextBounds(blockText, 0, blockText.length(), textRect);
+ widthSize = BLOCK_START_X * 2 + bmBlock.getWidth() + textMarginLeft + textMarginRight + textRect.width();
+ heightSize = BLOCK_START_Y * 2 + bmBlock.getHeight();
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
+ }
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ private float textOffset = 0;
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ bgRectF = new RectF(0, 0, w, h);
+
+ if (matrixAnim != null) {
+ matrixAnim.cancel();
+ }
+ textOffset = (getHeight() - blockTextMetrics.ascent - blockTextMetrics.descent) / 2;
+ matrixAnim = ObjectAnimator.ofFloat(this, "matrixTranslate", 0, w + GRADIENT_OFFSET).setDuration(2000);
+ matrixAnim.setRepeatCount(ValueAnimator.INFINITE);
+ matrixAnim.start();
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ if (matrixAnim != null) {
+ matrixAnim.start();
+ }
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ if (matrixAnim != null) {
+ matrixAnim.cancel();
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (x > BLOCK_START_X + blockOffset && x < blockWidth + BLOCK_START_X + blockOffset && y > BLOCK_START_Y && y < getHeight() - BLOCK_START_Y) {
+ isToEnd = false;
+ lastX = x;
+ }
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (lastX != 0) {
+ blockOffset = (int) (x - lastX);
+ if (blockOffset < 0) {
+ blockOffset = 0;
+ }
+ if (blockOffset + BLOCK_START_X + blockWidth > getWidth()) {
+ // 超出右边界
+ blockOffset = getWidth() - BLOCK_START_X - blockWidth;
+ if (!isToEnd) {
+ isToEnd = true;
+ if (moveToEndListener != null) {
+ moveToEndListener.moveToEnd();
+ }
+ startBlockBackAnim();
+ }
+ }
+ invalidate();
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ // 执行滑块回归动画
+ if (!isToEnd) {
+ startBlockBackAnim();
+ }
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ private void startBlockBackAnim() {
+ ObjectAnimator animator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0);
+ animator.setInterpolator(new DecelerateInterpolator());
+ animator.setDuration(1000 * blockOffset / getWidth());
+ animator.start();
+ lastX = 0;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ // 画背景
+ canvas.drawRoundRect(bgRectF, (float) getHeight() / 2, (float) getHeight() / 2, bgPaint);
+ // 画文字
+ gradientMatrix.setTranslate(matrixTranslate, 0);
+ textGradient.setLocalMatrix(gradientMatrix);
+ canvas.save();
+ canvas.drawText(blockText, blockWidth + BLOCK_START_X + textMarginLeft, textOffset, textPaint);
+ canvas.restore();
+ // 画滑块
+ canvas.drawBitmap(bmBlock, BLOCK_START_X + blockOffset, BLOCK_START_Y, blockPaint);
+ }
+
+ public interface OnSlidePanelMoveToEndListener {
+ /**
+ * 滑块滑到了末尾
+ */
+ void moveToEnd();
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/VerticalDashLineView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/VerticalDashLineView.java
new file mode 100644
index 0000000000..250d4a41b6
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/VerticalDashLineView.java
@@ -0,0 +1,64 @@
+package com.mogo.och.bus.view;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.DashPathEffect;
+import android.graphics.LinearGradient;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Shader;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+
+/**
+ * 垂直虚线
+ *
+ * @author tongchenfei
+ */
+public class VerticalDashLineView extends View {
+ public VerticalDashLineView(Context context) {
+ this(context,null);
+ }
+
+ public VerticalDashLineView(Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs,0);
+ }
+
+ public VerticalDashLineView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ private final Paint linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Path dashPath = new Path();
+
+ private void init(){
+ linePaint.setColor(Color.GREEN);
+ linePaint.setStyle(Paint.Style.STROKE);
+ linePaint.setStrokeWidth(2);
+ linePaint.setPathEffect(new DashPathEffect(new float[]{5, 5}, 0));
+ }
+
+ public void setGradient(int startColor, int endColor) {
+ LinearGradient linearGradient = new LinearGradient(0, 0, getWidth(), getHeight(), startColor, endColor, Shader.TileMode.CLAMP);
+ linePaint.setShader(linearGradient);
+ invalidate();
+ }
+
+ public void setColor(int color) {
+ linePaint.setShader(null);
+ linePaint.setColor(color);
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ dashPath.reset();
+ dashPath.moveTo((float) getWidth()/2, 0);
+ dashPath.lineTo((float) getWidth()/2,getHeight());
+ canvas.drawPath(dashPath,linePaint);
+ }
+}
diff --git a/OCH/mogo-och-bus/src/main/res/color/bus_autopilot_text_color_selector.xml b/OCH/mogo-och-bus/src/main/res/color/bus_autopilot_text_color_selector.xml
new file mode 100644
index 0000000000..15f6897792
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/color/bus_autopilot_text_color_selector.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_badcase_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_badcase_btn_bg.png
new file mode 100644
index 0000000000..89a6eaa5dc
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_badcase_btn_bg.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_base_icon_not_in_autopilot.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_base_slide_block.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_base_slide_block.png
new file mode 100644
index 0000000000..ed7b293b90
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_base_slide_block.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_disable_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_disable_autopilot_icon.png
new file mode 100644
index 0000000000..170f254cd1
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_disable_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_icon_arrived_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_icon_arriving_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_loading_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_loading_autopilot_icon.png
new file mode 100644
index 0000000000..f21a1081f1
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_loading_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_och_dot_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_och_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_och_dot_line.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_right_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_right_autopilot_icon.png
new file mode 100644
index 0000000000..cc2b18083d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_right_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_setting_btn_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_setting_btn_bg.png
new file mode 100644
index 0000000000..ba41bf3a53
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_switch_map_angle.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_switch_map_angle.png
new file mode 100644
index 0000000000..3e1b96f3e3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_switch_map_angle.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_wrong_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_wrong_autopilot_icon.png
new file mode 100644
index 0000000000..0c8988acb3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1440/bus_wrong_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_in_autopilot.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_in_autopilot.png
new file mode 100644
index 0000000000..75c26c3d71
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_in_autopilot.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..21dc719ec9
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_notice_box_bg.9.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_notice_box_bg.9.png
new file mode 100644
index 0000000000..8b4b579b56
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_notice_box_bg.9.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png
new file mode 100644
index 0000000000..8ffd0abe52
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_base_slide_block.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_disable_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_disable_autopilot_icon.png
new file mode 100644
index 0000000000..170f254cd1
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_disable_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_dot_line.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_dot_line.png
new file mode 100644
index 0000000000..186001352c
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_dot_line.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_ic_autopilot.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_ic_autopilot.png
new file mode 100644
index 0000000000..be978145dc
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_ic_autopilot.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png
new file mode 100644
index 0000000000..a676a789c3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png
new file mode 100644
index 0000000000..e1fd463963
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_not_arrive_station.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_not_arrive_station.png
new file mode 100644
index 0000000000..e0bb24c526
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_icon_not_arrive_station.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_loading_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_loading_autopilot_icon.png
new file mode 100644
index 0000000000..f21a1081f1
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_loading_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_right_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_right_autopilot_icon.png
new file mode 100644
index 0000000000..cc2b18083d
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_right_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_switch_map_angle.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_switch_map_angle.png
new file mode 100644
index 0000000000..3e1b96f3e3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_switch_map_angle.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_wrong_autopilot_icon.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_wrong_autopilot_icon.png
new file mode 100644
index 0000000000..0c8988acb3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/bus_wrong_autopilot_icon.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/img_bus_status_bg.png b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/img_bus_status_bg.png
new file mode 100644
index 0000000000..27cb9285d3
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable-xhdpi/img_bus_status_bg.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml
new file mode 100644
index 0000000000..a830539009
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg.xml
@@ -0,0 +1,46 @@
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg_check.png b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg_check.png
new file mode 100644
index 0000000000..28857974b5
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg_check.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg_nor.png b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg_nor.png
new file mode 100644
index 0000000000..f7d4f92c4b
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable/bus_autopilot_status_bg_nor.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_base_autopilot_status_icon_selector.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_base_autopilot_status_icon_selector.xml
new file mode 100644
index 0000000000..94555d78cc
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_base_autopilot_status_icon_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_operation_status_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_operation_status_bg.xml
new file mode 100644
index 0000000000..753d85e3ec
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_operation_status_bg.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_dw_grey_bottom_bkg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_anchor_bkg.xml
similarity index 54%
rename from modules/mogo-module-extensions/src/main/res/drawable/module_ext_dw_grey_bottom_bkg.xml
rename to OCH/mogo-och-bus/src/main/res/drawable/bus_panel_anchor_bkg.xml
index 68f51f1d56..38fc28d893 100644
--- a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_dw_grey_bottom_bkg.xml
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_anchor_bkg.xml
@@ -1,5 +1,5 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml
new file mode 100644
index 0000000000..204c5fc692
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_panel_bkg.xml
@@ -0,0 +1,19 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_station_green_dash_line.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_station_green_dash_line.xml
new file mode 100644
index 0000000000..963cdf38be
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_station_green_dash_line.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_station_v_green_dash.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_station_v_green_dash.xml
new file mode 100644
index 0000000000..376e0a472c
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_station_v_green_dash.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_map_bg.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_map_bg.xml
new file mode 100644
index 0000000000..b34021d977
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_switch_map_bg.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_yi_biao_pan_bg_nor.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_yi_biao_pan_bg_nor.xml
new file mode 100644
index 0000000000..4bde0e73c1
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_yi_biao_pan_bg_nor.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/bus_yi_biao_pan_bg_speeding.xml b/OCH/mogo-och-bus/src/main/res/drawable/bus_yi_biao_pan_bg_speeding.xml
new file mode 100644
index 0000000000..dea7a88bb6
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/drawable/bus_yi_biao_pan_bg_speeding.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/drawable/img_bus_status_bg.9.png b/OCH/mogo-och-bus/src/main/res/drawable/img_bus_status_bg.9.png
new file mode 100644
index 0000000000..0af2b9db73
Binary files /dev/null and b/OCH/mogo-och-bus/src/main/res/drawable/img_bus_status_bg.9.png differ
diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
new file mode 100644
index 0000000000..93bfe40e64
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml
new file mode 100644
index 0000000000..84e1495b9c
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/layout/fragment_och_bus.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/layout/item_och_bus_station.xml b/OCH/mogo-och-bus/src/main/res/layout/item_och_bus_station.xml
new file mode 100644
index 0000000000..507ace60a7
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/layout/item_och_bus_station.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/raw/bus_away_passengers.json b/OCH/mogo-och-bus/src/main/res/raw/bus_away_passengers.json
new file mode 100644
index 0000000000..e76436f2dc
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/raw/bus_away_passengers.json
@@ -0,0 +1,184 @@
+{
+ "code": 0,
+ "msg": "",
+ "detailMsg": "",
+ "result": {
+ "info": [
+ {
+ "_id": "cee57b3ae07c4486b0357319368487d7",
+ "orderNo": "XB20210422000002",
+ "orderType": 10,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 1,
+ "startStation": "万集东门站",
+ "startStationCoordinate": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "endStationId": 2,
+ "endStation": "顺密路口站",
+ "endStationCoordinate": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "orderDispatchType": 7,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "2021-04-22 16:31:58",
+ "orderEndTime": "2021-04-26 10:38:13",
+ "arrivedStartStationTime": null,
+ "arrivedEndStationTime": null,
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "2021-04-22 16:31:58",
+ "updateTime": "2021-04-26 10:38:13",
+ "personNum": 1,
+ "travelDistance": 1.2,
+ "vehicleColour": null,
+ "lastBrandName": null,
+ "headImgUrl": null
+ },
+ {
+ "_id": "ce69b1bcfb9840c6a4563bc6ef947caf",
+ "orderNo": "XB20210426000000",
+ "orderType": 10,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 1,
+ "startStation": "万集东门站",
+ "startStationCoordinate": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "endStationId": 2,
+ "endStation": "顺密路口站",
+ "endStationCoordinate": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "orderDispatchType": 7,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "2021-04-26 10:38:48",
+ "orderEndTime": "2021-04-26 10:46:16",
+ "arrivedStartStationTime": null,
+ "arrivedEndStationTime": null,
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "2021-04-26 10:38:48",
+ "updateTime": "2021-04-26 10:46:16",
+ "personNum": 1,
+ "travelDistance": 1.2,
+ "vehicleColour": null,
+ "lastBrandName": null,
+ "headImgUrl": null
+ },
+ {
+ "_id": "cae07b56f41c4e0fa60ab3543ffc258e",
+ "orderNo": "XB20210426000001",
+ "orderType": 10,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 1,
+ "startStation": "万集东门站",
+ "startStationCoordinate": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "endStationId": 2,
+ "endStation": "顺密路口站",
+ "endStationCoordinate": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "orderDispatchType": 7,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "2021-04-26 10:47:05",
+ "orderEndTime": "2021-04-26 10:48:07",
+ "arrivedStartStationTime": null,
+ "arrivedEndStationTime": null,
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "2021-04-26 10:47:05",
+ "updateTime": "2021-04-26 10:48:07",
+ "personNum": 1,
+ "travelDistance": 1.2,
+ "vehicleColour": null,
+ "lastBrandName": null,
+ "headImgUrl": null
+ },
+ {
+ "_id": "62bc84afbc434d01b644c74ee406e772",
+ "orderNo": "XB20210426000002",
+ "orderType": 10,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 1,
+ "startStation": "万集东门站",
+ "startStationCoordinate": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "endStationId": 2,
+ "endStation": "顺密路口站",
+ "endStationCoordinate": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "orderDispatchType": 7,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "2021-04-26 10:48:22",
+ "orderEndTime": "2021-04-26 10:50:32",
+ "arrivedStartStationTime": null,
+ "arrivedEndStationTime": null,
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "2021-04-26 10:48:22",
+ "updateTime": "2021-04-26 10:50:32",
+ "personNum": 1,
+ "travelDistance": 1.2,
+ "vehicleColour": null,
+ "lastBrandName": null,
+ "headImgUrl": null
+ },
+ {
+ "_id": "fa3214c7a6ec411bb3d6edbc98907423",
+ "orderNo": "XB20210426000009",
+ "orderType": 10,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 1,
+ "startStation": "万集东门站",
+ "startStationCoordinate": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "endStationId": 2,
+ "endStation": "顺密路口站",
+ "endStationCoordinate": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "orderDispatchType": 7,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "2021-04-26 19:26:05",
+ "orderEndTime": "2021-04-27 14:35:50",
+ "arrivedStartStationTime": null,
+ "arrivedEndStationTime": null,
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "2021-04-26 19:26:05",
+ "updateTime": "2021-04-27 14:35:50",
+ "personNum": 1,
+ "travelDistance": 1.2,
+ "vehicleColour": null,
+ "lastBrandName": null,
+ "headImgUrl": null
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/raw/bus_order_1.json b/OCH/mogo-och-bus/src/main/res/raw/bus_order_1.json
new file mode 100644
index 0000000000..050b67447d
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/raw/bus_order_1.json
@@ -0,0 +1,28 @@
+{
+ "_id": "62bc84afbc434d01b644c74ee406e772",
+ "areaCode": "1001",
+ "carNum": "京NB010",
+ "cityCode": "010",
+ "createTime": "Apr 26, 2021 10:48:22 AM",
+ "endStation": "顺密路口站",
+ "endStationCoordinate": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "endStationId": 2,
+ "orderDispatchType": 1,
+ "orderNo": "XB20210426000002",
+ "orderStartTime": "Apr 26, 2021 10:48:22 AM",
+ "orderType": 10,
+ "sn": "F803EB2046PZD00149",
+ "startStation": "万集东门站",
+ "startStationCoordinate": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "startStationId": 1,
+ "travelDistance": 1.2,
+ "updateTime": "Apr 26, 2021 10:48:23 AM",
+ "userName": "董QAD",
+ "userPhone": "15631204018"
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/raw/bus_station_list1.json b/OCH/mogo-och-bus/src/main/res/raw/bus_station_list1.json
new file mode 100644
index 0000000000..c74daa1174
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/raw/bus_station_list1.json
@@ -0,0 +1,69 @@
+{
+ "code": 0,
+ "msg": "",
+ "detailMsg": "",
+ "result": {
+ "site": [
+ {
+ "lineId": 1.0,
+ "siteId": 1.0,
+ "siteName": "万集东门站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "lon": 116.7354579447,
+ "lat": 40.1974932972,
+ "siteDesc": "万集东门站",
+ "siteState": 1.0,
+ "isCurrentSite": 1.0,
+ "siteColor": 1.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ },
+ {
+ "lineId": 1.0,
+ "siteId": 2.0,
+ "siteName": "市政府前街18号",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.729134342,
+ 40.1953113732
+ ],
+ "lon": 116.729134342,
+ "lat": 40.1953113732,
+ "siteDesc": "市政府前街18号",
+ "siteState": 1.0,
+ "isCurrentSite": 3.0,
+ "siteColor": 2.0,
+ "peoples": "0",
+ "ifStop": 0.0
+ },
+ {
+ "lineId": 1.0,
+ "siteId": 3.0,
+ "siteName": "顺密路口站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "lon": 116.721520973,
+ "lat": 40.1940181096,
+ "siteDesc": "顺密路口站",
+ "siteState": 1.0,
+ "isCurrentSite": 0.0,
+ "siteColor": 0.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/raw/bus_station_list2.json b/OCH/mogo-och-bus/src/main/res/raw/bus_station_list2.json
new file mode 100644
index 0000000000..48d6782cc3
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/raw/bus_station_list2.json
@@ -0,0 +1,109 @@
+{
+ "code": 0,
+ "msg": "",
+ "detailMsg": "",
+ "result": {
+ "site": [
+ {
+ "lineId": 1.0,
+ "siteId": 1.0,
+ "siteName": "万集东门站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.7354579447,
+ 40.1974932972
+ ],
+ "lon": 116.7354579447,
+ "lat": 40.1974932972,
+ "siteDesc": "万集东门站",
+ "siteState": 1.0,
+ "isCurrentSite": 0.0,
+ "siteColor": 0.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ },
+ {
+ "lineId": 1.0,
+ "siteId": 1.0,
+ "siteName": "万集东门站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.7374429112,
+ 40.2023987087
+ ],
+ "lon": 116.7374429112,
+ "lat": 40.2023987087,
+ "siteDesc": "万集东门站",
+ "siteState": 1.0,
+ "isCurrentSite": 0.0,
+ "siteColor": 0.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ },
+ {
+ "lineId": 1.0,
+ "siteId": 2.0,
+ "siteName": "顺密路口站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.721520973,
+ 40.1940181096
+ ],
+ "lon": 116.721520973,
+ "lat": 40.1940181096,
+ "siteDesc": "顺密路口站",
+ "siteState": 1.0,
+ "isCurrentSite": 1.0,
+ "siteColor": 1.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ },
+ {
+ "lineId": 1.0,
+ "siteId": 2.0,
+ "siteName": "顺密路口站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.723146,
+ 40.179637
+ ],
+ "lon": 116.723146,
+ "lat": 40.179637,
+ "siteDesc": "顺密路口站",
+ "siteState": 1.0,
+ "isCurrentSite": 1.0,
+ "siteColor": 1.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ },
+ {
+ "lineId": 2.0,
+ "siteId": 2.0,
+ "siteName": "顺密路口站",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "areaName": "顺义区",
+ "currentLocation": [
+ 116.738835502,
+ 40.2023958306
+ ],
+ "lon": 116.738835502,
+ "lat": 40.2023958306,
+ "siteDesc": "顺密路口站",
+ "siteState": 1.0,
+ "isCurrentSite": 1.0,
+ "siteColor": 1.0,
+ "peoples": "0",
+ "ifStop": 1.0
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml
new file mode 100644
index 0000000000..0a257a4014
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1440/dimens.xml
@@ -0,0 +1,119 @@
+
+
+
+ 300px
+ 348px
+ 211px
+ 276px
+
+
+ 220px
+ 98px
+ 159px
+
+ 32px
+ 20px
+ 42px
+ 32px
+
+ 15px
+
+ 20px
+ 36px
+ 28px
+ 36px
+
+ 3px
+ 3px
+ 17px
+ 17px
+
+
+ 300px
+ 270px
+ 30px
+ 24px
+ 24px
+ 1px
+ 30px
+ 23px
+ 30px
+ 146px
+ 20px
+ 23px
+ 30px
+ 23px
+ 26px
+ 32px
+ 20px
+ 80px
+ 3px
+ 44.5px
+ 20px
+ 28px
+ 27px
+
+
+ 25.6px
+ 20px
+ 20px
+ 16px
+ 16px
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 530px
+ 492px
+
+ 20px
+ 20px
+ 70px
+ 130px
+ 93px
+ 150px
+ 70px
+
+ 24px
+ 460px
+ 140px
+
+ 112px
+ 112px
+
+ 92px
+
+ 30px
+ 466px
+ 414px
+
+
+ 36px
+ 13px
+ 12px
+ 350px
+
+ 460px
+ 30px
+
+ 110px
+ 40px
+ 320px
+ 20px
+ 40px
+ 320px
+ 460px
+ 70px
+ 460px
+ 130px
+ 30px
+ 279px
+ 112px
+ 22px
+ 36px
+ 50px
+ 60px
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml
new file mode 100644
index 0000000000..b4b6ec1da2
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/values-xhdpi-2560x1600/dimens.xml
@@ -0,0 +1,119 @@
+
+
+
+ 300px
+ 348px
+ 211px
+ 276px
+
+
+ 220px
+ 98px
+ 159px
+
+ 32px
+ 20px
+ 42px
+ 32px
+
+ 15px
+
+ 20px
+ 36px
+ 28px
+ 36px
+
+ 3px
+ 3px
+ 17px
+ 17px
+
+
+ 300px
+ 270px
+ 30px
+ 24px
+ 24px
+ 1px
+ 30px
+ 23px
+ 30px
+ 146px
+ 20px
+ 23px
+ 30px
+ 23px
+ 26px
+ 32px
+ 20px
+ 80px
+ 3px
+ 44.5px
+ 20px
+ 28px
+ 27px
+
+
+ 25.6px
+ 20px
+ 20px
+ 16px
+ 16px
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 530px
+ 492px
+
+ 20px
+ 20px
+ 70px
+ 130px
+ 93px
+ 150px
+ 70px
+
+ 24px
+ 460px
+ 140px
+
+ 112px
+ 112px
+
+ 92px
+
+ 30px
+ 466px
+ 414px
+
+
+ 36px
+ 13px
+ 12px
+ 350px
+
+ 460px
+ 30px
+
+ 110px
+ 40px
+ 320px
+ 20px
+ 40px
+ 320px
+ 460px
+ 70px
+ 460px
+ 130px
+ 30px
+ 276px
+ 112px
+ 22px
+ 36px
+ 50px
+ 60px
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values/attrs.xml b/OCH/mogo-och-bus/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000..33fc037d9c
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/values/attrs.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values/colors.xml b/OCH/mogo-och-bus/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..d00508078d
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/values/colors.xml
@@ -0,0 +1,36 @@
+
+
+ #FF1FA7FF
+ #FFFFFFFF
+ #FFFFFFFF
+ #FF51649D
+ #7F8299EB
+
+ #51649D
+ #427d8e
+ #1FA7FF
+ #3FC281
+ #427d8e
+ #3FC281
+
+ #FFFFFF
+ #99FFFFFF
+ #FF52BBFF
+
+ #BF30334C
+ #fff
+ #f1f1f1
+
+ #7DE261
+ #FF2B2B
+ #E3BC59
+ #FFF
+ #256BFF
+ #FFFFFF
+
+ #DB3137
+ #3E77F6
+ #323C6F
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values/dimens.xml b/OCH/mogo-och-bus/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..6fcc61920c
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/values/dimens.xml
@@ -0,0 +1,135 @@
+
+
+
+ 300px
+ 348px
+ 211px
+ 276px
+
+
+ 220px
+ 98px
+ 159px
+
+ 32px
+ 20px
+ 26px
+ 20px
+
+ 15px
+
+ 20px
+ 36px
+ 28px
+ 36px
+
+ 3px
+ 3px
+ 17px
+ 17px
+
+
+ 300px
+ 270px
+ 30px
+ 24px
+ 24px
+ 1px
+ 30px
+ 23px
+ 30px
+ 146px
+ 20px
+ 23px
+ 30px
+ 23px
+ 26px
+ 20px
+ 20px
+ 80px
+ 3px
+ 27px
+ 20px
+ 28px
+ 27px
+
+ 16px
+ 16px
+ 16px
+ 16px
+ 16px
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 345px
+ 492px
+
+ 15px
+ 15px
+ 40px
+ 50px
+ 50px
+ 70px
+ 40px
+
+ 24px
+ 300px
+ 100px
+
+ 100px
+ 100px
+
+ 35px
+
+ 15px
+ 300px
+ 270px
+
+ 30px
+ 13px
+ 12px
+ 288px
+
+ 460px
+ 30px
+
+ 80px
+ 28px
+ 200px
+ 10px
+ 40px
+ 200px
+ 300px
+ 60px
+ 300px
+ 110px
+ 20px
+
+ #FFFFFF
+ #4DFFFFFF
+ #FFFFFF
+ #323C6F
+ 10px
+ 20px
+ 200px
+ 52px
+ 65px
+ 20px
+ 50px
+ 20px
+ 38px
+ 33px
+ 368px
+ 76px
+ 38px
+ 190px
+ 76px
+ 16px
+ 24px
+ 35px
+ 822px
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-bus/src/main/res/values/strings.xml b/OCH/mogo-och-bus/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..7c837211af
--- /dev/null
+++ b/OCH/mogo-och-bus/src/main/res/values/strings.xml
@@ -0,0 +1,8 @@
+
+ 近距视角
+ 远距视角
+ 启动中…
+ 启动成功
+ 启动失败
+ 自动驾驶
+
diff --git a/libraries/map-autonavi/.gitignore b/OCH/mogo-och-noop/.gitignore
similarity index 100%
rename from libraries/map-autonavi/.gitignore
rename to OCH/mogo-och-noop/.gitignore
diff --git a/foudations/mogo-base-websocket-sdk/build.gradle b/OCH/mogo-och-noop/build.gradle
similarity index 63%
rename from foudations/mogo-base-websocket-sdk/build.gradle
rename to OCH/mogo-och-noop/build.gradle
index 591c49afc3..2c5e33b374 100644
--- a/foudations/mogo-base-websocket-sdk/build.gradle
+++ b/OCH/mogo-och-noop/build.gradle
@@ -1,16 +1,29 @@
apply plugin: 'com.android.library'
+apply plugin: 'com.alibaba.arouter'
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
}
buildTypes {
@@ -19,27 +32,25 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
+ implementation rootProject.ext.dependencies.androidxappcompat
implementation rootProject.ext.dependencies.arouter
- implementation rootProject.ext.dependencies.mogowebsocket
-
+ annotationProcessor rootProject.ext.dependencies.aroutercompiler
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.mogoutils
implementation rootProject.ext.dependencies.mogocommons
- implementation rootProject.ext.dependencies.mogoserviceapi
- } else {
- implementation project(":foudations:mogo-utils")
+ implementation rootProject.ext.dependencies.modulecommon
+ implementation rootProject.ext.dependencies.mogo_core_data
+ implementation rootProject.ext.dependencies.mogo_core_function_call
+ }else {
+ implementation project(":core:mogo-core-utils")
implementation project(":foudations:mogo-commons")
- implementation project(":services:mogo-service-api")
implementation project(':modules:mogo-module-common')
+ implementation project(':core:mogo-core-data')
+ implementation project(':core:mogo-core-function-call')
}
}
diff --git a/modules/mogo-module-adas/consumer-rules.pro b/OCH/mogo-och-noop/consumer-rules.pro
similarity index 100%
rename from modules/mogo-module-adas/consumer-rules.pro
rename to OCH/mogo-och-noop/consumer-rules.pro
diff --git a/OCH/mogo-och-noop/gradle.properties b/OCH/mogo-och-noop/gradle.properties
new file mode 100644
index 0000000000..a3c4fc4290
--- /dev/null
+++ b/OCH/mogo-och-noop/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.och
+POM_ARTIFACT_ID=och-noop
+VERSION_CODE=1
diff --git a/libraries/map-autonavi/proguard-rules.pro b/OCH/mogo-och-noop/proguard-rules.pro
similarity index 100%
rename from libraries/map-autonavi/proguard-rules.pro
rename to OCH/mogo-och-noop/proguard-rules.pro
diff --git a/foudations/mogo-base-websocket-sdk/src/main/AndroidManifest.xml b/OCH/mogo-och-noop/src/main/AndroidManifest.xml
similarity index 69%
rename from foudations/mogo-base-websocket-sdk/src/main/AndroidManifest.xml
rename to OCH/mogo-och-noop/src/main/AndroidManifest.xml
index 164c03d1ce..83e4053945 100644
--- a/foudations/mogo-base-websocket-sdk/src/main/AndroidManifest.xml
+++ b/OCH/mogo-och-noop/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
+ package="com.mogo.och.bus">
/
\ No newline at end of file
diff --git a/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/IMogoOCH.java b/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/IMogoOCH.java
new file mode 100644
index 0000000000..073f7fcc29
--- /dev/null
+++ b/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/IMogoOCH.java
@@ -0,0 +1,24 @@
+package com.mogo.och.bus;
+
+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-noop/src/main/java/com/mogo/och/bus/MogoOCHNoop.java b/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/MogoOCHNoop.java
new file mode 100644
index 0000000000..431a3a1992
--- /dev/null
+++ b/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/MogoOCHNoop.java
@@ -0,0 +1,57 @@
+package com.mogo.och.bus;
+
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 描述
+ */
+@Route(path = OCHConstants.PATH)
+public class MogoOCHNoop implements IMogoOCH , IMogoStatusChangedListener {
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity activity, @Nullable Integer containerId) {
+ return null;
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ @Override
+ public void init(Context context) {
+
+ }
+
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+
+ }
+}
diff --git a/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/OCHConstants.java b/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/OCHConstants.java
new file mode 100644
index 0000000000..28e5686048
--- /dev/null
+++ b/OCH/mogo-och-noop/src/main/java/com/mogo/och/bus/OCHConstants.java
@@ -0,0 +1,16 @@
+package com.mogo.och.bus;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 网约车部分常量字段
+ */
+class OCHConstants {
+
+ /**
+ * arouter 路由地址
+ */
+ public static final String PATH = "/och/api";
+}
diff --git a/modules/mogo-module-adas/.gitignore b/OCH/mogo-och-taxi-passenger/.gitignore
similarity index 100%
rename from modules/mogo-module-adas/.gitignore
rename to OCH/mogo-och-taxi-passenger/.gitignore
diff --git a/OCH/mogo-och-taxi-passenger/build.gradle b/OCH/mogo-och-taxi-passenger/build.gradle
new file mode 100644
index 0000000000..8b22040630
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/build.gradle
@@ -0,0 +1,75 @@
+apply plugin: 'com.android.library'
+apply plugin: 'com.alibaba.arouter'
+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
+ }
+
+ buildTypes {
+ 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 'androidx.recyclerview:recyclerview:1.1.0'
+ implementation 'com.google.android.material:material:1.2.1'
+ annotationProcessor rootProject.ext.dependencies.aroutercompiler
+ implementation rootProject.ext.dependencies.rxandroid
+ implementation rootProject.ext.dependencies.androidxconstraintlayout
+ implementation rootProject.ext.dependencies.amapnavi3dmap
+ if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.modulecommon
+ implementation rootProject.ext.dependencies.mogo_core_data
+ implementation rootProject.ext.dependencies.mogo_core_function_call
+ implementation rootProject.ext.dependencies.mogo_core_function_smp
+ implementation rootProject.ext.dependencies.mogo_core_function_v2x
+ }else {
+ implementation project(":core:mogo-core-utils")
+ implementation project(":foudations:mogo-commons")
+ implementation project(':modules:mogo-module-common')
+ implementation project(':core:mogo-core-data')
+ implementation project(':core:mogo-core-function-call')
+ implementation project(':core:function-impl:mogo-core-function-smp')
+ implementation project(':core:function-impl:mogo-core-function-v2x')
+ }
+}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/consumer-rules.pro b/OCH/mogo-och-taxi-passenger/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/OCH/mogo-och-taxi-passenger/gradle.properties b/OCH/mogo-och-taxi-passenger/gradle.properties
new file mode 100644
index 0000000000..1aa38956f3
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/gradle.properties
@@ -0,0 +1,3 @@
+GROUP=com.mogo.och
+POM_ARTIFACT_ID=och-taxi-passenger
+VERSION_CODE=1
diff --git a/OCH/mogo-och-taxi-passenger/libs/pinyin4j-2.5.1.jar b/OCH/mogo-och-taxi-passenger/libs/pinyin4j-2.5.1.jar
new file mode 100644
index 0000000000..8446c53fce
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/libs/pinyin4j-2.5.1.jar differ
diff --git a/modules/mogo-module-adas/proguard-rules.pro b/OCH/mogo-och-taxi-passenger/proguard-rules.pro
similarity index 100%
rename from modules/mogo-module-adas/proguard-rules.pro
rename to OCH/mogo-och-taxi-passenger/proguard-rules.pro
diff --git a/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..8b529701ba
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+ /
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/IMogoOCH.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/IMogoOCH.java
new file mode 100644
index 0000000000..1788ea2695
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/IMogoOCH.java
@@ -0,0 +1,24 @@
+package com.mogo.och.taxi.passenger;
+
+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-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java
new file mode 100644
index 0000000000..8a9b2a2233
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxi.java
@@ -0,0 +1,106 @@
+package com.mogo.och.taxi.passenger;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
+import com.mogo.och.taxi.passenger.ui.OCHTaxiFragment;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 网约车-出租车
+ */
+@Route( path = OCHTaxiConst.PATH )
+class MogoOCHTaxi implements IMogoOCH, IMogoStatusChangedListener {
+
+ private static final String TAG = "MogoOCHTaxi";
+ private OCHTaxiFragment ochTaxiFragment;
+ private FragmentActivity mActivity;
+ private int mContainerId;
+ @Override
+ public void init( Context context ) {
+ Logger.d( TAG, "init" );
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.VR_MODE,this);
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.TOP_VIEW,this);
+ }
+
+ /**
+ * 进入鹰眼模式,设置手势缩放地图失效
+ */
+ private void stepIntoVrMode() {
+ Logger.d( TAG, "进入vr模式" );
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getMapServiceApi()
+ .getMapUIController()
+ .openVrMode( false );
+ }
+
+ private void showFragment() {
+ if (ochTaxiFragment == null) {
+ Logger.d(TAG, "准备add fragment======");
+ ochTaxiFragment = new OCHTaxiFragment();
+ mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, ochTaxiFragment).commitAllowingStateLoss();
+ return;
+ }
+ Logger.d(TAG, "准备show fragment");
+ mActivity.getSupportFragmentManager().beginTransaction().show(ochTaxiFragment).commitAllowingStateLoss();
+ }
+
+ private void hideFragment(){
+ if (ochTaxiFragment != null){
+ mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiFragment).commitAllowingStateLoss();
+ }
+ }
+
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (descriptor == StatusDescriptor.VR_MODE){
+ if (isTrue){
+ showFragment();
+ }else {
+ hideFragment();
+ }
+ }
+ }
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
+ this.mActivity = fragmentActivity;
+ this.mContainerId = integer;
+
+ UiThreadHandler.postDelayed(() -> stepIntoVrMode(), 5_000L);
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+}
diff --git a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/overlay/LineOverlayManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java
similarity index 65%
rename from modules/mogo-module-adas/src/main/java/com/mogo/module/adas/overlay/LineOverlayManager.java
rename to OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java
index 9e06a612a7..e56ae47928 100644
--- a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/overlay/LineOverlayManager.java
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/OCHTaxiOverlayManager.java
@@ -1,23 +1,21 @@
-package com.mogo.module.adas.overlay;
+package com.mogo.och.taxi.passenger;
import android.content.Context;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.data.map.MogoLocation;
-import com.mogo.eagle.core.network.utils.GsonUtil;
+import com.mogo.eagle.core.function.v2x.events.utils.LocationUtils;
+import com.mogo.eagle.core.utilcode.util.ColorUtils;
import com.mogo.map.overlay.IMogoOverlayManager;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.module.common.MogoApisHandler;
-import com.mogo.utils.ColorUtils;
-import com.mogo.utils.logger.Logger;
-
import java.util.ArrayList;
import java.util.List;
-public class LineOverlayManager {
+public class OCHTaxiOverlayManager {
+
- private static final String TAG = "LineOverlayManager";
private IMogoPolyline mMoGoPolyline;
// 连接线参数
private MogoPolylineOptions mPolylineOptions;
@@ -25,14 +23,9 @@ public class LineOverlayManager {
private List mPolylinePointList;
// 渐变色
private List mPolylineColors;
-
- IMogoOverlayManager mogoOverlayManager;
-
private Context mContext;
-
- private IAdasLineOverlayListener lineOverlayListener;
-
- public LineOverlayManager(Context context) {
+ IMogoOverlayManager mogoOverlayManager;
+ public OCHTaxiOverlayManager(Context context) {
mPolylineOptions = new MogoPolylineOptions();
// 绘制路径集合
mPolylinePointList = new ArrayList<>();
@@ -42,49 +35,37 @@ public class LineOverlayManager {
mogoOverlayManager = MogoApisHandler.getInstance().getApis().getMapServiceApi().getOverlayManager(mContext);
}
- public void setIAdasLineOverlayListener(IAdasLineOverlayListener listener){
- this.lineOverlayListener = listener;
- }
-
/**
* 绘制最优路线
*
* @param polylinePoint 要绘制的经纬度度集合
*/
- public void draw(MogoLocation carLocal, List polylinePoint) {
- Logger.d(TAG,"ready to draw");
+ public IMogoPolyline draw(MogoLocation carLocal, List polylinePoint) {
if (mMoGoPolyline != null) {
mMoGoPolyline.remove();
mPolylinePointList.clear();
mPolylineColors.clear();
}
if (polylinePoint != null) {
- Logger.d(TAG,"draw");
+
// 将当前车辆位置放进去
+ mPolylinePointList.add(new MogoLatLng(carLocal.getLatitude(), carLocal.getLongitude()));
// 过滤后台推送的推荐路线集合
for (MogoLatLng polyline : polylinePoint) {
//需要剔除已经行驶过的经纬度,这里需要比对推荐路线集合中的点是否在当前车辆行驶方向前面如果不在则抛弃
-// if (LocationUtils.isPointOnCarFront(carLocal, polyline)) {
+ if (LocationUtils.isPointOnCarFront(carLocal, polyline)) {
mPolylinePointList.add(polyline);
-// }
+ }
}
- if(mPolylinePointList.size() < 2 && lineOverlayListener != null){
- Logger.d(TAG,"finish line");
- lineOverlayListener.finishLine();
- }
- Logger.d(TAG,"point list size : " + mPolylinePointList.size() + " json : " + GsonUtil.jsonFromObject(mPolylinePointList));
mPolylineColors.addAll(ColorUtils.getGradientAlpha("#002965ED", "#FF2965ED", "#002965ED", mPolylinePointList.size()));
// 替换路径集合
- mPolylineOptions.setGps(true);
mPolylineOptions.points(mPolylinePointList);
// 线条粗细,渐变,渐变色值
mPolylineOptions.width(25).useGradient(true).colorValues(mPolylineColors);
// 绘制线
mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions);
}
+ return mMoGoPolyline;
}
- public interface IAdasLineOverlayListener{
- void finishLine();
- }
}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/CarHeartbeatReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/CarHeartbeatReqBean.java
new file mode 100644
index 0000000000..5b0d3282f0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/CarHeartbeatReqBean.java
@@ -0,0 +1,26 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
+
+import java.util.UUID;
+
+/**
+ * Created on 2021/9/16
+ *
+ * 上传车机心跳信息请求数据
+ */
+public class CarHeartbeatReqBean {
+ public String sn;
+ public double lon; //经度
+ public double lat; //纬度
+ public String msgId; //心跳信息唯一标识
+ public int interval; //上报间隔,单位秒,非必传,默认60秒
+
+ public CarHeartbeatReqBean(String sn, double lon, double lat) {
+ this.sn = sn;
+ this.lon = lon;
+ this.lat = lat;
+ this.msgId = UUID.randomUUID().toString();
+ this.interval = (int) (OCHTaxiConst.LOOP_PERIOD_60S / 1000);
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverServiceDataRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverServiceDataRespBean.java
new file mode 100644
index 0000000000..09251e601b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverServiceDataRespBean.java
@@ -0,0 +1,21 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/17
+ *
+ * 司机运营数据返回数据结构
+ */
+public class DriverServiceDataRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public Immediate immediate; //daily数据
+ }
+
+ public static class Immediate {
+ public long timeDuration; //当日在线时长,单位秒
+ public long orderNum; //当日完成订单数
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusQueryRespBean.java
new file mode 100644
index 0000000000..0081acf8e0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusQueryRespBean.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 收车/出车状态查询返回数据结构
+ */
+public class DriverStatusQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public int serviceStatus; //0收车,1出车
+ public long serviceOrderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusUpdateReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusUpdateReqBean.java
new file mode 100644
index 0000000000..8dfa1af49c
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/DriverStatusUpdateReqBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 收车/出车状态更新请求数据结构
+ */
+public class DriverStatusUpdateReqBean {
+ public String sn;
+ public int status; //0收车,1出车
+
+ public DriverStatusUpdateReqBean(String sn, int status) {
+ this.sn = sn;
+ this.status = status;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderCancelReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderCancelReqBean.java
new file mode 100644
index 0000000000..78ce76e482
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderCancelReqBean.java
@@ -0,0 +1,20 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 司机取消订单请求的数据结构
+ */
+public class OrderCancelReqBean {
+ public String sn;
+ public long order_id; //订单号(必须)
+ public int cancel_type; //取消类型(必须)
+ public String cancel_reason; //取消原因(必须)
+
+ public OrderCancelReqBean(String sn, long order_id, int cancel_type, String cancel_reason) {
+ this.sn = sn;
+ this.order_id = order_id;
+ this.cancel_type = cancel_type;
+ this.cancel_reason = cancel_reason;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabReqBean.java
new file mode 100644
index 0000000000..c96c2d5ee8
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabReqBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created on 2021/9/7
+ *
+ * (预约单)抢单动作的请求数据结构
+ */
+public class OrderGrabReqBean {
+ public String sn;
+ public long orderId;
+
+ public OrderGrabReqBean(String sn, long orderId) {
+ this.sn = sn;
+ this.orderId = orderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabRespBean.java
new file mode 100644
index 0000000000..bc4970b7e3
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabRespBean.java
@@ -0,0 +1,12 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/7
+ *
+ * (预约单)抢单动作的返回数据结构
+ */
+public class OrderGrabRespBean extends BaseData {
+ public long data; // 暂不使用
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabStatusQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabStatusQueryRespBean.java
new file mode 100644
index 0000000000..1e64ef93f1
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderGrabStatusQueryRespBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/7
+ *
+ * (预约单)查询抢单结果的返回数据结构
+ */
+public class OrderGrabStatusQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public int grabStatus; //0:抢单中; 1:抢单结束,匹配; 2:抢单结束,匹配到其他司机;3:订单已取消;4:非法,不是选择的自己
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryReqBean.java
new file mode 100644
index 0000000000..d0a1c79b09
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryReqBean.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单信息请求数据结构
+ */
+public class OrderQueryReqBean {
+
+ public String sn;
+ public long orderId;
+
+ public OrderQueryReqBean(String sn, long orderId) {
+ this.sn = sn;
+ this.orderId = orderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRespBean.java
new file mode 100644
index 0000000000..51b901163e
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRespBean.java
@@ -0,0 +1,88 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单返回数据结构
+ */
+public class OrderQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result implements Comparable{
+ // 订单id
+ public long orderId;
+ // 订单类型
+ public int orderType; //1即时单 2预约单
+ // 订单状态
+ public int orderStatus;
+ // 订单运营类型 (9出租车,10小巴)
+ public int businessType;
+ // 起始站点id
+ public int startSiteId;
+ // 起始站点名称
+ public String startSiteAddr;
+ // 起始站点坐标
+ public List startSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List startSiteGcjPoint; //高德坐标,用于本地计算距离 [lon,lat]
+ // 终点站点id
+ public int endSiteId;
+ // 终点站点名称
+ public String endSiteAddr;
+ // 终点站点坐标
+ public List endSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List endSiteGcjPoint; //高德坐标,用于计算距离 [lon,lat]
+
+ // 车牌号
+ public String carNumber;
+ //订单创建时间戳
+ public long createTime;
+ //开始服务时间戳:司机点击'开始服务'后订单状态更新成功的时间
+ public long startTime;
+ //预计用车时间:预约单=下单时的预约用车时间;即时单=派单成功的时间+预估的达到上车点的时间
+ public long bookingTime;
+
+
+
+ // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km
+ public double travelDistance;
+
+ /**
+ * @param distance
+ */
+ public void decreaseTravelDistance( double distance ) {
+ travelDistance = ( ( float ) distance / 1000f );
+ if ( travelDistance < 0 ) {
+ travelDistance = 0;
+ }
+ }
+
+ @Override
+ public int compareTo(Result o) {
+ long result = this.orderId - o.orderId;
+ return result == 0 ? 0 : (result > 0 ? 1 : -1);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Result result = (Result) o;
+ return orderId == result.orderId &&
+ orderType == result.orderType &&
+ orderStatus == result.orderStatus &&
+ businessType == result.businessType;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId, orderType, orderStatus, businessType, startSiteId,
+ startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
+ endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoReqBean.java
new file mode 100644
index 0000000000..bcaf6658bd
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoReqBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created on 2021/9/7
+ *
+ * 查询订单路径信息(起始点里程、预估时间等)请求数据结构
+ */
+public class OrderQueryRouteInfoReqBean {
+ public String sn;
+ public long orderId;
+
+ public OrderQueryRouteInfoReqBean(String sn, long orderId) {
+ this.sn = sn;
+ this.orderId = orderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoRespBean.java
new file mode 100644
index 0000000000..551e70925f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderQueryRouteInfoRespBean.java
@@ -0,0 +1,22 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created on 2021/9/7
+ *
+ * 查询订单路径信息(起始点里程、预估时间等)返回数据结构
+ */
+public class OrderQueryRouteInfoRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ // 到上车点
+ public long durationToStart; //司机绑定时的位置距离上车点时长,单位:秒
+ public long distanceToStart; //司机绑定时的位置距离上车点距离,单位:米
+
+ // 起点至终点
+ public long durationToEnd; //订单上车点到目的地的时长,单位:秒
+ public long distanceToEnd; //订单上车点到目的地的距离,单位:米
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderStatusUpdateReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderStatusUpdateReqBean.java
new file mode 100644
index 0000000000..6d99c1e0bf
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrderStatusUpdateReqBean.java
@@ -0,0 +1,18 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 订单状态更新请求数据结构
+ */
+public class OrderStatusUpdateReqBean {
+ public String sn;
+ public long orderId;
+ public int orderStatus;
+
+ public OrderStatusUpdateReqBean(String sn, long orderId, int orderStatus) {
+ this.sn = sn;
+ this.orderId = orderId;
+ this.orderStatus = orderStatus;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersInServiceQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersInServiceQueryRespBean.java
new file mode 100644
index 0000000000..f594fd6178
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersInServiceQueryRespBean.java
@@ -0,0 +1,19 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * 查询全部服务中/待服务订单的返回数据
+ */
+public class OrdersInServiceQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List servicing; //服务中订单
+ public List waitService; //待服务订单
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryReqBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryReqBean.java
new file mode 100644
index 0000000000..767828d2d4
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryReqBean.java
@@ -0,0 +1,19 @@
+package com.mogo.och.taxi.passenger.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 查询订单列表请求数据结构
+ */
+public class OrdersListQueryReqBean {
+
+ public String sn;
+ public int page; //页码,从0开始
+ public int size; //每页条数
+
+ public OrdersListQueryReqBean(String sn, int page, int size) {
+ this.sn = sn;
+ this.page = page;
+ this.size = size;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryRespBean.java
new file mode 100644
index 0000000000..98e61a7fe8
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersListQueryRespBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+public class OrdersListQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List orders;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersNewBookingQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersNewBookingQueryRespBean.java
new file mode 100644
index 0000000000..3c9aad7030
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/OrdersNewBookingQueryRespBean.java
@@ -0,0 +1,18 @@
+package com.mogo.och.taxi.passenger.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * 查询新到的预约单的返回数据结构
+ */
+public class OrdersNewBookingQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public List orders;
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiADASStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiADASStatusCallback.java
new file mode 100644
index 0000000000..ff28cdbe95
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiADASStatusCallback.java
@@ -0,0 +1,20 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
+ */
+public interface IOCHTaxiADASStatusCallback {
+ // 自动驾驶触发的已到达目的地:暂未用到
+ void onAutopilotArriveEnd();
+
+ // 自动驾驶可用状态
+ void onAutopilotEnable();
+
+ // 自动驾驶不可用状态
+ void onAutopilotDisable();
+
+ // 自动驾驶运行中
+ void onAutopilotRunning();
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiAutopilotPlanningCallback.java
new file mode 100644
index 0000000000..2bbd29669f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiAutopilotPlanningCallback.java
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.passenger.callback;
+
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/1
+ */
+public interface IOCHTaxiAutopilotPlanningCallback {
+ void routeResult(List models);
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiCarStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiCarStatusCallback.java
new file mode 100644
index 0000000000..d59144e86c
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiCarStatusCallback.java
@@ -0,0 +1,12 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:出车/收车状态变更
+ */
+public interface IOCHTaxiCarStatusCallback {
+ void onCarStatusChanged(boolean inOperation);
+
+ void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiControllerStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiControllerStatusCallback.java
new file mode 100644
index 0000000000..f40c0ea82d
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiControllerStatusCallback.java
@@ -0,0 +1,15 @@
+package com.mogo.och.taxi.passenger.callback;
+
+import android.location.Location;
+
+/**
+ * Created on 2021/9/10
+ *
+ * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
+ */
+public interface IOCHTaxiControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(Location location);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiNaviChangedCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiNaviChangedCallback.java
new file mode 100644
index 0000000000..9205cd3e26
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiNaviChangedCallback.java
@@ -0,0 +1,11 @@
+package com.mogo.och.taxi.passenger.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/3
+ */
+public interface IOCHTaxiNaviChangedCallback {
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond);
+ void reInitNaviAmap(boolean isPlay,boolean isRestart);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiOrderStatusCallback.java
new file mode 100644
index 0000000000..4891db386f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiOrderStatusCallback.java
@@ -0,0 +1,48 @@
+package com.mogo.och.taxi.passenger.callback;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+
+import java.util.List;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
+ */
+public interface IOCHTaxiOrderStatusCallback {
+ // 进行中单变更:暂未用到
+ void onOrdersInServiceChanged(@NonNull List inServiceList);
+ // 待服务单变更
+ void onOrdersWaitServiceChanged(@NonNull List waitServiceList);
+
+ // 当前进行单状态变更:新到进行中订单、进行中单状态变更
+ void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
+ // 当前订单取消完成:用于司机主动取消订单的结果反馈
+ void onCurrentOrderCancelDone();
+ // 待服务单被取消
+ void onOrderCancelDone(long orderId);
+ // 当前订单route信息查询反馈
+ void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
+
+ // 获取全部订单列表(含已完成、已取消)的反馈
+ void onOrdersListPageRefresh(List ordersList);
+
+ // 新到预约单
+ void onNewBookingOrderGot(OrderQueryRespBean.Result order);
+
+ // 执行抢单动作完成:可进入抢单中状态
+ void onGrabOrderExecuteDone();
+
+ // 抢到预约单
+ void onGrabOrderSuccess(OrderQueryRespBean.Result order);
+
+ // 未抢到预约单
+ void onGrabOrderFailed(OrderQueryRespBean.Result order);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/Shadow.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/Shadow.kt
new file mode 100644
index 0000000000..6b678ce172
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/Shadow.kt
@@ -0,0 +1,65 @@
+package com.mogo.och.taxi.passenger.callback
+
+import androidx.annotation.ColorRes
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ */
+interface Shadow {
+ //设置阴影半径
+ fun setShadowRadius(radius:Float): Shadow
+
+ //添加单位设置
+ fun setShadowRadius(unit:Int,radius: Float): Shadow
+
+ //设置应用颜色
+ fun setShadowColor(color:Int): Shadow
+
+ //设置阴影颜色资源文件id
+ fun setShadowColorRes(@ColorRes color: Int): Shadow
+ /**
+ * 设置模糊半径
+ * @param radius
+ */
+ fun setBlurRadius(radius:Float): Shadow
+
+ /**
+ *
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param radius 模糊半径
+ */
+ fun setBlurRadius(unit:Int,radius:Float): Shadow
+
+ /**
+ * 设置水平方向的偏移量
+ * @param offset x轴偏移
+ */
+ fun setXOffset(offset:Float): Shadow
+
+
+ /**
+ * 设置x方向的偏移量,设置单位
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param offset x轴偏移
+ */
+ fun setXOffset(unit:Int,offset:Float): Shadow
+
+ /**
+ * 设置竖直方向的偏移量
+ * @param offset y轴偏移
+ */
+ fun setYOffset(offset:Float): Shadow
+
+ /**
+ * 设置竖直方向的偏移量,带单位
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param offset y轴偏移
+ */
+ fun setYOffset(unit:Int,offset:Float): Shadow
+
+ /**
+ * 更新绘制
+ */
+ fun commit();
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OCHTaxiConst.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OCHTaxiConst.kt
new file mode 100644
index 0000000000..da9eab278c
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OCHTaxiConst.kt
@@ -0,0 +1,43 @@
+package com.mogo.och.taxi.passenger.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class OCHTaxiConst {
+ companion object {
+
+ private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
+ private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
+ private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
+
+ @JvmStatic
+ fun getBaseUrl(): String {
+ return when (DebugConfig.getNetMode()) {
+ DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
+ DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
+ DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
+ else -> BASE_URL_OCH_RELEASE
+ }
+ }
+
+ // OCH arouter 路由path
+ const val PATH = "/och/api"
+
+ // 到达起始点围栏
+ const val ARRIVE_AT_START_STATION_DISTANCE = 50 //围栏由20m改为50m
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+
+ // 轮询查询进行中/待服务订单的间隔时间 2秒
+ const val LOOP_PERIOD_2S = 2 * 1000L
+ // 轮询查询新到预约单 1秒
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ // 订单信息
+ const val SP_KEY_OCH_TAXI_ORDER = "SP_KEY_OCH_TAXI_ORDER"
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderCancelReasons.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderCancelReasons.kt
new file mode 100644
index 0000000000..67150540de
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderCancelReasons.kt
@@ -0,0 +1,48 @@
+package com.mogo.och.taxi.passenger.constant
+
+/**
+ * 司机端取消订单的原因定义
+ * Created on 2021/12/7
+ *
+ * * String int
+ * 进行中订单:
+ * 车况异常 0
+ * 设备异常 1
+ * 电量不足 2
+ * 身体不适 3
+ * 乘客未到 4
+ * 乘客中途下车 5
+ *
+ * 待服务订单:
+ * 2000 车辆故障
+ * 2001 乘客联系取消
+ * 2002 行程冲突
+ * 2003 车电量不足
+ * 2004 其他
+ */
+enum class OrderCancelReasons(val type: Int, val msg: String) {
+ CarBroken(1000, "车况异常"),
+ DeviceBroken(1001, "设备异常"),
+ BatteryLow(1002, "电量不足"),
+ DriverIsIll(1003, "身体不适"),
+ PassengerNotArrive(1004, "乘客未到"),
+ PassengerStopOver(1005, "乘客中途下车"),
+
+ BookCarBroken(2000, "车辆故障"),
+ BookPassengerCancel(2001, "乘客联系取消"),
+ BookJourneyConflict(2002, "行程冲突"),
+ BookBatteryLow(2003, "车电量不足"),
+ BookOther(2004, "其他");
+
+ companion object {
+ @JvmStatic
+ fun getType(msg: String): Int {
+ for (value in values()) {
+ if (value.msg == msg) {
+ return value.type
+ }
+ }
+ return 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderStatusEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderStatusEnum.kt
new file mode 100644
index 0000000000..a16e12cdf2
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderStatusEnum.kt
@@ -0,0 +1,47 @@
+package com.mogo.och.taxi.passenger.constant
+
+/**
+ * Created on 2021/12/7
+ *
+ * * Old code:START
+ * 未派单 0
+ * 去往上车站点 1
+ * 车辆已到达上车站点 2
+ * 乘客已到达上车站点 3
+ * 去往下车站点 4
+ * 到达下车站点 5
+ * 已完成 6
+ * 已取消 7
+ * Old code:END
+ *
+ * 0 订单创建(为派单),
+ * 10 已派上司机(司机去往上车点),
+ * 20 司机到达上车点,
+ * 30 乘客到达上车点,
+ * 40 服务中(去往目的地),
+ * 50 到达目的地,
+ * 60 已完成,
+ * 70 已取消
+ */
+enum class OrderStatusEnum(val code: Int) {
+ None( 0 ),
+ OnTheWayToStartStation( 10),
+ ArriveAtStartStation( 20),
+ UserArriveAtStartStation( 30),
+ OnTheWayToEndStation( 40),
+ ArriveAtEndStation( 50),
+ JourneyCompleted(60),//行程完成
+ Cancel( 70);
+
+ companion object {
+ @JvmStatic
+ fun valueOf(code: Int): OrderStatusEnum? {
+ for (value in values()) {
+ if (value.code == code) {
+ return value
+ }
+ }
+ return None
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderTypeEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderTypeEnum.kt
new file mode 100644
index 0000000000..bcf94ded11
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/OrderTypeEnum.kt
@@ -0,0 +1,11 @@
+package com.mogo.och.taxi.passenger.constant
+
+/**
+ * RoboTaxi订单类型声明
+ *
+ * Created on 2021/12/6
+ */
+enum class OrderTypeEnum(val type: Int) {
+ Instant(1), // 即时单
+ Reserved(2) // 预约单
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/MogoOCHTaxiModelNew.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/MogoOCHTaxiModelNew.java
new file mode 100644
index 0000000000..b3470d6fe0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/MogoOCHTaxiModelNew.java
@@ -0,0 +1,1015 @@
+package com.mogo.och.taxi.passenger.model;
+
+import android.content.Context;
+import android.content.Intent;
+import android.location.Location;
+import android.net.ConnectivityManager;
+
+import androidx.annotation.Nullable;
+
+import com.elegant.network.utils.GsonUtil;
+import com.mogo.cloud.commons.utils.CoordinateUtils;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.map.navi.IMogoCarLocationChangedListener2;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiADASStatusCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiAutopilotPlanningCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiCarStatusCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiControllerStatusCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiOrderStatusCallback;
+import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
+import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
+import com.mogo.och.taxi.passenger.constant.OrderTypeEnum;
+import com.mogo.och.taxi.passenger.network.OCHTaxiServiceCallback;
+import com.mogo.och.taxi.passenger.network.OCHTaxiServiceManagerNew;
+import com.mogo.och.taxi.passenger.utils.OrderUtil;
+import com.mogo.och.taxi.passenger.utils.PinYinUtil;
+import com.mogo.service.IMogoServiceApis;
+import com.mogo.service.cloud.socket.IMogoLifecycleListener;
+import com.mogo.service.intent.IMogoIntentListener;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车 - 出租车业务逻辑处理
+ */
+public class MogoOCHTaxiModelNew {
+
+ private static final String TAG = MogoOCHTaxiModelNew.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final MogoOCHTaxiModelNew INSTANCE = new MogoOCHTaxiModelNew();
+ }
+
+ public static MogoOCHTaxiModelNew getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Context mContext;
+ private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值
+ private volatile int mOCHCarStatus = -1; //出车/收车状态:1 出车;0 收车
+ private volatile long mPrevOrderId = -1; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出)
+ private volatile OrderQueryRespBean.Result mNewBookingOrder; //新到待抢预约单
+ private volatile OrderQueryRespBean.Result mCurrentOCHOrder; //当前订单
+ private volatile List mInServiceList = Collections.emptyList(); //进行中订单
+ private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单
+
+ private IOCHTaxiADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关
+ private IOCHTaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:出车/收车状态
+ private IOCHTaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+ private IOCHTaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更
+
+ private IOCHTaxiAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划
+
+ private double mLongitude, mLatitude;
+
+ private MogoOCHTaxiModelNew() {
+ }
+ public void setMoGoAutopilotPlanningListener(IOCHTaxiAutopilotPlanningCallback
+ moGoAutopilotPlanningCallback) {
+ this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
+ }
+ public void setADASStatusCallback(IOCHTaxiADASStatusCallback callback) {
+ this.mADASStatusCallback = callback;
+ }
+
+ public void setCarStatusCallback(IOCHTaxiCarStatusCallback callback) {
+ this.mCarStatusCallback = callback;
+ }
+
+ public void setControllerStatusCallback(IOCHTaxiControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+
+ public void setOrderStatusCallback(IOCHTaxiOrderStatusCallback callback) {
+ this.mOrderStatusCallback = callback;
+ }
+
+ public void init( Context context ) {
+ mContext = context.getApplicationContext();
+ initListeners();
+
+ IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
+ apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId());
+ // TODO: 2021/8/27 因需要通过此回调的location进行坐标上传,暂改为全程监听,退出后再反注册,
+ // 待后续整体调整location获取来源
+ if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) {
+ apis.getLocationInfoApi().start();
+ }
+
+ if (NetworkUtils.isConnected(mContext)) {
+// startOrStopOrderLoop(mOCHCarStatus == 1);
+ if (FunctionBuildConfig.appIdentityMode == 0x00) {
+ queryCarStatus();
+ }
+ }
+ }
+
+ public void startOrStopOrderLoop(){
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ }
+
+ public void release() {
+ startOrStopOrderLoop(false);
+ releaseListeners();
+ }
+
+ private void initListeners() {
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getSocketManagerApi(mContext)
+ .registerLifecycleListener(10010,mSocketLifeCycleLisnter);
+
+ // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口
+ CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getIntentManagerApi()
+ .registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener );
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener );
+ // 达到起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .registerCarLocationChangedListener( TAG, mCarLocationChangedListener2);
+
+ //2021.11.1 自动驾驶路线规划接口
+ CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener);
+ }
+
+ private void releaseListeners() {
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ // 注销到达起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getSocketManagerApi(mContext)
+ .unregisterLifecycleListener(10010);
+
+ CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener);
+ CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
+ }
+
+ private void startOrStopOrderLoop(boolean start) {
+ Logger.d(TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ OCHTaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop();
+ OCHTaxiModelLoopManager.getInstance().startNewBookingOrderLoop();
+ OCHTaxiModelLoopManager.getInstance().startHeartbeatLoop();
+ } else {
+ OCHTaxiModelLoopManager.getInstance().stopInAndWaitOrdersLoop();
+ OCHTaxiModelLoopManager.getInstance().stopNewBookingOrderLoop();
+ OCHTaxiModelLoopManager.getInstance().stopHeartbeatLoop();
+ }
+ }
+
+ //查询出车/收车状态
+ public void queryCarStatus() {
+ OCHTaxiServiceManagerNew.getInstance().queryDriverServiceStatus(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(DriverStatusQueryRespBean data) {
+ if (null != data && 0 == data.code) {
+ mOCHCarStatus = data.data.serviceStatus == 1 ? 1 : 0;
+ //更新view
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ if (mCarStatusCallback != null) {
+ mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) { }
+ });
+ }
+
+ //更新出车收车状态
+ public void updateCarStatus() {
+ if ( mOCHCarStatus == -1){
+ queryCarStatus();
+ return;
+ }
+ final int status = mOCHCarStatus == 1 ? 0 : 1;
+ OCHTaxiServiceManagerNew.getInstance().updateDriverServiceStatus(mContext, status,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code) {
+ mOCHCarStatus = status;
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ if (mCarStatusCallback != null) {
+ mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1);
+ }
+ Logger.d(TAG, "changeCarStatus:" + status);
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ /**
+ * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等)
+ *
+ * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时,
+ * 才更新最新进行中单到本地
+ */
+ public void queryInAndWaitOrders() {
+ OCHTaxiServiceManagerNew.getInstance().queryOrdersInAndWaitService(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrdersInServiceQueryRespBean data) {
+ if (data == null || data.data == null) {
+ return;
+ }
+
+ //1. 处理进行中订单
+ mInServiceList = data.data.servicing;
+ if (data.data.servicing != null && !data.data.servicing.isEmpty()) {
+ // 1.1. 当存在进行中单时:对本地currentOrder进行更新
+ if (mCurrentOCHOrder == null) {
+ //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ } else {
+ //1.1.2. 当本地有currentOrder:
+ //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新
+ //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新
+ if (mCurrentOCHOrder.orderId != data.data.servicing.get(0).orderId) {
+ queryCurOrderStatus();
+ } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+ } else {
+ // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更新
+ if (mCurrentOCHOrder != null) {
+ queryCurOrderStatus();
+ }
+ }
+
+ //2. 处理待服务订单列表
+ if (data.data.waitService != null && !data.data.waitService.isEmpty()) {
+ //2.1. 当存在待服务订单列表:跟本地待服务列表比较
+ if (mWaitServiceList.isEmpty()
+ || (mWaitServiceList.size() != data.data.waitService.size())
+ || !OrderUtil.haveSameOrders(mWaitServiceList, data.data.waitService)) {
+ // 2.1.1. 当本地无待服务单,或数量和内容不一致,更新本地待服务列表,并通知ui更新
+ mWaitServiceList = data.data.waitService;
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
+ }
+ }
+ } else {
+ //2.2. 当无待服务单时:如果本地也无则跳过;如果本地有,则清除并通知ui更新
+ if (!mWaitServiceList.isEmpty()) {
+ mWaitServiceList.clear();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
+ private void queryCurOrderStatus() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRespBean data) {
+ if (data != null && data.data != null
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == data.data.orderId) {
+ if (data.data.orderStatus == OrderStatusEnum.Cancel.getCode()
+ || data.data.orderStatus == OrderStatusEnum.JourneyCompleted.getCode()
+ || data.data.orderStatus == OrderStatusEnum.None.getCode()) {
+ clearCurrentOCHOrder();
+ cancelAutopilot();
+ } else {
+ updateNativeCurrentOrder(data.data);
+ }
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(data.data);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ //更新当前订单状态
+ public void updateOCHOrderStatus(final OrderStatusEnum orderStatus) {
+ if ( mCurrentOCHOrder == null ) {
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().updateOrderStatus(mContext, orderId,
+ orderStatus.getCode(), new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
+ mCurrentOCHOrder.orderStatus = orderStatus.getCode();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 取消当前订单
+ public void cancelCurrentOrder(int reasonType, String reason) {
+ if (mCurrentOCHOrder == null) {
+ mOrderStatusCallback.onCurrentOrderCancelDone();
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().cancelOrder(mContext, orderId, reasonType, reason,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderCancelDone();
+ }
+ clearCurrentOCHOrder();
+ cancelAutopilot();
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 取消待服务中订单
+ public void cancelOrderById(final long orderId, int reasonType, String reason) {
+ OCHTaxiServiceManagerNew.getInstance().cancelOrder(mContext, orderId, reasonType, reason,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrderCancelDone(orderId);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 查询当前订单route信息:预估时间、里程等
+ public void queryCurOrderRouteInfo() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().queryOrderRouteInfo(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRouteInfoRespBean data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderRouteInfoGot(data.data);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 获取全部订单列表
+ public void queryOrdersList(int page, int size) {
+ OCHTaxiServiceManagerNew.getInstance().queryOrdersList(mContext, page, size,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrdersListQueryRespBean data) {
+ if (null != data && 0 == data.code) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersListPageRefresh(data.data.orders);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ TipToast.shortTip("请求异常,请稍后重试");
+ }
+ });
+ }
+
+ /**
+ * 查询新到预约单
+ *
+ * 注:只有在本地缓存mNewBookingOrder为null时(执行完抢单or司机关闭改单),才更新新到待抢单
+ */
+ public void queryNewBookingOrder() {
+ OCHTaxiServiceManagerNew.getInstance().queryNewBookingOrder(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrdersNewBookingQueryRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.orders.size() > 0) {
+ // 本地无新到单,且本次新到单id与上次收到的新单id不同时:显示本次新到单
+ if (mNewBookingOrder == null ) {
+ for (Long orderId : data.data.orders) {
+ if (mPrevOrderId != orderId.longValue()) {
+ queryNewBookingContent(orderId.longValue());
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 仅限于获取到新待抢单且需要展示时查询该单信息:(queryOrderById接口可以查询属于该车的单、未派的单)
+ private void queryNewBookingContent(final long orderId) {
+ OCHTaxiServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.orderId == orderId
+ && data.data.orderType == OrderTypeEnum.Reserved.getType()) {
+ mNewBookingOrder = data.data;
+ mPrevOrderId = data.data.orderId;
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onNewBookingOrderGot(mNewBookingOrder);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 执行抢单动作
+ public void grabOrder() {
+ if (mNewBookingOrder == null) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ return;
+ }
+ final long orderId = mNewBookingOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().grabOrder(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderGrabRespBean data) {
+ if (data != null && data.code == 0
+ && mNewBookingOrder != null && mNewBookingOrder.orderId == orderId) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderExecuteDone();
+ OCHTaxiModelLoopManager.getInstance().startGrabResultLoop();
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ TipToast.shortTip("请求异常,请稍后重试");
+ }
+ });
+ }
+
+ // 查询抢单结果
+ public void queryOrderGrabStatus() {
+ if (mNewBookingOrder == null) {
+ OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ return;
+ }
+ final long orderId = mNewBookingOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().queryOrderGrabStatus(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderGrabStatusQueryRespBean data) {
+ //OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ if (data != null && data.code == 0
+ && mNewBookingOrder != null && mNewBookingOrder.orderId == orderId) {
+ if (data.data.grabStatus == 0) {
+ return; //抢单中,不处理继续轮询结果
+ }
+ if (mOrderStatusCallback != null) {
+ if (data.data.grabStatus == 1) {
+ mOrderStatusCallback.onGrabOrderSuccess(mNewBookingOrder);
+ } else if (data.data.grabStatus == 2) {
+ mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
+ } else {
+ // TODO: 2021/9/22 需根据具体内容给予提示,如订单已取消
+ mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
+ }
+ }
+ } else {
+ if (mOrderStatusCallback != null) {
+ // TODO: 2021/9/22 如果用户已取消单,抢单失败时暂返回null,UI当前直接恢复原页面内容,后续优化
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ }
+ OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ cancelNewBookingOrder();
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 车机端上传心跳数据(只在出车状态时上传)
+ public void runCarHeartbeat() {
+ OCHTaxiServiceManagerNew.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 查询司机服务数据
+ public void queryDriverServiceData() {
+ OCHTaxiServiceManagerNew.getInstance().queryDriverServiceData(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(DriverServiceDataRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.immediate != null) {
+ if (mCarStatusCallback != null) {
+ mCarStatusCallback.onServiceDataUpdate(
+ data.data.immediate.timeDuration, data.data.immediate.orderNum);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 取消当前新到预约单
+ public void cancelNewBookingOrder() {
+ mNewBookingOrder = null;
+ }
+
+ // 获取当前订单
+ public OrderQueryRespBean.Result getCurrentOCHOrder() {
+ return mCurrentOCHOrder;
+ }
+
+ // 获取当前订单状态
+ public OrderStatusEnum getCurOrderStatus() {
+ OrderQueryRespBean.Result order = MogoOCHTaxiModelNew.getInstance().getCurrentOCHOrder();
+ if (order == null) {
+ return OrderStatusEnum.None;
+ }
+ return OrderStatusEnum.valueOf(order.orderStatus);
+ }
+
+ //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据
+ private void updateNativeCurrentOrder(OrderQueryRespBean.Result data) {
+ if (data == null) {
+ return;
+ }
+ mCurrentOCHOrder = data;
+ SharedPrefsMgr.getInstance(mContext).putString(OCHTaxiConst.SP_KEY_OCH_TAXI_ORDER,
+ GsonUtil.jsonFromObject(data));
+ }
+
+ //清除订单信息
+ public void clearCurrentOCHOrder() {
+ mCurrentOCHOrder = null;
+ SharedPrefsMgr.getInstance(mContext).remove(OCHTaxiConst.SP_KEY_OCH_TAXI_ORDER);
+ }
+
+ //检测当前订单
+ public boolean checkCurrentOCHOrder() {
+ if ( mCurrentOCHOrder != null
+ && mCurrentOCHOrder.startSiteGcjPoint != null
+ && mCurrentOCHOrder.endSiteGcjPoint != null) {
+ return true;
+ }
+ return false;
+ }
+
+ //以当前订单为基础,开启自动驾驶
+ public void startAutoPilot() {
+ if (!checkCurrentOCHOrder()) {
+ Logger.e( TAG, "no order or order is empty." );
+ TipToast.shortTip("当前订单不存在或异常!");
+ return;
+ }
+
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+ == Integer.parseInt(DebugConfig.getAutoPilotStatus())) {
+ // TODO: 2021/11/28 工控机存在刚开始状态为0,但是可以开启变为2,工控机解决前不显示此toast
+// TipToast.shortTip("自动驾驶状态为不可用!");
+ }
+
+ double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0);
+ double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1);
+ double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0);
+ double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1);
+
+ AutopilotControlParameters parameters = new AutopilotControlParameters();
+ parameters.vehicleType = mCurrentOCHOrder.businessType;
+ parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM)
+ parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM)
+ parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon);
+ parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon);
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters);
+ Logger.d(TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters)
+ +" ,startSiteName="+ mCurrentOCHOrder.startSiteAddr+" ,endSiteName="+mCurrentOCHOrder.endSiteAddr);
+ if (DebugConfig.isDebug()) {
+ // TipToast.shortTip("Start autopilot!");
+ }
+
+ // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
+// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" );
+ }
+
+ //结束自动驾驶
+ public void cancelAutopilot() {
+ try {
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ Logger.d(TAG, "结束自动驾驶");
+ } catch ( Exception e ) {
+ e.printStackTrace();
+ }
+ }
+
+ //根据围栏判断,是否到达起点
+ private void judgeStartStation(Location location) {
+ if (mCurrentOCHOrder == null || mCurrentOCHOrder.startSiteGcjPoint == null
+ || mCurrentOCHOrder.startSiteGcjPoint.size() < 2) {
+ return;
+ }
+ double startLon = mCurrentOCHOrder.startSiteGcjPoint.get(0);
+ double startLat = mCurrentOCHOrder.startSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ startLon, startLat,
+ location.getLongitude(), location.getLatitude() );
+
+ if (DebugConfig.isDebug() && mCurrentOCHOrder.orderStatus == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ // TipToast.shortTip("距离上车点:" + Double.valueOf(distance).intValue());
+ }
+
+ Logger.i(TAG, "judgeStartStation() distance = " + distance);
+// if (mOrderStatusCallback != null && distance >= 0) {
+// mOrderStatusCallback.onCurrentOrderDistToStartChanged((long) distance, 0);
+// }
+
+ if ( distance > OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) {
+ distance = CoordinateUtils.calculateLineDistance(startLon, startLat,
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon(),
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat() );
+ }
+
+ if ( distance <= OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) {
+ updateOCHOrderStatus( OrderStatusEnum.ArriveAtStartStation);
+ return;
+ }
+ }
+
+ // TODO: 2021/9/12
+ public void calculateTravelDistance(Location carLocation){
+ if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) {
+ double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
+ double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ endLon, endLat,
+ carLocation.getLongitude(), carLocation.getLatitude());
+ mCurrentOCHOrder.decreaseTravelDistance(distance);
+ if (mOrderStatusCallback != null && distance >= 0) {
+ mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) distance, 0);
+ }
+ }
+ }
+
+ //监听网络变化,避免启动机器时无网导致无法更新订单信息
+ private IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() {
+ @Override
+ public void onIntentReceived( String intentStr, Intent intent ) {
+ Logger.d( TAG, "onIntentReceived = %s", intentStr );
+ if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) {
+ if ( NetworkUtils.isConnected( mContext ) ) {
+ if (FunctionBuildConfig.appIdentityMode == 0x00) {
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ queryCarStatus();
+ }
+ }
+ }
+ }
+ };
+
+ private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+
+ private IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() {
+ @Override
+ public void onConnectFailure() { Logger.e(TAG,"socket onConnectFailure"); }
+
+ @Override
+ public void onConnectSuccess() { Logger.e(TAG,"socket onConnectSuccess"); }
+
+ @Override
+ public void onConnectLost() { Logger.e(TAG,"socket onConnectLost"); }
+ };
+
+ // 自车定位
+ private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
+
+ @Override
+ public void onCarLocationChanged2( Location location ) {
+ IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
+ MogoLocation mogoLocation = new MogoLocation();
+ mogoLocation.setAccuracy(location.getAccuracy());
+ mogoLocation.setProvider(location.getProvider());
+ mogoLocation.setLongitude(location.getLongitude());
+ mogoLocation.setLatitude(location.getLatitude());
+ mogoLocation.setSpeed(location.getSpeed());
+ mogoLocation.setBearing(location.getBearing());
+ // TODO: 2021/9/2 因0830新版server后台只能过滤locType=1&&satellites>=4的定位数据,暂固话值,后续优化
+ mogoLocation.setLocType(1);
+ mogoLocation.setSatellite(4);
+
+ apis.getLocationInfoApi().provideLocation(mogoLocation);
+ //位置变化时,通过围栏判断是否到达x点
+ if (location != null && checkCurrentOCHOrder()) {
+ if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToStartStation) {
+ judgeStartStation(location);
+ } else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
+ calculateTravelDistance(location);
+ }
+ }
+ mLongitude = location.getLongitude();
+ mLatitude = location.getLatitude();
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(location);
+ }
+ }
+ };
+
+ /**
+ * 订单流转debug START
+ */
+ public void setArriveAtStartStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ TipToast.shortTip("订单状态不匹配该操作!");
+ return;
+ }
+ updateOCHOrderStatus(OrderStatusEnum.ArriveAtStartStation);
+ }
+
+ public void setArriveAtEndStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != OrderStatusEnum.OnTheWayToEndStation.getCode()) {
+ TipToast.shortTip("订单状态不匹配该操作!");
+ return;
+ }
+ updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
+ }
+
+ /**
+ * 测试开始服务
+ */
+ public void setOnTheWayToEndStation() {
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != OrderStatusEnum.ArriveAtStartStation.getCode()) {
+ TipToast.shortTip("订单状态不匹配该操作!");
+ }
+ updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ }
+ private IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){
+
+ private boolean arriveAtEnd = false; //乘客app专用字段
+
+ @Override
+ public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
+ if (autopilotStatusInfo == null) return;
+ int state = autopilotStatusInfo.getState();
+ Logger.d( TAG, "state = %s", state );
+ if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
+ if (mCurrentOCHOrder != null
+ && getCurOrderStatus() == OrderStatusEnum.ArriveAtStartStation
+ && state != mPrevAPStatus) {
+ // 当高频返回autopilot 2时,不重复调用订单状态变更
+ mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态
+ updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ }
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
+ mPrevAPStatus = state;
+
+ if (FunctionBuildConfig.isDemoMode
+ && FunctionBuildConfig.appIdentityMode == 0x01) {
+ // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
+ if (!arriveAtEnd) {
+ return;
+ } else {
+ arriveAtEnd = false;
+ }
+ }
+
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable();
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
+ mPrevAPStatus = state;
+
+ if (FunctionBuildConfig.isDemoMode
+ && FunctionBuildConfig.appIdentityMode == 0x01) {
+ // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
+ if (!arriveAtEnd) {
+ return;
+ } else {
+ arriveAtEnd = false;
+ }
+ }
+
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable();
+ }
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+
+ }
+
+ @Override
+ public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) {
+
+ }
+
+ @Override
+ public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo data) {
+ if (FunctionBuildConfig.isDemoMode
+ && FunctionBuildConfig.appIdentityMode == 0x01) {
+ arriveAtEnd = true;
+ }
+
+ if (data == null || !checkCurrentOCHOrder()
+ || (getCurOrderStatus() == OrderStatusEnum.ArriveAtEndStation)) {
+ return;
+ }
+ if (DebugConfig.isDebug()) {
+ // TipToast.shortTip("到达目的地");
+ }
+ updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
+ }
+ };
+ private IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){
+
+ @Override
+ public void onAutopilotTrajectory(ArrayList trajectoryInfos) {
+
+ }
+
+ @Override
+ public void onAutopilotRotting(AutopilotRouteInfo routeList) {
+ if (null != routeList && routeList.getModels() != null){
+ mAutopilotPlanningCallback.routeResult(routeList.getModels());
+ }
+ }
+ };
+ /**
+ * END
+ */
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/NaviToDestinationModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/NaviToDestinationModel.java
new file mode 100644
index 0000000000..38410c2606
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/NaviToDestinationModel.java
@@ -0,0 +1,433 @@
+package com.mogo.och.taxi.passenger.model;
+
+import android.Manifest;
+import android.content.Context;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.amap.api.navi.AMapNavi;
+import com.amap.api.navi.AMapNaviListener;
+import com.amap.api.navi.enums.NaviType;
+import com.amap.api.navi.model.AMapCalcRouteResult;
+import com.amap.api.navi.model.AMapLaneInfo;
+import com.amap.api.navi.model.AMapModelCross;
+import com.amap.api.navi.model.AMapNaviCameraInfo;
+import com.amap.api.navi.model.AMapNaviCross;
+import com.amap.api.navi.model.AMapNaviInfo;
+import com.amap.api.navi.model.AMapNaviLocation;
+import com.amap.api.navi.model.AMapNaviRouteNotifyData;
+import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;
+import com.amap.api.navi.model.AMapServiceAreaInfo;
+import com.amap.api.navi.model.AimLessModeCongestionInfo;
+import com.amap.api.navi.model.AimLessModeStat;
+import com.amap.api.navi.model.NaviInfo;
+import com.amap.api.navi.model.NaviLatLng;
+import com.autonavi.tbt.TrafficFacilityInfo;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
+import com.mogo.och.taxi.passenger.utils.PermissionUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/6
+ */
+public class NaviToDestinationModel implements AMapNaviListener {
+ private static Context mContext;
+ private AMapNavi mAMapNavi = null;
+ protected final List sList = new ArrayList();
+ protected final List eList = new ArrayList();
+ protected List mWayPointList = new ArrayList();
+ private IOCHTaxiNaviChangedCallback mNaviChangedCallback;
+ private AtomicInteger errorCount = new AtomicInteger(0);
+ private boolean isPlay;
+ public static NaviToDestinationModel getInstance(Context context) {
+ mContext = context;
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static final class SingletonHolder {
+ private static final NaviToDestinationModel INSTANCE = new NaviToDestinationModel();
+ }
+ private NaviToDestinationModel(){
+ }
+ public void initAMapNavi(NaviLatLng startLatLng,NaviLatLng endLatLng) {
+ try {
+ mAMapNavi = AMapNavi.getInstance(mContext);
+ mAMapNavi.addAMapNaviListener(this);
+ mAMapNavi.setUseInnerVoice(true, true);
+ sList.add(startLatLng);
+ eList.add(endLatLng);
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public void setVoiceIsMute(boolean isPlay){
+ if (mAMapNavi == null) return;
+ this.isPlay = isPlay;
+ if (isPlay){
+ mAMapNavi.startSpeak();
+ }else {
+ mAMapNavi.stopSpeak();
+ }
+ }
+
+ public AMapNavi getmAMapNavi() {
+ return mAMapNavi;
+ }
+
+ public void destroyAmaNavi(){
+ if (mAMapNavi != null){
+ isPlay = false;
+ mAMapNavi.stopNavi();
+ mAMapNavi.destroy();
+ mAMapNavi = null;
+ mNaviChangedCallback = null;
+ }
+ }
+
+ public void setOCHTaciNaviChangedCallback(IOCHTaxiNaviChangedCallback callback){
+ this.mNaviChangedCallback = callback;
+ }
+ @Override
+ public void onInitNaviFailure() {
+ Toast.makeText(mContext, "init navi Failed", Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onInitNaviSuccess() {
+ //初始化成功
+ /**
+ * 方法: int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 参数:
+ *
+ * @congestion 躲避拥堵
+ * @avoidhightspeed 不走高速
+ * @cost 避免收费
+ * @hightspeed 高速优先
+ * @multipleroute 多路径
+ *
+ * 说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。
+ * 注意: 不走高速与高速优先不能同时为true 高速优先与避免收费不能同时为true
+ */
+ int strategy = 0;
+ try {
+ //再次强调,最后一个参数为true时代表多路径,否则代表单路径
+ strategy = mAMapNavi.strategyConvert(true, false, false, false, false);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);
+ }
+ @Override
+ public void onCalculateRouteSuccess(int[] ints) {
+ //多路径算路成功回调
+ mAMapNavi.startNavi(NaviType.GPS);
+ }
+
+ @Override
+ public void onNaviInfoUpdate(NaviInfo naviinfo) {
+ //导航过程中的信息更新,请看NaviInfo的具体说明
+ if (null != mNaviChangedCallback){
+ mNaviChangedCallback.onCurrentNaviDistAndTimeChanged(naviinfo.getPathRetainDistance(),naviinfo.getPathRetainTime());// 米、秒
+ }
+ }
+
+ @Override
+ public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
+ errorCount.set(0);
+ }
+
+ @Override
+ public void onCalculateRouteFailure(AMapCalcRouteResult result) {
+ //路线计算失败
+ //多路径算路成功回调
+ if (errorCount.get() < 5){
+ errorCount.getAndIncrement();
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback.reInitNaviAmap(isPlay,true);
+ }
+ }
+ if (!NetworkUtils.isConnected(mContext) || result.getErrorCode() == 2){
+ TipToast.longTip("网络异常,请重试");
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback.reInitNaviAmap(isPlay,false);
+ }
+ return;
+ }
+ if (!PermissionUtil.isLocServiceEnable(mContext) || !PermissionUtil.checkPermission(mContext,new String[]{Manifest.permission.ACCESS_FINE_LOCATION})){
+ TipToast.longTip("请开启车机定位后重试");
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback.reInitNaviAmap(isPlay,false);
+ }
+ return;
+ }
+// if (result.getErrorCode() == 3){
+// TipToast.longTip("车辆当前坐标错误");
+// }else if (result.getErrorCode() == 6){
+// TipToast.longTip("终点坐标错误");
+// }
+ Log.i("dm", "路线计算失败:错误码=" + result.getErrorCode() + ",Error Message= " + result.getErrorDetail());
+ Log.i("dm", "错误码详细链接见:http://lbs.amap.com/api/android-navi-sdk/guide/tools/errorcode/");
+ }
+ @Override
+ public void onStartNavi(int type) {
+ //开始导航回调
+ }
+
+ @Override
+ public void onTrafficStatusUpdate() {
+ //
+ }
+
+ @Override
+ public void onLocationChange(AMapNaviLocation location) {
+ //当前位置回调
+ }
+
+ @Override
+ public void onGetNavigationText(int type, String text) {
+ //播报类型和播报文字回调
+ }
+
+ @Override
+ public void onGetNavigationText(String s) {
+
+ }
+
+ @Override
+ public void onEndEmulatorNavi() {
+ //结束模拟导航
+ }
+
+ @Override
+ public void onArriveDestination() {
+ //到达目的地
+ }
+
+ @Override
+ public void onCalculateRouteFailure(int errorInfo) {
+
+ }
+
+ @Override
+ public void onReCalculateRouteForYaw() {
+ //偏航后重新计算路线回调
+ }
+
+ @Override
+ public void onReCalculateRouteForTrafficJam() {
+ //拥堵后重新计算路线回调
+ }
+
+ @Override
+ public void onArrivedWayPoint(int wayID) {
+ //到达途径点
+ }
+
+ @Override
+ public void onGpsOpenStatus(boolean enabled) {
+ //GPS开关状态回调
+ }
+ @Override
+ public void showModeCross(AMapModelCross aMapModelCross) {
+ }
+
+ @Override
+ public void hideModeCross() {
+
+ }
+
+ @Override
+ public void updateIntervalCameraInfo(AMapNaviCameraInfo aMapNaviCameraInfo, AMapNaviCameraInfo aMapNaviCameraInfo1, int i) {
+
+ }
+
+ @Override
+ public void showLaneInfo(AMapLaneInfo aMapLaneInfo) {
+ //显示车道信息
+// StringBuffer sb = new StringBuffer();
+// sb.append("共" + aMapLaneInfo.frontLane.length + "车道");
+// for (int i = 0; i < aMapLaneInfo.frontLane.length; i++) {
+// //当前车道可以选择的动作
+// int background = aMapLaneInfo.backgroundLane[i];
+// //当前用户要执行的动作
+// int recommend = aMapLaneInfo.frontLane[i];
+//
+// Log.e("ggb", "---->>> background is " + background + " ; recommend is " + recommend);
+// //根据文档中每个动作对应的枚举类型,显示对应的图片
+// try {
+// sb.append(",第" + (i + 1) + "车道为" + array[background]);
+// if (recommend != 255) {
+// sb.append(",当前车道可 " + actions[recommend]);
+// }
+//
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+// Log.e("showLaneInfo", sb.toString());
+ }
+
+ @Override
+ public void onNaviRouteNotify(AMapNaviRouteNotifyData aMapNaviRouteNotifyData) {
+
+ }
+
+ @Override
+ public void updateCameraInfo(AMapNaviCameraInfo[] aMapCameraInfos) {
+
+ }
+
+ @Override
+ public void onServiceAreaUpdate(AMapServiceAreaInfo[] amapServiceAreaInfos) {
+
+ }
+
+ @Override
+ public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {
+
+ }
+
+ @Override
+ public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {
+ //已过时
+ }
+
+ @Override
+ public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {
+
+ }
+
+ @Override
+ public void showCross(AMapNaviCross aMapNaviCross) {
+ //显示放大图回调
+ }
+
+ @Override
+ public void hideCross() {
+ //隐藏放大图回调
+ }
+
+ @Override
+ public void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) {
+ //过时
+ }
+
+ @Override
+ public void hideLaneInfo() {
+ //隐藏车道信息
+ }
+
+ @Override
+ public void notifyParallelRoad(int i) {
+ }
+
+ @Override
+ public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {
+ //更新交通设施信息
+ }
+
+ @Override
+ public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {
+ //更新巡航模式的统计信息
+ }
+
+
+ @Override
+ public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {
+ //更新巡航模式的拥堵信息
+ }
+
+ @Override
+ public void onPlayRing(int i) {
+
+ }
+
+ /**
+ * 车道信息说明:
+ *
+ * 0xFF, 无对应车道
+ * 0, 直行
+ * 1, 左转
+ * 2, 直行+左转
+ * 3, 右转
+ * 4, 直行+右转
+ * 5, 左掉头
+ * 6, 左转+右转
+ * 7, 直行+左转+右转
+ * 8, 右掉头
+ * 9, 直行+左掉头
+ * 10, 直行+右掉头
+ * 11, 左转+左掉头
+ * 12, 右转+右掉头
+ * 13, 直行+扩展
+ * 14, 左转+左掉头+扩展
+ * 15, 保留
+ * 16, 直行+左转+左掉头
+ * 17, 右转+左掉头
+ * 18, 左转+右转+左掉头
+ * 19, 直行+右转+左掉头
+ * 20, 左转+右掉头
+ * 21, 公交车道
+ * 22, 空车道
+ * 23 可变车道
+ */
+
+ String[] array = {
+ "直行车道"
+ , "左转车道"
+ , "左转或直行车道"
+ , "右转车道"
+ , "右转或直行车道"
+ , "左掉头车道"
+ , "左转或者右转车道"
+ , " 左转或右转或直行车道"
+ , "右转掉头车道"
+ , "直行或左转掉头车道"
+ , "直行或右转掉头车道"
+ , "左转或左掉头车道"
+ , "右转或右掉头车道"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择该车道"
+ , "直行+左转+左掉头车道"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+
+ String[] actions = {
+ "直行"
+ , "左转"
+ , "左转或直行"
+ , "右转"
+ , "右转或这行"
+ , "左掉头"
+ , "左转或者右转"
+ , " 左转或右转或直行"
+ , "右转掉头"
+ , "直行或左转掉头"
+ , "直行或右转掉头"
+ , "左转或左掉头"
+ , "右转或右掉头"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择"
+ , "直行+左转+左掉头"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/OCHTaxiModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/OCHTaxiModelLoopManager.java
new file mode 100644
index 0000000000..a58fc4b411
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/OCHTaxiModelLoopManager.java
@@ -0,0 +1,118 @@
+package com.mogo.och.taxi.passenger.model;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created on 2021/9/10
+ *
+ * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
+ */
+public class OCHTaxiModelLoopManager {
+
+ private static final String TAG = OCHTaxiModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final OCHTaxiModelLoopManager INSTANCE = new OCHTaxiModelLoopManager();
+ }
+
+ public static OCHTaxiModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
+ private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询
+ private Disposable mGrabResultDisposable; //抢单结果轮询
+ private Disposable mHeartbeatDisposable; //心跳轮询
+
+ public void startInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryInAndWaitOrders());
+ }
+
+ public void stopInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null) {
+ Logger.i(TAG, "stopInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable.dispose();
+ mInAndWaitServiceDisposable = null;
+ }
+ }
+
+ public void startNewBookingOrderLoop() {
+ if (mNewBookingOrderDisposable != null && !mNewBookingOrderDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startNewBookingOrderLoop()");
+ mNewBookingOrderDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryNewBookingOrder());
+ }
+
+ public void stopNewBookingOrderLoop() {
+ if (mNewBookingOrderDisposable != null) {
+ Logger.i(TAG, "stopNewBookingOrderLoop()");
+ mNewBookingOrderDisposable.dispose();
+ mNewBookingOrderDisposable = null;
+ }
+ }
+
+ public void startGrabResultLoop() {
+ if (mGrabResultDisposable != null && !mGrabResultDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startGrabResultLoop()");
+ mGrabResultDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryOrderGrabStatus());
+ }
+
+ public void stopGrabResultLoop() {
+ if (mGrabResultDisposable != null) {
+ Logger.i(TAG, "stopGrabResultLoop()");
+ mGrabResultDisposable.dispose();
+ mGrabResultDisposable = null;
+ }
+ }
+
+ public void startHeartbeatLoop() {
+ if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startHeartbeatLoop()");
+ mHeartbeatDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().runCarHeartbeat());
+ }
+
+ public void stopHeartbeatLoop() {
+ if (mHeartbeatDisposable != null) {
+ Logger.i(TAG, "stopHeartbeatLoop()");
+ mHeartbeatDisposable.dispose();
+ mHeartbeatDisposable = null;
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceApiNew.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceApiNew.java
new file mode 100644
index 0000000000..90b5213cbd
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceApiNew.java
@@ -0,0 +1,161 @@
+package com.mogo.och.taxi.passenger.network;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.och.taxi.passenger.bean.CarHeartbeatReqBean;
+import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.DriverStatusUpdateReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderCancelReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderStatusUpdateReqBean;
+import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersListQueryReqBean;
+import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车-出租车接口定义
+ */
+interface OCHTaxiServiceApiNew {
+
+ /**
+ * 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
+ Observable queryOrdersInAndWaitService(@Query("sn") String sn);
+
+ /**
+ * 查询新到的预约单
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
+ Observable queryNewBookingOrder(@Query("sn") String sn);
+
+ /**
+ * (预约单)执行抢单动作
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
+ Observable grabOrder(@Body OrderGrabReqBean data);
+
+ /**
+ * (预约单)查询抢单结果
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
+ Observable queryOrderGrabStatus(@Body OrderGrabReqBean data);
+
+ /**
+ * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
+ Observable queryOrderRouteInfo(@Body OrderQueryRouteInfoReqBean data);
+
+ /**
+ * 通过orderId查询订单信息(用于本地已经有orderId时)
+ * @param data
+ * @return
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
+ Observable queryOrderById(@Body OrderQueryReqBean data);
+
+ /**
+ * 查询服务中订单信息(用于本地无orderId时)
+ * 如果有多条,只会返回时间最近的一条
+ * @param sn
+ * @return
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
+ Observable queryOrderInService(@Query("sn") String sn);
+
+ /**
+ * 取消订单
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
+ Observable cancelOrder(@Body OrderCancelReqBean data);
+
+ /**
+ * 订单列表获取
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
+ Observable queryOrdersList(@Body OrdersListQueryReqBean data);
+
+ /**
+ * 订单状态更新
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
+ Observable updateOrderStatus(@Body OrderStatusUpdateReqBean data);
+
+ /**
+ * 收车/出车状态更新
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
+ Observable updateDriverServiceStatus(@Body DriverStatusUpdateReqBean data);
+
+ /**
+ * 收车/出车状态查询
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
+ Observable queryDriverServiceStatus(@Query("sn") String sn);
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
+ Observable runCarHeartbeat(@Body CarHeartbeatReqBean data);
+
+ /**
+ * 查询司机服务数据
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
+ Observable queryServiceData(@Query("sn") String sn);
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceCallback.java
new file mode 100644
index 0000000000..7eb540694a
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceCallback.java
@@ -0,0 +1,18 @@
+package com.mogo.och.taxi.passenger.network;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 修改订单状态回调接口
+ */
+public interface OCHTaxiServiceCallback< T > {
+
+ void onSuccess(T data);
+
+ void onFail(int code, String msg);
+
+ default void onError() {
+
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceManagerNew.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceManagerNew.java
new file mode 100644
index 0000000000..6f14a0afdc
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/network/OCHTaxiServiceManagerNew.java
@@ -0,0 +1,352 @@
+package com.mogo.och.taxi.passenger.network;
+
+import android.content.Context;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.network.RequestOptions;
+import com.mogo.eagle.core.network.SubscribeImpl;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.passenger.bean.CarHeartbeatReqBean;
+import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.DriverStatusUpdateReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderCancelReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoReqBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderStatusUpdateReqBean;
+import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersListQueryReqBean;
+import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
+import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+public class OCHTaxiServiceManagerNew {
+ private static final String TAG = OCHTaxiServiceManagerNew.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final OCHTaxiServiceManagerNew INSTANCE = new OCHTaxiServiceManagerNew();
+ }
+
+ public static OCHTaxiServiceManagerNew getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private String baseUrl = OCHTaxiConst.getBaseUrl();
+ private OCHTaxiServiceApiNew mOCHTaxiServiceApi;
+
+ private OCHTaxiServiceManagerNew() {
+ if (mOCHTaxiServiceApi == null){
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ }
+
+ /**
+ * 查询全部服务中/待服务订单列表
+ * @param context
+ * @param callback
+ */
+ public void queryOrdersInAndWaitService(Context context,
+ OCHTaxiServiceCallback callback) {
+ if (mOCHTaxiServiceApi == null) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrdersInAndWaitService(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService"));
+ }
+
+ /**
+ * 查询新到的预约单
+ * @param context
+ * @param callback
+ */
+ public void queryNewBookingOrder(Context context,
+ OCHTaxiServiceCallback callback) {
+ if (mOCHTaxiServiceApi == null) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryNewBookingOrder(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryNewBookingOrder"));
+ }
+
+ /**
+ * (预约单)执行抢单动作
+ * @param context
+ * @param orderId
+ * @param callback
+ */
+ public void grabOrder(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.grabOrder(new OrderGrabReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "grabOrder"));
+ }
+
+ /**
+ * (预约单)查询抢单结果
+ * @param context
+ * @param orderId
+ * @param callback
+ */
+ public void queryOrderGrabStatus(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderGrabStatus(new OrderGrabReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderGrabStatus"));
+ }
+
+ /**
+ * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
+ * @param context
+ * @param orderId
+ * @param callback
+ */
+ public void queryOrderRouteInfo(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderRouteInfo(new OrderQueryRouteInfoReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderRouteInfo"));
+ }
+
+ /**
+ * 通过orderId查询订单信息(用于本地已经有orderId时)
+ * @param context
+ * @param orderId
+ * @param callback
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ public void queryOrderById(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderById(new OrderQueryReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderById"));
+ }
+
+ /**
+ * 查询未完成态订单信息(用于本地无orderId时)
+ * 如果有多条,只会返回时间最近的一条
+ * @param context
+ * @param callback
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ public void queryOrderInService(Context context,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderInService(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderInService"));
+ }
+
+ /**
+ * 司机取消订单
+ * @param context
+ * @param orderId
+ * @param cancelType
+ * @param cancelReason
+ * @param callback
+ */
+ public void cancelOrder(Context context, long orderId, int cancelType, String cancelReason,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.cancelOrder(new OrderCancelReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId, cancelType, cancelReason))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "cancelOrder"));
+ }
+
+ /**
+ * 订单列表获取
+ * @param context
+ * @param page
+ * @param size
+ * @param callback
+ */
+ public void queryOrdersList(Context context, int page, int size,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrdersList(new OrdersListQueryReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), page, size))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrdersList"));
+ }
+
+ /**
+ * 订单状态更新
+ * @param context
+ * @param orderId
+ * @param orderStatus
+ * @param callback
+ */
+ public void updateOrderStatus(Context context, long orderId, int orderStatus,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.updateOrderStatus(new OrderStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId, orderStatus))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "updateOrderStatus"));
+ }
+
+ /**
+ * 收车/出车状态更新
+ * @param context
+ * @param status
+ * @param callback
+ */
+ public void updateDriverServiceStatus(Context context, int status,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.updateDriverServiceStatus(new DriverStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), status))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus"));
+ }
+
+ /**
+ * 收车/出车状态查询
+ * @param context
+ * @param callback
+ */
+ public void queryDriverServiceStatus(Context context,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryDriverServiceStatus(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus"));
+ }
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param context
+ * @param lon
+ * @param lat
+ * @param callback
+ */
+ public void runCarHeartbeat(Context context, double lon, double lat,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.runCarHeartbeat(new CarHeartbeatReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
+ }
+
+ /**
+ * 查询司机服务数据
+ * @param context
+ * @param callback
+ */
+ public void queryDriverServiceData(Context context,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryServiceData(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceData"));
+ }
+
+ private SubscribeImpl getSubscribeImpl(
+ Context context, OCHTaxiServiceCallback callback, String apiName) {
+ return new SubscribeImpl(RequestOptions.create(context)) {
+ @Override
+ public void onSuccess(T o) {
+ super.onSuccess(o);
+ Logger.e(TAG,apiName + ": onSuccess() " + o.msg);
+ if (callback != null) {
+ callback.onSuccess(o);
+ }
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ Logger.e(TAG,apiName + ": onError() " + e.getMessage());
+ if (callback != null) {
+ callback.onError();
+ }
+ }
+
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ Logger.e(TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message));
+ if (callback != null) {
+ callback.onFail(code, message);
+ }
+ }
+ };
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/OCHTaxiPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/OCHTaxiPresenter.java
new file mode 100644
index 0000000000..48decd91d5
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/OCHTaxiPresenter.java
@@ -0,0 +1,259 @@
+package com.mogo.och.taxi.passenger.presenter;
+
+import android.location.Location;
+import android.os.Build;
+import android.os.Looper;
+import android.util.Log;
+
+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.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiAutopilotPlanningCallback;
+import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiADASStatusCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiCarStatusCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiControllerStatusCallback;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiOrderStatusCallback;
+import com.mogo.och.taxi.passenger.model.MogoOCHTaxiModelNew;
+import com.mogo.och.taxi.passenger.ui.OCHTaxiFragment;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 描述
+ */
+public class OCHTaxiPresenter extends Presenter implements IOCHTaxiADASStatusCallback,
+ IOCHTaxiCarStatusCallback, IOCHTaxiOrderStatusCallback, IOCHTaxiControllerStatusCallback, IOCHTaxiAutopilotPlanningCallback {
+
+ private static final String TAG = OCHTaxiPresenter.class.getSimpleName();
+
+ public OCHTaxiPresenter(OCHTaxiFragment view) {
+ super(view);
+ MogoOCHTaxiModelNew.getInstance().init(AbsMogoApplication.getApp());
+ initListeners();
+ }
+
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ Logger.d( TAG, "网约车-出租车拿到订单" );
+ }
+
+ @Override
+ public void onDestroy( @NonNull LifecycleOwner owner ) {
+ super.onDestroy( owner );
+
+ releaseListeners();
+ MogoOCHTaxiModelNew.getInstance().release();
+ }
+
+ private void initListeners() {
+ MogoOCHTaxiModelNew.getInstance().setADASStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setCarStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setControllerStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setOrderStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setMoGoAutopilotPlanningListener(this);
+ }
+
+ private void releaseListeners() {
+ MogoOCHTaxiModelNew.getInstance().setADASStatusCallback(null);
+ MogoOCHTaxiModelNew.getInstance().setCarStatusCallback(null);
+ MogoOCHTaxiModelNew.getInstance().setControllerStatusCallback(null);
+ MogoOCHTaxiModelNew.getInstance().setOrderStatusCallback(null);
+ MogoOCHTaxiModelNew.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() {
+ MogoOCHTaxiModelNew.getInstance().startAutoPilot();
+ }
+
+ // 更新出车/收车状态
+ public void updateCarStatus() {
+ MogoOCHTaxiModelNew.getInstance().updateCarStatus();
+ }
+
+ // 更新当前订单状态(当前订单状态流转)
+ public void updateCurOrderStatus(OrderStatusEnum status) {
+ MogoOCHTaxiModelNew.getInstance().updateOCHOrderStatus(status);
+ }
+
+ // 获取当前订单状态
+ public OrderStatusEnum getCurOrderStatus() {
+ return MogoOCHTaxiModelNew.getInstance().getCurOrderStatus();
+ }
+
+ // 取消当前订单
+ public void cancelCurOrder(int reasonType, String reason) {
+ MogoOCHTaxiModelNew.getInstance().cancelCurrentOrder(reasonType, reason);
+ }
+
+ // 取消待服务中订单
+ public void cancelOrderById(long orderId, int reasonType, String reason) {
+ MogoOCHTaxiModelNew.getInstance().cancelOrderById(orderId, reasonType, reason);
+ }
+
+ // 查询当前订单route信息:预估时间、里程等
+ public void queryCurOrderRouteInfo() {
+ MogoOCHTaxiModelNew.getInstance().queryCurOrderRouteInfo();
+ }
+
+ // 获取全部订单列表
+ public void queryOrdersList(int page, int size) {
+ MogoOCHTaxiModelNew.getInstance().queryOrdersList(page, size);
+ }
+
+ // 执行抢单动作
+ public void grabOrder() {
+ MogoOCHTaxiModelNew.getInstance().grabOrder();
+ }
+
+ // 关闭新到预约单
+ public void cancelNewBookingOrder() {
+ MogoOCHTaxiModelNew.getInstance().cancelNewBookingOrder();
+ }
+
+ // 查询司机服务数据
+ public void queryDriverServiceData() {
+ MogoOCHTaxiModelNew.getInstance().queryDriverServiceData();
+ }
+
+ @Override
+ public void onAutopilotArriveEnd() {
+
+ }
+
+ @Override
+ public void onAutopilotEnable() {
+ mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE);
+ }
+
+ @Override
+ public void onAutopilotDisable() {
+ mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE);
+ }
+
+ @Override
+ public void onAutopilotRunning() {
+ mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ }
+
+ @Override
+ public void onCarStatusChanged(boolean inOperation) {
+ mView.updateOperationStatus(inOperation);
+ }
+
+ @Override
+ public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
+ mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum);
+ }
+
+ @Override
+ public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) {
+
+ }
+
+ @Override
+ public void onOrdersWaitServiceChanged(@NonNull @NotNull List waitServiceList) {
+ mView.onOrdersWaitServiceChanged(waitServiceList);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ @Override
+ public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ Log.d(TAG,"order = "+order.toString());
+ mView.updateCurrentOrderStatusChanged(order);
+ }
+
+ @Override
+ public void onCurrentOrderCancelDone() {
+ mView.onCurrentOrderCancelDone();
+ }
+
+ @Override
+ public void onOrderCancelDone(long orderId) {
+ mView.onOrderCancelDone(orderId);
+ }
+
+ @Override
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
+ mView.onCurrentOrderRouteInfoGot(routeInfo);
+ }
+
+ @Override
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond) {
+ mView.onCurrentOrderDistToStartChanged(meters,timeInSecond);
+ }
+
+ @Override
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
+ mView.onCurrentOrderDistToEndChanged(meters,timeInSecond);
+ }
+
+ @Override
+ public void onOrdersListPageRefresh(List ordersList) {
+ mView.onOrdersListPageRefresh(ordersList);
+ }
+
+ @Override
+ public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
+ mView.onNewBookingOrderGot(order);
+ }
+
+ @Override
+ public void onGrabOrderExecuteDone() {
+ mView.onGrabOrderExecuteDone();
+ }
+
+ @Override
+ public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
+ mView.onGrabOrderSuccess(order);
+ }
+
+ @Override
+ public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
+ mView.onGrabOrderFailed(order);
+ }
+
+ @Override
+ public void onVRModeChanged(boolean isVRMode) {
+ runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
+ }
+
+ @Override
+ public void onCarLocationChanged(Location location) {
+ if (null != location){
+ runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
+ mView.updateLocation(location.getLatitude(),location.getLongitude());
+ }
+ }
+ @Override
+ public void routeResult(List models) {
+ if (models != null && models.size() > 0) mView.routeResult(models);
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BaseOchTaxiTabFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BaseOchTaxiTabFragment.java
new file mode 100644
index 0000000000..413c1ee545
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BaseOchTaxiTabFragment.java
@@ -0,0 +1,477 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import android.animation.ObjectAnimator;
+import android.content.Intent;
+import android.graphics.drawable.AnimationDrawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.Group;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.function.call.map.CallerSmpManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.uicontroller.VisualAngleMode;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.constants.DataTypes;
+import com.mogo.module.common.view.OnPreventFastClickListener;
+import com.mogo.och.taxi.passenger.R;
+
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+public abstract class BaseOchTaxiTabFragment> extends MvpFragment implements IMogoMapListener {
+
+ private static final String TAG = "BaseOchFragment";
+ private LinearLayout ctvAutopilotStatus;
+ protected TextView tvOperationStatus;
+ public boolean isOperationStatus;//false-收车,true-出车
+ protected FrameLayout flStationPanelContainer;
+ private FrameLayout flNaviPanelContainer;
+ private Group groupTestPanel;
+ private TextView mSpeedView;
+ private ImageView mAutopilotImage;
+ private TextView mAutopilotTv;
+ private LinearLayout mMapswitchBtn;
+ private ImageView mCloseNaviIcon;
+ protected LinearLayout mPersonalBtn;
+ protected LinearLayout mSettingBtn;
+ protected OCHNaviFragment ochNaviFragment = null;
+
+ private Handler mHandler = new Handler(Looper.getMainLooper());
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_base_fragment;
+ }
+
+ private View panelView;
+
+ @Override
+ protected void initViews() {
+ groupTestPanel = findViewById(R.id.groupTestPanel);
+ ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
+ mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
+ mAutopilotTv = findViewById(R.id.module_och_autopilot_tv);
+ flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
+ mPersonalBtn = findViewById(R.id.module_och_taxi_personal_layout);
+ 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);
+ if (DebugConfig.isDebug()) {
+ mSpeedView.setLongClickable(true);
+ // TODO: 2021/11/27 暂去除此调试功能
+// mSpeedView.setOnClickListener(v -> {
+// onAutopilotStatusChanged(false);
+// });
+ mSpeedView.setOnLongClickListener(v -> {
+ Log.d(TAG,"长按显示状态工具栏");
+ Intent intent = new Intent();
+ intent.putExtra("oper", 52);
+ MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent);
+ return true;
+ });
+ }
+ tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
+ mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_layout);
+ mMapswitchBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //视角切换
+ if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isLongSight()) {
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).visibleAllMarkers();
+ MogoApisHandler.getInstance().getApis().getMapServiceApi()
+ .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ } else if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isMediumSight()) {
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS);
+ MogoApisHandler.getInstance().getApis().getMapServiceApi()
+ .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ }
+ }
+ });
+ mPersonalBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onGoToTaxiOrders();
+ }
+ });
+
+ mSettingBtn = findViewById(R.id.module_och_taxi_setting_layout);
+ mSettingBtn.setOnClickListener(v -> {
+ // TODO: 2021/12/9
+ CallerHmiManager.INSTANCE.showToolsView();
+ });
+ panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
+ ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() {
+ @Override
+ public void onClickImpl(View v) {
+ // 如果能自动驾驶,就自动驾驶,不能就提示
+ if (FunctionBuildConfig.appIdentityMode == 0x00) {
+ restartAutopilot();
+ }
+ // TODO: 2021/11/27 通过开启结果更新ui
+// onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ }
+ });
+
+ // debug下调用测试面板
+// if (DebugConfig.isDebug()) {
+// ctvAutopilotStatus.setOnLongClickListener(v -> {
+// if (groupTestPanel.getVisibility() == View.VISIBLE) {
+ groupTestPanel.setVisibility(View.GONE);
+// } else {
+// groupTestPanel.setVisibility(View.VISIBLE);
+// }
+// return false;
+// });
+// }
+
+ onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+
+ // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
+// findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用");
+//// Logger.d("lianglihui","模拟 不可自动驾驶");
+// }
+// );
+
+ // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
+// findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, "能使用");
+//
+//// Logger.d("lianglihui","模拟 可自动驾驶");
+// }
+// );
+
+ // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
+// findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, "Running");
+//// Logger.d("lianglihui","模拟 自动驾驶能力");
+// }
+// );
+
+ // 模拟 自动驾驶站
+// findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi().mockOchStatus(-1, "Arrived");
+//
+//// Logger.d("lianglihui","模拟 自动驾驶站");
+// }
+// );
+
+ // 模拟 站点下发工控
+ findViewById(R.id.btnAutopilotControl).setOnClickListener(view ->
+ {
+// Logger.d("lianglihui","模拟 站点下发工控");
+ AutopilotControlParameters currentAutopilot = new AutopilotControlParameters();
+ currentAutopilot.isSpeakVoice = true;
+ // 万集东门站
+ currentAutopilot.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(40.194795425,116.724476409);
+ // 市政府前街18号
+ currentAutopilot.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(40.1939540844,116.720067);
+ // 订单运营类型 (9出租车,10小巴)
+ currentAutopilot.vehicleType = 10;
+ Logger.d(TAG, "模拟 订单站点下发:" + currentAutopilot);
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(currentAutopilot);
+ }
+ );
+
+ tvOperationStatus.setOnClickListener(view -> {
+ onChangeOperationStatus();
+ });
+ mCloseNaviIcon.setOnClickListener(v -> {
+ showNaviToStartStationFragment(false);
+ });
+
+ if (FunctionBuildConfig.appIdentityMode == 0x01) {
+ flStationPanelContainer.setVisibility(View.GONE);
+ tvOperationStatus.setVisibility(View.GONE);
+ mSettingBtn.setVisibility(View.GONE);
+ }
+ }
+ protected void onChangeOperationStatus() {
+
+ }
+
+ protected void onGoToTaxiOrders(){
+
+ }
+ public void showNotice(String notice) {
+ getActivity().runOnUiThread(() -> {
+ AIAssist.getInstance(getContext()).speakTTSVoice(notice);
+ });
+ }
+
+ /**
+ * 改变自动驾驶状态
+ *
+ * @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);
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == mPrevAPStatus) {
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
+ // 2->1
+// AIAssist.getInstance(getContext()).speakTTSVoice("已进入人工驾驶模式");
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == status) {
+ // 2->0
+// AIAssist.getInstance(getContext()).speakTTSVoice("自动驾驶已停止,请人工接管");
+ }
+ }
+ mPrevAPStatus = status;
+ });
+ }
+
+ private AnimationDrawable animationDrawable;
+ public void AutopilotStatusAnimchanged(int status) {
+// mAutopilotTv.setText(isInAutopilot?"自动驾驶":"开启自动驾驶");
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
+ ctvAutopilotStatus.setClickable(true);
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+ if (animationDrawable == null) {
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.anmi_flow));
+ animationDrawable = (AnimationDrawable) ctvAutopilotStatus.getBackground();
+ }
+ if (animationDrawable.isRunning()) {
+ return;
+ }
+ animationDrawable.selectDrawable(0);
+ animationDrawable.start();
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status){
+ ctvAutopilotStatus.setClickable(true);
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+ if (animationDrawable != null){
+ animationDrawable.selectDrawable(0);
+ animationDrawable.stop();
+ }
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
+ animationDrawable = null;
+ } else {
+ ctvAutopilotStatus.setClickable(false);
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_disable));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_disable);
+ if (animationDrawable != null){
+ animationDrawable.selectDrawable(0);
+ animationDrawable.stop();
+ }
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_ic_autopilot_bg));
+ animationDrawable = 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.getAutoPilotStatusInfo().getState());
+ }
+ }, 1000L);
+ }
+
+ private 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();//动画开始
+ } else {
+ isStarting = false;
+ if (autopilotLoadingAnimator != null) {
+ autopilotLoadingAnimator.end();
+ mAutopilotImage.clearAnimation();
+ autopilotLoadingAnimator = null;
+ }
+ }
+ }
+
+ /**
+ * 隐藏【自动驾驶】按钮
+ */
+ public void hideAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setVisibility(View.GONE);
+// slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ /**
+ * 展示【自动驾驶】按钮
+ */
+ public void showAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+ ctvAutopilotStatus.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public void hidPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.GONE);
+ });
+ }
+
+ public void showPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public View getPanelView() {
+ return panelView;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 重新开启自动驾驶
+ */
+ public abstract void restartAutopilot();
+
+
+ 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 切换
+ }
+// private void hideHMI() {
+// // 控制 脉速表 显示状态
+// CallerHmiManager.INSTANCE.setSpeedChartViewVisibility(View.GONE);
+// // 控制 自动驾驶按钮 显示状态
+// CallerHmiManager.INSTANCE.setAutopilotStatusViewVisibility(View.GONE);
+// // 控制 切换视角按钮 显示状态
+// CallerHmiManager.INSTANCE.setPerspectiveSwitchViewVisibility(View.GONE);
+// // 控制 车辆检检测按钮 示状态
+// CallerHmiManager.INSTANCE.setCheckStatusViewVisibility(View.GONE);
+// }
+
+ protected void showNaviToStartStationFragment(boolean isShow){
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (isShow){
+// if (ochNaviFragment == null){
+ ochNaviFragment = OCHNaviFragment.newInstance();
+// }
+ if (ochNaviFragment.isAdded()){
+ return;
+ }
+ transaction.add(R.id.module_mogo_och_navi_panel_container,ochNaviFragment).show(ochNaviFragment);
+ transaction.commitAllowingStateLoss();
+ mCloseNaviIcon.setVisibility(View.VISIBLE);
+ flNaviPanelContainer.setVisibility(View.VISIBLE);
+ CallerSmpManager.hidePanel();//隐藏小地图
+ }else {
+ if (ochNaviFragment != null){
+ ochNaviFragment.onDestroy();
+ transaction.remove(ochNaviFragment);
+ transaction.commitAllowingStateLoss();
+ ochNaviFragment = null;
+ }
+ mCloseNaviIcon.setVisibility(View.GONE);
+ flNaviPanelContainer.setVisibility(View.GONE);
+ CallerSmpManager.showPanel();//显示小地图
+ }
+ }
+
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BaseTaxiUIFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BaseTaxiUIFragment.java
new file mode 100644
index 0000000000..44339d1d5b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BaseTaxiUIFragment.java
@@ -0,0 +1,50 @@
+package com.mogo.och.taxi.passenger.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-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BorderShadowLayout.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BorderShadowLayout.java
new file mode 100644
index 0000000000..ac28d03e84
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/BorderShadowLayout.java
@@ -0,0 +1,360 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.BlurMaskFilter;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.widget.LinearLayout;
+
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.callback.Shadow;
+import com.mogo.och.taxi.passenger.utils.DimenUtil;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ * 边框阴影
+ */
+public class BorderShadowLayout extends LinearLayout {
+
+
+ private static final String TAG = "ShadowLayout";
+
+ //默认阴影半径
+ public static final float SHADOW_DEFAULT_RADIUS = DimenUtil.INSTANCE.dp2px(5);
+
+ //阴影最大偏移量
+ public static final float SHADOW_MAX_OFFSET = DimenUtil.INSTANCE.dp2px(20);
+
+ //阴影最大模糊半径
+ public static final float SHADOW_MAX_BLUR = DimenUtil.INSTANCE.dp2px(20);
+
+
+
+ //默认模糊半径
+ public static final float SHADOW_DEFAULT_BLUR_RADIUS = DimenUtil.INSTANCE.dp2px(5);
+
+
+ //阴影颜色
+ private int shadowColor = Color.parseColor("#333333");
+
+ //阴影类型,0:默认为单边 1:单边 2:邻边 3:四边所有
+ private int shadowType;
+
+ //阴影半径
+ private float shadowRadius = 0f;
+
+ //模糊度半径
+ private float blurRadius = SHADOW_DEFAULT_BLUR_RADIUS ;
+
+ //水平位移
+ private float xOffset = DimenUtil.INSTANCE.dp2px(10);
+
+
+ //竖直方向位移
+ private float yOffset = DimenUtil.INSTANCE.dp2px(10);
+
+ //背景色
+ private int bgColor = Color.WHITE;
+
+ //是否有点击效果
+ private boolean hasEffect = false ;
+
+
+ int left =0 ,right =0,top = 0,bottom = 0 ;
+
+ //代理方式
+ private Shadow shadow = new BorderShadowLayout.ShadowConfig(this);
+
+ private float mWidthMode;
+ private float mHeightMode;
+ private Paint mPaint = new Paint();
+ private Paint locationPaint = new Paint();
+
+ public BorderShadowLayout(Context context) {
+ super(context,null);
+ }
+
+ public BorderShadowLayout(Context context, AttributeSet attrs) {
+ this(context, attrs,0);
+ }
+
+ public BorderShadowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShadowLayout);
+ shadowColor = typedArray.getColor(R.styleable.ShadowLayout_shadowColor, Color.BLUE);
+ blurRadius = typedArray.getDimension(R.styleable.ShadowLayout_blurRadius, SHADOW_DEFAULT_BLUR_RADIUS);
+ shadowRadius = typedArray.getDimension(R.styleable.ShadowLayout_shadowRadius,0);
+ hasEffect = typedArray.getBoolean(R.styleable.ShadowLayout_hasEffect, false);
+ xOffset = typedArray.getDimension(R.styleable.ShadowLayout_xOffset,DimenUtil.INSTANCE.dp2px(10));
+ yOffset = typedArray.getDimension(R.styleable.ShadowLayout_yOffset,DimenUtil.INSTANCE.dp2px(10));
+ bgColor = typedArray.getColor(R.styleable.ShadowLayout_bgColor,Color.WHITE);
+ typedArray.recycle();
+
+ if (shadowRadius<0){
+ shadowRadius = -shadowRadius;
+ }
+ if (blurRadius < 0) {
+ blurRadius = -blurRadius;
+ }
+
+ blurRadius = Math.min(SHADOW_MAX_BLUR,blurRadius);
+
+ if (Math.abs(xOffset)> SHADOW_MAX_OFFSET){
+ xOffset = xOffset/Math.abs(xOffset) * SHADOW_MAX_OFFSET;
+ }
+
+ if (Math.abs(yOffset) > SHADOW_MAX_OFFSET){
+ yOffset = yOffset/Math.abs(yOffset) * SHADOW_MAX_OFFSET;
+ }
+
+ init();
+ }
+
+ private void init(){
+ setBackgroundColor(Color.parseColor("#00ffffff"));
+ if (xOffset>0){
+ //水平偏移量为正数,右侧有阴影,阴影长度为blurRadius+|xOffset|
+ right = (int)(blurRadius + Math.abs(xOffset));
+ }else if (xOffset==0){
+ //水平偏移为0,水平间距为blurRadius
+ left = (int)blurRadius;
+ right = (int)blurRadius;
+ }else {
+ //水平偏移为负数,左侧有阴影,阴影长度为blurRadius+|xOffset|
+ left = (int)(blurRadius + Math.abs(xOffset));
+ }
+ if (yOffset>0){
+ //竖直偏移量为正数,底部有阴影,阴影长度为blurRadius+|yOffset|
+ bottom = (int)(blurRadius + Math.abs(yOffset));
+ }else if (yOffset==0){
+ //竖直偏移量为0,竖直间距为blurRadius
+ top = (int)blurRadius;
+ bottom = (int)blurRadius;
+ }else {
+ //竖直偏移量为负数,顶部有阴影,阴影长度为blurRadius+|yOffset|
+ top = (int)(blurRadius + Math.abs(yOffset));
+ }
+ setPadding(left,top,right,bottom);
+ }
+
+
+
+
+
+ /**
+ * 获取阴影设置
+ * @return 返回阴影设置配置
+ */
+ public Shadow getShadowConfig(){
+ return shadow;
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed,l,t,r,b);
+ }
+
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+ }
+
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ drawBackground(canvas);//放在super前是后景,相反是前景,前景会覆盖子布局
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+
+
+ //绘制背景色(在子view底部)
+ private void drawBackground(Canvas canvas){
+
+ mWidthMode = getMeasuredWidth();
+ mHeightMode = getMeasuredHeight();
+ float startX = 0;
+ float startY = 0;
+ float endX = 0;
+ float endY = 0;
+
+ if (xOffset==0){
+ startX = right;
+ endX = mWidthMode-blurRadius;
+ }else {
+ startX = right+blurRadius;
+ endX = mWidthMode-left-blurRadius;
+ }
+
+ if (yOffset==0){
+ startY = bottom;
+ endY = mHeightMode-blurRadius;
+ }else {
+ startY = bottom+blurRadius;
+ endY = mHeightMode-top-blurRadius;
+ }
+// mPaint.setShadowLayer(blurRadius,0,0,shadowColor);
+ if (blurRadius>0){
+ mPaint.setMaskFilter(new BlurMaskFilter(blurRadius,BlurMaskFilter.Blur.NORMAL));
+ }
+ mPaint.setColor(shadowColor);
+ mPaint.setAntiAlias(true);
+
+ RectF shadowRect = new RectF(startX,startY,endX,endY);
+
+ RectF locationRectF = new RectF(left,top,mWidthMode-right,mHeightMode-bottom);
+ if (shadowRadius==0){
+ //不是圆角
+ canvas.drawRect(shadowRect,mPaint);
+ }else {
+ //圆角,角度为shadowRadius
+ canvas.drawRoundRect(shadowRect,shadowRadius,shadowRadius,mPaint);
+ }
+
+ locationPaint.setColor(bgColor);
+ locationPaint.setAntiAlias(true);
+
+ if (shadowRadius==0){
+ //不是圆角
+ canvas.drawRect(locationRectF,locationPaint);
+ }else {
+ //圆角,角度为shadowRadius
+ canvas.drawRoundRect(locationRectF,shadowRadius,shadowRadius,locationPaint);
+ }
+ }
+
+
+
+ /**
+ * 阴影配置
+ */
+ class ShadowConfig implements Shadow{
+
+ //代理
+ private BorderShadowLayout shadow;
+
+ private ShadowConfig(BorderShadowLayout shadow) {
+ this.shadow = shadow;
+ }
+
+ @Override
+ public Shadow setShadowRadius(float radius) {
+ return setShadowRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
+ }
+
+ @Override
+ public Shadow setShadowRadius(int unit, float radius) {
+ Context c = getContext();
+ Resources r;
+
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+ shadow.shadowRadius = Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics()));
+ return this;
+ }
+
+ @Override
+ public Shadow setShadowColor(int color) {
+ shadow.shadowColor = color;
+ return this;
+ }
+
+ @Override
+ public Shadow setShadowColorRes(int colorRes) {
+ shadow.shadowColor = shadow.getResources().getColor(colorRes);
+ return this;
+ }
+
+ @Override
+ public Shadow setBlurRadius(float radius) {
+ return setBlurRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
+ }
+
+ @Override
+ public Shadow setBlurRadius(int unit, float radius) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+ shadow.blurRadius = Math.min(SHADOW_MAX_BLUR,Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics())));
+ return this;
+ }
+
+ @Override
+ public Shadow setXOffset(float offset) {
+ return setXOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
+ }
+
+ @Override
+ public Shadow setXOffset(int unit, float offset) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+
+ float x = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
+ if (Math.abs(x)> SHADOW_MAX_OFFSET){
+ x = x/Math.abs(x) * SHADOW_MAX_OFFSET;
+ }
+ shadow.xOffset = x;
+ return this;
+ }
+
+ @Override
+ public Shadow setYOffset(float offset) {
+ return setYOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
+ }
+
+ @Override
+ public Shadow setYOffset(int unit, float offset) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+
+ float y = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
+ if (Math.abs(y)> SHADOW_MAX_OFFSET){
+ y = y/Math.abs(y) * SHADOW_MAX_OFFSET;
+ }
+ shadow.yOffset = y;
+ return this;
+ }
+
+ @Override
+ public void commit() {
+ shadow.init();
+ shadow.requestLayout();
+ shadow.postInvalidate();
+ }
+ }
+
+
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHNaviFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHNaviFragment.java
new file mode 100644
index 0000000000..887348c28d
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHNaviFragment.java
@@ -0,0 +1,304 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.model.CustomMapStyleOptions;
+import com.amap.api.navi.AMapNaviView;
+import com.amap.api.navi.AMapNaviViewListener;
+import com.amap.api.navi.AMapNaviViewOptions;
+import com.amap.api.navi.model.RouteOverlayOptions;
+import com.mogo.eagle.core.function.smp.utils.MapAssetStyleUtils;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
+import com.mogo.och.taxi.passenger.model.NaviToDestinationModel;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/30
+ */
+public class OCHNaviFragment extends BaseTaxiUIFragment implements AMapNaviViewListener, View.OnClickListener {
+
+ private AMapNaviView mAMapNaviView;
+// private OverviewButtonView mOverviewButtonView;
+// private NextTurnTipView mNextTurnTipView;
+ private AMap aMap;
+ private IOCHTaxiNaviChangedCallback mNaviToStartInfoCallback; // 前往乘客上车点
+ public static OCHNaviFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHNaviFragment fragment = new OCHNaviFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_navi_view;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ view.bringToFront();
+ initMapView(view);
+ }
+
+ private void initMapView(View view) {
+// mOverviewButtonView = view.findViewById(R.id.navi_overviewbuttonview);
+// mAMapNaviView.setLazyOverviewButtonView(mOverviewButtonView);
+ // mOverviewButtonView.setOnClickListener(this);
+// DriveWayView mDriveWayView = view.findViewById(R.id.navi_drivewayview);
+// mAMapNaviView.setLazyDriveWayView(mDriveWayView);
+// mNextTurnTipView = view.findViewById(R.id.navi_nextturntipview);
+// mAMapNaviView.setLazyNextTurnTipView(mNextTurnTipView);
+ mAMapNaviView = view.findViewById(R.id.navi_view);
+ mAMapNaviView.setAMapNaviViewListener(this);
+ //车头向上模式
+ mAMapNaviView.setNaviMode(AMapNaviView.CAR_UP_MODE);
+ aMap = mAMapNaviView.getMap();
+ //关闭地图文字显示
+ aMap.showMapText(false);
+ // 设置导航地图模式,aMap是地图控制器对象。
+ aMap.setMapType(AMap.MAP_TYPE_NIGHT);
+ // 关闭显示实时路况图层,aMap是地图控制器对象。
+ aMap.setTrafficEnabled(false);
+ setMapViewOptions();
+ new Thread(() -> {
+ try {
+ Thread.sleep(1000L);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (null == getContext()){
+ return;
+ }
+ aMap.setCustomMapStyle(
+ new CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(MapAssetStyleUtils.getAssetsStyle(getContext()))
+ .setStyleExtraData(MapAssetStyleUtils.getAssetsExtraStyle(getContext()))
+ );
+
+ //设置希望展示的地图缩放级别
+ }).start();
+ }
+
+ private void setMapViewOptions() {
+ AMapNaviViewOptions options = new AMapNaviViewOptions();
+ options.setTilt(0);//设置 2D 模式
+ options.setLayoutVisible(false);//设置导航界面UI是否显示。
+ options.setTrafficBarEnabled(false);//设置路况光柱条是否显示(只适用于驾车导航,需要联网)。
+ options.setAutoLockCar(true);//设置6秒后是否自动锁车
+ options.setAutoDisplayOverview(true);//设置是否自动全览模式,即在算路成功后自动进入全览模式
+ options.setTrafficLine(false);
+ options.setModeCrossDisplayShow(true);//设置是否显示路口放大图(路口模型图)
+ options.setAutoChangeZoom(true);//自动缩放级别
+ options.setCarBitmap(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.taxi_navi_arrow_icon));
+ options.setFourCornersBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.taxi_navi_direction_icon));
+ options.setAutoChangeZoom(true);//设置是否开启动态比例尺 (锁车态下自动进行地图缩放变化)
+// options.setZoom(18);//14-18
+// options.setTrafficInfoUpdateEnabled(false);
+// options.setTrafficLayerEnabled(false);//设置[实时交通图层开关按钮]是否显示(只适用于驾车导航,需要联网)。
+// options.setCameraInfoUpdateEnabled(false);
+// options.setCompassEnabled(false);//设置指南针图标否在导航界面显示,默认显示。
+// options.setLaneInfoShow(false);// 设置是否显示道路信息view
+// options.setNaviArrowVisible(false);//设置路线转向箭头隐藏和显示
+// options.setRealCrossDisplayShow(false);//设置是否显示路口放大图(实景图)
+// options.setRouteListButtonShow(true);//设置导航界面是否显示路线全览按钮。
+// options.setSettingMenuEnabled(false);//设置菜单按钮是否在导航界面显示。
+
+ RouteOverlayOptions routeOverlayOptions = new RouteOverlayOptions();
+
+// routeOverlayOptions.setArrowOnTrafficRoute(BitmapFactory.decodeResource(getResources(),R.drawable.custtexture_aolr));
+ routeOverlayOptions.setNormalRoute(BitmapFactory.decodeResource(getResources(), R.drawable.taxi_navi_line_icon));
+ options.setRouteOverlayOptions(routeOverlayOptions);
+
+ mAMapNaviView.setViewOptions(options);
+ }
+ public void goToOverview(){
+ if (mAMapNaviView.isRouteOverviewNow()){
+ mAMapNaviView.recoverLockMode();
+ }else {
+ mAMapNaviView.displayOverview();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+// if (v.getId() == R.id.navi_overviewbuttonview){
+// goToOverview();
+// }
+ }
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ mAMapNaviView.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mAMapNaviView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mAMapNaviView.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(false);
+ 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() {
+ Log.d("wlx", "导航页面加载成功");
+ Log.d("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-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiBeingServerdOrdersFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiBeingServerdOrdersFragment.java
new file mode 100644
index 0000000000..7be2d4f97a
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiBeingServerdOrdersFragment.java
@@ -0,0 +1,498 @@
+package com.mogo.och.taxi.passenger.ui;
+
+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.util.Log;
+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.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
+import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.passenger.model.MogoOCHTaxiModelNew;
+import com.mogo.och.taxi.passenger.model.NaviToDestinationModel;
+import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
+
+import java.text.DecimalFormat;
+import java.util.Calendar;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ * 正在进行中订单
+ */
+public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implements View.OnClickListener, IOCHTaxiNaviChangedCallback {
+
+ public static final String TAG = "OCHTaxiBeingServerd";
+ private static Activity mActivity;
+ private static OCHTaxiFragment mTaxiFragment;
+ private long mOrderId;
+ private double mOrderStartStationLat = 0;
+ private double mOrderStartStationLng = 0;
+
+ public static OCHTaxiBeingServerdOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment) {
+ mActivity = activity;
+ mTaxiFragment = taxiFragment;
+ Bundle args = new Bundle();
+
+ OCHTaxiBeingServerdOrdersFragment fragment = new OCHTaxiBeingServerdOrdersFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ private TextView mOrderStatus;
+ private ImageView mOrderCancel;
+ private TextView mOrderServerStatus;
+ 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 LinearLayout mContentModule32;
+ private TextView mStationTv32;
+ private TextView mArrivedStationTitleTv32;
+ private TextView mGoAheadStationTitleTv31;
+ private TextView mCatchStationTitleTv31;
+ private ImageView mNaviIcon;
+
+ private TextView mNoDatasTv;
+
+ private ConstraintLayout mNoDataView;
+
+ private volatile int saveOrderState = -1;
+
+ @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);
+ 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);
+ mNoDatasTv = view.findViewById(R.id.no_order_data_tv);
+ mNoDataView = view.findViewById(R.id.being_no_data_view);
+ mOrderCancel.setOnClickListener(this);
+ mOrderServerStatus.setOnClickListener(this);
+
+ initNaviView(view);
+
+ isHaveBeingOrder(false);
+
+ if (DebugConfig.isDebug()) {
+ initOrderTestBar(view);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ MogoOCHTaxiModelNew.getInstance().startOrStopOrderLoop();
+ }
+
+ private void initNaviView(View view) {
+ mNaviIcon = view.findViewById(R.id.module_och_taxi_navi_iv);
+ mNaviIcon.setOnClickListener(this);
+ }
+
+ private boolean isSpeakedEndingNotice = false;
+
+ /**
+ * 初始化订单信息
+ */
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ if (order == null) return;
+ if (order.orderStatus == OrderStatusEnum.JourneyCompleted.getCode()) {
+ isHaveBeingOrder(false);
+ return;
+ }
+ mOrderId = order.orderId;
+ onOrderStatusChanged(order.orderStatus);
+ if (OrderStatusEnum.ArriveAtEndStation.getCode() == order.orderStatus) {
+ mTaxiFragment.queryCurOrderRouteInfo();
+ mContentModule3.setVisibility(View.GONE);
+ mContentModule2.setVisibility(View.VISIBLE);
+ Logger.d(TAG, "已经达到终点");
+ mOrderStatus.setText(R.string.module_och_taxi_arrive_at_end_station2);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_end);
+ mOrderServerStatus.setTextColor(Color.parseColor("#FFFFFF"));
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#FF1D5EF3"));
+ mOrderServerStatus.setClickable(true);
+// String strHtml3 = "送乘客至
"
+// + "" + order.endSiteAddr + "";
+ mTitleTV2.setText("送乘客至");
+ mStationTv2.setText(order.endSiteAddr);
+// String strHtml2 = "距离 " + "- -" + " 公里,"
+// + "用时 " + "- -" + " 分钟";
+// mDistanceAndTime.setText(Html.fromHtml(strHtml2));
+ } else if (OrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus) {
+ Logger.d(TAG, "已经去往终点");
+ mContentModule3.setVisibility(View.GONE);
+ mContentModule2.setVisibility(View.VISIBLE);
+ mOrderStatus.setText(R.string.module_och_taxi_on_the_way_2_end_station);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_end);
+ mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF"));
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#4D1D5EF3"));
+ mOrderServerStatus.setClickable(false);
+// String strHtml3 = "送乘客至
"
+// + "" + order.endSiteAddr + "";
+ mTitleTV2.setText("送乘客至");
+// mStationTv2.setText(order.endSiteAddr);
+ mStationTv2.setText(order.endSiteAddr);
+// String strHtml4 = "距离 " + "- -" + " 公里,"
+// + "用时 " + "- -" + " 分钟";
+// mDistanceAndTime.setText(Html.fromHtml(strHtml4));
+ } else if (OrderStatusEnum.ArriveAtStartStation.getCode() == order.orderStatus) {
+ Logger.d(TAG, "已经达到起点");
+ mContentModule2.setVisibility(View.GONE);
+ mContentModule3.setVisibility(View.VISIBLE);
+ mArrivedStartTimeTv32.setVisibility(View.VISIBLE);
+ mContentModule32.setVisibility(View.VISIBLE);
+ mContentModule31.setVisibility(View.GONE);
+ mOrderOtherContent3.setVisibility(View.GONE);
+ mOrderStatus.setText(R.string.module_och_taxi_waiting);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_start);
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#FF1D5EF3"));
+ mOrderServerStatus.setTextColor(Color.parseColor("#FFFFFF"));
+ mOrderServerStatus.setClickable(true);
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ String currentHM = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_HH_mm);
+ String currentDay = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
+ String strHtml11 = "已于
"
+ + "" + currentHM + ""
+ + "" + " " + "到达乘客上车地点";
+ mArrivedStartTimeTv32.setLineHeight(60);
+ mArrivedStartTimeTv32.setText(Html.fromHtml(strHtml11));
+// String strHtml12 = "送乘客至
"
+// + "" + order.endSiteAddr + "";
+ mArrivedStationTitleTv32.setText("送乘客至");
+ mStationTv32.setText(order.endSiteAddr);
+ currentCale.add(Calendar.MINUTE, 10);
+ String strHtml13 = "";
+ if (currentDay.equals(OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd))) {
+ strHtml13 = "免费等待至 "
+ + "" + OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_HH_mm) + "";
+
+ } else {
+ strHtml13 = "免费等待至"
+ + "" + OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_MM_dd_HH_mm) + "";
+ }
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml13));
+ } else if (MogoOCHTaxiModelNew.getInstance().checkCurrentOCHOrder()) {
+ Logger.d(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);
+ mOrderStatus.setText(R.string.module_och_taxi_new_order);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_start);
+ mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF"));
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#4D1D5EF3"));
+ mOrderServerStatus.setClickable(false);
+ mGoAheadStationTitleTv31.setText("前往");
+ mCatchStationTitleTv31.setText("接乘客");
+// String strHtml0 = "前往
"
+// + "" + order.startSiteAddr + "
"
+// + "接乘客";
+ mStationTv31.setText(order.startSiteAddr);
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ Calendar startCale = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
+ String currentDay = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
+ String startDay = OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
+ String strHtml1 = "";
+ if (currentDay.equals(startDay)) {
+ strHtml1 = "乘客将于
"
+ + "" + OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_HH_mm) + ""
+ + " 用车";
+ } else {
+ strHtml1 = "乘客将于
"
+ + "" + OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_MM_dd_HH_mm) + ""
+ + " 用车";
+ }
+ mOrderOtherContent3.setText(Html.fromHtml(strHtml1));
+// String strHtml2 = "距离 " + "- -" + " 公里,"
+// + "用时 " + "- -" + " 分钟";
+// mDistanceAndTime.setText(Html.fromHtml(strHtml2));
+ mOrderStartStationLat = order.startSiteGcjPoint.get(1);
+ mOrderStartStationLng = order.startSiteGcjPoint.get(0);
+ }
+ }
+
+ private void startNaviToStartStation(boolean isShow, double orderStartStationLat, double orderStartStationLng) {
+ NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ Log.d(TAG, "currentLatLng=" + mTaxiFragment.mCurLatitude + " " + mTaxiFragment.mCurLongitude);
+ NaviLatLng startNaviLatLng = new NaviLatLng(mTaxiFragment.mCurLatitude, mTaxiFragment.mCurLongitude);
+ NaviLatLng endNaviLatLng = new NaviLatLng(orderStartStationLat, orderStartStationLng);
+ NaviToDestinationModel.getInstance(getContext()).initAMapNavi(startNaviLatLng, endNaviLatLng);
+ NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(isShow);
+ NaviToDestinationModel.getInstance(getContext()).setOCHTaciNaviChangedCallback(this);
+ }
+
+ private void showOrHideNavi(boolean isShow) {
+ if (!isShow) {
+ mNaviIcon.setVisibility(View.GONE);
+ NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ mTaxiFragment.showNaviToStartStationFragment(false);
+ }
+ }
+
+ public void updateDistanceAndTime(long meters, long timeInSecond) {
+// Log.d(TAG,"meters = "+meters);
+ if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) {
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dis = fnum.format((float) meters / 1000);
+ String strHtml2 = "里程 " + "" + dis + "" + " 公里"
+ + ",剩余 " + "" + (int) timeInSecond / 60 + "" + " 分钟";
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml2));
+ mNaviIcon.setVisibility(View.VISIBLE);
+ } else if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) {
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dis = fnum.format((float) meters / 1000);
+ String strHtml2 = "距离 " + "" + dis + "" + " 公里";
+// + ",用时 " + ""+(int)timeInSecond/60+"" + " 分钟";
+ mDistanceAndTime2.setText(Html.fromHtml(strHtml2));
+ }
+ }
+
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
+ Log.d(TAG, "meters = " + routeInfo.durationToEnd);
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dis = fnum.format((float) routeInfo.distanceToEnd / 1000);
+ String strHtml2 = "距离 " + "" + dis + "" + " 公里"
+ + ",用时 " + "" + (int) routeInfo.durationToEnd / 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));
+ }
+ }
+
+ public synchronized void SpeakNoticeOnce() {
+ if (!isSpeakedEndingNotice) {
+ isSpeakedEndingNotice = true;
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1));
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ }
+
+ private void startOrEndService(String step) {
+ if (step.equals("服务完成")) {//点击了完成服务,结束订单并更新订单信息
+// isHaveBeingOrder(false);
+ mTaxiFragment.completeOrderService(OrderStatusEnum.JourneyCompleted);
+ showNotice("车辆已停稳,请携带好随身物品,下车请注意安全");
+ return;
+ } else if (step.equals("开始服务")) {//点击服务,开启自动驾驶
+ mTaxiFragment.startAutoPilot();
+ showNotice("自动驾驶已启动,请系好安全带");
+ }
+ }
+
+ public void onOrderStatusChanged(int status) {
+ Log.d(TAG, "status==" + status);
+ mActivity.runOnUiThread(() -> {
+ if (status == OrderStatusEnum.None.getCode() || status == OrderStatusEnum.Cancel.getCode() || status == OrderStatusEnum.JourneyCompleted.getCode()) {
+ isSpeakedEndingNotice = false;
+ isHaveBeingOrder(false);
+ } else {
+ isHaveBeingOrder(true);
+ }
+ if (status != saveOrderState) {
+ OrderStatusEnum ochStatus = OrderStatusEnum.valueOf(status);
+ switch (ochStatus) {
+ case OnTheWayToStartStation:
+ showNotice(mActivity.getString(R.string.module_och_taxi_new_order));
+ startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng);
+ showOrHideNavi(true);
+ break;
+ case Cancel:
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel));
+ showOrHideNavi(false);
+ break;
+ case ArriveAtStartStation:
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text));
+ showOrHideNavi(false);
+ break;
+ case OnTheWayToEndStation:
+// showNotice("欢迎使用蘑菇智行");
+ showOrHideNavi(false);
+ break;
+ case ArriveAtEndStation:
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1));
+ showOrHideNavi(false);
+ break;
+ case JourneyCompleted:
+ showNotice("感谢您使用蘑菇智行,再见~");
+ showOrHideNavi(false);
+ break;
+ }
+ }
+ saveOrderState = status;
+ });
+ }
+
+ /**
+ * 是否有正在进行的订单,进行UI显示
+ *
+ * @param being
+ */
+ public void isHaveBeingOrder(boolean being) {
+ Log.d(TAG, "isHaveBeingOrder = " + being);
+ if (being) {
+ mNoDataView.setVisibility(View.GONE);
+ mBeingOrderLayout.setVisibility(View.VISIBLE);
+ mTaxiFragment.changeOperationViewVisible(View.GONE);
+ } else {
+ mNoDataView.setVisibility(View.VISIBLE);
+ mNoDatasTv.setText("暂无进行中订单");
+ mBeingOrderLayout.setVisibility(View.GONE);
+ mTaxiFragment.changeOperationViewVisible(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.module_och_taxi_order_server_status_tv) {
+ switch (mOrderServerStatus.getText().toString().trim()) {
+ case "开始服务":
+ case "服务完成":
+ Log.d(TAG, mOrderServerStatus.getText().toString());
+ startOrEndService(mOrderServerStatus.getText().toString().trim());
+ break;
+ }
+ } else if (v.getId() == R.id.module_och_taxi_order_cancel_iv) {
+ new OCHTaxiOrderCancelDialog(mTaxiFragment, mActivity, mOrderId, saveOrderState).show();
+ } else if (v.getId() == R.id.module_och_taxi_navi_iv) {
+ // TODO: 2021/11/30 打开去往乘客上车点的导航页面
+ if (mTaxiFragment != null) {
+ showNaviToStartStationFragment(true);
+ }
+ }
+ }
+
+ /**
+ * 显示/隐藏 前往乘客上车点的导航
+ *
+ * @param isShow
+ */
+ private void showNaviToStartStationFragment(boolean isShow) {
+ mTaxiFragment.showNaviToStartStationFragment(isShow);
+ startNaviToStartStation(isShow, mOrderStartStationLat, mOrderStartStationLng);
+ }
+
+
+ public void onCurrentOrderCancelDone() {
+ //提交取消订单后的回调
+ TipToast.tip("订单取消成功");
+ //更新界面
+ isHaveBeingOrder(false);
+ showOrHideNavi(false);
+ }
+
+ /**
+ * 订单流转debug START
+ */
+ private void initOrderTestBar(View view) {
+ mOrderStatus.setOnLongClickListener(v -> {
+ mTaxiFragment.clickTestBar();
+ return false;
+ });
+ }
+
+ public void showNotice(String notice) {
+ mActivity.runOnUiThread(() -> {
+ AIAssist.getInstance(getContext()).speakTTSVoice(notice);
+ });
+ }
+
+ @Override
+ public void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond) {
+ updateDistanceAndTime(meters, timeInSecond);
+ }
+
+ @Override
+ public void reInitNaviAmap(boolean isPlay, boolean isRestart) {
+ Log.d(TAG, "isPlay = " + isPlay + ", isRestart=" + isRestart);
+ if (!isRestart) {
+ mTaxiFragment.showNaviToStartStationFragment(false);
+ return;
+ }
+ mTaxiFragment.showNaviToStartStationFragment(false);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (saveOrderState == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng);
+ }
+ }
+ }, 2000);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (saveOrderState == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ if (mNaviIcon.getVisibility() == View.GONE) {
+ mNaviIcon.setVisibility(View.VISIBLE);
+ }
+ }
+
+ }
+ }, 3000);
+ }
+ /**
+ * END
+ */
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiFragment.java
new file mode 100644
index 0000000000..f723db9492
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiFragment.java
@@ -0,0 +1,338 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.passenger.model.MogoOCHTaxiModelNew;
+import com.mogo.och.taxi.passenger.presenter.OCHTaxiPresenter;
+import com.mogo.och.taxi.passenger.utils.PinYinUtil;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 网约车-出租车UI
+ */
+public class OCHTaxiFragment extends BaseOchTaxiTabFragment implements OCHTaxiView{
+
+ public static final String TAG = "OCHTaxiFragment";
+
+ public static OCHTaxiFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHTaxiFragment fragment = new OCHTaxiFragment();
+ fragment.setArguments( args );
+ return fragment;
+ }
+ private OCHTaxiGrabOrderFragment grabOrderFragment;
+ private OCHTaxiServerOrdersFragment serverOrdersFragment;
+ private WeakReference personalDialogFragment = null;
+ protected double mCurLatitude = 0.0;
+ protected double mCurLongitude = 0.0;
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.taxi_panel;
+ }
+
+ @Override
+ public void restartAutopilot() {
+ // 在自动驾驶中,才会有重新开启自动驾驶的操作
+ if (mPresenter.getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
+ Logger.d( TAG, "restartAutopilot" );
+ mPresenter.startAutoPilot();
+ startOrStopLoadingAnim(true);
+ }
+ }
+
+ @Override
+ public String getTagName() {
+ return "OCHTaxiFragment";
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ protected void initViews() {
+ super.initViews();
+ mPersonalBtn.setVisibility(View.GONE);
+ initFragment();
+ hidPanel();
+ if ( MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .isVrMode() ) {
+ switchVRFlatMode(true);
+ } else {
+ switchVRFlatMode(false);
+ }
+
+ if (FunctionBuildConfig.appIdentityMode == 0x00) {
+ tvOperationStatus.setVisibility(View.VISIBLE);
+ } else {
+ tvOperationStatus.setVisibility(View.GONE);
+ }
+
+ if (DebugConfig.isDebug()) {
+ initOrderTestBar();
+ }
+
+ }
+
+ private void initFragment() {
+ serverOrdersFragment = OCHTaxiServerOrdersFragment.newInstance();
+ grabOrderFragment = OCHTaxiGrabOrderFragment.newInstance();
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ //默认显示OCHTaxiServerOrdersFragment
+ transaction.add(R.id.fragment_container,serverOrdersFragment).show(serverOrdersFragment);
+ transaction.add(R.id.fragment_container,grabOrderFragment).hide(grabOrderFragment);
+ transaction.commitAllowingStateLoss();
+ }
+
+ private void showGrabFragmentAndUpdate() {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (grabOrderFragment == null){
+ grabOrderFragment = OCHTaxiGrabOrderFragment.newInstance();
+ transaction.add(R.id.fragment_container,grabOrderFragment).show(grabOrderFragment).commitAllowingStateLoss();
+ }else {
+ transaction.show(grabOrderFragment).hide(serverOrdersFragment).commitAllowingStateLoss();
+ }
+ }
+
+ public void showServerFragmentAndUpdate() {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (serverOrdersFragment == null){
+ serverOrdersFragment = OCHTaxiServerOrdersFragment.newInstance();
+ transaction.add(R.id.fragment_container,serverOrdersFragment).show(serverOrdersFragment);
+ }else {
+ transaction.show(serverOrdersFragment).hide(grabOrderFragment).commitAllowingStateLoss();
+ }
+ }
+
+ @NonNull
+ @Override
+ protected OCHTaxiPresenter createPresenter() {
+ return new OCHTaxiPresenter( 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();
+ }
+
+ public void updateOperationStatus(boolean inOperation) {
+ Logger.e(TAG,"onOperationChanged:"+ inOperation);
+ isOperationStatus = inOperation;
+ if ( inOperation ) {
+ tvOperationStatus.setText( "收车" );
+ mPersonalBtn.setVisibility(View.VISIBLE);
+ tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.taxi_back_btn),null,null,null);
+ showPanel();
+ } else {
+// AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
+ tvOperationStatus.setText("出车");
+ tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.taxi_out_btn),null,null,null);
+ mPersonalBtn.setVisibility(View.GONE);
+ hidPanel();
+ }
+ }
+
+ @Override
+ protected void onGoToTaxiOrders() {
+ personalDialogFragment = new WeakReference<>(new OCHTaxiPersonalDialogFragment(this));
+ personalDialogFragment.get().show(getActivity().getSupportFragmentManager(),"service_data");
+ }
+
+ public void routeResult(List routeList) {
+ if (routeList == null ) return;
+// double distance = calculateTravelDistance(mogoLocation,routeList);
+// if ( MogoOCHTaxiModel.getInstance().checkCurrentOCHOrder() ) {
+// MogoOCHTaxiModel.getInstance().getCurrentOCHOrder().decreaseTravelDistance( distance );
+// updateOrderBaseStatusInfo();
+// }
+// Logger.d("lianglihui","routeResult 剩余导航距离:"+distance);
+// if (routeList != null && routeList.size() >0){
+// Logger.d("lianglihui","routeResult:"+routeList.size());
+// //adas回调导航路径 绘制引导线
+// if ( ochTaxiOverlayManager == null){
+// ochTaxiOverlayManager = new OCHTaxiOverlayManager(this.getContext());
+// }
+// ochTaxiOverlayManager.draw(mogoLocation,routeList);
+// }
+ }
+ @Override
+ public void onMapLoaded() {
+ }
+
+ public void updateAutopilotStatus(int status) {
+ onAutopilotStatusChanged(status);
+ }
+ /**
+ * 收到自动驾驶通知的成功状态之后,设置本地状态及服务端状态
+ */
+ private void resetOCHTaxiOrderAutopilotStatus() {
+ mPresenter.updateCurOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ }
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order){
+ if (serverOrdersFragment != null){
+ serverOrdersFragment.updateCurrentOrderStatusChanged(order);
+ }
+ }
+ public void startAutoPilot(){
+ mPresenter.startAutoPilot();
+ startOrStopLoadingAnim(true);
+ }
+ public void completeOrderService(OrderStatusEnum status){
+ mPresenter.updateCurOrderStatus(status);
+ }
+ public void cancelCurOrder(int reasonType, String reaso){
+ mPresenter.cancelCurOrder(reasonType,reaso);
+ }
+
+ public void cancelOrderById(long orderId, int reasonType, String reason){
+ mPresenter.cancelOrderById(orderId,reasonType,reason);
+ }
+ public void onCurrentOrderCancelDone(){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onCurrentOrderCancelDone();
+ }
+ public void onOrderCancelDone(long orderId){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onOrderCancelDone(orderId);
+ }
+ public void onNewBookingOrderGot(OrderQueryRespBean.Result order){
+ if (null == order) return;
+ showGrabFragmentAndUpdate();
+ grabOrderFragment.updateGrabOrder(order);
+ }
+ public void grabOrder(){
+ mPresenter.grabOrder();
+ }
+ public void cancelNewBookingOrder(){
+ mPresenter.cancelNewBookingOrder();
+ showServerFragmentAndUpdate();
+ }
+ public void onGrabOrderExecuteDone(){
+ if (null == grabOrderFragment) return;
+ grabOrderFragment.onGrabOrderExecuteDone();
+ }
+ public void onGrabOrderSuccess(OrderQueryRespBean.Result order){
+ if (null == grabOrderFragment) return;
+ if (null == order){
+ showServerFragmentAndUpdate();
+ return;
+ }
+ showGrabFragmentAndUpdate();
+ grabOrderFragment.onGrabOrderSuccess();
+ }
+ public void onGrabOrderFailed(OrderQueryRespBean.Result order){
+ if (order == null){
+ showServerFragmentAndUpdate();
+ return;
+ }
+ if (null == grabOrderFragment) return;
+ showGrabFragmentAndUpdate();
+ grabOrderFragment.onGrabOrderFailed();
+ }
+ public void onOrdersWaitServiceChanged(List waitServiceList){
+ if (null == waitServiceList) return;
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onOrdersWaitServiceChanged(waitServiceList);
+ }
+ public void queryOrdersList(int page, int size){
+ mPresenter.queryOrdersList(page,size);
+ }
+ public void onOrdersListPageRefresh(List ordersList){
+ if (null == personalDialogFragment) personalDialogFragment = new WeakReference<>(new OCHTaxiPersonalDialogFragment(this));
+ personalDialogFragment.get().onOrdersListPageRefresh(ordersList);
+ }
+ public void queryDriverServiceData(){
+ mPresenter.queryDriverServiceData();
+ }
+ public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum){
+ if (null == personalDialogFragment) return;
+ personalDialogFragment.get().onServiceDataUpdate(dailyTimeDuration,dailyOrderNum);
+ }
+ public void queryCurOrderRouteInfo(){
+ mPresenter.queryCurOrderRouteInfo();
+ }
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onCurrentOrderRouteInfoGot(routeInfo);
+ }
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond){
+// if (null == serverOrdersFragment) return;
+// serverOrdersFragment.onCurrentOrderDistToStartChanged(meters,timeInSecond);
+ }
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onCurrentOrderDistToEndChanged(meters,timeInSecond);
+ }
+ public void updateLocation(double latitude,double longitude){
+ this.mCurLatitude = latitude;
+ this.mCurLongitude = longitude;
+ }
+ /**
+ * 订单流转debug START
+ */
+ public void initOrderTestBar() {
+ findViewById(R.id.test_bar_to_start).setOnClickListener(v -> {
+ MogoOCHTaxiModelNew.getInstance().setArriveAtStartStation();
+ });
+ findViewById(R.id.test_bar_to_end).setOnClickListener(v -> {
+ MogoOCHTaxiModelNew.getInstance().setArriveAtEndStation();
+ });
+ findViewById(R.id.test_bar_on_the_way_to_end).setOnClickListener(v ->{
+ showNotice("自动驾驶已启动,请系好安全带");
+ MogoOCHTaxiModelNew.getInstance().setOnTheWayToEndStation();
+ });
+ }
+ public void clickTestBar(){
+ View testBar = findViewById(R.id.module_och_taxi_order_status_change_test_bar);
+ if (testBar.getVisibility() == View.VISIBLE) {
+ testBar.setVisibility(View.GONE);
+ } else {
+ TextView testCurOrderId = findViewById(R.id.test_bar_current_order_id);
+ TextView testCurStartName = findViewById(R.id.test_bar_current_start_name);
+ TextView testCurEndName = findViewById(R.id.test_bar_current_end_name);
+ OrderQueryRespBean.Result order = MogoOCHTaxiModelNew.getInstance().getCurrentOCHOrder();
+
+ testCurOrderId.setText(order == null ? "" : String.valueOf(order.orderId));
+ testCurStartName.setText(order == null ? "" : PinYinUtil.getPinYinHeadChar(order.startSiteAddr));
+ testCurEndName.setText(order == null ? "" : PinYinUtil.getPinYinHeadChar(order.endSiteAddr));
+
+ testBar.setVisibility(View.VISIBLE);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiGrabOrderFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiGrabOrderFragment.java
new file mode 100644
index 0000000000..edcfff4a28
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiGrabOrderFragment.java
@@ -0,0 +1,193 @@
+package com.mogo.och.taxi.passenger.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.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
+
+import java.util.Calendar;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/9
+ */
+public class OCHTaxiGrabOrderFragment 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 OCHTaxiGrabOrderFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHTaxiGrabOrderFragment fragment = new OCHTaxiGrabOrderFragment();
+ 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();
+ }
+ getOchTaxiFragment().cancelNewBookingOrder();
+ }else if (v.getId() == R.id.grab_order_tv){
+ if (!mOrderGrabBt.getText().toString().equals("抢单中...")){
+ getOchTaxiFragment().grabOrder();
+ return;
+ }
+ }
+ }
+ private OCHTaxiFragment getOchTaxiFragment(){
+ return (OCHTaxiFragment)getParentFragment();
+ }
+ public void updateGrabOrder(OrderQueryRespBean.Result order){
+ mGrabResultAnimView.setVisibility(View.GONE);
+ Calendar calendar = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
+ if (OchTaxiUtils.compareDateIsCurrentDay(calendar)){
+ mOrderReserverTime.setText("用车时间:今天 "+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
+ getOchTaxiFragment().showNotice("预约单,今天"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm)+"从"
+ +order.startSiteAddr+"到"+order.endSiteAddr);
+ }else {
+ mOrderReserverTime.setText("用车时间:"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd_HH_mm));
+ getOchTaxiFragment().showNotice("预约单,"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_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.taxi_driver_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.setTextSize(21);
+ 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 和 动画 语音
+ getOchTaxiFragment().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 和 动画 语音
+ getOchTaxiFragment().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-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiOperationDatasFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiOperationDatasFragment.java
new file mode 100644
index 0000000000..74f7d32216
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiOperationDatasFragment.java
@@ -0,0 +1,130 @@
+package com.mogo.och.taxi.passenger.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.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/10
+ */
+public class OCHTaxiOperationDatasFragment 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 OCHTaxiOperationDatasFragment newInstance(Context context, int type) {
+ mContext = context;
+ mType = type;
+ Bundle args = new Bundle();
+ OCHTaxiOperationDatasFragment fragment = new OCHTaxiOperationDatasFragment();
+ 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);
+ }
+
+ 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);
+ 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(OchTaxiUtils.secondsToHourStr(datas.get(position))) ? "0": OchTaxiUtils.secondsToHourStr(datas.get(position));
+ String minuteData = OchTaxiUtils.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-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiOrderCancelDialog.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiOrderCancelDialog.java
new file mode 100644
index 0000000000..9e046ae715
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiOrderCancelDialog.java
@@ -0,0 +1,210 @@
+package com.mogo.och.taxi.passenger.ui;
+
+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.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+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.toast.TipToast;
+import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.constant.OrderCancelReasons;
+
+import java.lang.ref.WeakReference;
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/18
+ */
+public class OCHTaxiOrderCancelDialog 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 long mOrderId;
+
+ protected OCHTaxiOrderCancelDialog(OCHTaxiFragment fragment, Context context, long orderId, int orderStatus) {
+ super(context,R.style.OrderCancelDialog);
+ mOrderId = orderId;
+ mOchTaxiFragmentWeak = new WeakReference<>(fragment);
+ this.mOrderStatus = orderStatus;
+ contextWeakReference = new WeakReference<>(context);
+ initReasonArray();
+ }
+
+ private void initReasonArray() {
+ if (1 == mOrderStatus) {
+ mContentArrays = new String[]{OrderCancelReasons.BookPassengerCancel.getMsg(), OrderCancelReasons.CarBroken.getMsg(),
+ OrderCancelReasons.BookJourneyConflict.getMsg(), OrderCancelReasons.BatteryLow.getMsg(),
+ OrderCancelReasons.BookOther.getMsg()};
+ return;
+ }
+ OrderStatusEnum ochStatus = OrderStatusEnum.valueOf(mOrderStatus);
+ switch (ochStatus) {
+ case OnTheWayToStartStation:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg()};
+ break;
+ case ArriveAtStartStation:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(),
+ OrderCancelReasons.PassengerNotArrive.getMsg()};
+ break;
+ case OnTheWayToEndStation:
+ case ArriveAtEndStation:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(), OrderCancelReasons.PassengerStopOver.getMsg()};
+ break;
+ default:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(),
+ OrderCancelReasons.PassengerNotArrive.getMsg(), OrderCancelReasons.PassengerStopOver.getMsg()};
+ break;
+
+ }
+ }
+
+ protected OCHTaxiOrderCancelDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
+ super(context, cancelable, cancelListener);
+ }
+
+ protected OCHTaxiOrderCancelDialog(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);
+
+ Window window = getWindow();
+ //dialog padding 去掉
+ window.getDecorView().setPadding(0,0,0,0);
+ window.setDimAmount(0.5f);
+ window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));//设置背景, 不然显示不全
+ }
+
+ @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) && OrderCancelReasons.getType(mCurrentReason) != 0) {
+ if (1 == mOrderStatus){//预约单
+ mOchTaxiFragmentWeak.get().cancelOrderById(mOrderId,OrderCancelReasons.getType(mCurrentReason),mCurrentReason);
+ }else {//即时单
+ mOchTaxiFragmentWeak.get().cancelCurOrder(OrderCancelReasons.getType(mCurrentReason),mCurrentReason);
+ }
+ dismiss();
+ }else {
+ TipToast.longTip("取消原因不能为空");
+ }
+ }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) {
+ Log.d(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.taxi_selected_btn),null,null,null);
+ }else {
+ viewHolder.checkBoxTv.setCompoundDrawablesWithIntrinsicBounds(context.getResources().getDrawable(R.drawable.taxi_unselect_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-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiPersonalDialogFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiPersonalDialogFragment.java
new file mode 100644
index 0000000000..106b2c7d9f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiPersonalDialogFragment.java
@@ -0,0 +1,533 @@
+package com.mogo.och.taxi.passenger.ui;
+
+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.Log;
+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.DialogFragment;
+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.debug.DebugConfig;
+import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.constant.OrderTypeEnum;
+import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
+
+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/8/18
+ */
+public class OCHTaxiPersonalDialogFragment extends DialogFragment 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 = 0;
+ private int mPerPageSize = 10;
+ private static OCHTaxiFragment mTaxiFragment;
+ private static boolean serverHadNoData = false;
+
+ public OCHTaxiPersonalDialogFragment(){
+ }
+
+ public OCHTaxiPersonalDialogFragment(OCHTaxiFragment taxiFragment){
+ mTaxiFragment = taxiFragment;
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+// getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
+ View view = inflater.inflate(R.layout.taxi_orders_list_view, container, false);
+ initView(view);
+ return view;
+ }
+
+ @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;
+ window.setAttributes(params);
+ //设置背景, 不然显示不全
+ window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));
+ window.setGravity(Gravity.LEFT|Gravity.BOTTOM);
+ }
+
+ private void initView(View view) {
+ initOperationTabDatas(view);
+ mCloseIv = view.findViewById(R.id.module_och_taxi_order_list_close_iv);
+ mOperationDataRl = view.findViewById(R.id.module_och_taxi_operation_data_rl);
+ mShowOrdersBt = view.findViewById(R.id.module_och_taxi_order_list_show_bt);
+ mOrdersRv = view.findViewById(R.id.module_och_taxi_order_list);
+
+ mNoDatas = view.findViewById(R.id.no_order_data_view);
+ ImageView imageView = view.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(View view) {
+ mOperationTab = view.findViewById(R.id.operation_data_tablayout);
+ mOperationViewPager = view.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(OCHTaxiOperationDatasFragment.newInstance(getActivity(),0));
+ }else if (1 == i){
+ mOperationTab.addTab(tab);
+ changeOperationTabLayoutTabUI(tab,false);
+ fragments.add(OCHTaxiOperationDatasFragment.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);
+
+ if (mTaxiFragment == null){
+ dismiss();
+ }else {
+ mTaxiFragment.queryDriverServiceData();
+ }
+ }
+
+ /**
+ * 更新运营数据 时间和订单数
+ * @param dailyTimeDuration
+ * @param dailyOrderNum
+ */
+ 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(23);
+ Log.d(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(20);
+ Log.d(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();
+ requestOrdersList(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){
+ requestOrdersList(mNextPage, mPerPageSize);
+ }
+ }
+ });
+ mOrdersRv.setAdapter(mAdapter);
+ }
+
+ /**
+ * 请求订单数据
+ * @param page
+ * @param size
+ */
+ private void requestOrdersList(int page, int size){
+ mTaxiFragment.queryOrdersList(page,size);
+ }
+
+ /**
+ * 订单数据结果返回
+ * @param ordersList
+ */
+ public void onOrdersListPageRefresh(List ordersList){
+ if (null == ordersList && mNextPage == 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);
+ mAdapter.notifyDataSetChanged();
+ mNextPage = mNextPage +1;
+ }
+
+ 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(OchTaxiUtils.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 = OchTaxiUtils.getYMDTime(orders.get(position).createTime);//获取当前订单时间
+ int prevIndex = position - 1;
+ String preDate = OchTaxiUtils.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 = OchTaxiUtils.getYMDTime(orders.get(position).createTime);//获取当前订单时间
+ int nextIndex = position + 1;
+ String preDate = OchTaxiUtils.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(OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_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.orderId));
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private String getOrderStatus(int status, Button button){
+ OrderStatusEnum orderStatus = OrderStatusEnum.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 == OrderTypeEnum.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);
+ if (DebugConfig.isDebug()){
+ // TODO: 2021/11/23 因当前上线版本均打开了debug,所以此处隐藏orderId
+ orderNumTv.setVisibility(View.GONE);
+ }else {
+ orderNumTv.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ 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();
+ Log.d(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-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiRadiuImageView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiRadiuImageView.java
new file mode 100644
index 0000000000..39d589031b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiRadiuImageView.java
@@ -0,0 +1,110 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Path;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.appcompat.widget.AppCompatImageView;
+
+import com.mogo.och.taxi.passenger.R;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/29
+ */
+public class OCHTaxiRadiuImageView extends AppCompatImageView {
+ private float width, height;
+ private int defaultRadius = 0;
+ private int radius;
+ private int leftTopRadius;
+ private int rightTopRadius;
+ private int rightBottomRadius;
+ private int leftBottomRadius;
+
+
+ public OCHTaxiRadiuImageView(Context context) {
+ this(context, null);
+ init(context, null);
+ }
+
+ public OCHTaxiRadiuImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ init(context, attrs);
+ }
+
+ public OCHTaxiRadiuImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs);
+ }
+
+ private void init(Context context, AttributeSet attrs) {
+ if (Build.VERSION.SDK_INT < 18) {
+ setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
+ // 读取配置
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RoundCornerImageView);
+ radius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_radius, defaultRadius);
+ leftTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_left_top_radius, defaultRadius);
+ rightTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_right_top_radius, defaultRadius);
+ rightBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_right_bottom_radius, defaultRadius);
+ leftBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_left_bottom_radius, defaultRadius);
+
+
+ if (defaultRadius == leftTopRadius) {
+ leftTopRadius = radius;
+ }
+ if (defaultRadius == rightTopRadius) {
+ rightTopRadius = radius;
+ }
+ if (defaultRadius == rightBottomRadius) {
+ rightBottomRadius = radius;
+ }
+ if (defaultRadius == leftBottomRadius) {
+ leftBottomRadius = radius;
+ }
+ array.recycle();
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ width = getWidth();
+ height = getHeight();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ //这里做下判断,只有图片的宽高大于设置的圆角距离的时候才进行裁剪
+ int maxLeft = Math.max(leftTopRadius, leftBottomRadius);
+ int maxRight = Math.max(rightTopRadius, rightBottomRadius);
+ int minWidth = maxLeft + maxRight;
+ int maxTop = Math.max(leftTopRadius, rightTopRadius);
+ int maxBottom = Math.max(leftBottomRadius, rightBottomRadius);
+ int minHeight = maxTop + maxBottom;
+ if (width >= minWidth && height > minHeight) {
+ Path path = new Path();
+ //右上,右下,左下,左上
+ path.moveTo(leftTopRadius, 0);
+ path.lineTo(width - rightTopRadius, 0);
+ path.quadTo(width, 0, width, rightTopRadius);
+
+ path.lineTo(width, height - rightBottomRadius);
+ path.quadTo(width, height, width - rightBottomRadius, height);
+
+ path.lineTo(leftBottomRadius, height);
+ path.quadTo(0, height, 0, height - leftBottomRadius);
+
+ path.lineTo(0, leftTopRadius);
+ path.quadTo(0, 0, leftTopRadius, 0);
+
+ canvas.clipPath(path);
+ }
+ super.onDraw(canvas);
+ }
+
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiReserveOrdersFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiReserveOrdersFragment.java
new file mode 100644
index 0000000000..179e762cf0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiReserveOrdersFragment.java
@@ -0,0 +1,183 @@
+package com.mogo.och.taxi.passenger.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.mogo.toast.TipToast;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
+
+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 OCHTaxiReserveOrdersFragment extends BaseTaxiUIFragment {
+
+ private RecyclerView mRecyclerView;
+ private TextView mNodataTv;
+ private ConstraintLayout mNoDataView;
+ private View mBootRefreshNoDataView;
+ private List mDatas = new ArrayList<>();
+ private ToBeServedOrdersAdapter mAdapter;
+ private static OCHTaxiFragment mTaxiFragment;
+ private static Activity mActivity;
+ private boolean isUpwardSliding = false;
+
+ public static OCHTaxiReserveOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment){
+ mActivity = activity;
+ mTaxiFragment = taxiFragment;
+ Bundle args = new Bundle();
+ OCHTaxiReserveOrdersFragment fragment = new OCHTaxiReserveOrdersFragment();
+ 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 = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
+ if (OchTaxiUtils.compareDateIsCurrentDay(calendar)){
+ viewHolder.orderTime.setText("用车时间:今天"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
+ }else {
+ viewHolder.orderTime.setText("用车时间:"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd_HH_mm));
+ }
+ viewHolder.orderCancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ new OCHTaxiOrderCancelDialog(mTaxiFragment,context,order.orderId,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(long orderId){
+ TipToast.tip("订单取消成功");
+ for (int i=0; i< mDatas.size();i++){
+ OrderQueryRespBean.Result result = mDatas.get(i);
+ if (orderId == result.orderId){
+ mDatas.remove(i);
+ mAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiServerOrdersFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiServerOrdersFragment.java
new file mode 100644
index 0000000000..d9a8889cf7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiServerOrdersFragment.java
@@ -0,0 +1,214 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+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.Logger;
+import com.mogo.och.taxi.passenger.R;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 网约车-出租车UI
+ */
+public class OCHTaxiServerOrdersFragment extends BaseTaxiUIFragment {
+
+ public static final String TAG = "OCHTaxiFragment";
+
+ public static OCHTaxiServerOrdersFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHTaxiServerOrdersFragment fragment = new OCHTaxiServerOrdersFragment();
+ 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 OCHTaxiBeingServerdOrdersFragment beingServerdOrdersFragment = null;
+ private OCHTaxiReserveOrdersFragment 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"));
+ View tabView = View.inflate(getActivity(),R.layout.taxi_tab_item_custom,null);
+ TextView tv = tabView.findViewById(R.id.tab_title);
+ tv.setText(mTabTitles[i]);
+ tab.setCustomView(tabView);
+ if (0 == i){
+ mTaxiOrderTab.addTab(tab,true);
+ changeTabLayoutTabUI(tab,true);
+ beingServerdOrdersFragment = OCHTaxiBeingServerdOrdersFragment.newInstance(getActivity(),(OCHTaxiFragment) getParentFragment());
+ fragments.add(beingServerdOrdersFragment);
+ }else if (1 == i){
+ mTaxiOrderTab.addTab(tab);
+ changeTabLayoutTabUI(tab,false);
+ reserveOrdersFragment = OCHTaxiReserveOrdersFragment.newInstance(getActivity(),(OCHTaxiFragment) getParentFragment());
+ fragments.add(reserveOrdersFragment);
+ }
+
+ }
+ Log.d(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(20);
+ Log.d(TAG,"SelectTv = "+ textView.getText());
+ textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+ textView.setTextColor(Color.parseColor("#FFFFFF"));
+ }else {
+ textView.setBackground(null);
+ textView.setTextSize(18);
+ Log.d(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) {
+ Logger.d( TAG, "getItem="+position);
+ return fragments.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return fragments.size();
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getPageTitle(int position) {
+ Logger.d( 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(long orderId){
+ if (null == reserveOrdersFragment) return;
+ reserveOrdersFragment.onOrderCancelDone(orderId);
+ }
+ public void onCurrentOrderCancelDone(){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.onCurrentOrderCancelDone();
+ }
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.updateDistanceAndTime(meters,timeInSecond);
+ }
+ 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);
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiView.java
new file mode 100644
index 0000000000..8145c47fc5
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OCHTaxiView.java
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.passenger.ui;
+
+import com.mogo.commons.mvp.IView;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 描述
+ */
+interface OCHTaxiView extends IView {
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/DimenUtil.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/DimenUtil.kt
new file mode 100644
index 0000000000..56f1c0d52b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/DimenUtil.kt
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.passenger.utils
+
+import android.content.res.Resources
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ */
+object DimenUtil{
+ fun dp2px(value:Float):Float{
+ return (0.5f + value * Resources.getSystem().displayMetrics.density)
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/OchTaxiUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/OchTaxiUtils.java
new file mode 100644
index 0000000000..6576e891e9
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/OchTaxiUtils.java
@@ -0,0 +1,93 @@
+package com.mogo.och.taxi.passenger.utils;
+
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/20
+ */
+public class OchTaxiUtils {
+
+ public static final String TAXI_HH_mm = "HH:mm";
+ public static final String TAXI_MM_dd = "MM-dd";
+ public static final String TAXI_MM_dd_HH_mm = "MM-dd HH:mm";
+ public static final String TAXI_yyyy_MM_dd = "yyyy-MM-dd";
+ public static final String TAXI_yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
+
+ public static String formatCalendarToString(Calendar calendar, String format){
+ if (calendar == null) return "";
+ try {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.format(calendar.getTime());
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static boolean compareDateIsCurrentDay(Calendar targetCalendar){
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ String currentDay = formatCalendarToString(currentCale,OchTaxiUtils.TAXI_yyyy_MM_dd);
+ if (currentDay.equals(formatCalendarToString(targetCalendar,OchTaxiUtils.TAXI_yyyy_MM_dd))){
+ return true;
+ }else {
+ return false;
+ }
+ }
+
+ public static Calendar formatLongToCalendar(long time){
+ Calendar calendar = null;
+ try {
+ calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return calendar;
+ }
+ public static String formatLongToString(long time, String format){
+ try {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.format(time);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+ public static String getYMDTime(long time){//格式为 2021.8.21
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ int month = calendar.get(Calendar.MONTH) + 1;
+ return calendar.get(Calendar.YEAR)+"."+month+"."+ calendar.get(Calendar.DAY_OF_MONTH);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ *
+ * @param seconds 60
+ * @return 1 时
+ */
+ public static String secondsToHourStr(long seconds){//秒数转成相应的 小时分钟数
+ if (seconds >= 3600){
+ int hours = (int)seconds/3600;
+ return String.valueOf(hours);
+ }
+ return "";
+ }
+ /**
+ *
+ * @param seconds 60
+ * @return 1 时
+ */
+ public static String secondsToMinuteStr(long seconds){//秒数转成相应的 小时分钟数
+ int minute = (int)(seconds % 3600)/60;
+ return String.valueOf(minute);
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/OrderUtil.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/OrderUtil.java
new file mode 100644
index 0000000000..aa5b3aaaab
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/OrderUtil.java
@@ -0,0 +1,22 @@
+package com.mogo.och.taxi.passenger.utils;
+
+import com.mogo.och.taxi.passenger.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-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java
new file mode 100644
index 0000000000..f813fe3f7f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PermissionUtil.java
@@ -0,0 +1,37 @@
+package com.mogo.och.taxi.passenger.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-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PinYinUtil.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PinYinUtil.java
new file mode 100644
index 0000000000..d6c0007365
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/PinYinUtil.java
@@ -0,0 +1,31 @@
+package com.mogo.och.taxi.passenger.utils;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/26
+ */
+public class PinYinUtil {
+ /**
+ * 得到中文字符串首字母
+ * @param str 需要转化的中文字符串
+ * @return 大写首字母缩写的字符串
+ */
+ public static String getPinYinHeadChar(String str) {
+ str = str.replaceAll("[\\p{P}‘’“”|+=¥$<>^~~]", "");
+ StringBuilder convert = new StringBuilder();
+ for (int j = 0; j < str.length(); j++) {
+ char word = str.charAt(j);
+ String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
+ if (pinyinArray != null) {
+ convert.append(pinyinArray[0].charAt(0));
+ } else {
+ if (!"".equals(String.valueOf(word).trim())){
+ convert.append(word);
+ }
+ }
+ }
+ return convert.toString().trim().toUpperCase();
+ }
+}
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/color/taxi_autopilot_text_color_selector.xml b/OCH/mogo-och-taxi-passenger/src/main/res/color/taxi_autopilot_text_color_selector.xml
new file mode 100644
index 0000000000..16cef94271
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_bg_selector.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_bg_selector.xml
new file mode 100644
index 0000000000..e01265811f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_bg_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_status_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_status_bg.xml
new file mode 100644
index 0000000000..9350652b43
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_status_bg.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_back_btn.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_back_btn.png
new file mode 100644
index 0000000000..35e13ff68c
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_back_btn.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_base_icon_not_in_autopilot.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_close_navi_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_close_navi_icon.png
new file mode 100644
index 0000000000..56525e7ed2
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_close_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot.png
new file mode 100644
index 0000000000..539e106058
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg.png
new file mode 100644
index 0000000000..ef5a5ea880
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg_pressed.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg_pressed.png
new file mode 100644
index 0000000000..39194f8e55
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg_pressed.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_disable.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_disable.png
new file mode 100644
index 0000000000..695515a366
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_disable.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_failed.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_failed.png
new file mode 100644
index 0000000000..3347b2bfc2
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_failed.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_loading.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_loading.png
new file mode 100644
index 0000000000..a71cf9a4f9
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_loading.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_success.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_success.png
new file mode 100644
index 0000000000..dd7dc2d6b2
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_success.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_masking.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_masking.png
new file mode 100644
index 0000000000..b33738106e
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_masking.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_arrow_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_arrow_icon.png
new file mode 100644
index 0000000000..a83b7c9e74
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_arrow_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_direction_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_direction_icon.png
new file mode 100755
index 0000000000..1b96799531
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_direction_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_icon.png
new file mode 100644
index 0000000000..bd4e6ccde4
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_line_icon.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_line_icon.png
new file mode 100644
index 0000000000..7f758d5999
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_line_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_out_btn.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_out_btn.png
new file mode 100644
index 0000000000..a3a771d686
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_out_btn.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_personal_btn.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_personal_btn.png
new file mode 100644
index 0000000000..0cb863cecb
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_personal_btn.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_setting_btn_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_setting_btn_bg.png
new file mode 100644
index 0000000000..a21f54cc53
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_bg.png
new file mode 100644
index 0000000000..62942a7a42
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_selector.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_selector.xml
new file mode 100644
index 0000000000..aaf1d9add3
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_selector.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_switch_map_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_switch_map_bg.png
new file mode 100644
index 0000000000..f4ab3deb31
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi-2560x1440/taxi_switch_map_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00001.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00001.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00002.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00002.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00003.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00003.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00004.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00004.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00005.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00005.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00006.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00006.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00007.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00007.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00008.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00008.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00009.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00009.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00010.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00010.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00011.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00011.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00012.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00012.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00013.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00013.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00014.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00014.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00015.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00015.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00016.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00016.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00017.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00017.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00018.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00018.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00019.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00019.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00020.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00020.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00021.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00021.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00022.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00022.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00023.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00023.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00024.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00024.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00025.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00025.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00026.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00026.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00027.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00027.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00028.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00028.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00029.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00029.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00030.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00030.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00031.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00031.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00032.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00032.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00033.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00033.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00034.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00034.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00035.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00035.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00036.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00036.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00037.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00037.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00038.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00038.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00039.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00039.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00040.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00040.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00041.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00041.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00042.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00042.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00043.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00043.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00044.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00044.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/heart_00045.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/heart_00045.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/no_order_data.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/no_order_data.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00001.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00001.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00002.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00002.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00003.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00003.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00004.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00004.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00005.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00005.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00006.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00006.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00007.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00007.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00008.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00008.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00009.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00009.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00010.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00010.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00011.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00011.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00012.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00012.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00013.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00013.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00014.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00014.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00015.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00015.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00016.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00016.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00017.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00017.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00018.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00018.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00019.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00019.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00020.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00020.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00021.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00021.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00022.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00022.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00023.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00023.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00024.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00024.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00025.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00025.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00026.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00026.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00027.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00027.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00028.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00028.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00029.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00029.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00030.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00030.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00031.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00031.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00032.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00032.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00033.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00033.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00034.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00034.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00035.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00035.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00036.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00036.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00037.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00037.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00038.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00038.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00039.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00039.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00040.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00040.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00041.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00041.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00042.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00042.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00043.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00043.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00044.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00044.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/success_00045.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/success_00045.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..21dc719ec9
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_base_slide_block.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_base_slide_block.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_dot_line.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_dot_line.png
new file mode 100644
index 0000000000..186001352c
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_dot_line.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png
new file mode 100644
index 0000000000..be978145dc
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png
new file mode 100644
index 0000000000..a676a789c3
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png
new file mode 100644
index 0000000000..e1fd463963
Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_navi_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_order_list_page.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_order_list_page.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_selected_btn.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_selected_btn.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_unselect_btn.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable-xhdpi/taxi_unselect_btn.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00000.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00000.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00001.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00001.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00002.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00002.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00003.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00003.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00004.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00004.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00005.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00005.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00006.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00006.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00007.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00007.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00008.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00008.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00009.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00009.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00010.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00010.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00011.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00011.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00012.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00012.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00013.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00013.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00014.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00014.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00015.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00015.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00016.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00016.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00017.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00017.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00018.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00018.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00019.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00019.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00020.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00020.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00021.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00021.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00022.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00022.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00023.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00023.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00024.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00024.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00025.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00025.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00026.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00026.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00027.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00027.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00028.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00028.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00029.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00029.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00030.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00030.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00031.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00031.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00032.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00032.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00033.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00033.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00034.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00034.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00035.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00035.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00036.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00036.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00037.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00037.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00038.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00038.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00039.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00039.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00040.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00040.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00041.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00041.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00042.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00042.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00043.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00043.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00044.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00044.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00045.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00045.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00046.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00046.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00047.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00047.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00048.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00048.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00049.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00049.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00050.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00050.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00051.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00051.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00052.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00052.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00053.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00053.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00054.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00054.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00055.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00055.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00056.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00056.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00057.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00057.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00058.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00058.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anim_flow_00059.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/anim_flow_00059.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml
new file mode 100644
index 0000000000..611cde2035
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/anmi_flow.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/grab_failure_anmi_flow.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/grab_failure_anmi_flow.xml
new file mode 100644
index 0000000000..5a0649a2c5
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/grab_success_anmi_flow.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/grab_success_anmi_flow.xml
new file mode 100644
index 0000000000..0447f8441d
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/img_taxi_operation_status_bg.9.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/img_taxi_operation_status_bg.9.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_autopilot_status_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_autopilot_status_bg.xml
new file mode 100644
index 0000000000..97ac9039cc
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_autopilot_status_bg.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_autopilot_status_bg_check.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_autopilot_status_bg_check.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_autopilot_status_bg_nor.png b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_autopilot_status_bg_nor.png differ
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_base_autopilot_status_icon_selector.xml b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_base_autopilot_status_icon_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/mogo-module-extensions/src/main/res/drawable/view_traffic_light_vr_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_cancel_button_bg.xml
similarity index 63%
rename from modules/mogo-module-extensions/src/main/res/drawable/view_traffic_light_vr_bg.xml
rename to OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_cancel_button_bg.xml
index a63c02e5a6..60eb252eab 100644
--- a/modules/mogo-module-extensions/src/main/res/drawable/view_traffic_light_vr_bg.xml
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_cancel_button_bg.xml
@@ -1,6 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_checkbox_selector.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_checkbox_selector.xml
new file mode 100644
index 0000000000..adc3fce148
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_grab_order_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_grab_order_bg.xml
new file mode 100644
index 0000000000..d626dfde91
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_grabing_order_btn_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_grabing_order_btn_bg.xml
new file mode 100644
index 0000000000..fbe05625d8
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_line_bg1.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_line_bg1.xml
new file mode 100644
index 0000000000..7fcd53f564
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_line_bg1.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_top_container_shader_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_line_bg2.xml
similarity index 55%
rename from modules/mogo-module-extensions/src/main/res/drawable/module_ext_top_container_shader_bg.xml
rename to OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_line_bg2.xml
index 12be6e29d0..e0861580ee 100644
--- a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_top_container_shader_bg.xml
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_line_bg2.xml
@@ -1,7 +1,7 @@
+ android:angle="0"
+ android:startColor="#99808FCD"
+ android:endColor="#995F6EC0"/>
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_operation_data_item_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_operation_data_item_bg.xml
new file mode 100644
index 0000000000..dca30d9244
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_operation_status_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_operation_status_bg.xml
new file mode 100644
index 0000000000..dde09aaba4
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_bg.xml
new file mode 100644
index 0000000000..f442e3fb0b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_button_status_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_button_status_bg.xml
new file mode 100644
index 0000000000..103e621370
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml
new file mode 100644
index 0000000000..8869eec9a6
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_button_type_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_button_type_bg.xml
new file mode 100644
index 0000000000..d32f758b8b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml
new file mode 100644
index 0000000000..acae5d44a7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml
new file mode 100644
index 0000000000..942b51b459
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_order_viewpager_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_order_viewpager_bg.xml
new file mode 100644
index 0000000000..621dfb107e
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_panel_bkg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_panel_bkg.xml
new file mode 100644
index 0000000000..04864e072b
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_panel_distance_bkg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_panel_distance_bkg.xml
new file mode 100644
index 0000000000..bbb05d8127
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/drawable/taxi_show_orders_bg.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/taxi_show_orders_bg.xml
new file mode 100644
index 0000000000..c7f6e8e8f0
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/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-passenger/src/main/res/layout/taxi_base_fragment.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_base_fragment.xml
new file mode 100644
index 0000000000..a1158dd2b2
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_base_fragment.xml
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_being_order.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_being_order.xml
new file mode 100644
index 0000000000..da7aa36c9d
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_being_order.xml
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_navi_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_navi_view.xml
new file mode 100644
index 0000000000..49d6454265
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_navi_view.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_no_data_common_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_no_data_common_view.xml
new file mode 100644
index 0000000000..dc6d17e0a7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_no_data_common_view.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_data_item_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_data_item_view.xml
new file mode 100644
index 0000000000..5581647a61
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_data_item_view.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_data_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_data_view.xml
new file mode 100644
index 0000000000..04c3b385de
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_data_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_tab_item_custom.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_tab_item_custom.xml
new file mode 100644
index 0000000000..36083f3018
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_operation_tab_item_custom.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_cancel_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_cancel_view.xml
new file mode 100644
index 0000000000..35fa48fe9a
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_cancel_view.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_checkbox_item.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_checkbox_item.xml
new file mode 100644
index 0000000000..c04429d76c
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_checkbox_item.xml
@@ -0,0 +1,10 @@
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_grab_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_grab_view.xml
new file mode 100644
index 0000000000..a99799d707
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_grab_view.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_list_boot_no_data_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_list_boot_no_data_view.xml
new file mode 100644
index 0000000000..4e24c65314
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_list_boot_no_data_view.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_reserve_item.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_reserve_item.xml
new file mode 100644
index 0000000000..3cf7369efd
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_order_reserve_item.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_day_item.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_day_item.xml
new file mode 100644
index 0000000000..077bf77c47
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_day_item.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_item.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_item.xml
new file mode 100644
index 0000000000..9ddc3532ec
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_item.xml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_view.xml
new file mode 100644
index 0000000000..6e4b75c851
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_orders_list_view.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_panel.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_panel.xml
new file mode 100644
index 0000000000..6c04ff2797
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_panel.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_reserve_orders.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_reserve_orders.xml
new file mode 100644
index 0000000000..4228dcda02
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_reserve_orders.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_server_orders_panel.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_server_orders_panel.xml
new file mode 100644
index 0000000000..9ce89e8452
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_server_orders_panel.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_tab_item_custom.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_tab_item_custom.xml
new file mode 100644
index 0000000000..58e7e988be
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_tab_item_custom.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order.json b/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order.json
new file mode 100644
index 0000000000..e8d0819d3f
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order.json
@@ -0,0 +1,22 @@
+{
+ "drivingRoutes": [
+ {
+ "lat": 40.197234,
+ "lon": 116.74143,
+ "siteId": "1.0",
+ "siteName": "万集东门站"
+ },
+ {
+ "lat": 40.1953113732,
+ "lon": 116.729134342,
+ "siteId": "2.0",
+ "siteName": "市政府前街18号"
+ }
+ ],
+ "endStation": "市政府前街18号",
+ "orderDispatchType": 1,
+ "orderNo": "CZ20210430000005",
+ "orderType": 9,
+ "startStation": "万集东门站",
+ "travelDistance": 0.6
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order_detail.json b/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order_detail.json
new file mode 100644
index 0000000000..7d62fcacb7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order_detail.json
@@ -0,0 +1,39 @@
+{
+ "code": 0,
+ "msg": "",
+ "detailMsg": "",
+ "result": {
+ "_id": "5352c1d2c9d84ab3ab9ecf1e47e13bdd",
+ "orderNo": "CZ20210427000016",
+ "orderType": 9,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 10000,
+ "startStation": "0409第一站",
+ "startStationCoordinate": [
+ 116.7389159039,
+ 40.1992312592
+ ],
+ "endStationId": 21,
+ "endStation": "第二十一站",
+ "endStationCoordinate": [
+ 116.737866,
+ 40.19646
+ ],
+ "orderDispatchType": 1,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "Apr 27, 2021 8:55:44 PM",
+ "arrivedStartStationTime": "",
+ "arrivedEndStationTime": "",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "Apr 27, 2021 8:55:44 PM",
+ "updateTime": "Apr 27, 2021 8:55:56 PM",
+ "personNum": 1,
+ "travelDistance": 0.3,
+ "vehicleColour": "黑色",
+ "lastBrandName": "",
+ "headImgUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83ep4YkeZqjiazTK87NQtYp6KMYvAdJcxNpxyJ2gibeNNheH1HFaJdX4hB15eIR3zZdGMWNanKzIn460w/132"
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order_state_update.json b/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order_state_update.json
new file mode 100644
index 0000000000..9ee3d17f02
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/raw/taxi_order_state_update.json
@@ -0,0 +1,10 @@
+{
+ "endStation": "市政府前街18号",
+ "endStationId": "2.0",
+ "orderDispatchType": 7,
+ "orderNo": "CZ20210430000005",
+ "orderType": 9,
+ "startStation": "万集东门站",
+ "startStationId": "1.0",
+ "travelDistance": 0.6
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml
new file mode 100644
index 0000000000..0863a26ec1
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml
@@ -0,0 +1,26 @@
+
+
+ 560px
+ 910px
+ 800px
+ 222px
+ 1120px
+ 162px
+ 446px
+ 400px
+ 160px
+ 432px
+ 64px
+ 616px
+ 132px
+ 300px
+ 240px
+ 400px
+ 160px
+ 280px
+ 120px
+
+ 220px
+ 420px
+ 220px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml
new file mode 100644
index 0000000000..d2514bf596
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml
@@ -0,0 +1,90 @@
+
+
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 530px
+ 492px
+
+ 20px
+ 20px
+ 70px
+ 130px
+ 93px
+ 150px
+ 70px
+
+ 24px
+ 460px
+ 140px
+
+ 51dp
+ 51dp
+
+ 83px
+
+ 40px
+ 466px
+ 414px
+
+
+
+ 46px
+ 13px
+ 12px
+ 350px
+
+ 460px
+ 30px
+ 560px
+ 310px
+ 15px
+ 25px
+ 25px
+ 32px
+ 1px
+ 20px
+ 20px
+ 20px
+ 140px
+ 20px
+ 41px
+ 17px
+ 41px
+ 42px
+ 32px
+ 32px
+ 84px
+ 3px
+ 20px
+ 32px
+ 36px
+ 17px
+ 31.5px
+
+ 800px
+ 222px
+ 1120px
+ 162px
+ 446px
+ 400px
+ 160px
+ 432px
+ 64px
+ 616px
+ 132px
+ 300px
+ 240px
+ 400px
+ 160px
+ 280px
+ 120px
+
+ 220px
+ 420px
+ 220px
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/attrs.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000..1a60978ae5
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/attrs.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..318fd9a653
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml
@@ -0,0 +1,16 @@
+
+
+ #FFFFFF
+ #707DBE
+ #8198E8
+ #8198E8
+ #8198E8
+ #FFFFFF
+ #FF2B6EFF
+ #FF3B4577
+ #80000000
+
+ #FFFFFF
+ #99FFFFFF
+ #FF52BBFF
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..b2e50d81d7
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml
@@ -0,0 +1,85 @@
+
+
+ 40px
+ 46px
+ 24px
+
+ 345px
+ 492px
+
+ 15px
+ 15px
+ 40px
+ 50px
+ 50px
+ 70px
+ 40px
+
+ 24px
+ 300px
+ 100px
+
+ 100px
+ 100px
+
+ 35px
+
+ 15px
+ 300px
+ 270px
+
+ 30px
+ 13px
+ 12px
+ 288px
+
+ 460px
+ 30px
+ 464px
+ 310px
+ 5px
+ 20px
+ 20px
+ 20px
+ 1px
+ 20px
+ 20px
+ 20px
+ 140px
+ 20px
+ 20px
+ 17px
+ 20px
+ 26px
+ 20px
+ 20px
+ 64px
+ 3px
+ 20px
+ 20px
+ 24px
+ 17px
+ 22.5px
+
+ 800px
+ 222px
+ 1120px
+ 162px
+ 446px
+ 400px
+ 160px
+ 432px
+ 64px
+ 616px
+ 132px
+ 300px
+ 240px
+ 400px
+ 160px
+ 280px
+ 120px
+
+ 220px
+ 420px
+ 220px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..b6804d5519
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/strings.xml
@@ -0,0 +1,21 @@
+
+
+ 确认上车,行程开始
+ 到达站点,乘客已下车
+ 已到达上车站点,等待乘客上车
+ 预计里程
+ 3.2 km
+ 请携带好随身物品,注意侧后\n方来车,感谢体验蘑菇智行自\n动驾驶车!
+ 即将到达目的地,请您携带好随身物品,安全下车。
+ 送乘客至目的地
+ 等待乘客上车
+ 前往乘客上车地点
+ 已到达乘客下车点
+ 订单已完成
+ 订单已取消
+ 请选择取消订单的理由
+ 出现异常情况时,可选择原因无责取消订单:
+ 确认
+ 开始服务
+ 服务完成
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..bd2964b922
--- /dev/null
+++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/styles.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/.gitignore b/OCH/mogo-och-taxi/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/OCH/mogo-och-taxi/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/build.gradle b/OCH/mogo-och-taxi/build.gradle
new file mode 100644
index 0000000000..8b22040630
--- /dev/null
+++ b/OCH/mogo-och-taxi/build.gradle
@@ -0,0 +1,75 @@
+apply plugin: 'com.android.library'
+apply plugin: 'com.alibaba.arouter'
+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
+ }
+
+ buildTypes {
+ 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 'androidx.recyclerview:recyclerview:1.1.0'
+ implementation 'com.google.android.material:material:1.2.1'
+ annotationProcessor rootProject.ext.dependencies.aroutercompiler
+ implementation rootProject.ext.dependencies.rxandroid
+ implementation rootProject.ext.dependencies.androidxconstraintlayout
+ implementation rootProject.ext.dependencies.amapnavi3dmap
+ if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
+ implementation rootProject.ext.dependencies.mogoutils
+ implementation rootProject.ext.dependencies.mogocommons
+ implementation rootProject.ext.dependencies.modulecommon
+ implementation rootProject.ext.dependencies.mogo_core_data
+ implementation rootProject.ext.dependencies.mogo_core_function_call
+ implementation rootProject.ext.dependencies.mogo_core_function_smp
+ implementation rootProject.ext.dependencies.mogo_core_function_v2x
+ }else {
+ implementation project(":core:mogo-core-utils")
+ implementation project(":foudations:mogo-commons")
+ implementation project(':modules:mogo-module-common')
+ implementation project(':core:mogo-core-data')
+ implementation project(':core:mogo-core-function-call')
+ implementation project(':core:function-impl:mogo-core-function-smp')
+ implementation project(':core:function-impl:mogo-core-function-v2x')
+ }
+}
+
+apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/consumer-rules.pro b/OCH/mogo-och-taxi/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/OCH/mogo-och-taxi/gradle.properties b/OCH/mogo-och-taxi/gradle.properties
new file mode 100644
index 0000000000..2d8ec933d9
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/libs/pinyin4j-2.5.1.jar b/OCH/mogo-och-taxi/libs/pinyin4j-2.5.1.jar
new file mode 100644
index 0000000000..8446c53fce
Binary files /dev/null and b/OCH/mogo-och-taxi/libs/pinyin4j-2.5.1.jar differ
diff --git a/modules/mogo-module-push-base/proguard-rules.pro b/OCH/mogo-och-taxi/proguard-rules.pro
similarity index 94%
rename from modules/mogo-module-push-base/proguard-rules.pro
rename to OCH/mogo-och-taxi/proguard-rules.pro
index f1b424510d..481bb43481 100644
--- a/modules/mogo-module-push-base/proguard-rules.pro
+++ b/OCH/mogo-och-taxi/proguard-rules.pro
@@ -18,4 +18,4 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
-#-renamesourcefileattribute SourceFile
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/modules/mogo-module-map/src/main/AndroidManifest.xml b/OCH/mogo-och-taxi/src/main/AndroidManifest.xml
similarity index 57%
rename from modules/mogo-module-map/src/main/AndroidManifest.xml
rename to OCH/mogo-och-taxi/src/main/AndroidManifest.xml
index c14b468c9b..fb42392054 100644
--- a/modules/mogo-module-map/src/main/AndroidManifest.xml
+++ b/OCH/mogo-och-taxi/src/main/AndroidManifest.xml
@@ -1,2 +1,5 @@
+ package="com.mogo.och.taxi">
+
+ /
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/IMogoOCH.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/IMogoOCH.java
new file mode 100644
index 0000000000..3c724ee33c
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java
new file mode 100644
index 0000000000..364e258dc1
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java
@@ -0,0 +1,106 @@
+package com.mogo.och.taxi;
+
+import android.content.Context;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.constant.OCHTaxiConst;
+import com.mogo.och.taxi.ui.OCHTaxiFragment;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 网约车-出租车
+ */
+@Route( path = OCHTaxiConst.PATH )
+class MogoOCHTaxi implements IMogoOCH , IMogoStatusChangedListener {
+
+ private static final String TAG = "MogoOCHTaxi";
+ private OCHTaxiFragment ochTaxiFragment;
+ private FragmentActivity mActivity;
+ private int mContainerId;
+ @Override
+ public void init( Context context ) {
+ Logger.d( TAG, "init" );
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.VR_MODE,this);
+ MogoApisHandler.getInstance().getApis().getStatusManagerApi().registerStatusChangedListener("ochTaxi", StatusDescriptor.TOP_VIEW,this);
+ }
+
+ /**
+ * 进入鹰眼模式,设置手势缩放地图失效
+ */
+ private void stepIntoVrMode() {
+ Logger.d( TAG, "进入vr模式" );
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getMapServiceApi()
+ .getMapUIController()
+ .openVrMode( false );
+ }
+
+ private void showFragment() {
+ if (ochTaxiFragment == null) {
+ Logger.d(TAG, "准备add fragment======");
+ ochTaxiFragment = new OCHTaxiFragment();
+ mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, ochTaxiFragment).commitAllowingStateLoss();
+ return;
+ }
+ Logger.d(TAG, "准备show fragment");
+ mActivity.getSupportFragmentManager().beginTransaction().show(ochTaxiFragment).commitAllowingStateLoss();
+ }
+
+ private void hideFragment(){
+ if (ochTaxiFragment != null){
+ mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiFragment).commitAllowingStateLoss();
+ }
+ }
+
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (descriptor == StatusDescriptor.VR_MODE){
+ if (isTrue){
+ showFragment();
+ }else {
+ hideFragment();
+ }
+ }
+ }
+
+ @Override
+ public void createCoverage(FragmentActivity activity, int containerId) {
+
+ }
+
+ @NotNull
+ @Override
+ public String getFunctionName() {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Fragment createCoverage(@Nullable FragmentActivity fragmentActivity, @Nullable Integer integer) {
+ this.mActivity = fragmentActivity;
+ this.mContainerId = integer;
+
+ UiThreadHandler.postDelayed(() -> stepIntoVrMode(), 5_000L);
+ return null;
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java
new file mode 100644
index 0000000000..95988abf48
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java
@@ -0,0 +1,71 @@
+package com.mogo.och.taxi;
+
+import android.content.Context;
+
+import com.mogo.eagle.core.data.map.MogoLatLng;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.function.v2x.events.utils.LocationUtils;
+import com.mogo.eagle.core.utilcode.util.ColorUtils;
+import com.mogo.map.overlay.IMogoOverlayManager;
+import com.mogo.map.overlay.IMogoPolyline;
+import com.mogo.map.overlay.MogoPolylineOptions;
+import com.mogo.module.common.MogoApisHandler;
+import java.util.ArrayList;
+import java.util.List;
+
+public class OCHTaxiOverlayManager {
+
+
+ private IMogoPolyline mMoGoPolyline;
+ // 连接线参数
+ private MogoPolylineOptions mPolylineOptions;
+ // 线路径集合
+ private List mPolylinePointList;
+ // 渐变色
+ private List mPolylineColors;
+ private Context mContext;
+ IMogoOverlayManager mogoOverlayManager;
+ public OCHTaxiOverlayManager(Context context) {
+ mPolylineOptions = new MogoPolylineOptions();
+ // 绘制路径集合
+ mPolylinePointList = new ArrayList<>();
+ // 引导线颜色
+ mPolylineColors = new ArrayList<>();
+ mContext = context;
+ mogoOverlayManager = MogoApisHandler.getInstance().getApis().getMapServiceApi().getOverlayManager(mContext);
+ }
+
+ /**
+ * 绘制最优路线
+ *
+ * @param polylinePoint 要绘制的经纬度度集合
+ */
+ public IMogoPolyline draw(MogoLocation carLocal, List polylinePoint) {
+ if (mMoGoPolyline != null) {
+ mMoGoPolyline.remove();
+ mPolylinePointList.clear();
+ mPolylineColors.clear();
+ }
+ if (polylinePoint != null) {
+
+ // 将当前车辆位置放进去
+ mPolylinePointList.add(new MogoLatLng(carLocal.getLatitude(), carLocal.getLongitude()));
+ // 过滤后台推送的推荐路线集合
+ for (MogoLatLng polyline : polylinePoint) {
+ //需要剔除已经行驶过的经纬度,这里需要比对推荐路线集合中的点是否在当前车辆行驶方向前面如果不在则抛弃
+ if (LocationUtils.isPointOnCarFront(carLocal, polyline)) {
+ mPolylinePointList.add(polyline);
+ }
+ }
+ mPolylineColors.addAll(ColorUtils.getGradientAlpha("#002965ED", "#FF2965ED", "#002965ED", mPolylinePointList.size()));
+ // 替换路径集合
+ mPolylineOptions.points(mPolylinePointList);
+ // 线条粗细,渐变,渐变色值
+ mPolylineOptions.width(25).useGradient(true).colorValues(mPolylineColors);
+ // 绘制线
+ mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions);
+ }
+ return mMoGoPolyline;
+ }
+
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/CarHeartbeatReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/CarHeartbeatReqBean.java
new file mode 100644
index 0000000000..b95cb5c3da
--- /dev/null
+++ b/OCH/mogo-och-taxi/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.OCHTaxiConst;
+
+import java.util.UUID;
+
+/**
+ * Created on 2021/9/16
+ *
+ * 上传车机心跳信息请求数据
+ */
+public class CarHeartbeatReqBean {
+ public String sn;
+ public double lon; //经度
+ public double lat; //纬度
+ public String msgId; //心跳信息唯一标识
+ public int interval; //上报间隔,单位秒,非必传,默认60秒
+
+ public CarHeartbeatReqBean(String sn, double lon, double lat) {
+ this.sn = sn;
+ this.lon = lon;
+ this.lat = lat;
+ this.msgId = UUID.randomUUID().toString();
+ this.interval = (int) (OCHTaxiConst.LOOP_PERIOD_60S / 1000);
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverServiceDataRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverServiceDataRespBean.java
new file mode 100644
index 0000000000..e7e861bce6
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverServiceDataRespBean.java
@@ -0,0 +1,21 @@
+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 Immediate immediate; //daily数据
+ }
+
+ public static class Immediate {
+ public long timeDuration; //当日在线时长,单位秒
+ public long orderNum; //当日完成订单数
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java
new file mode 100644
index 0000000000..b531f1be8f
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusQueryRespBean.java
@@ -0,0 +1,17 @@
+package com.mogo.och.taxi.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 收车/出车状态查询返回数据结构
+ */
+public class DriverStatusQueryRespBean extends BaseData {
+ public Result data;
+
+ public static class Result {
+ public int serviceStatus; //0收车,1出车
+ public long serviceOrderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusUpdateReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusUpdateReqBean.java
new file mode 100644
index 0000000000..73481aa296
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/DriverStatusUpdateReqBean.java
@@ -0,0 +1,16 @@
+package com.mogo.och.taxi.bean;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 收车/出车状态更新请求数据结构
+ */
+public class DriverStatusUpdateReqBean {
+ public String sn;
+ public int status; //0收车,1出车
+
+ public DriverStatusUpdateReqBean(String sn, int status) {
+ this.sn = sn;
+ this.status = status;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderCancelReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderCancelReqBean.java
new file mode 100644
index 0000000000..1213575b40
--- /dev/null
+++ b/OCH/mogo-och-taxi/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 long order_id; //订单号(必须)
+ public int cancel_type; //取消类型(必须)
+ public String cancel_reason; //取消原因(必须)
+
+ public OrderCancelReqBean(String sn, long order_id, int cancel_type, String cancel_reason) {
+ this.sn = sn;
+ this.order_id = order_id;
+ this.cancel_type = cancel_type;
+ this.cancel_reason = cancel_reason;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderGrabReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderGrabReqBean.java
new file mode 100644
index 0000000000..175bd72c61
--- /dev/null
+++ b/OCH/mogo-och-taxi/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 long orderId;
+
+ public OrderGrabReqBean(String sn, long orderId) {
+ this.sn = sn;
+ this.orderId = orderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderGrabRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderGrabRespBean.java
new file mode 100644
index 0000000000..e605c21b5d
--- /dev/null
+++ b/OCH/mogo-och-taxi/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 long data; // 暂不使用
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderGrabStatusQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderGrabStatusQueryRespBean.java
new file mode 100644
index 0000000000..3fe8d877af
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/bean/OrderQueryReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryReqBean.java
new file mode 100644
index 0000000000..c719b560c8
--- /dev/null
+++ b/OCH/mogo-och-taxi/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 long orderId;
+
+ public OrderQueryReqBean(String sn, long orderId) {
+ this.sn = sn;
+ this.orderId = orderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java
new file mode 100644
index 0000000000..469c35a2ae
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRespBean.java
@@ -0,0 +1,88 @@
+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{
+ // 订单id
+ public long orderId;
+ // 订单类型
+ public int orderType; //1即时单 2预约单
+ // 订单状态
+ public int orderStatus;
+ // 订单运营类型 (9出租车,10小巴)
+ public int businessType;
+ // 起始站点id
+ public int startSiteId;
+ // 起始站点名称
+ public String startSiteAddr;
+ // 起始站点坐标
+ public List startSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List startSiteGcjPoint; //高德坐标,用于本地计算距离 [lon,lat]
+ // 终点站点id
+ public int endSiteId;
+ // 终点站点名称
+ public String endSiteAddr;
+ // 终点站点坐标
+ public List endSitePoint; //wgs坐标,用于自动驾驶 [lon,lat]
+ public List endSiteGcjPoint; //高德坐标,用于计算距离 [lon,lat]
+
+ // 车牌号
+ public String carNumber;
+ //订单创建时间戳
+ public long createTime;
+ //开始服务时间戳:司机点击'开始服务'后订单状态更新成功的时间
+ public long startTime;
+ //预计用车时间:预约单=下单时的预约用车时间;即时单=派单成功的时间+预估的达到上车点的时间
+ public long bookingTime;
+
+
+
+ // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km
+ public double travelDistance;
+
+ /**
+ * @param distance
+ */
+ public void decreaseTravelDistance( double distance ) {
+ travelDistance = ( ( float ) distance / 1000f );
+ if ( travelDistance < 0 ) {
+ travelDistance = 0;
+ }
+ }
+
+ @Override
+ public int compareTo(Result o) {
+ long result = this.orderId - o.orderId;
+ return result == 0 ? 0 : (result > 0 ? 1 : -1);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Result result = (Result) o;
+ return orderId == result.orderId &&
+ orderType == result.orderType &&
+ orderStatus == result.orderStatus &&
+ businessType == result.businessType;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId, orderType, orderStatus, businessType, startSiteId,
+ startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
+ endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoReqBean.java
new file mode 100644
index 0000000000..36ac82ea74
--- /dev/null
+++ b/OCH/mogo-och-taxi/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 long orderId;
+
+ public OrderQueryRouteInfoReqBean(String sn, long orderId) {
+ this.sn = sn;
+ this.orderId = orderId;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderQueryRouteInfoRespBean.java
new file mode 100644
index 0000000000..02cc314c59
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/bean/OrderStatusUpdateReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrderStatusUpdateReqBean.java
new file mode 100644
index 0000000000..622060353b
--- /dev/null
+++ b/OCH/mogo-och-taxi/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 long orderId;
+ public int orderStatus;
+
+ public OrderStatusUpdateReqBean(String sn, long orderId, int orderStatus) {
+ this.sn = sn;
+ this.orderId = orderId;
+ this.orderStatus = orderStatus;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrdersInServiceQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrdersInServiceQueryRespBean.java
new file mode 100644
index 0000000000..0dbe003f56
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryReqBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryReqBean.java
new file mode 100644
index 0000000000..de74f2f794
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrdersListQueryRespBean.java
new file mode 100644
index 0000000000..7627953a54
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/bean/OrdersNewBookingQueryRespBean.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/bean/OrdersNewBookingQueryRespBean.java
new file mode 100644
index 0000000000..ae889977de
--- /dev/null
+++ b/OCH/mogo-och-taxi/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;
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiADASStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiADASStatusCallback.java
new file mode 100644
index 0000000000..0b8b59420c
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiADASStatusCallback.java
@@ -0,0 +1,20 @@
+package com.mogo.och.taxi.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
+ */
+public interface IOCHTaxiADASStatusCallback {
+ // 自动驾驶触发的已到达目的地:暂未用到
+ void onAutopilotArriveEnd();
+
+ // 自动驾驶可用状态
+ void onAutopilotEnable();
+
+ // 自动驾驶不可用状态
+ void onAutopilotDisable();
+
+ // 自动驾驶运行中
+ void onAutopilotRunning();
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java
new file mode 100644
index 0000000000..36949f59b9
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java
@@ -0,0 +1,13 @@
+package com.mogo.och.taxi.callback;
+
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/1
+ */
+public interface IOCHTaxiAutopilotPlanningCallback {
+ void routeResult(List models);
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiCarStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiCarStatusCallback.java
new file mode 100644
index 0000000000..2244131a50
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiCarStatusCallback.java
@@ -0,0 +1,12 @@
+package com.mogo.och.taxi.callback;
+
+/**
+ * Created on 2021/9/8
+ *
+ * Model->Presenter回调:出车/收车状态变更
+ */
+public interface IOCHTaxiCarStatusCallback {
+ void onCarStatusChanged(boolean inOperation);
+
+ void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum);
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiControllerStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiControllerStatusCallback.java
new file mode 100644
index 0000000000..f4fce22cc1
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiControllerStatusCallback.java
@@ -0,0 +1,15 @@
+package com.mogo.och.taxi.callback;
+
+import android.location.Location;
+
+/**
+ * Created on 2021/9/10
+ *
+ * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
+ */
+public interface IOCHTaxiControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(Location location);
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java
new file mode 100644
index 0000000000..f7c35b49cc
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiNaviChangedCallback.java
@@ -0,0 +1,11 @@
+package com.mogo.och.taxi.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/3
+ */
+public interface IOCHTaxiNaviChangedCallback {
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond);
+ void reInitNaviAmap(boolean isPlay,boolean isRestart);
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiOrderStatusCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiOrderStatusCallback.java
new file mode 100644
index 0000000000..1677d8ebcc
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiOrderStatusCallback.java
@@ -0,0 +1,48 @@
+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 IOCHTaxiOrderStatusCallback {
+ // 进行中单变更:暂未用到
+ void onOrdersInServiceChanged(@NonNull List inServiceList);
+ // 待服务单变更
+ void onOrdersWaitServiceChanged(@NonNull List waitServiceList);
+
+ // 当前进行单状态变更:新到进行中订单、进行中单状态变更
+ void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
+ // 当前订单取消完成:用于司机主动取消订单的结果反馈
+ void onCurrentOrderCancelDone();
+ // 待服务单被取消
+ void onOrderCancelDone(long orderId);
+ // 当前订单route信息查询反馈
+ void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
+ // 当前位置距离上车点的距离(米)、预估时间(秒)
+ void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
+
+ // 获取全部订单列表(含已完成、已取消)的反馈
+ void onOrdersListPageRefresh(List ordersList);
+
+ // 新到预约单
+ void onNewBookingOrderGot(OrderQueryRespBean.Result order);
+
+ // 执行抢单动作完成:可进入抢单中状态
+ void onGrabOrderExecuteDone();
+
+ // 抢到预约单
+ void onGrabOrderSuccess(OrderQueryRespBean.Result order);
+
+ // 未抢到预约单
+ void onGrabOrderFailed(OrderQueryRespBean.Result order);
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/Shadow.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/Shadow.kt
new file mode 100644
index 0000000000..59c9d02eba
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/Shadow.kt
@@ -0,0 +1,65 @@
+package com.mogo.och.taxi.callback
+
+import androidx.annotation.ColorRes
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ */
+interface Shadow {
+ //设置阴影半径
+ fun setShadowRadius(radius:Float):Shadow
+
+ //添加单位设置
+ fun setShadowRadius(unit:Int,radius: Float):Shadow
+
+ //设置应用颜色
+ fun setShadowColor(color:Int):Shadow
+
+ //设置阴影颜色资源文件id
+ fun setShadowColorRes(@ColorRes color: Int):Shadow
+ /**
+ * 设置模糊半径
+ * @param radius
+ */
+ fun setBlurRadius(radius:Float):Shadow
+
+ /**
+ *
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param radius 模糊半径
+ */
+ fun setBlurRadius(unit:Int,radius:Float):Shadow
+
+ /**
+ * 设置水平方向的偏移量
+ * @param offset x轴偏移
+ */
+ fun setXOffset(offset:Float):Shadow
+
+
+ /**
+ * 设置x方向的偏移量,设置单位
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param offset x轴偏移
+ */
+ fun setXOffset(unit:Int,offset:Float):Shadow
+
+ /**
+ * 设置竖直方向的偏移量
+ * @param offset y轴偏移
+ */
+ fun setYOffset(offset:Float):Shadow
+
+ /**
+ * 设置竖直方向的偏移量,带单位
+ * @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
+ * @param offset y轴偏移
+ */
+ fun setYOffset(unit:Int,offset:Float):Shadow
+
+ /**
+ * 更新绘制
+ */
+ fun commit();
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt
new file mode 100644
index 0000000000..4c96592023
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OCHTaxiConst.kt
@@ -0,0 +1,48 @@
+package com.mogo.och.taxi.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class OCHTaxiConst {
+ companion object {
+
+ private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
+ private const val BASE_URL_OCH_QA = "https://tech-qa.zhidaohulian.com"
+ private const val BASE_URL_OCH_RELEASE = "https://tech.zhidaohulian.com"
+
+ @JvmStatic
+ fun getBaseUrl(): String {
+ return when (DebugConfig.getNetMode()) {
+ DebugConfig.NET_MODE_DEV, DebugConfig.NET_MODE_DEMO -> BASE_URL_OCH_DEV
+ DebugConfig.NET_MODE_QA -> BASE_URL_OCH_QA
+ DebugConfig.NET_MODE_RELEASE -> BASE_URL_OCH_RELEASE
+ else -> BASE_URL_OCH_RELEASE
+ }
+ }
+
+ // OCH arouter 路由path
+ const val PATH = "/och/api"
+
+ // 到达起始点围栏
+ const val ARRIVE_AT_START_STATION_DISTANCE = 50 //围栏由20m改为50m
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+
+ // 轮询查询进行中/待服务订单的间隔时间 2秒
+ const val LOOP_PERIOD_2S = 2 * 1000L
+ // 轮询查询新到预约单 1秒
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ // 订单信息
+ const val SP_KEY_OCH_TAXI_ORDER = "SP_KEY_OCH_TAXI_ORDER"
+
+ //起点UUID
+ const val TAXI_START_MAP_MAKER = "taxi_start_map_maker";
+ //终点UUID
+ const val TAXI_END_MAP_MAKER = "taxi_end_map_maker";
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderCancelReasons.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderCancelReasons.kt
new file mode 100644
index 0000000000..060e152a83
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderCancelReasons.kt
@@ -0,0 +1,48 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * 司机端取消订单的原因定义
+ * Created on 2021/12/7
+ *
+ * * String int
+ * 进行中订单:
+ * 车况异常 0
+ * 设备异常 1
+ * 电量不足 2
+ * 身体不适 3
+ * 乘客未到 4
+ * 乘客中途下车 5
+ *
+ * 待服务订单:
+ * 2000 车辆故障
+ * 2001 乘客联系取消
+ * 2002 行程冲突
+ * 2003 车电量不足
+ * 2004 其他
+ */
+enum class OrderCancelReasons(val type: Int, val msg: String) {
+ CarBroken(1000, "车况异常"),
+ DeviceBroken(1001, "设备异常"),
+ BatteryLow(1002, "电量不足"),
+ DriverIsIll(1003, "身体不适"),
+ PassengerNotArrive(1004, "乘客未到"),
+ PassengerStopOver(1005, "乘客中途下车"),
+
+ BookCarBroken(2000, "车辆故障"),
+ BookPassengerCancel(2001, "乘客联系取消"),
+ BookJourneyConflict(2002, "行程冲突"),
+ BookBatteryLow(2003, "车电量不足"),
+ BookOther(2004, "其他");
+
+ companion object {
+ @JvmStatic
+ fun getType(msg: String): Int {
+ for (value in values()) {
+ if (value.msg == msg) {
+ return value.type
+ }
+ }
+ return 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderStatusEnum.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderStatusEnum.kt
new file mode 100644
index 0000000000..0d2c08550c
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderStatusEnum.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 OrderStatusEnum(val code: Int) {
+ None( 0 ),
+ OnTheWayToStartStation( 10),
+ ArriveAtStartStation( 20),
+ UserArriveAtStartStation( 30),
+ OnTheWayToEndStation( 40),
+ ArriveAtEndStation( 50),
+ JourneyCompleted(60),//行程完成
+ Cancel( 70);
+
+ companion object {
+ @JvmStatic
+ fun valueOf(code: Int): OrderStatusEnum? {
+ for (value in values()) {
+ if (value.code == code) {
+ return value
+ }
+ }
+ return None
+ }
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderTypeEnum.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderTypeEnum.kt
new file mode 100644
index 0000000000..97ffeb20e1
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/constant/OrderTypeEnum.kt
@@ -0,0 +1,11 @@
+package com.mogo.och.taxi.constant
+
+/**
+ * RoboTaxi订单类型声明
+ *
+ * Created on 2021/12/6
+ */
+enum class OrderTypeEnum(val type: Int) {
+ Instant(1), // 即时单
+ Reserved(2) // 预约单
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java
new file mode 100644
index 0000000000..807eedf07a
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java
@@ -0,0 +1,1054 @@
+package com.mogo.och.taxi.model;
+
+import android.content.Context;
+import android.content.Intent;
+import android.location.Location;
+import android.net.ConnectivityManager;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.elegant.network.utils.GsonUtil;
+import com.mogo.cloud.commons.utils.CoordinateUtils;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.data.map.MogoLocation;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.map.navi.IMogoCarLocationChangedListener2;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.bean.DriverStatusQueryRespBean;
+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.OrdersInServiceQueryRespBean;
+import com.mogo.och.taxi.bean.OrdersListQueryRespBean;
+import com.mogo.och.taxi.bean.OrdersNewBookingQueryRespBean;
+import com.mogo.och.taxi.callback.IOCHTaxiADASStatusCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiCarStatusCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiControllerStatusCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiOrderStatusCallback;
+import com.mogo.och.taxi.constant.OCHTaxiConst;
+import com.mogo.och.taxi.constant.OrderStatusEnum;
+import com.mogo.och.taxi.constant.OrderTypeEnum;
+import com.mogo.och.taxi.network.OCHTaxiServiceCallback;
+import com.mogo.och.taxi.network.OCHTaxiServiceManagerNew;
+import com.mogo.och.taxi.utils.OrderUtil;
+import com.mogo.och.taxi.utils.PinYinUtil;
+import com.mogo.service.IMogoServiceApis;
+import com.mogo.service.cloud.socket.IMogoLifecycleListener;
+import com.mogo.service.intent.IMogoIntentListener;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.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;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车 - 出租车业务逻辑处理
+ */
+public class MogoOCHTaxiModelNew {
+
+ private static final String TAG = MogoOCHTaxiModelNew.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final MogoOCHTaxiModelNew INSTANCE = new MogoOCHTaxiModelNew();
+ }
+
+ public static MogoOCHTaxiModelNew getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Context mContext;
+ private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值
+ private volatile int mOCHCarStatus = -1; //出车/收车状态:1 出车;0 收车
+ private volatile long mPrevOrderId = -1; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出)
+ private volatile OrderQueryRespBean.Result mNewBookingOrder; //新到待抢预约单
+ private volatile OrderQueryRespBean.Result mCurrentOCHOrder; //当前订单
+ private volatile List mInServiceList = Collections.emptyList(); //进行中订单
+ private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单
+
+ private IOCHTaxiADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关
+ private IOCHTaxiCarStatusCallback mCarStatusCallback; //Model->Presenter:出车/收车状态
+ private IOCHTaxiControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+ private IOCHTaxiOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更
+
+ private IOCHTaxiAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划
+
+ private double mLongitude, mLatitude;
+
+ private MogoOCHTaxiModelNew() {
+ }
+ public void setMoGoAutopilotPlanningListener(IOCHTaxiAutopilotPlanningCallback
+ moGoAutopilotPlanningCallback) {
+ this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
+ }
+ public void setADASStatusCallback(IOCHTaxiADASStatusCallback callback) {
+ this.mADASStatusCallback = callback;
+ }
+
+ public void setCarStatusCallback(IOCHTaxiCarStatusCallback callback) {
+ this.mCarStatusCallback = callback;
+ }
+
+ public void setControllerStatusCallback(IOCHTaxiControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+
+ public void setOrderStatusCallback(IOCHTaxiOrderStatusCallback callback) {
+ this.mOrderStatusCallback = callback;
+ }
+
+ public void init( Context context ) {
+ mContext = context.getApplicationContext();
+ initListeners();
+
+ IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
+ apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId());
+ // TODO: 2021/8/27 因需要通过此回调的location进行坐标上传,暂改为全程监听,退出后再反注册,
+ // 待后续整体调整location获取来源
+ if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) {
+ apis.getLocationInfoApi().start();
+ }
+
+ //2022.1.28
+ // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
+ // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with
+ RxJavaPlugins.setErrorHandler(new Consumer() {
+ @Override
+ public void accept(Throwable e) {
+ if (e instanceof UndeliverableException) {
+ e = e.getCause();
+ Log.d(TAG,"UndeliverableException");
+ }
+ if ((e instanceof IOException)) {//
+ // fine, irrelevant network problem or API that throws on cancellation
+ Log.d(TAG,"IOException");
+ return;
+ }
+ if (e instanceof InterruptedException) {
+ // fine, some blocking code was interrupted by a dispose call
+ Log.d(TAG,"InterruptedException");
+ return;
+ }
+ if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
+ // that's likely a bug in the application
+ Log.d(TAG,"NullPointerException or IllegalArgumentException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ if (e instanceof IllegalStateException) {
+ // that's a bug in RxJava or in a custom operator
+ Log.d(TAG,"IllegalStateException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ Log.d(TAG,"Undeliverable exception");
+ }
+ });
+
+ if (NetworkUtils.isConnected(mContext)) {
+// startOrStopOrderLoop(mOCHCarStatus == 1);
+ queryCarStatus();
+ }
+ }
+
+ public void startOrStopOrderLoop(){
+ if (NetworkUtils.isConnected(mContext)) {
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ }
+ }
+
+ public void release() {
+ startOrStopOrderLoop(false);
+ releaseListeners();
+ }
+
+ private void initListeners() {
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getSocketManagerApi(mContext)
+ .registerLifecycleListener(10010,mSocketLifeCycleLisnter);
+
+ // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口
+ CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getIntentManagerApi()
+ .registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener );
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener );
+ // 达到起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .registerCarLocationChangedListener( TAG, mCarLocationChangedListener2);
+
+ //2021.11.1 自动驾驶路线规划接口
+ CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener);
+ }
+
+ private void releaseListeners() {
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ // 注销到达起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getSocketManagerApi(mContext)
+ .unregisterLifecycleListener(10010);
+
+ CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener);
+ CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
+ }
+
+ private void startOrStopOrderLoop(boolean start) {
+ Logger.d(TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ OCHTaxiModelLoopManager.getInstance().startInAndWaitOrdersLoop();
+ OCHTaxiModelLoopManager.getInstance().startNewBookingOrderLoop();
+ OCHTaxiModelLoopManager.getInstance().startHeartbeatLoop();
+ } else {
+ OCHTaxiModelLoopManager.getInstance().stopInAndWaitOrdersLoop();
+ OCHTaxiModelLoopManager.getInstance().stopNewBookingOrderLoop();
+ OCHTaxiModelLoopManager.getInstance().stopHeartbeatLoop();
+ }
+ }
+
+ //查询出车/收车状态
+ public void queryCarStatus() {
+ OCHTaxiServiceManagerNew.getInstance().queryDriverServiceStatus(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(DriverStatusQueryRespBean data) {
+ if (null != data && 0 == data.code) {
+ mOCHCarStatus = data.data.serviceStatus == 1 ? 1 : 0;
+ //更新view
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ if (mCarStatusCallback != null) {
+ mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) { }
+ });
+ }
+
+ //更新出车收车状态
+ public void updateCarStatus() {
+ if ( mOCHCarStatus == -1){
+ queryCarStatus();
+ return;
+ }
+ final int status = mOCHCarStatus == 1 ? 0 : 1;
+ OCHTaxiServiceManagerNew.getInstance().updateDriverServiceStatus(mContext, status,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code) {
+ mOCHCarStatus = status;
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ if (mCarStatusCallback != null) {
+ mCarStatusCallback.onCarStatusChanged(mOCHCarStatus == 1);
+ }
+ Logger.d(TAG, "changeCarStatus:" + status);
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ /**
+ * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等)
+ *
+ * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时,
+ * 才更新最新进行中单到本地
+ */
+ public void queryInAndWaitOrders() {
+ OCHTaxiServiceManagerNew.getInstance().queryOrdersInAndWaitService(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrdersInServiceQueryRespBean data) {
+ if (data == null || data.data == null) {
+ return;
+ }
+
+ //1. 处理进行中订单
+ mInServiceList = data.data.servicing;
+ if (data.data.servicing != null && !data.data.servicing.isEmpty()) {
+ // 1.1. 当存在进行中单时:对本地currentOrder进行更新
+ if (mCurrentOCHOrder == null) {
+ //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ } else {
+ //1.1.2. 当本地有currentOrder:
+ //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新
+ //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新
+ if (mCurrentOCHOrder.orderId != data.data.servicing.get(0).orderId) {
+ queryCurOrderStatus();
+ } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
+ updateNativeCurrentOrder(data.data.servicing.get(0));
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+ } else {
+ // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更新
+ if (mCurrentOCHOrder != null) {
+ queryCurOrderStatus();
+ }
+ }
+
+ //2. 处理待服务订单列表
+ if (data.data.waitService != null && !data.data.waitService.isEmpty()) {
+ //2.1. 当存在待服务订单列表:跟本地待服务列表比较
+ if (mWaitServiceList.isEmpty()
+ || (mWaitServiceList.size() != data.data.waitService.size())
+ || !OrderUtil.haveSameOrders(mWaitServiceList, data.data.waitService)) {
+ // 2.1.1. 当本地无待服务单,或数量和内容不一致,更新本地待服务列表,并通知ui更新
+ mWaitServiceList = data.data.waitService;
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
+ }
+ }
+ } else {
+ //2.2. 当无待服务单时:如果本地也无则跳过;如果本地有,则清除并通知ui更新
+ if (!mWaitServiceList.isEmpty()) {
+ mWaitServiceList.clear();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersWaitServiceChanged(mWaitServiceList);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
+ private void queryCurOrderStatus() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRespBean data) {
+ if (data != null && data.data != null
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == data.data.orderId) {
+ if (data.data.orderStatus == OrderStatusEnum.Cancel.getCode()
+ || data.data.orderStatus == OrderStatusEnum.JourneyCompleted.getCode()
+ || data.data.orderStatus == OrderStatusEnum.None.getCode()) {
+ clearCurrentOCHOrder();
+ cancelAutopilot();
+ } else {
+ updateNativeCurrentOrder(data.data);
+ }
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(data.data);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ //更新当前订单状态
+ public void updateOCHOrderStatus(final OrderStatusEnum orderStatus) {
+ if ( mCurrentOCHOrder == null ) {
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().updateOrderStatus(mContext, orderId,
+ orderStatus.getCode(), new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
+ mCurrentOCHOrder.orderStatus = orderStatus.getCode();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
+ }
+ }
+ }
+
+ @Override
+ public void onError() {
+ if (!NetworkUtils.isConnected(mContext)) {
+ TipToast.shortTip("网络异常,请稍后重试");
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 取消当前订单
+ public void cancelCurrentOrder(int reasonType, String reason) {
+ if (mCurrentOCHOrder == null) {
+ mOrderStatusCallback.onCurrentOrderCancelDone();
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().cancelOrder(mContext, orderId, reasonType, reason,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderCancelDone();
+ }
+ clearCurrentOCHOrder();
+ cancelAutopilot();
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 取消待服务中订单
+ public void cancelOrderById(final long orderId, int reasonType, String reason) {
+ OCHTaxiServiceManagerNew.getInstance().cancelOrder(mContext, orderId, reasonType, reason,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+ if (null != data && 0 == data.code) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrderCancelDone(orderId);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 查询当前订单route信息:预估时间、里程等
+ public void queryCurOrderRouteInfo() {
+ if (mCurrentOCHOrder == null) {
+ return;
+ }
+ final long orderId = mCurrentOCHOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().queryOrderRouteInfo(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRouteInfoRespBean data) {
+ if (null != data && 0 == data.code
+ && mCurrentOCHOrder != null && mCurrentOCHOrder.orderId == orderId) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onCurrentOrderRouteInfoGot(data.data);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+// TipToast.shortTip(code + "," + msg);
+ }
+ });
+ }
+
+ // 获取全部订单列表
+ public void queryOrdersList(int page, int size) {
+ OCHTaxiServiceManagerNew.getInstance().queryOrdersList(mContext, page, size,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrdersListQueryRespBean data) {
+ if (null != data && 0 == data.code) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onOrdersListPageRefresh(data.data.orders);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ TipToast.shortTip("请求异常,请稍后重试");
+ }
+ });
+ }
+
+ /**
+ * 查询新到预约单
+ *
+ * 注:只有在本地缓存mNewBookingOrder为null时(执行完抢单or司机关闭改单),才更新新到待抢单
+ */
+ public void queryNewBookingOrder() {
+ OCHTaxiServiceManagerNew.getInstance().queryNewBookingOrder(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrdersNewBookingQueryRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.orders.size() > 0) {
+ // 本地无新到单,且本次新到单id与上次收到的新单id不同时:显示本次新到单
+ if (mNewBookingOrder == null ) {
+ for (Long orderId : data.data.orders) {
+ if (mPrevOrderId != orderId.longValue()) {
+ queryNewBookingContent(orderId.longValue());
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 仅限于获取到新待抢单且需要展示时查询该单信息:(queryOrderById接口可以查询属于该车的单、未派的单)
+ private void queryNewBookingContent(final long orderId) {
+ OCHTaxiServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderQueryRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.orderId == orderId
+ && data.data.orderType == OrderTypeEnum.Reserved.getType()) {
+ mNewBookingOrder = data.data;
+ mPrevOrderId = data.data.orderId;
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onNewBookingOrderGot(mNewBookingOrder);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 执行抢单动作
+ public void grabOrder() {
+ if (mNewBookingOrder == null) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ return;
+ }
+ final long orderId = mNewBookingOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().grabOrder(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderGrabRespBean data) {
+ if (data != null && data.code == 0
+ && mNewBookingOrder != null && mNewBookingOrder.orderId == orderId) {
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderExecuteDone();
+ OCHTaxiModelLoopManager.getInstance().startGrabResultLoop();
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+ TipToast.shortTip("请求异常,请稍后重试");
+ }
+ });
+ }
+
+ // 查询抢单结果
+ public void queryOrderGrabStatus() {
+ if (mNewBookingOrder == null) {
+ OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ if (mOrderStatusCallback != null) {
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ return;
+ }
+ final long orderId = mNewBookingOrder.orderId;
+ OCHTaxiServiceManagerNew.getInstance().queryOrderGrabStatus(mContext, orderId,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(OrderGrabStatusQueryRespBean data) {
+ //OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ if (data != null && data.code == 0
+ && mNewBookingOrder != null && mNewBookingOrder.orderId == orderId) {
+ if (data.data.grabStatus == 0) {
+ return; //抢单中,不处理继续轮询结果
+ }
+ if (mOrderStatusCallback != null) {
+ if (data.data.grabStatus == 1) {
+ mOrderStatusCallback.onGrabOrderSuccess(mNewBookingOrder);
+ } else if (data.data.grabStatus == 2) {
+ mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
+ } else {
+ // TODO: 2021/9/22 需根据具体内容给予提示,如订单已取消
+ mOrderStatusCallback.onGrabOrderFailed(mNewBookingOrder);
+ }
+ }
+ } else {
+ if (mOrderStatusCallback != null) {
+ // TODO: 2021/9/22 如果用户已取消单,抢单失败时暂返回null,UI当前直接恢复原页面内容,后续优化
+ mOrderStatusCallback.onGrabOrderFailed(null);
+ }
+ }
+ OCHTaxiModelLoopManager.getInstance().stopGrabResultLoop();
+ cancelNewBookingOrder();
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 车机端上传心跳数据(只在出车状态时上传)
+ public void runCarHeartbeat() {
+ OCHTaxiServiceManagerNew.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 查询司机服务数据
+ public void queryDriverServiceData() {
+ OCHTaxiServiceManagerNew.getInstance().queryDriverServiceData(mContext,
+ new OCHTaxiServiceCallback() {
+ @Override
+ public void onSuccess(DriverServiceDataRespBean data) {
+ if (data != null && data.code == 0
+ && data.data != null && data.data.immediate != null) {
+ if (mCarStatusCallback != null) {
+ mCarStatusCallback.onServiceDataUpdate(
+ data.data.immediate.timeDuration, data.data.immediate.orderNum);
+ }
+ }
+ }
+
+ @Override
+ public void onFail(int code, String msg) {
+
+ }
+ });
+ }
+
+ // 取消当前新到预约单
+ public void cancelNewBookingOrder() {
+ mNewBookingOrder = null;
+ }
+
+ // 获取当前订单
+ public OrderQueryRespBean.Result getCurrentOCHOrder() {
+ return mCurrentOCHOrder;
+ }
+
+ // 获取当前订单状态
+ public OrderStatusEnum getCurOrderStatus() {
+ OrderQueryRespBean.Result order = MogoOCHTaxiModelNew.getInstance().getCurrentOCHOrder();
+ if (order == null) {
+ return OrderStatusEnum.None;
+ }
+ return OrderStatusEnum.valueOf(order.orderStatus);
+ }
+
+ //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据
+ private void updateNativeCurrentOrder(OrderQueryRespBean.Result data) {
+ if (data == null) {
+ return;
+ }
+ mCurrentOCHOrder = data;
+ SharedPrefsMgr.getInstance(mContext).putString(OCHTaxiConst.SP_KEY_OCH_TAXI_ORDER,
+ GsonUtil.jsonFromObject(data));
+ if (FunctionBuildConfig.isDemoMode
+ && mCurrentOCHOrder.orderStatus == OrderStatusEnum.OnTheWayToEndStation.getCode()) {
+ // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ Logger.d(TAG, "美化模式-ignore:置为true(更新本地order信息)");
+ }
+ }
+
+ //清除订单信息
+ public void clearCurrentOCHOrder() {
+ mCurrentOCHOrder = null;
+ SharedPrefsMgr.getInstance(mContext).remove(OCHTaxiConst.SP_KEY_OCH_TAXI_ORDER);
+ if (FunctionBuildConfig.isDemoMode) {
+ // 当美化模式(演示模式)开启时: 取消或订单已完成时,置false
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+ Logger.d(TAG, "美化模式-ignore:置为false(清除当前订单)");
+ }
+ }
+
+ //检测当前订单
+ public boolean checkCurrentOCHOrder() {
+ if ( mCurrentOCHOrder != null
+ && mCurrentOCHOrder.startSiteGcjPoint != null
+ && mCurrentOCHOrder.endSiteGcjPoint != null) {
+ return true;
+ }
+ return false;
+ }
+
+ //以当前订单为基础,开启自动驾驶
+ public void startAutoPilot() {
+ if (!checkCurrentOCHOrder()) {
+ Logger.e( TAG, "no order or order is empty." );
+ TipToast.shortTip("当前订单不存在或异常!");
+ return;
+ }
+
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+ == Integer.parseInt(DebugConfig.getAutoPilotStatus())) {
+ // TODO: 2021/11/28 工控机存在刚开始状态为0,但是可以开启变为2,工控机解决前不显示此toast
+// TipToast.shortTip("自动驾驶状态为不可用!");
+ }
+
+ double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0);
+ double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1);
+ double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0);
+ double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1);
+
+ AutopilotControlParameters parameters = new AutopilotControlParameters();
+ parameters.vehicleType = mCurrentOCHOrder.businessType;
+ parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM)
+ parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM)
+ parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon);
+ parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon);
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters);
+ Logger.d(TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters)
+ +" ,startSiteName="+ mCurrentOCHOrder.startSiteAddr+" ,endSiteName="+mCurrentOCHOrder.endSiteAddr);
+ if (DebugConfig.isDebug()) {
+ // TipToast.shortTip("Start autopilot!");
+ }
+
+ // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除
+// OCHTaxiUiController.getInstance().onAutoPilotStatusChanged( IMogoAdasOCHCallback.STATUS_AUTOPILOT_RUNNING, "开启自动驾驶" );
+ }
+
+ //结束自动驾驶
+ public void cancelAutopilot() {
+ try {
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ Logger.d(TAG, "结束自动驾驶");
+ } catch ( Exception e ) {
+ e.printStackTrace();
+ }
+ }
+
+ //根据围栏判断,是否到达起点
+ private void judgeStartStation(Location location) {
+ if (mCurrentOCHOrder == null || mCurrentOCHOrder.startSiteGcjPoint == null
+ || mCurrentOCHOrder.startSiteGcjPoint.size() < 2) {
+ return;
+ }
+ double startLon = mCurrentOCHOrder.startSiteGcjPoint.get(0);
+ double startLat = mCurrentOCHOrder.startSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ startLon, startLat,
+ location.getLongitude(), location.getLatitude() );
+
+ if (DebugConfig.isDebug() && mCurrentOCHOrder.orderStatus == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ // TipToast.shortTip("距离上车点:" + Double.valueOf(distance).intValue());
+ }
+
+ Logger.i(TAG, "judgeStartStation() distance = " + distance);
+// if (mOrderStatusCallback != null && distance >= 0) {
+// mOrderStatusCallback.onCurrentOrderDistToStartChanged((long) distance, 0);
+// }
+
+ if ( distance > OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) {
+ distance = CoordinateUtils.calculateLineDistance(startLon, startLat,
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon(),
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat() );
+ }
+
+ if ( distance <= OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) {
+ updateOCHOrderStatus( OrderStatusEnum.ArriveAtStartStation);
+ return;
+ }
+ }
+
+ // TODO: 2021/9/12
+ public void calculateTravelDistance(Location carLocation){
+ if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) {
+ double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
+ double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
+ double distance = CoordinateUtils.calculateLineDistance(
+ endLon, endLat,
+ carLocation.getLongitude(), carLocation.getLatitude());
+ mCurrentOCHOrder.decreaseTravelDistance(distance);
+ if (mOrderStatusCallback != null && distance >= 0) {
+ mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) distance, 0);
+ }
+ }
+ }
+
+ //监听网络变化,避免启动机器时无网导致无法更新订单信息
+ private IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() {
+ @Override
+ public void onIntentReceived( String intentStr, Intent intent ) {
+ Logger.d( TAG, "onIntentReceived = %s", intentStr );
+ if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) {
+ if ( NetworkUtils.isConnected( mContext ) ) {
+ startOrStopOrderLoop(mOCHCarStatus == 1);
+ queryCarStatus();
+ }
+ }
+ }
+ };
+
+ private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+
+ private IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() {
+ @Override
+ public void onConnectFailure() { Logger.e(TAG,"socket onConnectFailure"); }
+
+ @Override
+ public void onConnectSuccess() { Logger.e(TAG,"socket onConnectSuccess"); }
+
+ @Override
+ public void onConnectLost() { Logger.e(TAG,"socket onConnectLost"); }
+ };
+
+ // 自车定位
+ private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
+
+ @Override
+ public void onCarLocationChanged2( Location location ) {
+ IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
+ MogoLocation mogoLocation = new MogoLocation();
+ mogoLocation.setAccuracy(location.getAccuracy());
+ mogoLocation.setProvider(location.getProvider());
+ mogoLocation.setLongitude(location.getLongitude());
+ mogoLocation.setLatitude(location.getLatitude());
+ mogoLocation.setSpeed(location.getSpeed());
+ mogoLocation.setBearing(location.getBearing());
+ // TODO: 2021/9/2 因0830新版server后台只能过滤locType=1&&satellites>=4的定位数据,暂固话值,后续优化
+ mogoLocation.setLocType(1);
+ mogoLocation.setSatellite(4);
+
+ apis.getLocationInfoApi().provideLocation(mogoLocation);
+ //位置变化时,通过围栏判断是否到达x点
+ if (location != null && checkCurrentOCHOrder()) {
+ if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToStartStation) {
+ judgeStartStation(location);
+ } else if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
+ calculateTravelDistance(location);
+ }
+ }
+ mLongitude = location.getLongitude();
+ mLatitude = location.getLatitude();
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(location);
+ }
+ }
+ };
+
+ /**
+ * 订单流转debug START
+ */
+ public void setArriveAtStartStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ TipToast.shortTip("订单状态不匹配该操作!");
+ return;
+ }
+ updateOCHOrderStatus(OrderStatusEnum.ArriveAtStartStation);
+ }
+
+ public void setArriveAtEndStation() {
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != OrderStatusEnum.OnTheWayToEndStation.getCode()) {
+ TipToast.shortTip("订单状态不匹配该操作!");
+ return;
+ }
+ updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
+ }
+
+ /**
+ * 测试开始服务
+ */
+ public void setOnTheWayToEndStation() {
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
+ if (mCurrentOCHOrder == null
+ || mCurrentOCHOrder.orderStatus != OrderStatusEnum.ArriveAtStartStation.getCode()) {
+ TipToast.shortTip("订单状态不匹配该操作!");
+ }
+ updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ }
+ private IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){
+
+ @Override
+ public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
+ if (autopilotStatusInfo == null) return;
+ int state = autopilotStatusInfo.getState();
+ Logger.d( TAG, "state = %s", state );
+ if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
+ if (mCurrentOCHOrder != null
+ && getCurOrderStatus() == OrderStatusEnum.ArriveAtStartStation
+ && state != mPrevAPStatus) {
+ // 当高频返回autopilot 2时,不重复调用订单状态变更
+ mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态
+ updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ if (FunctionBuildConfig.isDemoMode) {
+ // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ Logger.d(TAG, "美化模式-ignore:置为true(到达出发点且已开启自动驾驶)");
+ }
+ }
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
+ mPrevAPStatus = state;
+ if (FunctionBuildConfig.isDemoMode
+ && checkCurrentOCHOrder()
+ && getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
+ // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态
+ return;
+ }
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable();
+ } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
+ mPrevAPStatus = state;
+ if (FunctionBuildConfig.isDemoMode
+ && checkCurrentOCHOrder()
+ && getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
+ // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态
+ return;
+ }
+ if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable();
+ }
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+
+ }
+
+ @Override
+ public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) {
+
+ }
+
+ @Override
+ public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo data) {
+ if (data == null || !checkCurrentOCHOrder()
+ || (getCurOrderStatus() == OrderStatusEnum.ArriveAtEndStation)) {
+ return;
+ }
+ if (DebugConfig.isDebug()) {
+ // TipToast.shortTip("到达目的地");
+ }
+ updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
+ }
+ };
+ private IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){
+
+ @Override
+ public void onAutopilotTrajectory(ArrayList trajectoryInfos) {
+
+ }
+
+ @Override
+ public void onAutopilotRotting(AutopilotRouteInfo routeList) {
+ if (null != routeList && routeList.getModels() != null){
+ mAutopilotPlanningCallback.routeResult(routeList.getModels());
+ }
+ }
+ };
+ /**
+ * END
+ */
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/NaviToDestinationModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/NaviToDestinationModel.java
new file mode 100644
index 0000000000..1c7a0f692c
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/NaviToDestinationModel.java
@@ -0,0 +1,433 @@
+package com.mogo.och.taxi.model;
+
+import android.Manifest;
+import android.content.Context;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.amap.api.navi.AMapNavi;
+import com.amap.api.navi.AMapNaviListener;
+import com.amap.api.navi.enums.NaviType;
+import com.amap.api.navi.model.AMapCalcRouteResult;
+import com.amap.api.navi.model.AMapLaneInfo;
+import com.amap.api.navi.model.AMapModelCross;
+import com.amap.api.navi.model.AMapNaviCameraInfo;
+import com.amap.api.navi.model.AMapNaviCross;
+import com.amap.api.navi.model.AMapNaviInfo;
+import com.amap.api.navi.model.AMapNaviLocation;
+import com.amap.api.navi.model.AMapNaviRouteNotifyData;
+import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo;
+import com.amap.api.navi.model.AMapServiceAreaInfo;
+import com.amap.api.navi.model.AimLessModeCongestionInfo;
+import com.amap.api.navi.model.AimLessModeStat;
+import com.amap.api.navi.model.NaviInfo;
+import com.amap.api.navi.model.NaviLatLng;
+import com.autonavi.tbt.TrafficFacilityInfo;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.och.taxi.callback.IOCHTaxiNaviChangedCallback;
+import com.mogo.och.taxi.utils.PermissionUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/12/6
+ */
+public class NaviToDestinationModel implements AMapNaviListener {
+ private static Context mContext;
+ private AMapNavi mAMapNavi = null;
+ protected final List sList = new ArrayList();
+ protected final List eList = new ArrayList();
+ protected List mWayPointList = new ArrayList();
+ private IOCHTaxiNaviChangedCallback mNaviChangedCallback;
+ private AtomicInteger errorCount = new AtomicInteger(0);
+ private boolean isPlay;
+ public static NaviToDestinationModel getInstance(Context context) {
+ mContext = context;
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static final class SingletonHolder {
+ private static final NaviToDestinationModel INSTANCE = new NaviToDestinationModel();
+ }
+ private NaviToDestinationModel(){
+ }
+ public void initAMapNavi(NaviLatLng startLatLng,NaviLatLng endLatLng) {
+ try {
+ mAMapNavi = AMapNavi.getInstance(mContext);
+ mAMapNavi.addAMapNaviListener(this);
+ mAMapNavi.setUseInnerVoice(true, true);
+ sList.add(startLatLng);
+ eList.add(endLatLng);
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public void setVoiceIsMute(boolean isPlay){
+ if (mAMapNavi == null) return;
+ this.isPlay = isPlay;
+ if (isPlay){
+ mAMapNavi.startSpeak();
+ }else {
+ mAMapNavi.stopSpeak();
+ }
+ }
+
+ public AMapNavi getmAMapNavi() {
+ return mAMapNavi;
+ }
+
+ public void destroyAmaNavi(){
+ if (mAMapNavi != null){
+ isPlay = false;
+ mAMapNavi.stopNavi();
+ mAMapNavi.destroy();
+ mAMapNavi = null;
+ mNaviChangedCallback = null;
+ }
+ }
+
+ public void setOCHTaciNaviChangedCallback(IOCHTaxiNaviChangedCallback callback){
+ this.mNaviChangedCallback = callback;
+ }
+ @Override
+ public void onInitNaviFailure() {
+ Toast.makeText(mContext, "init navi Failed", Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onInitNaviSuccess() {
+ //初始化成功
+ /**
+ * 方法: int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 参数:
+ *
+ * @congestion 躲避拥堵
+ * @avoidhightspeed 不走高速
+ * @cost 避免收费
+ * @hightspeed 高速优先
+ * @multipleroute 多路径
+ *
+ * 说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。
+ * 注意: 不走高速与高速优先不能同时为true 高速优先与避免收费不能同时为true
+ */
+ int strategy = 0;
+ try {
+ //再次强调,最后一个参数为true时代表多路径,否则代表单路径
+ strategy = mAMapNavi.strategyConvert(true, false, false, false, false);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ mAMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);
+ }
+ @Override
+ public void onCalculateRouteSuccess(int[] ints) {
+ //多路径算路成功回调
+ mAMapNavi.startNavi(NaviType.GPS);
+ }
+
+ @Override
+ public void onNaviInfoUpdate(NaviInfo naviinfo) {
+ //导航过程中的信息更新,请看NaviInfo的具体说明
+ if (null != mNaviChangedCallback){
+ mNaviChangedCallback.onCurrentNaviDistAndTimeChanged(naviinfo.getPathRetainDistance(),naviinfo.getPathRetainTime());// 米、秒
+ }
+ }
+
+ @Override
+ public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {
+ errorCount.set(0);
+ }
+
+ @Override
+ public void onCalculateRouteFailure(AMapCalcRouteResult result) {
+ //路线计算失败
+ //多路径算路成功回调
+ if (errorCount.get() < 5){
+ errorCount.getAndIncrement();
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback.reInitNaviAmap(isPlay,true);
+ }
+ }
+ if (!NetworkUtils.isConnected(mContext) || result.getErrorCode() == 2){
+ TipToast.longTip("网络异常,请重试");
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback.reInitNaviAmap(isPlay,false);
+ }
+ return;
+ }
+ if (!PermissionUtil.isLocServiceEnable(mContext) || !PermissionUtil.checkPermission(mContext,new String[]{Manifest.permission.ACCESS_FINE_LOCATION})){
+ TipToast.longTip("请开启车机定位后重试");
+ if (mNaviChangedCallback != null){
+ mNaviChangedCallback.reInitNaviAmap(isPlay,false);
+ }
+ return;
+ }
+// if (result.getErrorCode() == 3){
+// TipToast.longTip("车辆当前坐标错误");
+// }else if (result.getErrorCode() == 6){
+// TipToast.longTip("终点坐标错误");
+// }
+ Log.i("dm", "路线计算失败:错误码=" + result.getErrorCode() + ",Error Message= " + result.getErrorDetail());
+ Log.i("dm", "错误码详细链接见:http://lbs.amap.com/api/android-navi-sdk/guide/tools/errorcode/");
+ }
+ @Override
+ public void onStartNavi(int type) {
+ //开始导航回调
+ }
+
+ @Override
+ public void onTrafficStatusUpdate() {
+ //
+ }
+
+ @Override
+ public void onLocationChange(AMapNaviLocation location) {
+ //当前位置回调
+ }
+
+ @Override
+ public void onGetNavigationText(int type, String text) {
+ //播报类型和播报文字回调
+ }
+
+ @Override
+ public void onGetNavigationText(String s) {
+
+ }
+
+ @Override
+ public void onEndEmulatorNavi() {
+ //结束模拟导航
+ }
+
+ @Override
+ public void onArriveDestination() {
+ //到达目的地
+ }
+
+ @Override
+ public void onCalculateRouteFailure(int errorInfo) {
+
+ }
+
+ @Override
+ public void onReCalculateRouteForYaw() {
+ //偏航后重新计算路线回调
+ }
+
+ @Override
+ public void onReCalculateRouteForTrafficJam() {
+ //拥堵后重新计算路线回调
+ }
+
+ @Override
+ public void onArrivedWayPoint(int wayID) {
+ //到达途径点
+ }
+
+ @Override
+ public void onGpsOpenStatus(boolean enabled) {
+ //GPS开关状态回调
+ }
+ @Override
+ public void showModeCross(AMapModelCross aMapModelCross) {
+ }
+
+ @Override
+ public void hideModeCross() {
+
+ }
+
+ @Override
+ public void updateIntervalCameraInfo(AMapNaviCameraInfo aMapNaviCameraInfo, AMapNaviCameraInfo aMapNaviCameraInfo1, int i) {
+
+ }
+
+ @Override
+ public void showLaneInfo(AMapLaneInfo aMapLaneInfo) {
+ //显示车道信息
+// StringBuffer sb = new StringBuffer();
+// sb.append("共" + aMapLaneInfo.frontLane.length + "车道");
+// for (int i = 0; i < aMapLaneInfo.frontLane.length; i++) {
+// //当前车道可以选择的动作
+// int background = aMapLaneInfo.backgroundLane[i];
+// //当前用户要执行的动作
+// int recommend = aMapLaneInfo.frontLane[i];
+//
+// Log.e("ggb", "---->>> background is " + background + " ; recommend is " + recommend);
+// //根据文档中每个动作对应的枚举类型,显示对应的图片
+// try {
+// sb.append(",第" + (i + 1) + "车道为" + array[background]);
+// if (recommend != 255) {
+// sb.append(",当前车道可 " + actions[recommend]);
+// }
+//
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+// Log.e("showLaneInfo", sb.toString());
+ }
+
+ @Override
+ public void onNaviRouteNotify(AMapNaviRouteNotifyData aMapNaviRouteNotifyData) {
+
+ }
+
+ @Override
+ public void updateCameraInfo(AMapNaviCameraInfo[] aMapCameraInfos) {
+
+ }
+
+ @Override
+ public void onServiceAreaUpdate(AMapServiceAreaInfo[] amapServiceAreaInfos) {
+
+ }
+
+ @Override
+ public void onNaviInfoUpdated(AMapNaviInfo aMapNaviInfo) {
+
+ }
+
+ @Override
+ public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {
+ //已过时
+ }
+
+ @Override
+ public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {
+
+ }
+
+ @Override
+ public void showCross(AMapNaviCross aMapNaviCross) {
+ //显示放大图回调
+ }
+
+ @Override
+ public void hideCross() {
+ //隐藏放大图回调
+ }
+
+ @Override
+ public void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) {
+ //过时
+ }
+
+ @Override
+ public void hideLaneInfo() {
+ //隐藏车道信息
+ }
+
+ @Override
+ public void notifyParallelRoad(int i) {
+ }
+
+ @Override
+ public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {
+ //更新交通设施信息
+ }
+
+ @Override
+ public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {
+ //更新巡航模式的统计信息
+ }
+
+
+ @Override
+ public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {
+ //更新巡航模式的拥堵信息
+ }
+
+ @Override
+ public void onPlayRing(int i) {
+
+ }
+
+ /**
+ * 车道信息说明:
+ *
+ * 0xFF, 无对应车道
+ * 0, 直行
+ * 1, 左转
+ * 2, 直行+左转
+ * 3, 右转
+ * 4, 直行+右转
+ * 5, 左掉头
+ * 6, 左转+右转
+ * 7, 直行+左转+右转
+ * 8, 右掉头
+ * 9, 直行+左掉头
+ * 10, 直行+右掉头
+ * 11, 左转+左掉头
+ * 12, 右转+右掉头
+ * 13, 直行+扩展
+ * 14, 左转+左掉头+扩展
+ * 15, 保留
+ * 16, 直行+左转+左掉头
+ * 17, 右转+左掉头
+ * 18, 左转+右转+左掉头
+ * 19, 直行+右转+左掉头
+ * 20, 左转+右掉头
+ * 21, 公交车道
+ * 22, 空车道
+ * 23 可变车道
+ */
+
+ String[] array = {
+ "直行车道"
+ , "左转车道"
+ , "左转或直行车道"
+ , "右转车道"
+ , "右转或直行车道"
+ , "左掉头车道"
+ , "左转或者右转车道"
+ , " 左转或右转或直行车道"
+ , "右转掉头车道"
+ , "直行或左转掉头车道"
+ , "直行或右转掉头车道"
+ , "左转或左掉头车道"
+ , "右转或右掉头车道"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择该车道"
+ , "直行+左转+左掉头车道"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+
+ String[] actions = {
+ "直行"
+ , "左转"
+ , "左转或直行"
+ , "右转"
+ , "右转或这行"
+ , "左掉头"
+ , "左转或者右转"
+ , " 左转或右转或直行"
+ , "右转掉头"
+ , "直行或左转掉头"
+ , "直行或右转掉头"
+ , "左转或左掉头"
+ , "右转或右掉头"
+ , "直行并且车道扩展"
+ , "左转+左掉头+扩展"
+ , "不可以选择"
+ , "直行+左转+左掉头"
+ , "右转+左掉头"
+ , "左转+右转+左掉头"
+ , "直行+右转+左掉头"
+ , "左转+右掉头"
+ , "公交车道"
+ , "空车道"
+ , "可变车道"
+ };
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java
new file mode 100644
index 0000000000..f0bf44761a
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/OCHTaxiModelLoopManager.java
@@ -0,0 +1,118 @@
+package com.mogo.och.taxi.model;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.och.taxi.constant.OCHTaxiConst;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created on 2021/9/10
+ *
+ * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
+ */
+public class OCHTaxiModelLoopManager {
+
+ private static final String TAG = OCHTaxiModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final OCHTaxiModelLoopManager INSTANCE = new OCHTaxiModelLoopManager();
+ }
+
+ public static OCHTaxiModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
+ private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询
+ private Disposable mGrabResultDisposable; //抢单结果轮询
+ private Disposable mHeartbeatDisposable; //心跳轮询
+
+ public void startInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryInAndWaitOrders());
+ }
+
+ public void stopInAndWaitOrdersLoop() {
+ if (mInAndWaitServiceDisposable != null) {
+ Logger.i(TAG, "stopInAndWaitOrdersLoop()");
+ mInAndWaitServiceDisposable.dispose();
+ mInAndWaitServiceDisposable = null;
+ }
+ }
+
+ public void startNewBookingOrderLoop() {
+ if (mNewBookingOrderDisposable != null && !mNewBookingOrderDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startNewBookingOrderLoop()");
+ mNewBookingOrderDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryNewBookingOrder());
+ }
+
+ public void stopNewBookingOrderLoop() {
+ if (mNewBookingOrderDisposable != null) {
+ Logger.i(TAG, "stopNewBookingOrderLoop()");
+ mNewBookingOrderDisposable.dispose();
+ mNewBookingOrderDisposable = null;
+ }
+ }
+
+ public void startGrabResultLoop() {
+ if (mGrabResultDisposable != null && !mGrabResultDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startGrabResultLoop()");
+ mGrabResultDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryOrderGrabStatus());
+ }
+
+ public void stopGrabResultLoop() {
+ if (mGrabResultDisposable != null) {
+ Logger.i(TAG, "stopGrabResultLoop()");
+ mGrabResultDisposable.dispose();
+ mGrabResultDisposable = null;
+ }
+ }
+
+ public void startHeartbeatLoop() {
+ if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
+ return;
+ }
+ Logger.i(TAG, "startHeartbeatLoop()");
+ mHeartbeatDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
+ OCHTaxiConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().runCarHeartbeat());
+ }
+
+ public void stopHeartbeatLoop() {
+ if (mHeartbeatDisposable != null) {
+ Logger.i(TAG, "stopHeartbeatLoop()");
+ mHeartbeatDisposable.dispose();
+ mHeartbeatDisposable = null;
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java
new file mode 100644
index 0000000000..23188ae2a8
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceApiNew.java
@@ -0,0 +1,161 @@
+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.DriverStatusQueryRespBean;
+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.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 io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 网约车-出租车接口定义
+ */
+interface OCHTaxiServiceApiNew {
+
+ /**
+ * 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
+ Observable queryOrdersInAndWaitService(@Query("sn") String sn);
+
+ /**
+ * 查询新到的预约单
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
+ Observable queryNewBookingOrder(@Query("sn") String sn);
+
+ /**
+ * (预约单)执行抢单动作
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
+ Observable grabOrder(@Body OrderGrabReqBean data);
+
+ /**
+ * (预约单)查询抢单结果
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
+ Observable queryOrderGrabStatus(@Body OrderGrabReqBean data);
+
+ /**
+ * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
+ Observable queryOrderRouteInfo(@Body OrderQueryRouteInfoReqBean data);
+
+ /**
+ * 通过orderId查询订单信息(用于本地已经有orderId时)
+ * @param data
+ * @return
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
+ Observable queryOrderById(@Body OrderQueryReqBean data);
+
+ /**
+ * 查询服务中订单信息(用于本地无orderId时)
+ * 如果有多条,只会返回时间最近的一条
+ * @param sn
+ * @return
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
+ Observable queryOrderInService(@Query("sn") String sn);
+
+ /**
+ * 取消订单
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+ @POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
+ Observable cancelOrder(@Body OrderCancelReqBean data);
+
+ /**
+ * 订单列表获取
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
+ Observable queryOrdersList(@Body OrdersListQueryReqBean data);
+
+ /**
+ * 订单状态更新
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
+ Observable updateOrderStatus(@Body OrderStatusUpdateReqBean data);
+
+ /**
+ * 收车/出车状态更新
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
+ Observable updateDriverServiceStatus(@Body DriverStatusUpdateReqBean data);
+
+ /**
+ * 收车/出车状态查询
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
+ Observable queryDriverServiceStatus(@Query("sn") String sn);
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
+ Observable runCarHeartbeat(@Body CarHeartbeatReqBean data);
+
+ /**
+ * 查询司机服务数据
+ * @param sn
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
+ Observable queryServiceData(@Query("sn") String sn);
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceCallback.java
new file mode 100644
index 0000000000..2a015c2d7c
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceCallback.java
@@ -0,0 +1,18 @@
+package com.mogo.och.taxi.network;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/15
+ *
+ * 修改订单状态回调接口
+ */
+public interface OCHTaxiServiceCallback< T > {
+
+ void onSuccess(T data);
+
+ void onFail(int code, String msg);
+
+ default void onError() {
+
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java
new file mode 100644
index 0000000000..e482f58a7f
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/network/OCHTaxiServiceManagerNew.java
@@ -0,0 +1,352 @@
+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.RequestOptions;
+import com.mogo.eagle.core.network.SubscribeImpl;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.bean.CarHeartbeatReqBean;
+import com.mogo.och.taxi.bean.DriverServiceDataRespBean;
+import com.mogo.och.taxi.bean.DriverStatusQueryRespBean;
+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.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.constant.OCHTaxiConst;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by pangfan on 2021/8/19
+ */
+public class OCHTaxiServiceManagerNew {
+ private static final String TAG = OCHTaxiServiceManagerNew.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final OCHTaxiServiceManagerNew INSTANCE = new OCHTaxiServiceManagerNew();
+ }
+
+ public static OCHTaxiServiceManagerNew getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private String baseUrl = OCHTaxiConst.getBaseUrl();
+ private OCHTaxiServiceApiNew mOCHTaxiServiceApi;
+
+ private OCHTaxiServiceManagerNew() {
+ if (mOCHTaxiServiceApi == null){
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ }
+
+ /**
+ * 查询全部服务中/待服务订单列表
+ * @param context
+ * @param callback
+ */
+ public void queryOrdersInAndWaitService(Context context,
+ OCHTaxiServiceCallback callback) {
+ if (mOCHTaxiServiceApi == null) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrdersInAndWaitService(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService"));
+ }
+
+ /**
+ * 查询新到的预约单
+ * @param context
+ * @param callback
+ */
+ public void queryNewBookingOrder(Context context,
+ OCHTaxiServiceCallback callback) {
+ if (mOCHTaxiServiceApi == null) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryNewBookingOrder(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryNewBookingOrder"));
+ }
+
+ /**
+ * (预约单)执行抢单动作
+ * @param context
+ * @param orderId
+ * @param callback
+ */
+ public void grabOrder(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.grabOrder(new OrderGrabReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "grabOrder"));
+ }
+
+ /**
+ * (预约单)查询抢单结果
+ * @param context
+ * @param orderId
+ * @param callback
+ */
+ public void queryOrderGrabStatus(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderGrabStatus(new OrderGrabReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderGrabStatus"));
+ }
+
+ /**
+ * 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
+ * @param context
+ * @param orderId
+ * @param callback
+ */
+ public void queryOrderRouteInfo(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderRouteInfo(new OrderQueryRouteInfoReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderRouteInfo"));
+ }
+
+ /**
+ * 通过orderId查询订单信息(用于本地已经有orderId时)
+ * @param context
+ * @param orderId
+ * @param callback
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ public void queryOrderById(Context context, long orderId,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderById(new OrderQueryReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderById"));
+ }
+
+ /**
+ * 查询未完成态订单信息(用于本地无orderId时)
+ * 如果有多条,只会返回时间最近的一条
+ * @param context
+ * @param callback
+ * @deprecated v2.1_0930需求中暂不再使用此接口
+ */
+ public void queryOrderInService(Context context,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrderInService(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrderInService"));
+ }
+
+ /**
+ * 司机取消订单
+ * @param context
+ * @param orderId
+ * @param cancelType
+ * @param cancelReason
+ * @param callback
+ */
+ public void cancelOrder(Context context, long orderId, int cancelType, String cancelReason,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.cancelOrder(new OrderCancelReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId, cancelType, cancelReason))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "cancelOrder"));
+ }
+
+ /**
+ * 订单列表获取
+ * @param context
+ * @param page
+ * @param size
+ * @param callback
+ */
+ public void queryOrdersList(Context context, int page, int size,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryOrdersList(new OrdersListQueryReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), page, size))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryOrdersList"));
+ }
+
+ /**
+ * 订单状态更新
+ * @param context
+ * @param orderId
+ * @param orderStatus
+ * @param callback
+ */
+ public void updateOrderStatus(Context context, long orderId, int orderStatus,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.updateOrderStatus(new OrderStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), orderId, orderStatus))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "updateOrderStatus"));
+ }
+
+ /**
+ * 收车/出车状态更新
+ * @param context
+ * @param status
+ * @param callback
+ */
+ public void updateDriverServiceStatus(Context context, int status,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.updateDriverServiceStatus(new DriverStatusUpdateReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), status))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus"));
+ }
+
+ /**
+ * 收车/出车状态查询
+ * @param context
+ * @param callback
+ */
+ public void queryDriverServiceStatus(Context context,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryDriverServiceStatus(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus"));
+ }
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param context
+ * @param lon
+ * @param lat
+ * @param callback
+ */
+ public void runCarHeartbeat(Context context, double lon, double lat,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.runCarHeartbeat(new CarHeartbeatReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
+ }
+
+ /**
+ * 查询司机服务数据
+ * @param context
+ * @param callback
+ */
+ public void queryDriverServiceData(Context context,
+ OCHTaxiServiceCallback callback) {
+ if ( mOCHTaxiServiceApi == null ) {
+ mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
+ .create(OCHTaxiServiceApiNew.class, baseUrl);
+ }
+ mOCHTaxiServiceApi.queryServiceData(MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "queryDriverServiceData"));
+ }
+
+ private SubscribeImpl getSubscribeImpl(
+ Context context, OCHTaxiServiceCallback callback, String apiName) {
+ return new SubscribeImpl(RequestOptions.create(context)) {
+ @Override
+ public void onSuccess(T o) {
+ super.onSuccess(o);
+ Logger.e(TAG,apiName + ": onSuccess() " + o.msg);
+ if (callback != null) {
+ callback.onSuccess(o);
+ }
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ Logger.e(TAG,apiName + ": onError() " + e.getMessage());
+ if (callback != null) {
+ callback.onError();
+ }
+ }
+
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ Logger.e(TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message));
+ if (callback != null) {
+ callback.onFail(code, message);
+ }
+ }
+ };
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java
new file mode 100644
index 0000000000..8a1242200d
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java
@@ -0,0 +1,259 @@
+package com.mogo.och.taxi.presenter;
+
+import android.location.Location;
+import android.os.Build;
+import android.os.Looper;
+import android.util.Log;
+
+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.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback;
+import com.mogo.och.taxi.constant.OrderStatusEnum;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.callback.IOCHTaxiADASStatusCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiCarStatusCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiControllerStatusCallback;
+import com.mogo.och.taxi.callback.IOCHTaxiOrderStatusCallback;
+import com.mogo.och.taxi.model.MogoOCHTaxiModelNew;
+import com.mogo.och.taxi.ui.OCHTaxiFragment;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 描述
+ */
+public class OCHTaxiPresenter extends Presenter implements IOCHTaxiADASStatusCallback,
+ IOCHTaxiCarStatusCallback, IOCHTaxiOrderStatusCallback, IOCHTaxiControllerStatusCallback, IOCHTaxiAutopilotPlanningCallback {
+
+ private static final String TAG = OCHTaxiPresenter.class.getSimpleName();
+
+ public OCHTaxiPresenter(OCHTaxiFragment view) {
+ super(view);
+ MogoOCHTaxiModelNew.getInstance().init(AbsMogoApplication.getApp());
+ initListeners();
+ }
+
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ Logger.d( TAG, "网约车-出租车拿到订单" );
+ }
+
+ @Override
+ public void onDestroy( @NonNull LifecycleOwner owner ) {
+ super.onDestroy( owner );
+
+ releaseListeners();
+ MogoOCHTaxiModelNew.getInstance().release();
+ }
+
+ private void initListeners() {
+ MogoOCHTaxiModelNew.getInstance().setADASStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setCarStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setControllerStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setOrderStatusCallback(this);
+ MogoOCHTaxiModelNew.getInstance().setMoGoAutopilotPlanningListener(this);
+ }
+
+ private void releaseListeners() {
+ MogoOCHTaxiModelNew.getInstance().setADASStatusCallback(null);
+ MogoOCHTaxiModelNew.getInstance().setCarStatusCallback(null);
+ MogoOCHTaxiModelNew.getInstance().setControllerStatusCallback(null);
+ MogoOCHTaxiModelNew.getInstance().setOrderStatusCallback(null);
+ MogoOCHTaxiModelNew.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() {
+ MogoOCHTaxiModelNew.getInstance().startAutoPilot();
+ }
+
+ // 更新出车/收车状态
+ public void updateCarStatus() {
+ MogoOCHTaxiModelNew.getInstance().updateCarStatus();
+ }
+
+ // 更新当前订单状态(当前订单状态流转)
+ public void updateCurOrderStatus(OrderStatusEnum status) {
+ MogoOCHTaxiModelNew.getInstance().updateOCHOrderStatus(status);
+ }
+
+ // 获取当前订单状态
+ public OrderStatusEnum getCurOrderStatus() {
+ return MogoOCHTaxiModelNew.getInstance().getCurOrderStatus();
+ }
+
+ // 取消当前订单
+ public void cancelCurOrder(int reasonType, String reason) {
+ MogoOCHTaxiModelNew.getInstance().cancelCurrentOrder(reasonType, reason);
+ }
+
+ // 取消待服务中订单
+ public void cancelOrderById(long orderId, int reasonType, String reason) {
+ MogoOCHTaxiModelNew.getInstance().cancelOrderById(orderId, reasonType, reason);
+ }
+
+ // 查询当前订单route信息:预估时间、里程等
+ public void queryCurOrderRouteInfo() {
+ MogoOCHTaxiModelNew.getInstance().queryCurOrderRouteInfo();
+ }
+
+ // 获取全部订单列表
+ public void queryOrdersList(int page, int size) {
+ MogoOCHTaxiModelNew.getInstance().queryOrdersList(page, size);
+ }
+
+ // 执行抢单动作
+ public void grabOrder() {
+ MogoOCHTaxiModelNew.getInstance().grabOrder();
+ }
+
+ // 关闭新到预约单
+ public void cancelNewBookingOrder() {
+ MogoOCHTaxiModelNew.getInstance().cancelNewBookingOrder();
+ }
+
+ // 查询司机服务数据
+ public void queryDriverServiceData() {
+ MogoOCHTaxiModelNew.getInstance().queryDriverServiceData();
+ }
+
+ @Override
+ public void onAutopilotArriveEnd() {
+
+ }
+
+ @Override
+ public void onAutopilotEnable() {
+ mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE);
+ }
+
+ @Override
+ public void onAutopilotDisable() {
+ mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE);
+ }
+
+ @Override
+ public void onAutopilotRunning() {
+ mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ }
+
+ @Override
+ public void onCarStatusChanged(boolean inOperation) {
+ mView.updateOperationStatus(inOperation);
+ }
+
+ @Override
+ public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
+ mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum);
+ }
+
+ @Override
+ public void onOrdersInServiceChanged(@NonNull @NotNull List inServiceList) {
+
+ }
+
+ @Override
+ public void onOrdersWaitServiceChanged(@NonNull @NotNull List waitServiceList) {
+ mView.onOrdersWaitServiceChanged(waitServiceList);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ @Override
+ public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ Log.d(TAG,"order = "+order.toString());
+ mView.updateCurrentOrderStatusChanged(order);
+ }
+
+ @Override
+ public void onCurrentOrderCancelDone() {
+ mView.onCurrentOrderCancelDone();
+ }
+
+ @Override
+ public void onOrderCancelDone(long orderId) {
+ mView.onOrderCancelDone(orderId);
+ }
+
+ @Override
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
+ mView.onCurrentOrderRouteInfoGot(routeInfo);
+ }
+
+ @Override
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond) {
+ mView.onCurrentOrderDistToStartChanged(meters,timeInSecond);
+ }
+
+ @Override
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
+ mView.onCurrentOrderDistToEndChanged(meters,timeInSecond);
+ }
+
+ @Override
+ public void onOrdersListPageRefresh(List ordersList) {
+ mView.onOrdersListPageRefresh(ordersList);
+ }
+
+ @Override
+ public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
+ mView.onNewBookingOrderGot(order);
+ }
+
+ @Override
+ public void onGrabOrderExecuteDone() {
+ mView.onGrabOrderExecuteDone();
+ }
+
+ @Override
+ public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
+ mView.onGrabOrderSuccess(order);
+ }
+
+ @Override
+ public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
+ mView.onGrabOrderFailed(order);
+ }
+
+ @Override
+ public void onVRModeChanged(boolean isVRMode) {
+ runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
+ }
+
+ @Override
+ public void onCarLocationChanged(Location location) {
+ if (null != location){
+ runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
+ mView.updateLocation(location.getLatitude(),location.getLongitude());
+ }
+ }
+ @Override
+ public void routeResult(List models) {
+ if (models != null && models.size() > 0) mView.routeResult(models);
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java
new file mode 100644
index 0000000000..814956ec7c
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java
@@ -0,0 +1,482 @@
+package com.mogo.och.taxi.ui;
+
+import android.animation.ObjectAnimator;
+import android.content.Intent;
+import android.graphics.drawable.AnimationDrawable;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.constraintlayout.widget.Group;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.amap.api.navi.model.NaviLatLng;
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.mvp.IView;
+import com.mogo.commons.mvp.MvpFragment;
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.function.call.map.CallerSmpManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.uicontroller.VisualAngleMode;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.constants.DataTypes;
+import com.mogo.module.common.view.OnPreventFastClickListener;
+import com.mogo.och.taxi.R;
+
+import kotlin.Unit;
+import kotlin.jvm.functions.Function0;
+
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+public abstract class BaseOchTaxiTabFragment> extends MvpFragment implements IMogoMapListener {
+
+ private static final String TAG = "BaseOchFragment";
+ private LinearLayout ctvAutopilotStatus;
+ protected TextView tvOperationStatus;
+ public boolean isOperationStatus;//false-收车,true-出车
+ protected FrameLayout flStationPanelContainer;
+ private FrameLayout flNaviPanelContainer;
+ private Group groupTestPanel;
+ private TextView mSpeedView;
+ private ImageView mAutopilotImage;
+ private TextView mAutopilotTv;
+ private LinearLayout mMapswitchBtn;
+ private ImageView mCloseNaviIcon;
+ protected LinearLayout mPersonalBtn;
+ protected LinearLayout mSettingBtn;
+ protected ImageView mBadcaseBtn;
+ protected OCHNaviFragment ochNaviFragment = null;
+
+ private Handler mHandler = new Handler(Looper.getMainLooper());
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_base_fragment;
+ }
+
+ private View panelView;
+
+ @Override
+ protected void initViews() {
+ groupTestPanel = findViewById(R.id.groupTestPanel);
+ ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
+ mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
+ mAutopilotTv = findViewById(R.id.module_och_autopilot_tv);
+ flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
+ mPersonalBtn = findViewById(R.id.module_och_taxi_personal_layout);
+ 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);
+ if (DebugConfig.isDebug()) {
+ mSpeedView.setLongClickable(true);
+ // TODO: 2021/11/27 暂去除此调试功能
+// mSpeedView.setOnClickListener(v -> {
+// onAutopilotStatusChanged(false);
+// });
+ mSpeedView.setOnLongClickListener(v -> {
+ Log.d(TAG,"长按显示状态工具栏");
+ Intent intent = new Intent();
+ intent.putExtra("oper", 52);
+ MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent);
+ return true;
+ });
+ }
+ tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
+ mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_layout);
+ mMapswitchBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //视角切换
+ if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isLongSight()) {
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).visibleAllMarkers();
+ MogoApisHandler.getInstance().getApis().getMapServiceApi()
+ .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ } else if (MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getCurrentMapVisualAngle().isMediumSight()) {
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS);
+ MogoApisHandler.getInstance().getApis().getMapServiceApi()
+ .getMapUIController().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ }
+ }
+ });
+ mPersonalBtn.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onGoToTaxiOrders();
+ }
+ });
+
+ 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_iv);
+ CallerHmiManager.INSTANCE.registerBadCaseCallback(
+ () -> { // onShow()
+ return mBadcaseBtn; },
+ () -> { // onHide()
+ return null; });
+
+ panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
+ ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() {
+ @Override
+ public void onClickImpl(View v) {
+ // 如果能自动驾驶,就自动驾驶,不能就提示
+ restartAutopilot();
+ // TODO: 2021/11/27 通过开启结果更新ui
+// onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ }
+ });
+
+ // debug下调用测试面板
+// if (DebugConfig.isDebug()) {
+// ctvAutopilotStatus.setOnLongClickListener(v -> {
+// if (groupTestPanel.getVisibility() == View.VISIBLE) {
+ groupTestPanel.setVisibility(View.GONE);
+// } else {
+// groupTestPanel.setVisibility(View.VISIBLE);
+// }
+// return false;
+// });
+// }
+
+ onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+
+ // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
+// findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用");
+//// Logger.d("lianglihui","模拟 不可自动驾驶");
+// }
+// );
+
+ // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
+// findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, "能使用");
+//
+//// Logger.d("lianglihui","模拟 可自动驾驶");
+// }
+// );
+
+ // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
+// findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi()
+// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, "Running");
+//// Logger.d("lianglihui","模拟 自动驾驶能力");
+// }
+// );
+
+ // 模拟 自动驾驶站
+// findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
+// {
+// MogoApisHandler.getInstance().getApis()
+// .getAdasControllerApi().mockOchStatus(-1, "Arrived");
+//
+//// Logger.d("lianglihui","模拟 自动驾驶站");
+// }
+// );
+
+ // 模拟 站点下发工控
+ findViewById(R.id.btnAutopilotControl).setOnClickListener(view ->
+ {
+// Logger.d("lianglihui","模拟 站点下发工控");
+ AutopilotControlParameters currentAutopilot = new AutopilotControlParameters();
+ currentAutopilot.isSpeakVoice = true;
+ // 万集东门站
+ currentAutopilot.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(40.194795425,116.724476409);
+ // 市政府前街18号
+ currentAutopilot.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(40.1939540844,116.720067);
+ // 订单运营类型 (9出租车,10小巴)
+ currentAutopilot.vehicleType = 10;
+ Logger.d(TAG, "模拟 订单站点下发:" + currentAutopilot);
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(currentAutopilot);
+ }
+ );
+
+ tvOperationStatus.setOnClickListener(view -> {
+ onChangeOperationStatus();
+ });
+ mCloseNaviIcon.setOnClickListener(v -> {
+ showNaviToStartStationFragment(false);
+ });
+ }
+ protected void onChangeOperationStatus() {
+
+ }
+
+ protected void onGoToTaxiOrders(){
+
+ }
+ public void showNotice(String notice) {
+ getActivity().runOnUiThread(() -> {
+ AIAssist.getInstance(getContext()).speakTTSVoice(notice);
+ });
+ }
+
+ /**
+ * 改变自动驾驶状态
+ *
+ * @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);
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == mPrevAPStatus) {
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
+ // 2->1
+// AIAssist.getInstance(getContext()).speakTTSVoice("已进入人工驾驶模式");
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == status) {
+ // 2->0
+// AIAssist.getInstance(getContext()).speakTTSVoice("自动驾驶已停止,请人工接管");
+ }
+ }
+ mPrevAPStatus = status;
+ });
+ }
+
+ private AnimationDrawable animationDrawable;
+ public void AutopilotStatusAnimchanged(int status) {
+// mAutopilotTv.setText(isInAutopilot?"自动驾驶":"开启自动驾驶");
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
+ ctvAutopilotStatus.setClickable(true);
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+ if (animationDrawable == null) {
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.anmi_flow));
+ animationDrawable = (AnimationDrawable) ctvAutopilotStatus.getBackground();
+ }
+ if (animationDrawable.isRunning()) {
+ return;
+ }
+ animationDrawable.selectDrawable(0);
+ animationDrawable.start();
+ } else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status){
+ ctvAutopilotStatus.setClickable(true);
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_normal));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot);
+ if (animationDrawable != null){
+ animationDrawable.selectDrawable(0);
+ animationDrawable.stop();
+ }
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
+ animationDrawable = null;
+ } else {
+ ctvAutopilotStatus.setClickable(false);
+ mAutopilotTv.setText("自动驾驶");
+ mAutopilotTv.setTextColor(getResources().getColor(R.color.taxi_autopilot_text_color_disable));
+ mAutopilotImage.setImageResource(R.drawable.taxi_ic_autopilot_disable);
+ if (animationDrawable != null){
+ animationDrawable.selectDrawable(0);
+ animationDrawable.stop();
+ }
+ ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_ic_autopilot_bg));
+ animationDrawable = 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.getAutoPilotStatusInfo().getState());
+ }
+ }, 1000L);
+ }
+
+ private 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();//动画开始
+ } else {
+ isStarting = false;
+ if (autopilotLoadingAnimator != null) {
+ autopilotLoadingAnimator.end();
+ mAutopilotImage.clearAnimation();
+ autopilotLoadingAnimator = null;
+ }
+ }
+ }
+
+ /**
+ * 隐藏【自动驾驶】按钮
+ */
+ public void hideAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setVisibility(View.GONE);
+// slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ /**
+ * 展示【自动驾驶】按钮
+ */
+ public void showAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+ ctvAutopilotStatus.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public void hidPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.GONE);
+ });
+ }
+
+ public void showPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public View getPanelView() {
+ return panelView;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 重新开启自动驾驶
+ */
+ public abstract void restartAutopilot();
+
+
+ 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 切换
+ }
+// private void hideHMI() {
+// // 控制 脉速表 显示状态
+// CallerHmiManager.INSTANCE.setSpeedChartViewVisibility(View.GONE);
+// // 控制 自动驾驶按钮 显示状态
+// CallerHmiManager.INSTANCE.setAutopilotStatusViewVisibility(View.GONE);
+// // 控制 切换视角按钮 显示状态
+// CallerHmiManager.INSTANCE.setPerspectiveSwitchViewVisibility(View.GONE);
+// // 控制 车辆检检测按钮 示状态
+// CallerHmiManager.INSTANCE.setCheckStatusViewVisibility(View.GONE);
+// }
+
+ protected void showNaviToStartStationFragment(boolean isShow){
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (isShow){
+// if (ochNaviFragment == null){
+ ochNaviFragment = OCHNaviFragment.newInstance();
+// }
+ if (ochNaviFragment.isAdded()){
+ return;
+ }
+ transaction.add(R.id.module_mogo_och_navi_panel_container,ochNaviFragment).show(ochNaviFragment);
+ transaction.commitAllowingStateLoss();
+ mCloseNaviIcon.setVisibility(View.VISIBLE);
+ flNaviPanelContainer.setVisibility(View.VISIBLE);
+ CallerSmpManager.hidePanel();//隐藏小地图
+ }else {
+ if (ochNaviFragment != null){
+ ochNaviFragment.onDestroy();
+ transaction.remove(ochNaviFragment);
+ transaction.commitAllowingStateLoss();
+ ochNaviFragment = null;
+ }
+ mCloseNaviIcon.setVisibility(View.GONE);
+ flNaviPanelContainer.setVisibility(View.GONE);
+ CallerSmpManager.showPanel();//显示小地图
+ }
+ }
+
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiUIFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiUIFragment.java
new file mode 100644
index 0000000000..013b27bf3e
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/ui/BorderShadowLayout.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BorderShadowLayout.java
new file mode 100644
index 0000000000..dd3c49b15a
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BorderShadowLayout.java
@@ -0,0 +1,360 @@
+package com.mogo.och.taxi.ui;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.BlurMaskFilter;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.widget.LinearLayout;
+
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.callback.Shadow;
+import com.mogo.och.taxi.utils.DimenUtil;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/1/21
+ * 边框阴影
+ */
+public class BorderShadowLayout extends LinearLayout {
+
+
+ private static final String TAG = "ShadowLayout";
+
+ //默认阴影半径
+ public static final float SHADOW_DEFAULT_RADIUS = DimenUtil.INSTANCE.dp2px(5);
+
+ //阴影最大偏移量
+ public static final float SHADOW_MAX_OFFSET = DimenUtil.INSTANCE.dp2px(20);
+
+ //阴影最大模糊半径
+ public static final float SHADOW_MAX_BLUR = DimenUtil.INSTANCE.dp2px(20);
+
+
+
+ //默认模糊半径
+ public static final float SHADOW_DEFAULT_BLUR_RADIUS = DimenUtil.INSTANCE.dp2px(5);
+
+
+ //阴影颜色
+ private int shadowColor = Color.parseColor("#333333");
+
+ //阴影类型,0:默认为单边 1:单边 2:邻边 3:四边所有
+ private int shadowType;
+
+ //阴影半径
+ private float shadowRadius = 0f;
+
+ //模糊度半径
+ private float blurRadius = SHADOW_DEFAULT_BLUR_RADIUS ;
+
+ //水平位移
+ private float xOffset = DimenUtil.INSTANCE.dp2px(10);
+
+
+ //竖直方向位移
+ private float yOffset = DimenUtil.INSTANCE.dp2px(10);
+
+ //背景色
+ private int bgColor = Color.WHITE;
+
+ //是否有点击效果
+ private boolean hasEffect = false ;
+
+
+ int left =0 ,right =0,top = 0,bottom = 0 ;
+
+ //代理方式
+ private Shadow shadow = new BorderShadowLayout.ShadowConfig(this);
+
+ private float mWidthMode;
+ private float mHeightMode;
+ private Paint mPaint = new Paint();
+ private Paint locationPaint = new Paint();
+
+ public BorderShadowLayout(Context context) {
+ super(context,null);
+ }
+
+ public BorderShadowLayout(Context context, AttributeSet attrs) {
+ this(context, attrs,0);
+ }
+
+ public BorderShadowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShadowLayout);
+ shadowColor = typedArray.getColor(R.styleable.ShadowLayout_shadowColor, Color.BLUE);
+ blurRadius = typedArray.getDimension(R.styleable.ShadowLayout_blurRadius, SHADOW_DEFAULT_BLUR_RADIUS);
+ shadowRadius = typedArray.getDimension(R.styleable.ShadowLayout_shadowRadius,0);
+ hasEffect = typedArray.getBoolean(R.styleable.ShadowLayout_hasEffect, false);
+ xOffset = typedArray.getDimension(R.styleable.ShadowLayout_xOffset,DimenUtil.INSTANCE.dp2px(10));
+ yOffset = typedArray.getDimension(R.styleable.ShadowLayout_yOffset,DimenUtil.INSTANCE.dp2px(10));
+ bgColor = typedArray.getColor(R.styleable.ShadowLayout_bgColor,Color.WHITE);
+ typedArray.recycle();
+
+ if (shadowRadius<0){
+ shadowRadius = -shadowRadius;
+ }
+ if (blurRadius < 0) {
+ blurRadius = -blurRadius;
+ }
+
+ blurRadius = Math.min(SHADOW_MAX_BLUR,blurRadius);
+
+ if (Math.abs(xOffset)> SHADOW_MAX_OFFSET){
+ xOffset = xOffset/Math.abs(xOffset) * SHADOW_MAX_OFFSET;
+ }
+
+ if (Math.abs(yOffset) > SHADOW_MAX_OFFSET){
+ yOffset = yOffset/Math.abs(yOffset) * SHADOW_MAX_OFFSET;
+ }
+
+ init();
+ }
+
+ private void init(){
+ setBackgroundColor(Color.parseColor("#00ffffff"));
+ if (xOffset>0){
+ //水平偏移量为正数,右侧有阴影,阴影长度为blurRadius+|xOffset|
+ right = (int)(blurRadius + Math.abs(xOffset));
+ }else if (xOffset==0){
+ //水平偏移为0,水平间距为blurRadius
+ left = (int)blurRadius;
+ right = (int)blurRadius;
+ }else {
+ //水平偏移为负数,左侧有阴影,阴影长度为blurRadius+|xOffset|
+ left = (int)(blurRadius + Math.abs(xOffset));
+ }
+ if (yOffset>0){
+ //竖直偏移量为正数,底部有阴影,阴影长度为blurRadius+|yOffset|
+ bottom = (int)(blurRadius + Math.abs(yOffset));
+ }else if (yOffset==0){
+ //竖直偏移量为0,竖直间距为blurRadius
+ top = (int)blurRadius;
+ bottom = (int)blurRadius;
+ }else {
+ //竖直偏移量为负数,顶部有阴影,阴影长度为blurRadius+|yOffset|
+ top = (int)(blurRadius + Math.abs(yOffset));
+ }
+ setPadding(left,top,right,bottom);
+ }
+
+
+
+
+
+ /**
+ * 获取阴影设置
+ * @return 返回阴影设置配置
+ */
+ public Shadow getShadowConfig(){
+ return shadow;
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed,l,t,r,b);
+ }
+
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+ }
+
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ drawBackground(canvas);//放在super前是后景,相反是前景,前景会覆盖子布局
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+
+
+
+ //绘制背景色(在子view底部)
+ private void drawBackground(Canvas canvas){
+
+ mWidthMode = getMeasuredWidth();
+ mHeightMode = getMeasuredHeight();
+ float startX = 0;
+ float startY = 0;
+ float endX = 0;
+ float endY = 0;
+
+ if (xOffset==0){
+ startX = right;
+ endX = mWidthMode-blurRadius;
+ }else {
+ startX = right+blurRadius;
+ endX = mWidthMode-left-blurRadius;
+ }
+
+ if (yOffset==0){
+ startY = bottom;
+ endY = mHeightMode-blurRadius;
+ }else {
+ startY = bottom+blurRadius;
+ endY = mHeightMode-top-blurRadius;
+ }
+// mPaint.setShadowLayer(blurRadius,0,0,shadowColor);
+ if (blurRadius>0){
+ mPaint.setMaskFilter(new BlurMaskFilter(blurRadius,BlurMaskFilter.Blur.NORMAL));
+ }
+ mPaint.setColor(shadowColor);
+ mPaint.setAntiAlias(true);
+
+ RectF shadowRect = new RectF(startX,startY,endX,endY);
+
+ RectF locationRectF = new RectF(left,top,mWidthMode-right,mHeightMode-bottom);
+ if (shadowRadius==0){
+ //不是圆角
+ canvas.drawRect(shadowRect,mPaint);
+ }else {
+ //圆角,角度为shadowRadius
+ canvas.drawRoundRect(shadowRect,shadowRadius,shadowRadius,mPaint);
+ }
+
+ locationPaint.setColor(bgColor);
+ locationPaint.setAntiAlias(true);
+
+ if (shadowRadius==0){
+ //不是圆角
+ canvas.drawRect(locationRectF,locationPaint);
+ }else {
+ //圆角,角度为shadowRadius
+ canvas.drawRoundRect(locationRectF,shadowRadius,shadowRadius,locationPaint);
+ }
+ }
+
+
+
+ /**
+ * 阴影配置
+ */
+ class ShadowConfig implements Shadow{
+
+ //代理
+ private BorderShadowLayout shadow;
+
+ private ShadowConfig(BorderShadowLayout shadow) {
+ this.shadow = shadow;
+ }
+
+ @Override
+ public Shadow setShadowRadius(float radius) {
+ return setShadowRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
+ }
+
+ @Override
+ public Shadow setShadowRadius(int unit, float radius) {
+ Context c = getContext();
+ Resources r;
+
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+ shadow.shadowRadius = Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics()));
+ return this;
+ }
+
+ @Override
+ public Shadow setShadowColor(int color) {
+ shadow.shadowColor = color;
+ return this;
+ }
+
+ @Override
+ public Shadow setShadowColorRes(int colorRes) {
+ shadow.shadowColor = shadow.getResources().getColor(colorRes);
+ return this;
+ }
+
+ @Override
+ public Shadow setBlurRadius(float radius) {
+ return setBlurRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
+ }
+
+ @Override
+ public Shadow setBlurRadius(int unit, float radius) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+ shadow.blurRadius = Math.min(SHADOW_MAX_BLUR,Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics())));
+ return this;
+ }
+
+ @Override
+ public Shadow setXOffset(float offset) {
+ return setXOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
+ }
+
+ @Override
+ public Shadow setXOffset(int unit, float offset) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+
+ float x = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
+ if (Math.abs(x)> SHADOW_MAX_OFFSET){
+ x = x/Math.abs(x) * SHADOW_MAX_OFFSET;
+ }
+ shadow.xOffset = x;
+ return this;
+ }
+
+ @Override
+ public Shadow setYOffset(float offset) {
+ return setYOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
+ }
+
+ @Override
+ public Shadow setYOffset(int unit, float offset) {
+ Context c = getContext();
+ Resources r;
+ if (c == null) {
+ r = Resources.getSystem();
+ } else {
+ r = c.getResources();
+ }
+
+ float y = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
+ if (Math.abs(y)> SHADOW_MAX_OFFSET){
+ y = y/Math.abs(y) * SHADOW_MAX_OFFSET;
+ }
+ shadow.yOffset = y;
+ return this;
+ }
+
+ @Override
+ public void commit() {
+ shadow.init();
+ shadow.requestLayout();
+ shadow.postInvalidate();
+ }
+ }
+
+
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHNaviFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHNaviFragment.java
new file mode 100644
index 0000000000..fa69f8c0db
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHNaviFragment.java
@@ -0,0 +1,306 @@
+package com.mogo.och.taxi.ui;
+
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.model.BitmapDescriptorFactory;
+import com.amap.api.maps.model.CustomMapStyleOptions;
+import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.navi.AMapNaviView;
+import com.amap.api.navi.AMapNaviViewListener;
+import com.amap.api.navi.AMapNaviViewOptions;
+import com.amap.api.navi.model.RouteOverlayOptions;
+import com.mogo.eagle.core.function.smp.utils.MapAssetStyleUtils;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.callback.IOCHTaxiNaviChangedCallback;
+import com.mogo.och.taxi.model.NaviToDestinationModel;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/30
+ */
+public class OCHNaviFragment extends BaseTaxiUIFragment implements AMapNaviViewListener, View.OnClickListener {
+
+ private AMapNaviView mAMapNaviView;
+// private OverviewButtonView mOverviewButtonView;
+// private NextTurnTipView mNextTurnTipView;
+ private AMap aMap;
+ private IOCHTaxiNaviChangedCallback mNaviToStartInfoCallback; // 前往乘客上车点
+ public static OCHNaviFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHNaviFragment fragment = new OCHNaviFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.taxi_navi_view;
+ }
+
+ @Override
+ protected void initViews(View view) {
+ view.bringToFront();
+ initMapView(view);
+ }
+
+ private void initMapView(View view) {
+// mOverviewButtonView = view.findViewById(R.id.navi_overviewbuttonview);
+// mAMapNaviView.setLazyOverviewButtonView(mOverviewButtonView);
+ // mOverviewButtonView.setOnClickListener(this);
+// DriveWayView mDriveWayView = view.findViewById(R.id.navi_drivewayview);
+// mAMapNaviView.setLazyDriveWayView(mDriveWayView);
+// mNextTurnTipView = view.findViewById(R.id.navi_nextturntipview);
+// mAMapNaviView.setLazyNextTurnTipView(mNextTurnTipView);
+ mAMapNaviView = view.findViewById(R.id.navi_view);
+ mAMapNaviView.setAMapNaviViewListener(this);
+ //车头向上模式
+ mAMapNaviView.setNaviMode(AMapNaviView.CAR_UP_MODE);
+ aMap = mAMapNaviView.getMap();
+ //关闭地图文字显示
+ aMap.showMapText(false);
+ // 设置导航地图模式,aMap是地图控制器对象。
+ aMap.setMapType(AMap.MAP_TYPE_NIGHT);
+ // 关闭显示实时路况图层,aMap是地图控制器对象。
+ aMap.setTrafficEnabled(false);
+ setMapViewOptions();
+ new Thread(() -> {
+ try {
+ Thread.sleep(1000L);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (null == getContext()){
+ return;
+ }
+ aMap.setCustomMapStyle(
+ new CustomMapStyleOptions()
+ .setEnable(true)
+ .setStyleData(MapAssetStyleUtils.getAssetsStyle(getContext()))
+ .setStyleExtraData(MapAssetStyleUtils.getAssetsExtraStyle(getContext()))
+ );
+
+ //设置希望展示的地图缩放级别
+ }).start();
+ }
+
+ private void setMapViewOptions() {
+ AMapNaviViewOptions options = new AMapNaviViewOptions();
+ options.setTilt(0);//设置 2D 模式
+ options.setLayoutVisible(false);//设置导航界面UI是否显示。
+ options.setTrafficBarEnabled(false);//设置路况光柱条是否显示(只适用于驾车导航,需要联网)。
+ options.setAutoLockCar(true);//设置6秒后是否自动锁车
+ options.setAutoDisplayOverview(true);//设置是否自动全览模式,即在算路成功后自动进入全览模式
+ options.setTrafficLine(false);
+ options.setModeCrossDisplayShow(true);//设置是否显示路口放大图(路口模型图)
+ options.setAutoChangeZoom(true);//自动缩放级别
+ options.setCarBitmap(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.taxi_navi_arrow_icon));
+ options.setFourCornersBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.taxi_navi_direction_icon));
+ options.setAutoChangeZoom(true);//设置是否开启动态比例尺 (锁车态下自动进行地图缩放变化)
+// options.setZoom(18);//14-18
+// options.setTrafficInfoUpdateEnabled(false);
+// options.setTrafficLayerEnabled(false);//设置[实时交通图层开关按钮]是否显示(只适用于驾车导航,需要联网)。
+// options.setCameraInfoUpdateEnabled(false);
+// options.setCompassEnabled(false);//设置指南针图标否在导航界面显示,默认显示。
+// options.setLaneInfoShow(false);// 设置是否显示道路信息view
+// options.setNaviArrowVisible(false);//设置路线转向箭头隐藏和显示
+// options.setRealCrossDisplayShow(false);//设置是否显示路口放大图(实景图)
+// options.setRouteListButtonShow(true);//设置导航界面是否显示路线全览按钮。
+// options.setSettingMenuEnabled(false);//设置菜单按钮是否在导航界面显示。
+
+ RouteOverlayOptions routeOverlayOptions = new RouteOverlayOptions();
+
+// routeOverlayOptions.setArrowOnTrafficRoute(BitmapFactory.decodeResource(getResources(),R.drawable.custtexture_aolr));
+ routeOverlayOptions.setNormalRoute(BitmapFactory.decodeResource(getResources(), R.drawable.taxi_navi_line_icon));
+ options.setRouteOverlayOptions(routeOverlayOptions);
+
+ mAMapNaviView.setViewOptions(options);
+ }
+ public void goToOverview(){
+ if (mAMapNaviView.isRouteOverviewNow()){
+ mAMapNaviView.recoverLockMode();
+ }else {
+ mAMapNaviView.displayOverview();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+// if (v.getId() == R.id.navi_overviewbuttonview){
+// goToOverview();
+// }
+ }
+ @Override
+ protected void initViews(Bundle savedInstanceState) {
+ super.initViews(savedInstanceState);
+ mAMapNaviView.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mAMapNaviView.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ mAMapNaviView.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(false);
+ 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() {
+ Log.d("wlx", "导航页面加载成功");
+ Log.d("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/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java
new file mode 100644
index 0000000000..d3897c8601
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiBeingServerdOrdersFragment.java
@@ -0,0 +1,540 @@
+package com.mogo.och.taxi.ui;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.Html;
+import android.util.Log;
+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.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.marker.MogoMarkerOptions;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.callback.IOCHTaxiNaviChangedCallback;
+import com.mogo.och.taxi.constant.OCHTaxiConst;
+import com.mogo.och.taxi.constant.OrderStatusEnum;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.model.MogoOCHTaxiModelNew;
+import com.mogo.och.taxi.model.NaviToDestinationModel;
+import com.mogo.och.taxi.utils.OchTaxiUtils;
+
+import java.text.DecimalFormat;
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ * 正在进行中订单
+ */
+public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implements View.OnClickListener, IOCHTaxiNaviChangedCallback {
+
+ public static final String TAG = "OCHTaxiBeingServerd";
+ private static Activity mActivity;
+ private static OCHTaxiFragment mTaxiFragment;
+ private long mOrderId;
+ private double mOrderStartStationLat = 0;
+ private double mOrderStartStationLng = 0;
+
+ public static OCHTaxiBeingServerdOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment) {
+ mActivity = activity;
+ mTaxiFragment = taxiFragment;
+ Bundle args = new Bundle();
+
+ OCHTaxiBeingServerdOrdersFragment fragment = new OCHTaxiBeingServerdOrdersFragment();
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ private TextView mOrderStatus;
+ private ImageView mOrderCancel;
+ private TextView mOrderServerStatus;
+ 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 LinearLayout mContentModule32;
+ private TextView mStationTv32;
+ private TextView mArrivedStationTitleTv32;
+ private TextView mGoAheadStationTitleTv31;
+ private TextView mCatchStationTitleTv31;
+ private ImageView mNaviIcon;
+
+ private TextView mNoDatasTv;
+
+ private ConstraintLayout mNoDataView;
+
+ private volatile int saveOrderState = -1;
+
+ @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);
+ 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);
+ mNoDatasTv = view.findViewById(R.id.no_order_data_tv);
+ mNoDataView = view.findViewById(R.id.being_no_data_view);
+ mOrderCancel.setOnClickListener(this);
+ mOrderServerStatus.setOnClickListener(this);
+
+ initNaviView(view);
+
+ isHaveBeingOrder(false);
+
+ if (DebugConfig.isDebug()) {
+ initOrderTestBar(view);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ MogoOCHTaxiModelNew.getInstance().startOrStopOrderLoop();
+ }
+
+ private void initNaviView(View view) {
+ mNaviIcon = view.findViewById(R.id.module_och_taxi_navi_iv);
+ mNaviIcon.setOnClickListener(this);
+ }
+
+ private boolean isSpeakedEndingNotice = false;
+
+ /**
+ * 初始化订单信息
+ */
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
+ if (order == null) return;
+ if (order.orderStatus == OrderStatusEnum.JourneyCompleted.getCode()) {
+ isHaveBeingOrder(false);
+ return;
+ }
+ mOrderId = order.orderId;
+ onOrderStatusChanged(order);
+ if (OrderStatusEnum.ArriveAtEndStation.getCode() == order.orderStatus) {
+ mTaxiFragment.queryCurOrderRouteInfo();
+ mContentModule3.setVisibility(View.GONE);
+ mContentModule2.setVisibility(View.VISIBLE);
+ Logger.d(TAG, "已经达到终点");
+ mOrderStatus.setText(R.string.module_och_taxi_arrive_at_end_station2);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_end);
+ mOrderServerStatus.setTextColor(Color.parseColor("#FFFFFF"));
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#FF1D5EF3"));
+ mOrderServerStatus.setClickable(true);
+// String strHtml3 = "送乘客至
"
+// + "" + order.endSiteAddr + "";
+ mTitleTV2.setText("送乘客至");
+ mStationTv2.setText(order.endSiteAddr);
+// String strHtml2 = "距离 " + "- -" + " 公里,"
+// + "用时 " + "- -" + " 分钟";
+// mDistanceAndTime.setText(Html.fromHtml(strHtml2));
+ } else if (OrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus) {
+ Logger.d(TAG, "已经去往终点");
+ mContentModule3.setVisibility(View.GONE);
+ mContentModule2.setVisibility(View.VISIBLE);
+ mOrderStatus.setText(R.string.module_och_taxi_on_the_way_2_end_station);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_end);
+ mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF"));
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#4D1D5EF3"));
+ mOrderServerStatus.setClickable(false);
+// String strHtml3 = "送乘客至
"
+// + "" + order.endSiteAddr + "";
+ mTitleTV2.setText("送乘客至");
+// mStationTv2.setText(order.endSiteAddr);
+ mStationTv2.setText(order.endSiteAddr);
+// String strHtml4 = "距离 " + "- -" + " 公里,"
+// + "用时 " + "- -" + " 分钟";
+// mDistanceAndTime.setText(Html.fromHtml(strHtml4));
+ } else if (OrderStatusEnum.ArriveAtStartStation.getCode() == order.orderStatus) {
+ Logger.d(TAG, "已经达到起点");
+ mContentModule2.setVisibility(View.GONE);
+ mContentModule3.setVisibility(View.VISIBLE);
+ mArrivedStartTimeTv32.setVisibility(View.VISIBLE);
+ mContentModule32.setVisibility(View.VISIBLE);
+ mContentModule31.setVisibility(View.GONE);
+ mOrderOtherContent3.setVisibility(View.GONE);
+ mOrderStatus.setText(R.string.module_och_taxi_waiting);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_start);
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#FF1D5EF3"));
+ mOrderServerStatus.setTextColor(Color.parseColor("#FFFFFF"));
+ mOrderServerStatus.setClickable(true);
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ String currentHM = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_HH_mm);
+ String currentDay = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
+ String strHtml11 = "已于
"
+ + "" + currentHM + ""
+ + "" + " " + "到达乘客上车地点";
+ mArrivedStartTimeTv32.setLineHeight(60);
+ mArrivedStartTimeTv32.setText(Html.fromHtml(strHtml11));
+// String strHtml12 = "送乘客至
"
+// + "" + order.endSiteAddr + "";
+ mArrivedStationTitleTv32.setText("送乘客至");
+ mStationTv32.setText(order.endSiteAddr);
+ currentCale.add(Calendar.MINUTE, 10);
+ String strHtml13 = "";
+ if (currentDay.equals(OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd))) {
+ strHtml13 = "免费等待至 "
+ + "" + OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_HH_mm) + "";
+
+ } else {
+ strHtml13 = "免费等待至"
+ + "" + OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_MM_dd_HH_mm) + "";
+ }
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml13));
+ } else if (MogoOCHTaxiModelNew.getInstance().checkCurrentOCHOrder()) {
+ Logger.d(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);
+ mOrderStatus.setText(R.string.module_och_taxi_new_order);
+ mOrderServerStatus.setText(R.string.module_och_taxi_order_server_start);
+ mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF"));
+ GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
+ background.setColor(Color.parseColor("#4D1D5EF3"));
+ mOrderServerStatus.setClickable(false);
+ mGoAheadStationTitleTv31.setText("前往");
+ mCatchStationTitleTv31.setText("接乘客");
+// String strHtml0 = "前往
"
+// + "" + order.startSiteAddr + "
"
+// + "接乘客";
+ mStationTv31.setText(order.startSiteAddr);
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ Calendar startCale = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
+ String currentDay = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
+ String startDay = OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
+ String strHtml1 = "";
+ if (currentDay.equals(startDay)) {
+ strHtml1 = "乘客将于
"
+ + "" + OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_HH_mm) + ""
+ + " 用车";
+ } else {
+ strHtml1 = "乘客将于
"
+ + "" + OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_MM_dd_HH_mm) + ""
+ + " 用车";
+ }
+ mOrderOtherContent3.setText(Html.fromHtml(strHtml1));
+// String strHtml2 = "距离 " + "- -" + " 公里,"
+// + "用时 " + "- -" + " 分钟";
+// mDistanceAndTime.setText(Html.fromHtml(strHtml2));
+ mOrderStartStationLat = order.startSiteGcjPoint.get(1);
+ mOrderStartStationLng = order.startSiteGcjPoint.get(0);
+ }
+ }
+
+ private void startNaviToStartStation(boolean isShow, double orderStartStationLat, double orderStartStationLng) {
+ NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ Log.d(TAG, "currentLatLng=" + mTaxiFragment.mCurLatitude + " " + mTaxiFragment.mCurLongitude);
+ NaviLatLng startNaviLatLng = new NaviLatLng(mTaxiFragment.mCurLatitude, mTaxiFragment.mCurLongitude);
+ NaviLatLng endNaviLatLng = new NaviLatLng(orderStartStationLat, orderStartStationLng);
+ NaviToDestinationModel.getInstance(getContext()).initAMapNavi(startNaviLatLng, endNaviLatLng);
+ NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(isShow);
+ NaviToDestinationModel.getInstance(getContext()).setOCHTaciNaviChangedCallback(this);
+ }
+
+ private void showOrHideNavi(boolean isShow) {
+ if (!isShow) {
+ mNaviIcon.setVisibility(View.GONE);
+ NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ mTaxiFragment.showNaviToStartStationFragment(false);
+ }
+ }
+
+ public void updateDistanceAndTime(long meters, long timeInSecond) {
+// Log.d(TAG,"meters = "+meters);
+ if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) {
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dis = fnum.format((float) meters / 1000);
+ String strHtml2 = "里程 " + "" + dis + "" + " 公里"
+ + ",剩余 " + "" + (int) timeInSecond / 60 + "" + " 分钟";
+ mDistanceAndTime3.setText(Html.fromHtml(strHtml2));
+ mNaviIcon.setVisibility(View.VISIBLE);
+ } else if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) {
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dis = fnum.format((float) meters / 1000);
+ String strHtml2 = "距离 " + "" + dis + "" + " 公里";
+// + ",用时 " + ""+(int)timeInSecond/60+"" + " 分钟";
+ mDistanceAndTime2.setText(Html.fromHtml(strHtml2));
+ }
+ }
+
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
+ Log.d(TAG, "meters = " + routeInfo.durationToEnd);
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dis = fnum.format((float) routeInfo.distanceToEnd / 1000);
+ String strHtml2 = "距离 " + "" + dis + "" + " 公里"
+ + ",用时 " + "" + (int) routeInfo.durationToEnd / 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));
+ }
+ }
+
+ public synchronized void SpeakNoticeOnce() {
+ if (!isSpeakedEndingNotice) {
+ isSpeakedEndingNotice = true;
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1));
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
+ }
+
+ private void startOrEndService(String step) {
+ if (step.equals("服务完成")) {//点击了完成服务,结束订单并更新订单信息
+// isHaveBeingOrder(false);
+ mTaxiFragment.completeOrderService(OrderStatusEnum.JourneyCompleted);
+ showNotice("车辆已停稳,请携带好随身物品,下车请注意安全");
+ return;
+ } else if (step.equals("开始服务")) {//点击服务,开启自动驾驶
+ mTaxiFragment.startAutoPilot();
+ showNotice("自动驾驶已启动,请系好安全带");
+ }
+ }
+
+ public void onOrderStatusChanged(OrderQueryRespBean.Result order) {
+ int status = order.orderStatus;
+ Log.d(TAG, "status==" + status);
+ mActivity.runOnUiThread(() -> {
+ if (status == OrderStatusEnum.None.getCode() || status == OrderStatusEnum.Cancel.getCode() || status == OrderStatusEnum.JourneyCompleted.getCode()) {
+ isSpeakedEndingNotice = false;
+ isHaveBeingOrder(false);
+ } else {
+ isHaveBeingOrder(true);
+ }
+ if (status != saveOrderState) {
+ OrderStatusEnum ochStatus = OrderStatusEnum.valueOf(status);
+ switch (ochStatus) {
+ case OnTheWayToStartStation:
+ showNotice(mActivity.getString(R.string.module_och_taxi_new_order));
+ startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng);
+ showOrHideNavi(true);
+ setOrRemoveMapMaker(true, OCHTaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.drawable.icon_station_start_end);
+ setOrRemoveMapMaker(true,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.drawable.icon_station_start_end);
+ break;
+ case Cancel:
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel));
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(false, OCHTaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.drawable.icon_station_start_end);
+ setOrRemoveMapMaker(false,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.drawable.icon_station_start_end);
+ break;
+ case ArriveAtStartStation:
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text));
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(true, OCHTaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.drawable.icon_station_start_end);
+ setOrRemoveMapMaker(true,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.drawable.icon_station_start_end);
+ break;
+ case OnTheWayToEndStation:
+// showNotice("欢迎使用蘑菇智行");
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(false, OCHTaxiConst.TAXI_START_MAP_MAKER,order.startSitePoint,R.drawable.icon_station_start_end);
+ setOrRemoveMapMaker(true,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.drawable.icon_station_start_end);
+ break;
+ case ArriveAtEndStation:
+ showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1));
+ showOrHideNavi(false);
+ setOrRemoveMapMaker(false,OCHTaxiConst.TAXI_END_MAP_MAKER,order.endSitePoint,R.drawable.icon_station_start_end);
+ break;
+ case JourneyCompleted:
+ showNotice("感谢您使用蘑菇智行,再见~");
+ showOrHideNavi(false);
+ break;
+ }
+ }
+ saveOrderState = status;
+ });
+ }
+
+ /**
+ * 是否有正在进行的订单,进行UI显示
+ *
+ * @param being
+ */
+ public void isHaveBeingOrder(boolean being) {
+ Log.d(TAG, "isHaveBeingOrder = " + being);
+ if (being) {
+ mNoDataView.setVisibility(View.GONE);
+ mBeingOrderLayout.setVisibility(View.VISIBLE);
+ mTaxiFragment.changeOperationViewVisible(View.GONE);
+ } else {
+ mNoDataView.setVisibility(View.VISIBLE);
+ mNoDatasTv.setText("暂无进行中订单");
+ mBeingOrderLayout.setVisibility(View.GONE);
+ mTaxiFragment.changeOperationViewVisible(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.module_och_taxi_order_server_status_tv) {
+ switch (mOrderServerStatus.getText().toString().trim()) {
+ case "开始服务":
+ case "服务完成":
+ Log.d(TAG, mOrderServerStatus.getText().toString());
+ startOrEndService(mOrderServerStatus.getText().toString().trim());
+ break;
+ }
+ } else if (v.getId() == R.id.module_och_taxi_order_cancel_iv) {
+ new OCHTaxiOrderCancelDialog(mTaxiFragment, mActivity, mOrderId, saveOrderState).show();
+ } else if (v.getId() == R.id.module_och_taxi_navi_iv) {
+ // TODO: 2021/11/30 打开去往乘客上车点的导航页面
+ if (mTaxiFragment != null) {
+ showNaviToStartStationFragment(true);
+ }
+ }
+ }
+
+ /**
+ * 显示/隐藏 前往乘客上车点的导航
+ *
+ * @param isShow
+ */
+ private void showNaviToStartStationFragment(boolean isShow) {
+ mTaxiFragment.showNaviToStartStationFragment(isShow);
+ startNaviToStartStation(isShow, mOrderStartStationLat, mOrderStartStationLng);
+ }
+
+
+ public void onCurrentOrderCancelDone() {
+ //提交取消订单后的回调
+ TipToast.tip("订单取消成功");
+ //更新界面
+ isHaveBeingOrder(false);
+ showOrHideNavi(false);
+ }
+
+ /**
+ * 订单流转debug START
+ */
+ private void initOrderTestBar(View view) {
+ mOrderStatus.setOnLongClickListener(v -> {
+ mTaxiFragment.clickTestBar();
+ return false;
+ });
+ }
+
+ public void showNotice(String notice) {
+ mActivity.runOnUiThread(() -> {
+ AIAssist.getInstance(getContext()).speakTTSVoice(notice);
+ });
+ }
+
+ @Override
+ public void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond) {
+ updateDistanceAndTime(meters, timeInSecond);
+ }
+
+ @Override
+ public void reInitNaviAmap(boolean isPlay, boolean isRestart) {
+ Log.d(TAG, "isPlay = " + isPlay + ", isRestart=" + isRestart);
+ if (!isRestart) {
+ mTaxiFragment.showNaviToStartStationFragment(false);
+ return;
+ }
+ mTaxiFragment.showNaviToStartStationFragment(false);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (saveOrderState == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng);
+ }
+ }
+ }, 2000);
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (saveOrderState == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
+ if (mNaviIcon.getVisibility() == View.GONE) {
+ mNaviIcon.setVisibility(View.VISIBLE);
+ }
+ }
+
+ }
+ }, 3000);
+ }
+
+ /**
+ * 绘制地图起点终点
+ * @param isAdd
+ * @param uuid
+ * @param station
+ * @param iconId
+ */
+ private void setOrRemoveMapMaker(boolean isAdd, String uuid, List station, int iconId){
+ if (isAdd){
+ Log.d("setMapMaker= ",uuid+"=latitude="+station.get(1)+",longitude="+station.get(0));
+ MogoMarkerOptions options = new MogoMarkerOptions();
+ options.anchorColor("#000000");//不设置报错,暂时随便设置个
+ options.setGps(true);//使用wgs 必须设置true
+ options.scale(0.15f);
+ Bitmap bitmap = BitmapFactory.decodeResource(mActivity.getResources(), iconId, null);
+ options.icon(bitmap);
+ options.latitude(station.get(1));
+ options.longitude(station.get(0));
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).addMarker(uuid, options);
+ }else {
+ Log.d("RemoveMapMaker=",uuid+"=latitude="+station.get(1)+",longitude="+station.get(0));
+ MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(uuid);
+ }
+ }
+ /**
+ * END
+ */
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java
new file mode 100644
index 0000000000..7746b2e407
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiFragment.java
@@ -0,0 +1,333 @@
+package com.mogo.och.taxi.ui;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.constant.OrderStatusEnum;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean;
+import com.mogo.och.taxi.model.MogoOCHTaxiModelNew;
+import com.mogo.och.taxi.presenter.OCHTaxiPresenter;
+import com.mogo.och.taxi.utils.PinYinUtil;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 网约车-出租车UI
+ */
+public class OCHTaxiFragment extends BaseOchTaxiTabFragment implements OCHTaxiView{
+
+ public static final String TAG = "OCHTaxiFragment";
+
+ public static OCHTaxiFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHTaxiFragment fragment = new OCHTaxiFragment();
+ fragment.setArguments( args );
+ return fragment;
+ }
+ private OCHTaxiGrabOrderFragment grabOrderFragment;
+ private OCHTaxiServerOrdersFragment serverOrdersFragment;
+ private WeakReference personalDialogFragment = null;
+ protected double mCurLatitude = 0.0;
+ protected double mCurLongitude = 0.0;
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.taxi_panel;
+ }
+
+ @Override
+ public void restartAutopilot() {
+ // 在自动驾驶中,才会有重新开启自动驾驶的操作
+ if (mPresenter.getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
+ Logger.d( TAG, "restartAutopilot" );
+ mPresenter.startAutoPilot();
+ startOrStopLoadingAnim(true);
+ }
+ }
+
+ @Override
+ public String getTagName() {
+ return "OCHTaxiFragment";
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ protected void initViews() {
+ super.initViews();
+ mPersonalBtn.setVisibility(View.GONE);
+ initFragment();
+ hidPanel();
+ if ( MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .isVrMode() ) {
+ switchVRFlatMode(true);
+ } else {
+ switchVRFlatMode(false);
+ }
+
+ tvOperationStatus.setVisibility(View.VISIBLE);
+
+ if (DebugConfig.isDebug()) {
+ initOrderTestBar();
+ }
+
+ }
+
+ private void initFragment() {
+ serverOrdersFragment = OCHTaxiServerOrdersFragment.newInstance();
+ grabOrderFragment = OCHTaxiGrabOrderFragment.newInstance();
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ //默认显示OCHTaxiServerOrdersFragment
+ transaction.add(R.id.fragment_container,serverOrdersFragment).show(serverOrdersFragment);
+ transaction.add(R.id.fragment_container,grabOrderFragment).hide(grabOrderFragment);
+ transaction.commitAllowingStateLoss();
+ }
+
+ private void showGrabFragmentAndUpdate() {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (grabOrderFragment == null){
+ grabOrderFragment = OCHTaxiGrabOrderFragment.newInstance();
+ transaction.add(R.id.fragment_container,grabOrderFragment).show(grabOrderFragment).commitAllowingStateLoss();
+ }else {
+ transaction.show(grabOrderFragment).hide(serverOrdersFragment).commitAllowingStateLoss();
+ }
+ }
+
+ public void showServerFragmentAndUpdate() {
+ FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
+ if (serverOrdersFragment == null){
+ serverOrdersFragment = OCHTaxiServerOrdersFragment.newInstance();
+ transaction.add(R.id.fragment_container,serverOrdersFragment).show(serverOrdersFragment);
+ }else {
+ transaction.show(serverOrdersFragment).hide(grabOrderFragment).commitAllowingStateLoss();
+ }
+ }
+
+ @NonNull
+ @Override
+ protected OCHTaxiPresenter createPresenter() {
+ return new OCHTaxiPresenter( 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();
+ }
+
+ public void updateOperationStatus(boolean inOperation) {
+ Logger.e(TAG,"onOperationChanged:"+ inOperation);
+ isOperationStatus = inOperation;
+ if ( inOperation ) {
+ tvOperationStatus.setText( "收车" );
+ mPersonalBtn.setVisibility(View.VISIBLE);
+ tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.taxi_back_btn),null,null,null);
+ showPanel();
+ } else {
+// AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
+ tvOperationStatus.setText("出车");
+ tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.taxi_out_btn),null,null,null);
+ mPersonalBtn.setVisibility(View.GONE);
+ hidPanel();
+ }
+ }
+
+ @Override
+ protected void onGoToTaxiOrders() {
+ personalDialogFragment = new WeakReference<>(new OCHTaxiPersonalDialogFragment(this));
+ personalDialogFragment.get().show(getActivity().getSupportFragmentManager(),"service_data");
+ }
+
+ public void routeResult(List routeList) {
+ if (routeList == null ) return;
+// double distance = calculateTravelDistance(mogoLocation,routeList);
+// if ( MogoOCHTaxiModel.getInstance().checkCurrentOCHOrder() ) {
+// MogoOCHTaxiModel.getInstance().getCurrentOCHOrder().decreaseTravelDistance( distance );
+// updateOrderBaseStatusInfo();
+// }
+// Logger.d("lianglihui","routeResult 剩余导航距离:"+distance);
+// if (routeList != null && routeList.size() >0){
+// Logger.d("lianglihui","routeResult:"+routeList.size());
+// //adas回调导航路径 绘制引导线
+// if ( ochTaxiOverlayManager == null){
+// ochTaxiOverlayManager = new OCHTaxiOverlayManager(this.getContext());
+// }
+// ochTaxiOverlayManager.draw(mogoLocation,routeList);
+// }
+ }
+ @Override
+ public void onMapLoaded() {
+ }
+
+ public void updateAutopilotStatus(int status) {
+ onAutopilotStatusChanged(status);
+ }
+ /**
+ * 收到自动驾驶通知的成功状态之后,设置本地状态及服务端状态
+ */
+ private void resetOCHTaxiOrderAutopilotStatus() {
+ mPresenter.updateCurOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
+ }
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order){
+ if (serverOrdersFragment != null){
+ serverOrdersFragment.updateCurrentOrderStatusChanged(order);
+ }
+ }
+ public void startAutoPilot(){
+ mPresenter.startAutoPilot();
+ startOrStopLoadingAnim(true);
+ }
+ public void completeOrderService(OrderStatusEnum status){
+ mPresenter.updateCurOrderStatus(status);
+ }
+ public void cancelCurOrder(int reasonType, String reaso){
+ mPresenter.cancelCurOrder(reasonType,reaso);
+ }
+
+ public void cancelOrderById(long orderId, int reasonType, String reason){
+ mPresenter.cancelOrderById(orderId,reasonType,reason);
+ }
+ public void onCurrentOrderCancelDone(){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onCurrentOrderCancelDone();
+ }
+ public void onOrderCancelDone(long orderId){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onOrderCancelDone(orderId);
+ }
+ public void onNewBookingOrderGot(OrderQueryRespBean.Result order){
+ if (null == order) return;
+ showGrabFragmentAndUpdate();
+ grabOrderFragment.updateGrabOrder(order);
+ }
+ public void grabOrder(){
+ mPresenter.grabOrder();
+ }
+ public void cancelNewBookingOrder(){
+ mPresenter.cancelNewBookingOrder();
+ showServerFragmentAndUpdate();
+ }
+ public void onGrabOrderExecuteDone(){
+ if (null == grabOrderFragment) return;
+ grabOrderFragment.onGrabOrderExecuteDone();
+ }
+ public void onGrabOrderSuccess(OrderQueryRespBean.Result order){
+ if (null == grabOrderFragment) return;
+ if (null == order){
+ showServerFragmentAndUpdate();
+ return;
+ }
+ showGrabFragmentAndUpdate();
+ grabOrderFragment.onGrabOrderSuccess();
+ }
+ public void onGrabOrderFailed(OrderQueryRespBean.Result order){
+ if (order == null){
+ showServerFragmentAndUpdate();
+ return;
+ }
+ if (null == grabOrderFragment) return;
+ showGrabFragmentAndUpdate();
+ grabOrderFragment.onGrabOrderFailed();
+ }
+ public void onOrdersWaitServiceChanged(List waitServiceList){
+ if (null == waitServiceList) return;
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onOrdersWaitServiceChanged(waitServiceList);
+ }
+ public void queryOrdersList(int page, int size){
+ mPresenter.queryOrdersList(page,size);
+ }
+ public void onOrdersListPageRefresh(List ordersList){
+ if (null == personalDialogFragment) personalDialogFragment = new WeakReference<>(new OCHTaxiPersonalDialogFragment(this));
+ personalDialogFragment.get().onOrdersListPageRefresh(ordersList);
+ }
+ public void queryDriverServiceData(){
+ mPresenter.queryDriverServiceData();
+ }
+ public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum){
+ if (null == personalDialogFragment) return;
+ personalDialogFragment.get().onServiceDataUpdate(dailyTimeDuration,dailyOrderNum);
+ }
+ public void queryCurOrderRouteInfo(){
+ mPresenter.queryCurOrderRouteInfo();
+ }
+ public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onCurrentOrderRouteInfoGot(routeInfo);
+ }
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond){
+// if (null == serverOrdersFragment) return;
+// serverOrdersFragment.onCurrentOrderDistToStartChanged(meters,timeInSecond);
+ }
+ public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond){
+ if (null == serverOrdersFragment) return;
+ serverOrdersFragment.onCurrentOrderDistToEndChanged(meters,timeInSecond);
+ }
+ public void updateLocation(double latitude,double longitude){
+ this.mCurLatitude = latitude;
+ this.mCurLongitude = longitude;
+ }
+ /**
+ * 订单流转debug START
+ */
+ public void initOrderTestBar() {
+ findViewById(R.id.test_bar_to_start).setOnClickListener(v -> {
+ MogoOCHTaxiModelNew.getInstance().setArriveAtStartStation();
+ });
+ findViewById(R.id.test_bar_to_end).setOnClickListener(v -> {
+ MogoOCHTaxiModelNew.getInstance().setArriveAtEndStation();
+ });
+ findViewById(R.id.test_bar_on_the_way_to_end).setOnClickListener(v ->{
+ showNotice("自动驾驶已启动,请系好安全带");
+ MogoOCHTaxiModelNew.getInstance().setOnTheWayToEndStation();
+ });
+ }
+ public void clickTestBar(){
+ View testBar = findViewById(R.id.module_och_taxi_order_status_change_test_bar);
+ if (testBar.getVisibility() == View.VISIBLE) {
+ testBar.setVisibility(View.GONE);
+ } else {
+ TextView testCurOrderId = findViewById(R.id.test_bar_current_order_id);
+ TextView testCurStartName = findViewById(R.id.test_bar_current_start_name);
+ TextView testCurEndName = findViewById(R.id.test_bar_current_end_name);
+ OrderQueryRespBean.Result order = MogoOCHTaxiModelNew.getInstance().getCurrentOCHOrder();
+
+ testCurOrderId.setText(order == null ? "" : String.valueOf(order.orderId));
+ testCurStartName.setText(order == null ? "" : PinYinUtil.getPinYinHeadChar(order.startSiteAddr));
+ testCurEndName.setText(order == null ? "" : PinYinUtil.getPinYinHeadChar(order.endSiteAddr));
+
+ testBar.setVisibility(View.VISIBLE);
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiGrabOrderFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiGrabOrderFragment.java
new file mode 100644
index 0000000000..f23cf81700
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiGrabOrderFragment.java
@@ -0,0 +1,193 @@
+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.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.utils.OchTaxiUtils;
+
+import java.util.Calendar;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/9
+ */
+public class OCHTaxiGrabOrderFragment 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 OCHTaxiGrabOrderFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHTaxiGrabOrderFragment fragment = new OCHTaxiGrabOrderFragment();
+ 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();
+ }
+ getOchTaxiFragment().cancelNewBookingOrder();
+ }else if (v.getId() == R.id.grab_order_tv){
+ if (!mOrderGrabBt.getText().toString().equals("抢单中...")){
+ getOchTaxiFragment().grabOrder();
+ return;
+ }
+ }
+ }
+ private OCHTaxiFragment getOchTaxiFragment(){
+ return (OCHTaxiFragment)getParentFragment();
+ }
+ public void updateGrabOrder(OrderQueryRespBean.Result order){
+ mGrabResultAnimView.setVisibility(View.GONE);
+ Calendar calendar = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
+ if (OchTaxiUtils.compareDateIsCurrentDay(calendar)){
+ mOrderReserverTime.setText("用车时间:今天 "+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
+ getOchTaxiFragment().showNotice("预约单,今天"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm)+"从"
+ +order.startSiteAddr+"到"+order.endSiteAddr);
+ }else {
+ mOrderReserverTime.setText("用车时间:"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd_HH_mm));
+ getOchTaxiFragment().showNotice("预约单,"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_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.taxi_driver_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.setTextSize(21);
+ 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 和 动画 语音
+ getOchTaxiFragment().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 和 动画 语音
+ getOchTaxiFragment().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/src/main/java/com/mogo/och/taxi/ui/OCHTaxiOperationDatasFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiOperationDatasFragment.java
new file mode 100644
index 0000000000..e341a55dd7
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiOperationDatasFragment.java
@@ -0,0 +1,130 @@
+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.taxi.R;
+import com.mogo.och.taxi.utils.OchTaxiUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/10
+ */
+public class OCHTaxiOperationDatasFragment 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 OCHTaxiOperationDatasFragment newInstance(Context context, int type) {
+ mContext = context;
+ mType = type;
+ Bundle args = new Bundle();
+ OCHTaxiOperationDatasFragment fragment = new OCHTaxiOperationDatasFragment();
+ 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);
+ }
+
+ 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);
+ 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(OchTaxiUtils.secondsToHourStr(datas.get(position))) ? "0": OchTaxiUtils.secondsToHourStr(datas.get(position));
+ String minuteData = OchTaxiUtils.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/src/main/java/com/mogo/och/taxi/ui/OCHTaxiOrderCancelDialog.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiOrderCancelDialog.java
new file mode 100644
index 0000000000..84cea96779
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiOrderCancelDialog.java
@@ -0,0 +1,210 @@
+package com.mogo.och.taxi.ui;
+
+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.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+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.toast.TipToast;
+import com.mogo.och.taxi.constant.OrderStatusEnum;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.constant.OrderCancelReasons;
+
+import java.lang.ref.WeakReference;
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/18
+ */
+public class OCHTaxiOrderCancelDialog 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 long mOrderId;
+
+ protected OCHTaxiOrderCancelDialog(OCHTaxiFragment fragment, Context context, long orderId, int orderStatus) {
+ super(context,R.style.OrderCancelDialog);
+ mOrderId = orderId;
+ mOchTaxiFragmentWeak = new WeakReference<>(fragment);
+ this.mOrderStatus = orderStatus;
+ contextWeakReference = new WeakReference<>(context);
+ initReasonArray();
+ }
+
+ private void initReasonArray() {
+ if (1 == mOrderStatus) {
+ mContentArrays = new String[]{OrderCancelReasons.BookPassengerCancel.getMsg(), OrderCancelReasons.CarBroken.getMsg(),
+ OrderCancelReasons.BookJourneyConflict.getMsg(), OrderCancelReasons.BatteryLow.getMsg(),
+ OrderCancelReasons.BookOther.getMsg()};
+ return;
+ }
+ OrderStatusEnum ochStatus = OrderStatusEnum.valueOf(mOrderStatus);
+ switch (ochStatus) {
+ case OnTheWayToStartStation:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg()};
+ break;
+ case ArriveAtStartStation:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(),
+ OrderCancelReasons.PassengerNotArrive.getMsg()};
+ break;
+ case OnTheWayToEndStation:
+ case ArriveAtEndStation:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(), OrderCancelReasons.PassengerStopOver.getMsg()};
+ break;
+ default:
+ mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
+ OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(),
+ OrderCancelReasons.PassengerNotArrive.getMsg(), OrderCancelReasons.PassengerStopOver.getMsg()};
+ break;
+
+ }
+ }
+
+ protected OCHTaxiOrderCancelDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
+ super(context, cancelable, cancelListener);
+ }
+
+ protected OCHTaxiOrderCancelDialog(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);
+
+ Window window = getWindow();
+ //dialog padding 去掉
+ window.getDecorView().setPadding(0,0,0,0);
+ window.setDimAmount(0.5f);
+ window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));//设置背景, 不然显示不全
+ }
+
+ @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) && OrderCancelReasons.getType(mCurrentReason) != 0) {
+ if (1 == mOrderStatus){//预约单
+ mOchTaxiFragmentWeak.get().cancelOrderById(mOrderId,OrderCancelReasons.getType(mCurrentReason),mCurrentReason);
+ }else {//即时单
+ mOchTaxiFragmentWeak.get().cancelCurOrder(OrderCancelReasons.getType(mCurrentReason),mCurrentReason);
+ }
+ dismiss();
+ }else {
+ TipToast.longTip("取消原因不能为空");
+ }
+ }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) {
+ Log.d(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.taxi_selected_btn),null,null,null);
+ }else {
+ viewHolder.checkBoxTv.setCompoundDrawablesWithIntrinsicBounds(context.getResources().getDrawable(R.drawable.taxi_unselect_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/src/main/java/com/mogo/och/taxi/ui/OCHTaxiPersonalDialogFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiPersonalDialogFragment.java
new file mode 100644
index 0000000000..3a4791beaf
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiPersonalDialogFragment.java
@@ -0,0 +1,509 @@
+package com.mogo.och.taxi.ui;
+
+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.Log;
+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.DialogFragment;
+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.debug.DebugConfig;
+import com.mogo.och.taxi.constant.OrderStatusEnum;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.constant.OrderTypeEnum;
+import com.mogo.och.taxi.utils.OchTaxiUtils;
+
+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/8/18
+ */
+public class OCHTaxiPersonalDialogFragment extends DialogFragment 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 = 0;
+ private int mPerPageSize = 10;
+ private static OCHTaxiFragment mTaxiFragment;
+ private static boolean serverHadNoData = false;
+
+ public OCHTaxiPersonalDialogFragment(){
+ }
+
+ public OCHTaxiPersonalDialogFragment(OCHTaxiFragment taxiFragment){
+ mTaxiFragment = taxiFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.taxi_orders_list_view, container, false);
+ initView(view);
+ return view;
+ }
+
+ @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;
+ Log.d(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(View view) {
+ initOperationTabDatas(view);
+ mCloseIv = view.findViewById(R.id.module_och_taxi_order_list_close_iv);
+ mOperationDataRl = view.findViewById(R.id.module_och_taxi_operation_data_rl);
+ mShowOrdersBt = view.findViewById(R.id.module_och_taxi_order_list_show_bt);
+ mOrdersRv = view.findViewById(R.id.module_och_taxi_order_list);
+
+ mNoDatas = view.findViewById(R.id.no_order_data_view);
+ ImageView imageView = view.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(View view) {
+ mOperationTab = view.findViewById(R.id.operation_data_tablayout);
+ mOperationViewPager = view.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(OCHTaxiOperationDatasFragment.newInstance(getActivity(),0));
+ }else if (1 == i){
+ mOperationTab.addTab(tab);
+ changeOperationTabLayoutTabUI(tab,false);
+ fragments.add(OCHTaxiOperationDatasFragment.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);
+
+ if (mTaxiFragment == null){
+ dismiss();
+ }else {
+ mTaxiFragment.queryDriverServiceData();
+ }
+ }
+
+ 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(23);
+ Log.d(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(20);
+ Log.d(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();
+ requestOrdersList(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){
+ requestOrdersList(mNextPage, mPerPageSize);
+ }
+ }
+ });
+ mOrdersRv.setAdapter(mAdapter);
+ }
+
+ private void requestOrdersList(int page, int size){
+ mTaxiFragment.queryOrdersList(page,size);
+ }
+
+ public void onOrdersListPageRefresh(List ordersList){
+ if (null == ordersList && mNextPage == 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);
+ mAdapter.notifyDataSetChanged();
+ mNextPage = mNextPage +1;
+ }
+
+ 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(OchTaxiUtils.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 = OchTaxiUtils.getYMDTime(orders.get(position).createTime);//获取当前订单时间
+ int prevIndex = position - 1;
+ String preDate = OchTaxiUtils.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 = OchTaxiUtils.getYMDTime(orders.get(position).createTime);//获取当前订单时间
+ int nextIndex = position + 1;
+ String preDate = OchTaxiUtils.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(OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_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.orderId));
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+ private String getOrderStatus(int status, Button button){
+ OrderStatusEnum orderStatus = OrderStatusEnum.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 == OrderTypeEnum.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);
+ if (DebugConfig.isDebug()){
+ // TODO: 2021/11/23 因当前上线版本均打开了debug,所以此处隐藏orderId
+ orderNumTv.setVisibility(View.GONE);
+ }else {
+ orderNumTv.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ 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();
+ Log.d(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/src/main/java/com/mogo/och/taxi/ui/OCHTaxiRadiuImageView.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiRadiuImageView.java
new file mode 100644
index 0000000000..1b562e89f4
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiRadiuImageView.java
@@ -0,0 +1,110 @@
+package com.mogo.och.taxi.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Path;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.appcompat.widget.AppCompatImageView;
+
+import com.mogo.och.taxi.R;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/9/29
+ */
+public class OCHTaxiRadiuImageView extends AppCompatImageView {
+ private float width, height;
+ private int defaultRadius = 0;
+ private int radius;
+ private int leftTopRadius;
+ private int rightTopRadius;
+ private int rightBottomRadius;
+ private int leftBottomRadius;
+
+
+ public OCHTaxiRadiuImageView(Context context) {
+ this(context, null);
+ init(context, null);
+ }
+
+ public OCHTaxiRadiuImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ init(context, attrs);
+ }
+
+ public OCHTaxiRadiuImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs);
+ }
+
+ private void init(Context context, AttributeSet attrs) {
+ if (Build.VERSION.SDK_INT < 18) {
+ setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+ }
+ // 读取配置
+ TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RoundCornerImageView);
+ radius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_radius, defaultRadius);
+ leftTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_left_top_radius, defaultRadius);
+ rightTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_right_top_radius, defaultRadius);
+ rightBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_right_bottom_radius, defaultRadius);
+ leftBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_left_bottom_radius, defaultRadius);
+
+
+ if (defaultRadius == leftTopRadius) {
+ leftTopRadius = radius;
+ }
+ if (defaultRadius == rightTopRadius) {
+ rightTopRadius = radius;
+ }
+ if (defaultRadius == rightBottomRadius) {
+ rightBottomRadius = radius;
+ }
+ if (defaultRadius == leftBottomRadius) {
+ leftBottomRadius = radius;
+ }
+ array.recycle();
+ }
+
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ width = getWidth();
+ height = getHeight();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ //这里做下判断,只有图片的宽高大于设置的圆角距离的时候才进行裁剪
+ int maxLeft = Math.max(leftTopRadius, leftBottomRadius);
+ int maxRight = Math.max(rightTopRadius, rightBottomRadius);
+ int minWidth = maxLeft + maxRight;
+ int maxTop = Math.max(leftTopRadius, rightTopRadius);
+ int maxBottom = Math.max(leftBottomRadius, rightBottomRadius);
+ int minHeight = maxTop + maxBottom;
+ if (width >= minWidth && height > minHeight) {
+ Path path = new Path();
+ //右上,右下,左下,左上
+ path.moveTo(leftTopRadius, 0);
+ path.lineTo(width - rightTopRadius, 0);
+ path.quadTo(width, 0, width, rightTopRadius);
+
+ path.lineTo(width, height - rightBottomRadius);
+ path.quadTo(width, height, width - rightBottomRadius, height);
+
+ path.lineTo(leftBottomRadius, height);
+ path.quadTo(0, height, 0, height - leftBottomRadius);
+
+ path.lineTo(0, leftTopRadius);
+ path.quadTo(0, 0, leftTopRadius, 0);
+
+ canvas.clipPath(path);
+ }
+ super.onDraw(canvas);
+ }
+
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiReserveOrdersFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiReserveOrdersFragment.java
new file mode 100644
index 0000000000..b402ae1a17
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiReserveOrdersFragment.java
@@ -0,0 +1,183 @@
+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.mogo.toast.TipToast;
+import com.mogo.och.taxi.R;
+import com.mogo.och.taxi.bean.OrderQueryRespBean;
+import com.mogo.och.taxi.utils.OchTaxiUtils;
+
+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 OCHTaxiReserveOrdersFragment extends BaseTaxiUIFragment {
+
+ private RecyclerView mRecyclerView;
+ private TextView mNodataTv;
+ private ConstraintLayout mNoDataView;
+ private View mBootRefreshNoDataView;
+ private List mDatas = new ArrayList<>();
+ private ToBeServedOrdersAdapter mAdapter;
+ private static OCHTaxiFragment mTaxiFragment;
+ private static Activity mActivity;
+ private boolean isUpwardSliding = false;
+
+ public static OCHTaxiReserveOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment){
+ mActivity = activity;
+ mTaxiFragment = taxiFragment;
+ Bundle args = new Bundle();
+ OCHTaxiReserveOrdersFragment fragment = new OCHTaxiReserveOrdersFragment();
+ 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 = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
+ if (OchTaxiUtils.compareDateIsCurrentDay(calendar)){
+ viewHolder.orderTime.setText("用车时间:今天"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
+ }else {
+ viewHolder.orderTime.setText("用车时间:"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd_HH_mm));
+ }
+ viewHolder.orderCancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ new OCHTaxiOrderCancelDialog(mTaxiFragment,context,order.orderId,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(long orderId){
+ TipToast.tip("订单取消成功");
+ for (int i=0; i< mDatas.size();i++){
+ OrderQueryRespBean.Result result = mDatas.get(i);
+ if (orderId == result.orderId){
+ mDatas.remove(i);
+ mAdapter.notifyDataSetChanged();
+ break;
+ }
+ }
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiServerOrdersFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiServerOrdersFragment.java
new file mode 100644
index 0000000000..70440978b4
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiServerOrdersFragment.java
@@ -0,0 +1,214 @@
+package com.mogo.och.taxi.ui;
+
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+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.Logger;
+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;
+
+/**
+ * @author congtaowang
+ * @since 2021/1/18
+ *
+ * 网约车-出租车UI
+ */
+public class OCHTaxiServerOrdersFragment extends BaseTaxiUIFragment {
+
+ public static final String TAG = "OCHTaxiFragment";
+
+ public static OCHTaxiServerOrdersFragment newInstance() {
+
+ Bundle args = new Bundle();
+
+ OCHTaxiServerOrdersFragment fragment = new OCHTaxiServerOrdersFragment();
+ 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 OCHTaxiBeingServerdOrdersFragment beingServerdOrdersFragment = null;
+ private OCHTaxiReserveOrdersFragment 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"));
+ View tabView = View.inflate(getActivity(),R.layout.taxi_tab_item_custom,null);
+ TextView tv = tabView.findViewById(R.id.tab_title);
+ tv.setText(mTabTitles[i]);
+ tab.setCustomView(tabView);
+ if (0 == i){
+ mTaxiOrderTab.addTab(tab,true);
+ changeTabLayoutTabUI(tab,true);
+ beingServerdOrdersFragment = OCHTaxiBeingServerdOrdersFragment.newInstance(getActivity(),(OCHTaxiFragment) getParentFragment());
+ fragments.add(beingServerdOrdersFragment);
+ }else if (1 == i){
+ mTaxiOrderTab.addTab(tab);
+ changeTabLayoutTabUI(tab,false);
+ reserveOrdersFragment = OCHTaxiReserveOrdersFragment.newInstance(getActivity(),(OCHTaxiFragment) getParentFragment());
+ fragments.add(reserveOrdersFragment);
+ }
+
+ }
+ Log.d(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(20);
+ Log.d(TAG,"SelectTv = "+ textView.getText());
+ textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+ textView.setTextColor(Color.parseColor("#FFFFFF"));
+ }else {
+ textView.setBackground(null);
+ textView.setTextSize(18);
+ Log.d(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) {
+ Logger.d( TAG, "getItem="+position);
+ return fragments.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return fragments.size();
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getPageTitle(int position) {
+ Logger.d( 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(long orderId){
+ if (null == reserveOrdersFragment) return;
+ reserveOrdersFragment.onOrderCancelDone(orderId);
+ }
+ public void onCurrentOrderCancelDone(){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.onCurrentOrderCancelDone();
+ }
+ public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond){
+ if (null == beingServerdOrdersFragment) return;
+ beingServerdOrdersFragment.updateDistanceAndTime(meters,timeInSecond);
+ }
+ 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);
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiView.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiView.java
new file mode 100644
index 0000000000..ba9377c8fe
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/OCHTaxiView.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 OCHTaxiView extends IView {
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/DimenUtil.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/DimenUtil.kt
new file mode 100644
index 0000000000..0ef16d740a
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/utils/OchTaxiUtils.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OchTaxiUtils.java
new file mode 100644
index 0000000000..8c777d31e4
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OchTaxiUtils.java
@@ -0,0 +1,93 @@
+package com.mogo.och.taxi.utils;
+
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/8/20
+ */
+public class OchTaxiUtils {
+
+ public static final String TAXI_HH_mm = "HH:mm";
+ public static final String TAXI_MM_dd = "MM-dd";
+ public static final String TAXI_MM_dd_HH_mm = "MM-dd HH:mm";
+ public static final String TAXI_yyyy_MM_dd = "yyyy-MM-dd";
+ public static final String TAXI_yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
+
+ public static String formatCalendarToString(Calendar calendar, String format){
+ if (calendar == null) return "";
+ try {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.format(calendar.getTime());
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ public static boolean compareDateIsCurrentDay(Calendar targetCalendar){
+ Calendar currentCale = DateTimeUtils.getCurrentDateTime();
+ String currentDay = formatCalendarToString(currentCale,OchTaxiUtils.TAXI_yyyy_MM_dd);
+ if (currentDay.equals(formatCalendarToString(targetCalendar,OchTaxiUtils.TAXI_yyyy_MM_dd))){
+ return true;
+ }else {
+ return false;
+ }
+ }
+
+ public static Calendar formatLongToCalendar(long time){
+ Calendar calendar = null;
+ try {
+ calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return calendar;
+ }
+ public static String formatLongToString(long time, String format){
+ try {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.format(time);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+ public static String getYMDTime(long time){//格式为 2021.8.21
+ try {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(time);
+ int month = calendar.get(Calendar.MONTH) + 1;
+ return calendar.get(Calendar.YEAR)+"."+month+"."+ calendar.get(Calendar.DAY_OF_MONTH);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ *
+ * @param seconds 60
+ * @return 1 时
+ */
+ public static String secondsToHourStr(long seconds){//秒数转成相应的 小时分钟数
+ if (seconds >= 3600){
+ int hours = (int)seconds/3600;
+ return String.valueOf(hours);
+ }
+ return "";
+ }
+ /**
+ *
+ * @param seconds 60
+ * @return 1 时
+ */
+ public static String secondsToMinuteStr(long seconds){//秒数转成相应的 小时分钟数
+ int minute = (int)(seconds % 3600)/60;
+ return String.valueOf(minute);
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OrderUtil.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/OrderUtil.java
new file mode 100644
index 0000000000..4c61f04ebb
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/utils/PermissionUtil.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/PermissionUtil.java
new file mode 100644
index 0000000000..121533db99
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/java/com/mogo/och/taxi/utils/PinYinUtil.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/PinYinUtil.java
new file mode 100644
index 0000000000..42b5ed4af0
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/PinYinUtil.java
@@ -0,0 +1,31 @@
+package com.mogo.och.taxi.utils;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/11/26
+ */
+public class PinYinUtil {
+ /**
+ * 得到中文字符串首字母
+ * @param str 需要转化的中文字符串
+ * @return 大写首字母缩写的字符串
+ */
+ public static String getPinYinHeadChar(String str) {
+ str = str.replaceAll("[\\p{P}‘’“”|+=¥$<>^~~]", "");
+ StringBuilder convert = new StringBuilder();
+ for (int j = 0; j < str.length(); j++) {
+ char word = str.charAt(j);
+ String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
+ if (pinyinArray != null) {
+ convert.append(pinyinArray[0].charAt(0));
+ } else {
+ if (!"".equals(String.valueOf(word).trim())){
+ convert.append(word);
+ }
+ }
+ }
+ return convert.toString().trim().toUpperCase();
+ }
+}
diff --git a/OCH/mogo-och-taxi/src/main/res/color/taxi_autopilot_text_color_selector.xml b/OCH/mogo-och-taxi/src/main/res/color/taxi_autopilot_text_color_selector.xml
new file mode 100644
index 0000000000..16cef94271
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_bg_selector.xml b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_bg_selector.xml
new file mode 100644
index 0000000000..e01265811f
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_bg_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_status_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_status_bg.xml
new file mode 100644
index 0000000000..9350652b43
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_autopilot_status_bg.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_back_btn.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_back_btn.png
new file mode 100644
index 0000000000..35e13ff68c
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_back_btn.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_badcase_btn_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_badcase_btn_bg.png
new file mode 100644
index 0000000000..89a6eaa5dc
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_badcase_btn_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_base_icon_not_in_autopilot.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_close_navi_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_close_navi_icon.png
new file mode 100644
index 0000000000..56525e7ed2
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_close_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_dot_line.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot.png
new file mode 100644
index 0000000000..539e106058
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg.png
new file mode 100644
index 0000000000..ef5a5ea880
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg_pressed.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg_pressed.png
new file mode 100644
index 0000000000..39194f8e55
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_bg_pressed.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_disable.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_disable.png
new file mode 100644
index 0000000000..695515a366
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_disable.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_failed.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_failed.png
new file mode 100644
index 0000000000..3347b2bfc2
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_failed.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_loading.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_loading.png
new file mode 100644
index 0000000000..a71cf9a4f9
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_loading.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_success.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_success.png
new file mode 100644
index 0000000000..dd7dc2d6b2
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_ic_autopilot_success.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_masking.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_masking.png
new file mode 100644
index 0000000000..b33738106e
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_masking.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_arrow_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_arrow_icon.png
new file mode 100644
index 0000000000..a83b7c9e74
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_arrow_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_direction_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_direction_icon.png
new file mode 100755
index 0000000000..1b96799531
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_direction_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_icon.png
new file mode 100644
index 0000000000..bd4e6ccde4
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_line_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_line_icon.png
new file mode 100644
index 0000000000..7f758d5999
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_navi_line_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_out_btn.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_out_btn.png
new file mode 100644
index 0000000000..a3a771d686
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_out_btn.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_personal_btn.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_personal_btn.png
new file mode 100644
index 0000000000..0cb863cecb
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_personal_btn.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_setting_btn_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_setting_btn_bg.png
new file mode 100644
index 0000000000..a21f54cc53
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_bg.png
new file mode 100644
index 0000000000..62942a7a42
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_selector.xml b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_selector.xml
new file mode 100644
index 0000000000..aaf1d9add3
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_speed_selector.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_switch_map_bg.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_switch_map_bg.png
new file mode 100644
index 0000000000..f4ab3deb31
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1440/taxi_switch_map_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00001.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00001.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00002.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00002.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00003.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00003.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00004.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00004.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00005.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00005.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00006.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00006.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00007.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00007.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00008.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00008.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00009.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00009.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00010.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00010.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00011.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00011.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00012.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00012.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00013.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00013.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00014.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00014.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00015.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00015.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00016.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00016.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00017.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00017.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00018.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00018.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00019.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00019.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00020.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00020.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00021.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00021.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00022.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00022.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00023.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00023.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00024.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00024.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00025.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00025.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00026.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00026.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00027.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00027.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00028.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00028.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00029.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00029.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00030.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00030.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00031.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00031.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00032.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00032.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00033.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00033.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00034.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00034.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00035.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00035.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00036.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00036.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00037.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00037.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00038.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00038.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00039.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00039.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00040.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00040.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00041.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00041.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00042.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00042.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00043.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00043.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00044.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00044.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/heart_00045.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/heart_00045.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/img_taxi_operation_status_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/no_order_data.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/no_order_data.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00001.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00001.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00002.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00002.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00003.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00003.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00004.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00004.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00005.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00005.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00006.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00006.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00007.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00007.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00008.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00008.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00009.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00009.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00010.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00010.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00011.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00011.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00012.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00012.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00013.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00013.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00014.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00014.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00015.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00015.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00016.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00016.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00017.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00017.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00018.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00018.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00019.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00019.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00020.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00020.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00021.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00021.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00022.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00022.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00023.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00023.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00024.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00024.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00025.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00025.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00026.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00026.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00027.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00027.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00028.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00028.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00029.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00029.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00030.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00030.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00031.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00031.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00032.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00032.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00033.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00033.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00034.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00034.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00035.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00035.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00036.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00036.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00037.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00037.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00038.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00038.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00039.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00039.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00040.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00040.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00041.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00041.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00042.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00042.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00043.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00043.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00044.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00044.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/success_00045.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/success_00045.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_base_icon_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..21dc719ec9
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_base_notice_box_bg.9.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_base_slide_block.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_base_slide_block.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_close_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_dot_line.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_dot_line.png
new file mode 100644
index 0000000000..186001352c
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_dot_line.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_big.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_circle_blue_small.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_circle_green_big.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_circle_green_small.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_grab_order_bt.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_image_circle_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_operation_tab_line.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_driver_tab_item_bg.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_grab_dot_line.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_grad_order_close_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png
new file mode 100644
index 0000000000..be978145dc
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_autopilot.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_ic_autopilot_disable.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png
new file mode 100644
index 0000000000..a676a789c3
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png
new file mode 100644
index 0000000000..e1fd463963
Binary files /dev/null and b/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_navi_arrow_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_navi_direction_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_navi_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_navi_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_navi_line_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_order_cancel_close.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_order_cancel_close1.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_order_list_close_iv.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_order_list_page.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_order_list_page.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_report_order_cancel_icon.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_selected_btn.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_selected_btn.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable-xhdpi/taxi_unselect_btn.png b/OCH/mogo-och-taxi/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/src/main/res/drawable-xhdpi/taxi_unselect_btn.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00000.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00000.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00001.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00001.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00002.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00002.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00003.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00003.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00004.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00004.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00005.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00005.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00006.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00006.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00007.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00007.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00008.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00008.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00009.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00009.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00010.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00010.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00011.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00011.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00012.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00012.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00013.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00013.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00014.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00014.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00015.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00015.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00016.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00016.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00017.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00017.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00018.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00018.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00019.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00019.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00020.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00020.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00021.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00021.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00022.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00022.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00023.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00023.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00024.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00024.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00025.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00025.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00026.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00026.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00027.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00027.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00028.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00028.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00029.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00029.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00030.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00030.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00031.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00031.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00032.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00032.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00033.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00033.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00034.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00034.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00035.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00035.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00036.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00036.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00037.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00037.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00038.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00038.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00039.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00039.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00040.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00040.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00041.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00041.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00042.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00042.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00043.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00043.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00044.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00044.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00045.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00045.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00046.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00046.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00047.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00047.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00048.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00048.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00049.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00049.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00050.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00050.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00051.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00051.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00052.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00052.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00053.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00053.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00054.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00054.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00055.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00055.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00056.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00056.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00057.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00057.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00058.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00058.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anim_flow_00059.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/anim_flow_00059.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/anmi_flow.xml b/OCH/mogo-och-taxi/src/main/res/drawable/anmi_flow.xml
new file mode 100644
index 0000000000..611cde2035
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/drawable/anmi_flow.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/grab_failure_anmi_flow.xml b/OCH/mogo-och-taxi/src/main/res/drawable/grab_failure_anmi_flow.xml
new file mode 100644
index 0000000000..5a0649a2c5
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/grab_success_anmi_flow.xml b/OCH/mogo-och-taxi/src/main/res/drawable/grab_success_anmi_flow.xml
new file mode 100644
index 0000000000..0447f8441d
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/img_taxi_operation_status_bg.9.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/img_taxi_operation_status_bg.9.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_autopilot_status_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_autopilot_status_bg.xml
new file mode 100644
index 0000000000..97ac9039cc
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_autopilot_status_bg.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_autopilot_status_bg_check.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_autopilot_status_bg_check.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_autopilot_status_bg_nor.png b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_autopilot_status_bg_nor.png differ
diff --git a/OCH/mogo-och-taxi/src/main/res/drawable/taxi_base_autopilot_status_icon_selector.xml b/OCH/mogo-och-taxi/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/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/src/main/res/drawable/taxi_cancel_button_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_cancel_button_bg.xml
new file mode 100644
index 0000000000..60eb252eab
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_checkbox_selector.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_checkbox_selector.xml
new file mode 100644
index 0000000000..adc3fce148
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_grab_order_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_grab_order_bg.xml
new file mode 100644
index 0000000000..d626dfde91
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_grabing_order_btn_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_grabing_order_btn_bg.xml
new file mode 100644
index 0000000000..fbe05625d8
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_line_bg1.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_line_bg1.xml
new file mode 100644
index 0000000000..7fcd53f564
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_line_bg2.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_line_bg2.xml
new file mode 100644
index 0000000000..e0861580ee
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_operation_data_item_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_operation_data_item_bg.xml
new file mode 100644
index 0000000000..dca30d9244
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_operation_status_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_operation_status_bg.xml
new file mode 100644
index 0000000000..dde09aaba4
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_bg.xml
new file mode 100644
index 0000000000..f442e3fb0b
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_button_status_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_button_status_bg.xml
new file mode 100644
index 0000000000..103e621370
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_button_status_canceled_bg.xml
new file mode 100644
index 0000000000..8869eec9a6
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_button_type_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_button_type_bg.xml
new file mode 100644
index 0000000000..d32f758b8b
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_button_type_reserver_bg.xml
new file mode 100644
index 0000000000..acae5d44a7
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_cancel_dialog_bg.xml
new file mode 100644
index 0000000000..942b51b459
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_order_viewpager_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_order_viewpager_bg.xml
new file mode 100644
index 0000000000..621dfb107e
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_panel_bkg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_panel_bkg.xml
new file mode 100644
index 0000000000..04864e072b
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_panel_distance_bkg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_panel_distance_bkg.xml
new file mode 100644
index 0000000000..bbb05d8127
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/drawable/taxi_show_orders_bg.xml b/OCH/mogo-och-taxi/src/main/res/drawable/taxi_show_orders_bg.xml
new file mode 100644
index 0000000000..c7f6e8e8f0
--- /dev/null
+++ b/OCH/mogo-och-taxi/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/src/main/res/layout/taxi_base_fragment.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml
new file mode 100644
index 0000000000..cac3a20b7a
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml
new file mode 100644
index 0000000000..da7aa36c9d
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_being_order.xml
@@ -0,0 +1,251 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_navi_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_navi_view.xml
new file mode 100644
index 0000000000..49d6454265
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_navi_view.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_no_data_common_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_no_data_common_view.xml
new file mode 100644
index 0000000000..dc6d17e0a7
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_no_data_common_view.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_data_item_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_data_item_view.xml
new file mode 100644
index 0000000000..5581647a61
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_data_item_view.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_data_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_data_view.xml
new file mode 100644
index 0000000000..04c3b385de
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_data_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_tab_item_custom.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_tab_item_custom.xml
new file mode 100644
index 0000000000..36083f3018
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_operation_tab_item_custom.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_cancel_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_cancel_view.xml
new file mode 100644
index 0000000000..35fa48fe9a
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_cancel_view.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_checkbox_item.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_checkbox_item.xml
new file mode 100644
index 0000000000..c04429d76c
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_checkbox_item.xml
@@ -0,0 +1,10 @@
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_grab_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_grab_view.xml
new file mode 100644
index 0000000000..f4c6717bbd
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_grab_view.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_list_boot_no_data_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_list_boot_no_data_view.xml
new file mode 100644
index 0000000000..4e24c65314
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_list_boot_no_data_view.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_reserve_item.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_reserve_item.xml
new file mode 100644
index 0000000000..3cf7369efd
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_order_reserve_item.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_day_item.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_day_item.xml
new file mode 100644
index 0000000000..077bf77c47
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_day_item.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_item.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_item.xml
new file mode 100644
index 0000000000..9ddc3532ec
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_item.xml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_view.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_view.xml
new file mode 100644
index 0000000000..6ca746cc6d
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_orders_list_view.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_panel.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_panel.xml
new file mode 100644
index 0000000000..e5357ee50f
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_panel.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_reserve_orders.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_reserve_orders.xml
new file mode 100644
index 0000000000..4228dcda02
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_reserve_orders.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_server_orders_panel.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_server_orders_panel.xml
new file mode 100644
index 0000000000..9ce89e8452
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_server_orders_panel.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_tab_item_custom.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_tab_item_custom.xml
new file mode 100644
index 0000000000..58e7e988be
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_tab_item_custom.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/raw/taxi_order.json b/OCH/mogo-och-taxi/src/main/res/raw/taxi_order.json
new file mode 100644
index 0000000000..e8d0819d3f
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/raw/taxi_order.json
@@ -0,0 +1,22 @@
+{
+ "drivingRoutes": [
+ {
+ "lat": 40.197234,
+ "lon": 116.74143,
+ "siteId": "1.0",
+ "siteName": "万集东门站"
+ },
+ {
+ "lat": 40.1953113732,
+ "lon": 116.729134342,
+ "siteId": "2.0",
+ "siteName": "市政府前街18号"
+ }
+ ],
+ "endStation": "市政府前街18号",
+ "orderDispatchType": 1,
+ "orderNo": "CZ20210430000005",
+ "orderType": 9,
+ "startStation": "万集东门站",
+ "travelDistance": 0.6
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/raw/taxi_order_detail.json b/OCH/mogo-och-taxi/src/main/res/raw/taxi_order_detail.json
new file mode 100644
index 0000000000..7d62fcacb7
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/raw/taxi_order_detail.json
@@ -0,0 +1,39 @@
+{
+ "code": 0,
+ "msg": "",
+ "detailMsg": "",
+ "result": {
+ "_id": "5352c1d2c9d84ab3ab9ecf1e47e13bdd",
+ "orderNo": "CZ20210427000016",
+ "orderType": 9,
+ "userName": "董QAD",
+ "userPhone": "15631204018",
+ "startStationId": 10000,
+ "startStation": "0409第一站",
+ "startStationCoordinate": [
+ 116.7389159039,
+ 40.1992312592
+ ],
+ "endStationId": 21,
+ "endStation": "第二十一站",
+ "endStationCoordinate": [
+ 116.737866,
+ 40.19646
+ ],
+ "orderDispatchType": 1,
+ "carNum": "京NB010",
+ "sn": "F803EB2046PZD00149",
+ "orderStartTime": "Apr 27, 2021 8:55:44 PM",
+ "arrivedStartStationTime": "",
+ "arrivedEndStationTime": "",
+ "cityCode": "010",
+ "areaCode": "1001",
+ "createTime": "Apr 27, 2021 8:55:44 PM",
+ "updateTime": "Apr 27, 2021 8:55:56 PM",
+ "personNum": 1,
+ "travelDistance": 0.3,
+ "vehicleColour": "黑色",
+ "lastBrandName": "",
+ "headImgUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83ep4YkeZqjiazTK87NQtYp6KMYvAdJcxNpxyJ2gibeNNheH1HFaJdX4hB15eIR3zZdGMWNanKzIn460w/132"
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/raw/taxi_order_state_update.json b/OCH/mogo-och-taxi/src/main/res/raw/taxi_order_state_update.json
new file mode 100644
index 0000000000..9ee3d17f02
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/raw/taxi_order_state_update.json
@@ -0,0 +1,10 @@
+{
+ "endStation": "市政府前街18号",
+ "endStationId": "2.0",
+ "orderDispatchType": 7,
+ "orderNo": "CZ20210430000005",
+ "orderType": 9,
+ "startStation": "万集东门站",
+ "startStationId": "1.0",
+ "travelDistance": 0.6
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values-sw320dp/dimens.xml b/OCH/mogo-och-taxi/src/main/res/values-sw320dp/dimens.xml
new file mode 100644
index 0000000000..0863a26ec1
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values-sw320dp/dimens.xml
@@ -0,0 +1,26 @@
+
+
+ 560px
+ 910px
+ 800px
+ 222px
+ 1120px
+ 162px
+ 446px
+ 400px
+ 160px
+ 432px
+ 64px
+ 616px
+ 132px
+ 300px
+ 240px
+ 400px
+ 160px
+ 280px
+ 120px
+
+ 220px
+ 420px
+ 220px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-taxi/src/main/res/values-xhdpi-2560x1440/dimens.xml
new file mode 100644
index 0000000000..d2514bf596
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values-xhdpi-2560x1440/dimens.xml
@@ -0,0 +1,90 @@
+
+
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 530px
+ 492px
+
+ 20px
+ 20px
+ 70px
+ 130px
+ 93px
+ 150px
+ 70px
+
+ 24px
+ 460px
+ 140px
+
+ 51dp
+ 51dp
+
+ 83px
+
+ 40px
+ 466px
+ 414px
+
+
+
+ 46px
+ 13px
+ 12px
+ 350px
+
+ 460px
+ 30px
+ 560px
+ 310px
+ 15px
+ 25px
+ 25px
+ 32px
+ 1px
+ 20px
+ 20px
+ 20px
+ 140px
+ 20px
+ 41px
+ 17px
+ 41px
+ 42px
+ 32px
+ 32px
+ 84px
+ 3px
+ 20px
+ 32px
+ 36px
+ 17px
+ 31.5px
+
+ 800px
+ 222px
+ 1120px
+ 162px
+ 446px
+ 400px
+ 160px
+ 432px
+ 64px
+ 616px
+ 132px
+ 300px
+ 240px
+ 400px
+ 160px
+ 280px
+ 120px
+
+ 220px
+ 420px
+ 220px
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values/attrs.xml b/OCH/mogo-och-taxi/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000..1a60978ae5
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values/attrs.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values/colors.xml b/OCH/mogo-och-taxi/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..318fd9a653
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values/colors.xml
@@ -0,0 +1,16 @@
+
+
+ #FFFFFF
+ #707DBE
+ #8198E8
+ #8198E8
+ #8198E8
+ #FFFFFF
+ #FF2B6EFF
+ #FF3B4577
+ #80000000
+
+ #FFFFFF
+ #99FFFFFF
+ #FF52BBFF
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values/dimens.xml b/OCH/mogo-och-taxi/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..30312ffaab
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values/dimens.xml
@@ -0,0 +1,87 @@
+
+
+ 40px
+ 46px
+ 24px
+
+ 345px
+ 492px
+
+ 15px
+ 15px
+ 40px
+ 50px
+ 50px
+ 70px
+ 40px
+
+ 24px
+ 300px
+ 100px
+
+ 100px
+ 100px
+
+ 35px
+
+ 15px
+ 300px
+ 270px
+
+ 30px
+ 13px
+ 12px
+ 288px
+
+ 460px
+ 30px
+ 464px
+ 310px
+ 5px
+ 20px
+ 20px
+ 20px
+ 1px
+ 20px
+ 20px
+ 20px
+ 140px
+ 20px
+ 20px
+ 17px
+ 20px
+ 26px
+ 20px
+ 20px
+ 64px
+ 3px
+ 20px
+ 20px
+ 24px
+ 17px
+ 22.5px
+
+ 800px
+ 222px
+ 1120px
+ 162px
+ 446px
+ 400px
+ 160px
+ 432px
+ 64px
+ 616px
+ 132px
+ 300px
+ 240px
+ 400px
+ 160px
+ 280px
+ 120px
+
+ 220px
+ 420px
+ 220px
+
+ 40px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values/strings.xml b/OCH/mogo-och-taxi/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..b6804d5519
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values/strings.xml
@@ -0,0 +1,21 @@
+
+
+ 确认上车,行程开始
+ 到达站点,乘客已下车
+ 已到达上车站点,等待乘客上车
+ 预计里程
+ 3.2 km
+ 请携带好随身物品,注意侧后\n方来车,感谢体验蘑菇智行自\n动驾驶车!
+ 即将到达目的地,请您携带好随身物品,安全下车。
+ 送乘客至目的地
+ 等待乘客上车
+ 前往乘客上车地点
+ 已到达乘客下车点
+ 订单已完成
+ 订单已取消
+ 请选择取消订单的理由
+ 出现异常情况时,可选择原因无责取消订单:
+ 确认
+ 开始服务
+ 服务完成
+
\ No newline at end of file
diff --git a/OCH/mogo-och-taxi/src/main/res/values/styles.xml b/OCH/mogo-och-taxi/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..bd2964b922
--- /dev/null
+++ b/OCH/mogo-och-taxi/src/main/res/values/styles.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZD_README/README_VersionHistory.md b/ZD_README/README_VersionHistory.md
index 320ac5c41c..116e6ba841 100644
--- a/ZD_README/README_VersionHistory.md
+++ b/ZD_README/README_VersionHistory.md
@@ -63,7 +63,6 @@ callchatprovider : "com.mogo.module.carchatout:module-carchatting-pr
// V2X
moduleV2x : "com.mogo.module:module-v2x:${MOGO_COMMONS_VERSION}",
-moduleADAS : "com.mogo.module:mogo-module-adas:${MOGO_COMMONS_VERSION}",
modulesearch : "com.mogo.module:module-search:${MOGO_COMMONS_VERSION}",
// push
modulepush : "com.mogo.module:module-push:${MOGO_COMMONS_VERSION}",
diff --git a/app/build.gradle b/app/build.gradle
index 0710ec2903..eabcafae8f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,16 +4,83 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'android-aspectjx'
apply plugin: 'bugly'
-apply plugin: 'apm-plugin'
+
+if (!isAndroidTestBuild()) {
+ apply plugin: 'apm-plugin'
+}
//apply ByteX宿主
-apply plugin: 'bytex'
-ByteX {
- enable true
- enableInDebug true
- logLevel "DEBUG"
+if (!isAndroidTestBuild()) {
+ apply plugin: 'bytex'
+ ByteX {
+ enable true
+ enableInDebug true
+ logLevel "DEBUG"
+ }
}
+if (!isAndroidTestBuild()) {
+ apply plugin: 'bytex.threadOpt'
+ thread_opt {
+ enable true
+ enableInDebug true
+ rxJavaIoReplacer 'com/mogo/eagle/core/utilcode/util/ThreadUtils@@getIoPool@@()Ljava/util/concurrent/ExecutorService;'
+ rxJavaComputationReplacer 'com/mogo/eagle/core/utilcode/util/ThreadUtils@@getCpuPool@@()Ljava/util/concurrent/ExecutorService;'
+ coroutineIoReplacer 'com/mogo/eagle/core/utilcode/util/ThreadUtils@@getIoPool@@()Ljava/util/concurrent/ExecutorService;'
+ coroutineDefaultReplacer 'com/mogo/eagle/core/utilcode/util/ThreadUtils@@getCpuPool@@()Ljava/util/concurrent/ExecutorService;'
+ }
+
+ /**
+ * 方便使用systrace工具,在工程侧打点,便于分析工程侧性能问题
+ */
+ apply plugin: 'bytex.systrace'
+ systrace {
+ /**
+ * 交付时要关闭,会有性能损耗
+ */
+ enable false
+ enableInDebug false
+ /**
+ * - 是否使用[Trace.beginAsyncSection(String, int)/Trace.endAsyncSection(String, int)]进行打点
+ * - 默认使用[Trace.beginSection(String)/Trace.endSection()]进行打点
+ */
+ isTraceAsync false
+ /**
+ * - 是否在运行时只针对主线程打点,其它线程不打
+ */
+ isOnlyMainThread false
+
+ /**
+ * - 是否忽略对类的静态构造方法打点
+ * - 默认不忽略
+ */
+ isIgnoreClinitMethod false
+
+ /**
+ * - 是否忽略对类中的简单方法打点
+ * 简单方法定义:
+ * - 空方法
+ * - get/set 方法
+ * - 单独的方法,方法体内没有调用其它方法
+ * - 默认不忽略
+ */
+ isIgnoreSampleMethod false
+
+ /**
+ * - 针对特定类集合,配置打点白名单,在此集合中的类中的所有方法不打点
+ * - 支持正则表达式
+ */
+ whiteListForClass = []
+
+ /**
+ * - 针对特定包名集合,配置打点白名单,所有类以此包名为前缀的类不打点
+ * - 支持正则表达式
+ */
+ whiteListForPackage = []
+ }
+}
+
+
/*apply plugin: 'chain.log.hook'
hooklog{
enableLoggerToServer true
@@ -70,6 +137,7 @@ android {
]
}
release {
+ debuggable false
minifyEnabled false
zipAlignEnabled false
shrinkResources false
@@ -86,13 +154,14 @@ android {
targetCompatibility 1.8
}
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
- f8xxLauncherOnlineRelease {
- manifest.srcFile 'src/f8xxLauncherOnlineRelease/AndroidManifest.xml'
- }
}
flavorDimensions "product", "basic", "env"
@@ -127,18 +196,19 @@ android {
}
// 配置不同渠道参数,直接影响功能完整度
- apply from: "./productFlavors/f8Amap.gradle"
- apply from: "./productFlavors/f8xx.gradle"
- apply from: "./productFlavors/f80x.gradle"
- apply from: "./productFlavors/fochbus.gradle"
- apply from: "./productFlavors/fochtaxi.gradle"
apply from: "./productFlavors/fPadLenovo.gradle"
apply from: "./productFlavors/fPadLenovoOchBus.gradle"
apply from: "./productFlavors/fPadLenovoOchTaxi.gradle"
+ apply from: "./productFlavors/fPadLenovoOchBusPassenger.gradle"
+ apply from: "./productFlavors/fPadLenovoOchTaxiPassenger.gradle"
packagingOptions {
exclude 'META-INF/io.netty.versions.properties'
}
+
+ useLibrary 'android.test.runner'
+ useLibrary 'android.test.base'
+ useLibrary 'android.test.mock'
}
repositories {
@@ -151,29 +221,6 @@ aspectjx {
include "com.mogo.chat"
}
-ApmPlugin {
- // 是否进行插桩
- enable true
- // 是否在Debug包插桩,默认不插桩
- enableInDebug true
- // DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR");
- // INFO 级别Log会汇总所有被插桩处理的类供查看,路径 app/build/ByteX/ApmPlugin
- logLevel "DEBUG"
- // 启动分析开关:监控App启动耗时,需要同时开启pageLoadSwitch
- startSwitch = true
- // 页面响应开关:监控Activity的生命周期耗时
- pageLoadSwitch = true
- // 网络监控开关:监控okhttp3的网络请求
- okHttp3Switch = true
- // 白名单下的包进行插桩,需要填写要插装类所在的包名,支持前缀配置
- whiteList = [
- "com.mogo"
- ]
- // 黑名单包下类不进行插桩,可以配置包名和类名,没有可以填空
- blackList = [
-
- ]
-}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
@@ -183,9 +230,6 @@ dependencies {
implementation rootProject.ext.dependencies.arouter
implementation rootProject.ext.dependencies.boostmultidex
- implementation 'com.volcengine:apm_insight:1.4.4.cn'
- implementation 'com.volcengine:apm_insight_crash:1.4.2'
-
compileOnly rootProject.ext.dependencies.adasapi
compileOnly rootProject.ext.dependencies.adasconfigapi
@@ -194,28 +238,47 @@ dependencies {
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.mogo_core_function_main
+ implementation rootProject.ext.dependencies.ttspad
} else {
implementation project(':core:function-impl:mogo-core-function-main')
+ implementation project(':tts:tts-pad')
}
- apply from: "./functions/tts.gradle"
apply from: "./functions/och.gradle"
-// implementation group: "com.tencent.matrix", name: "matrix-android-lib", version: '0.6.6', changing: true
-// implementation group: "com.tencent.matrix", name: "matrix-android-commons", version: '0.6.6', changing: true
-// implementation group: "com.tencent.matrix", name: "matrix-trace-canary", version:'0.6.6', changing: true
-// implementation group: "com.tencent.matrix", name: "matrix-io-canary", version: '0.6.6', changing: true
-
+ androidTestImplementation rootProject.ext.dependencies.androidx_test_core
+ androidTestImplementation rootProject.ext.dependencies.androidx_test_core_ktx
+ androidTestImplementation rootProject.ext.dependencies.androidx_unit_ext
+ androidTestImplementation rootProject.ext.dependencies.androidx_unit_ext_ktx
+ androidTestImplementation rootProject.ext.dependencies.androidx_runner
+ androidTestImplementation rootProject.ext.dependencies.androidx_espresso_core
}
-//apply plugin: 'com.tencent.matrix-plugin'
-//matrix {
-// trace {
-// enable = true //if you don't want to use trace canary, set false
-// baseMethodMapFile = "${project.projectDir}/matrixOutput/Debug.methodmap"
-// blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
-// }
-//}
+if (!isAndroidTestBuild()) {
+ ApmPlugin {
+ // 是否进行插桩
+ enable true
+ // 是否在Debug包插桩,默认不插桩
+ enableInDebug true
+ // DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR");
+ // INFO 级别Log会汇总所有被插桩处理的类供查看,路径 app/build/ByteX/ApmPlugin
+ logLevel "DEBUG"
+ // 启动分析开关:监控App启动耗时,需要同时开启pageLoadSwitch
+ startSwitch = true
+ // 页面响应开关:监控Activity的生命周期耗时
+ pageLoadSwitch = true
+ // 网络监控开关:监控okhttp3的网络请求
+ okHttp3Switch = true
+ // 白名单下的包进行插桩,需要填写要插装类所在的包名,支持前缀配置
+ whiteList = [
+ "com.mogo"
+ ]
+ // 黑名单包下类不进行插桩,可以配置包名和类名,没有可以填空
+ blackList = [
+
+ ]
+ }
+}
android.applicationVariants.all { variant ->
def buildTime = new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+08:00"))
@@ -252,10 +315,20 @@ def getWorkingBranchName() {
*/
def getWorkingBranchHash() {
def workingBranchHash = ""
- def proc = "git log -n1 --format=format:\"%h\"".execute()
+ def proc = "git log -n1 --format=format:%h".execute()
proc.in.eachLine { line -> workingBranchHash = line }
proc.err.eachLine { line -> println line }
proc.waitFor()
println "Working branch hash: " + workingBranchHash
- return workingBranchHash
+ return "\"${workingBranchHash}\""
+}
+
+
+boolean isAndroidTestBuild() {
+ for (String s : gradle.startParameter.taskNames) {
+ if (s.contains("AndroidTest")) {
+ return true
+ }
+ }
+ return false
}
diff --git a/app/functions/och.gradle b/app/functions/och.gradle
index ad51544f40..301d25a9cf 100644
--- a/app/functions/och.gradle
+++ b/app/functions/och.gradle
@@ -1,58 +1,91 @@
// 网约车服务:仅小巴车、出租车渠道用
project.dependencies {
- f8xxImplementation (rootProject.ext.dependencies.mogoochnoop){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
- f80xImplementation (rootProject.ext.dependencies.mogoochnoop){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.module' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
- f8AmapImplementation (rootProject.ext.dependencies.mogoochnoop){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.module' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
- fochtaxiImplementation (rootProject.ext.dependencies.mogoochtaxi){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.module' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
- fochbusImplementation (rootProject.ext.dependencies.mogoochbus){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.module' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
+ if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
+ fPadLenovoImplementation(rootProject.ext.dependencies.mogoochnoop) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // Bus司机端
+ fPadLenovoOchBusImplementation(rootProject.ext.dependencies.mogoochbus) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // Bus乘客端
+ fPadLenovoOchBusPassengerImplementation(rootProject.ext.dependencies.mogoochbus) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // taxi司机端
+ fPadLenovoOchTaxiImplementation(rootProject.ext.dependencies.mogoochtaxi) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // taxi乘客端
+ fPadLenovoOchTaxiPassengerImplementation(rootProject.ext.dependencies.mogoochtaxi) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+ } else {
+ fPadLenovoImplementation (project(':OCH:mogo-och-noop')) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // Bus司机端
+ fPadLenovoOchBusImplementation (project(':OCH:mogo-och-bus')) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // Bus乘客端
+ fPadLenovoOchBusPassengerImplementation (project(':OCH:mogo-och-bus')) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // taxi司机端
+ fPadLenovoOchTaxiImplementation (project(':OCH:mogo-och-taxi')) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
+
+ // taxi乘客端
+ fPadLenovoOchTaxiPassengerImplementation (project(':OCH:mogo-och-taxi-passenger')) {
+ exclude group: 'com.mogo.commons' //by group
+ exclude group: 'com.mogo.module' //by group
+ exclude group: 'com.mogo.map' //by group
+ exclude group: 'com.mogo.eagle.core' //by group
+ exclude group: 'com.mogo.eagle.core.function' //by group
+ }
- fPadLenovoImplementation (rootProject.ext.dependencies.mogoochnoop){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
}
- fPadLenovoOchTaxiImplementation (rootProject.ext.dependencies.mogoochtaxi){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.module' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
- fPadLenovoOchBusImplementation (rootProject.ext.dependencies.mogoochbus){
- exclude group: 'com.mogo.commons' //by group
- exclude group: 'com.mogo.module' //by group
- exclude group: 'com.mogo.map' //by group
- exclude group: 'com.mogo.eagle.core' //by group
- exclude group: 'com.mogo.eagle.core.function' //by group
- }
-}
\ No newline at end of file
+}
diff --git a/app/functions/tts.gradle b/app/functions/tts.gradle
deleted file mode 100644
index 682094cdc0..0000000000
--- a/app/functions/tts.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-project.dependencies {
- if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
- f8xxImplementation rootProject.ext.dependencies.ttszhi
- f80xImplementation rootProject.ext.dependencies.ttszhi
- f8AmapImplementation rootProject.ext.dependencies.ttszhi
-
- fochtaxiImplementation rootProject.ext.dependencies.ttszhi
- fochbusImplementation rootProject.ext.dependencies.ttszhi
-
- fPadLenovoImplementation rootProject.ext.dependencies.ttspad
- fPadLenovoOchTaxiImplementation rootProject.ext.dependencies.ttspad
- fPadLenovoOchBusImplementation rootProject.ext.dependencies.ttspad
- } else {
- f8xxImplementation project(':tts:tts-zhi')
- f80xImplementation project(':tts:tts-zhi')
- f8AmapImplementation project(':tts:tts-zhi')
-
- fochtaxiImplementation project(':tts:tts-zhi')
- fochbusImplementation project(':tts:tts-zhi')
-
- fPadLenovoImplementation project(':tts:tts-pad')
- fPadLenovoOchTaxiImplementation project(':tts:tts-pad')
- fPadLenovoOchBusImplementation project(':tts:tts-pad')
- }
-}
\ No newline at end of file
diff --git a/app/productFlavors/f8xx.gradle b/app/productFlavors/f8xx.gradle
index 40c29c4e44..1429240524 100644
--- a/app/productFlavors/f8xx.gradle
+++ b/app/productFlavors/f8xx.gradle
@@ -12,20 +12,26 @@ project.android.productFlavors {
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
buildConfigField 'int', 'CAR_MACHINE_TYPE', '0'
+ //高德地图鉴权信息
manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "f8xx"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x00"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "192.168.1.102"
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/productFlavors/fPadLenovo.gradle b/app/productFlavors/fPadLenovo.gradle
index 8b37f917db..cd72bc87d6 100644
--- a/app/productFlavors/fPadLenovo.gradle
+++ b/app/productFlavors/fPadLenovo.gradle
@@ -12,21 +12,25 @@ project.android.productFlavors {
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
buildConfigField 'int', 'CAR_MACHINE_TYPE', '2'
+ // 高德地图鉴权信息
manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fPadLenovo"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
- // 默认进入的地图模式
- buildConfigField 'int', 'MAP_STYLE_MODE', "1"
+
+ // 构建的应用身份类型,司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x02"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.1.102\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/productFlavors/fPadLenovoOchBus.gradle b/app/productFlavors/fPadLenovoOchBus.gradle
index f91d1c529b..0e65bd1c47 100644
--- a/app/productFlavors/fPadLenovoOchBus.gradle
+++ b/app/productFlavors/fPadLenovoOchBus.gradle
@@ -9,22 +9,30 @@ project.android.productFlavors {
}
minSdkVersion rootProject.ext.android.minSdkVersionPadLenovo
targetSdkVersion rootProject.ext.android.targetSdkVersionPadLenovo
+ versionCode rootProject.versionCode as int
+ versionName rootProject.versionName
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
buildConfigField 'int', 'CAR_MACHINE_TYPE', '2'
+ //高德地图鉴权信息
manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fPadLenovoOchBus"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x00"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.8.102\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/productFlavors/f80x.gradle b/app/productFlavors/fPadLenovoOchBusPassenger.gradle
similarity index 56%
rename from app/productFlavors/f80x.gradle
rename to app/productFlavors/fPadLenovoOchBusPassenger.gradle
index 2339f69ab2..4b7b299e78 100644
--- a/app/productFlavors/f80x.gradle
+++ b/app/productFlavors/fPadLenovoOchBusPassenger.gradle
@@ -1,31 +1,36 @@
project.android.productFlavors {
- // f系列-分体机
- f80x {
+ // 衡阳-联想Pad-网约车-小巴车-乘客端
+ fPadLenovoOchBusPassenger {
externalNativeBuild {
ndk {
// 设置支持的SO库架构
abiFilters "arm64-v8a"
}
}
- minSdkVersion rootProject.ext.android.minSdkVersion
- targetSdkVersion rootProject.ext.android.targetSdkVersion
+ minSdkVersion rootProject.ext.android.minSdkVersionPadLenovo
+ targetSdkVersion rootProject.ext.android.targetSdkVersionPadLenovo
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
- buildConfigField 'int', 'CAR_MACHINE_TYPE', '0'
- manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "f80x"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+ buildConfigField 'int', 'CAR_MACHINE_TYPE', '2'
+ //高德地图鉴权信息
+ manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fPadLenovoOchBusPassenger"]
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
- }
+ // 构建的应用身份类型,司机0|乘客1
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x01"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.8.103\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
+ }
}
\ No newline at end of file
diff --git a/app/productFlavors/fPadLenovoOchTaxi.gradle b/app/productFlavors/fPadLenovoOchTaxi.gradle
index 97c8a45d43..4d92c20f68 100644
--- a/app/productFlavors/fPadLenovoOchTaxi.gradle
+++ b/app/productFlavors/fPadLenovoOchTaxi.gradle
@@ -10,23 +10,31 @@ project.android.productFlavors {
}
minSdkVersion rootProject.ext.android.minSdkVersionPadLenovo
targetSdkVersion rootProject.ext.android.targetSdkVersionPadLenovo
+ versionCode rootProject.versionCode as int
+ versionName rootProject.versionName
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
buildConfigField 'int', 'CAR_MACHINE_TYPE', '2'
+ //高德地图鉴权信息
manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fPadLenovoOchTaxi"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x00"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.1.102\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/productFlavors/f8Amap.gradle b/app/productFlavors/fPadLenovoOchTaxiPassenger.gradle
similarity index 50%
rename from app/productFlavors/f8Amap.gradle
rename to app/productFlavors/fPadLenovoOchTaxiPassenger.gradle
index 16ace86c59..b69be39466 100644
--- a/app/productFlavors/f8Amap.gradle
+++ b/app/productFlavors/fPadLenovoOchTaxiPassenger.gradle
@@ -1,31 +1,39 @@
project.android.productFlavors {
- // f系列-分体机-高德
- f8Amap {
+ // 衡阳-联想Pad-网约车-出租车-乘客端
+ fPadLenovoOchTaxiPassenger {
externalNativeBuild {
ndk {
// 设置支持的SO库架构
- abiFilters "armeabi-v7a"
+ abiFilters "arm64-v8a"
}
}
- minSdkVersion rootProject.ext.android.minSdkVersion
- targetSdkVersion rootProject.ext.android.targetSdkVersion
+ minSdkVersion rootProject.ext.android.minSdkVersionPadLenovo
+ targetSdkVersion rootProject.ext.android.targetSdkVersionPadLenovo
+ versionCode rootProject.versionCode as int
+ versionName rootProject.versionName
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
- buildConfigField 'int', 'CAR_MACHINE_TYPE', '0'
- manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "f8Amap"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+ buildConfigField 'int', 'CAR_MACHINE_TYPE', '2'
+ //高德地图鉴权信息
+ manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fPadLenovoOchTaxiPassenger"]
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,司机0|乘客1
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x01"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.1.103\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/productFlavors/fochbus.gradle b/app/productFlavors/fochbus.gradle
index 640e070d92..16feafdae4 100644
--- a/app/productFlavors/fochbus.gradle
+++ b/app/productFlavors/fochbus.gradle
@@ -12,20 +12,26 @@ project.android.productFlavors {
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
buildConfigField 'int', 'CAR_MACHINE_TYPE', '0'
+ //高德地图鉴权信息
manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fochbus"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x00"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.8.102\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/productFlavors/fochtaxi.gradle b/app/productFlavors/fochtaxi.gradle
index 72f6faef0a..fa21f03205 100644
--- a/app/productFlavors/fochtaxi.gradle
+++ b/app/productFlavors/fochtaxi.gradle
@@ -12,20 +12,26 @@ project.android.productFlavors {
// 应用包名
applicationId rootProject.ext.android.fLauncherApplicationId
dimension "product"
- buildConfigField 'boolean', 'AI_ASSIST_ACTIVE_STAUTS', 'false'
+
// 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
buildConfigField 'int', 'CAR_MACHINE_TYPE', '0'
+ //高德地图鉴权信息
manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fochtaxi"]
- // 是否使用高德sdk自定义导航
- buildConfigField 'boolean', 'USE_CUSTOM_NAVI', 'false'
+
// 是否基于地图
buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
- // 分享时是否隐藏 adas
- buildConfigField 'boolean', 'IS_NEED_HIDE_ADAS_WHEN_SHARE', 'false'
+
// 是否需要实时上报坐标
buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
// GPS数据提供源: 0-Android系统,1-工控机,2-OBU
buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0x00"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.1.102\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'true'
}
}
\ No newline at end of file
diff --git a/app/regroup.gradle b/app/regroup.gradle
index 8d6313ec6e..6b249c3b08 100644
--- a/app/regroup.gradle
+++ b/app/regroup.gradle
@@ -1,7 +1,7 @@
// 将 install 和 assemble 任务按功能分组
afterEvaluate {
- def launcher = ["f80x", "f8xx", "f8amap", "fochtaxi", "fochbus", "fPadLenovo", "fPadLenovoOchTaxi", "fPadLenovoOchBus"]
+ def launcher = [ "fPadLenovo", "fPadLenovoOchTaxi", "fPadLenovoOchBus", "fPadLenovoOchBusPassenger", "fPadLenovoOchTaxiPassenger"]
it.getTasks().iterator().forEachRemaining {
def task = it
diff --git a/app/src/androidTest/AndroidManifest.xml b/app/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000000..a09f1154a6
--- /dev/null
+++ b/app/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt b/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt
new file mode 100644
index 0000000000..29a8fd3427
--- /dev/null
+++ b/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt
@@ -0,0 +1,145 @@
+package com.mogo.functions.test
+
+import androidx.lifecycle.lifecycleScope
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult
+import com.mogo.eagle.core.function.hmi.ui.MoGoHmiFragment
+import com.mogo.eagle.core.function.main.MainLauncherActivity
+import kotlinx.coroutines.*
+import kotlinx.coroutines.flow.*
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.text.SimpleDateFormat
+import java.util.*
+import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
+import kotlin.random.Random
+
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class AutoPilotBadCaseTest {
+
+ lateinit var launch: ActivityScenario
+
+ @Before
+ fun launch() {
+ launch = ActivityScenario.launch(MainLauncherActivity::class.java)
+ }
+
+ @ExperimentalCoroutinesApi @Test
+ fun showBadCaseEntrance1(): Unit = runBlocking(Dispatchers.Main) {
+ val f = ensureMoGoHmiFragmentShow()
+ var index = 0
+ (1 until 50)
+ .map { it }
+ .asFlow()
+ .onEach {
+ delay(TimeUnit.SECONDS.toMillis(5))
+ f.onAutopilotRecordResult(AutoPilotRecordResult().also {
+ it.diskFree = (100 + index).toLong()
+ it.duration = 60.0
+ it.fileName = "/user/general/record_$index.log"
+ it.id = 10 + index
+ it.key = "yyy_$index"
+ it.stat = 100
+ it.type = 1
+ it.timestamp = SimpleDateFormat("yyyyMMddHHmmss").format(Date())
+ index++
+ })
+ }
+ .flowOn(Dispatchers.Default)
+ .collect()
+ delay(TimeUnit.HOURS.toMillis(2))
+ }
+
+
+ @ExperimentalCoroutinesApi @Test
+ fun showBadCaseEntrance2():Unit = runBlocking(Dispatchers.Main) {
+ val f = ensureMoGoHmiFragmentShow()
+ var index = 0
+ (1 until 50)
+ .map { it }
+ .asFlow()
+ .onEach {
+ if (index in 1..4) {
+ delay(TimeUnit.SECONDS.toMillis(15))
+ } else {
+ delay(Random(20).nextLong())
+ }
+ f.onAutopilotRecordResult(AutoPilotRecordResult().also {
+ it.diskFree = (100 + index).toLong()
+ it.duration = 60.0
+ it.fileName = "/user/general/record_$index.log"
+ it.id = 10 + index
+ it.key = "yyy_$index"
+ it.stat = 100
+ it.type = 1
+ it.timestamp = SimpleDateFormat("yyyyMMddHHmmss").format(Date())
+ index++
+ })
+
+ if (index == 5) {
+ f.lifecycleScope.cancel()
+ }
+
+ }
+ .flowOn(Dispatchers.Default)
+ .collect()
+ delay(TimeUnit.HOURS.toMillis(2))
+ }
+
+ @ExperimentalCoroutinesApi @Test
+ fun showBadCaseEntrance3(): Unit = runBlocking(Dispatchers.Main) {
+ val f = ensureMoGoHmiFragmentShow()
+ var index = 0
+ (1 until 50)
+ .map { it }
+ .asFlow()
+ .onEach {
+ delay(TimeUnit.SECONDS.toMillis(20))
+ f.onAutopilotRecordResult(AutoPilotRecordResult().also {
+ it.diskFree = (100 + index).toLong()
+ it.duration = 60.0
+ it.fileName = "/user/general/record_$index.log"
+ it.id = 10 + index
+ it.key = "yyy_$index"
+ it.stat = 100
+ it.type = 1
+ it.timestamp = SimpleDateFormat("yyyyMMddHHmmss").format(Date())
+ index++
+ })
+ }
+ .flowOn(Dispatchers.Default)
+ .collect()
+ delay(TimeUnit.HOURS.toMillis(2))
+ }
+
+
+ private suspend fun ensureMoGoHmiFragmentShow(): MoGoHmiFragment = suspendCancellableCoroutine {
+ launch.onActivity { itx ->
+ val executor = Executors.newSingleThreadScheduledExecutor()
+ executor.scheduleAtFixedRate({
+ var find =
+ itx.supportFragmentManager.fragments.find { it is MoGoHmiFragment } as? MoGoHmiFragment
+ while (find == null) {
+ find =
+ itx.supportFragmentManager.fragments.find { it is MoGoHmiFragment } as? MoGoHmiFragment
+
+ }
+ while (!find.isResumed) {
+ Thread.sleep(500)
+ }
+ it.resumeWith(Result.success(find))
+ try {
+ Thread.sleep(500)
+ executor.shutdownNow()
+ } catch (e: Throwable) {
+ e.printStackTrace()
+ }
+ }, 50, 500, TimeUnit.MILLISECONDS)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/mogo/functions/test/KotlinCoroutineSchedulersTest.kt b/app/src/androidTest/java/com/mogo/functions/test/KotlinCoroutineSchedulersTest.kt
new file mode 100644
index 0000000000..4b0ae4bb87
--- /dev/null
+++ b/app/src/androidTest/java/com/mogo/functions/test/KotlinCoroutineSchedulersTest.kt
@@ -0,0 +1,57 @@
+package com.mogo.functions.test
+
+import androidx.lifecycle.coroutineScope
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.mogo.eagle.core.function.main.MainLauncherActivity
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.TimeUnit
+
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class KotlinCoroutineSchedulersTest {
+
+ lateinit var launch: ActivityScenario
+
+ @Before
+ fun before() {
+ launch = ActivityScenario.launch(MainLauncherActivity::class.java)
+ }
+
+ @Test
+ fun testKotlinCoroutineSchedulersIo() = runBlocking {
+ launch.onActivity {
+ it.lifecycle.coroutineScope.launchWhenCreated {
+ repeat(10) {
+ withContext(Dispatchers.IO) {
+ assert(Thread.currentThread().name.startsWith("io-pool-"))
+ }
+ delay(TimeUnit.SECONDS.toMillis(1))
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(20))
+ }
+
+ @Test
+ fun testKotlinCoroutineSchedulersCpu() = runBlocking {
+ launch.onActivity {
+ it.lifecycle.coroutineScope.launchWhenCreated {
+ repeat(10) {
+ withContext(Dispatchers.Default) {
+ assert(Thread.currentThread().name.startsWith("cpu-pool-"))
+ }
+ delay(TimeUnit.SECONDS.toMillis(1))
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(20))
+ }
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/mogo/functions/test/ReminderTest.kt b/app/src/androidTest/java/com/mogo/functions/test/ReminderTest.kt
new file mode 100644
index 0000000000..5cc40a03cc
--- /dev/null
+++ b/app/src/androidTest/java/com/mogo/functions/test/ReminderTest.kt
@@ -0,0 +1,387 @@
+package com.mogo.functions.test
+
+import android.animation.Animator
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.view.Gravity
+import android.view.View
+import android.view.ViewGroup
+import android.view.WindowManager
+import android.view.animation.OvershootInterpolator
+import android.widget.PopupWindow
+import androidx.core.view.ViewCompat
+import androidx.lifecycle.lifecycleScope
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
+import com.mogo.eagle.core.function.hmi.notification.WarningFloat
+import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
+import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern
+import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView
+import com.mogo.eagle.core.function.main.MainLauncherActivity
+import com.mogo.eagle.core.utilcode.kotlin.shape
+import com.mogo.eagle.core.utilcode.reminder.Reminder
+import com.mogo.eagle.core.utilcode.reminder.api.impl.ActivityReminder
+import com.mogo.eagle.core.utilcode.reminder.api.impl.PopupWindowReminder
+import com.mogo.eagle.core.utilcode.reminder.api.impl.ViewReminder
+import com.mogo.eagle.core.utilcode.util.AppStateManager
+import com.mogo.module.common.enums.EventTypeEnum
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.lang.Integer.min
+import java.util.concurrent.TimeUnit
+
+
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class ReminderTest {
+
+ lateinit var launch: ActivityScenario
+
+ @Before
+ fun before() {
+ launch = ActivityScenario.launch(MainLauncherActivity::class.java)
+ }
+
+ @Test
+ fun testViewReminderNotOverride() = runBlocking(Dispatchers.Main) {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenResumed {
+ for (i in 1..10) {
+ val reminder = WindowManagerViewUnOverrideReminder(View(it).also { itx -> itx.background = shape(solid = color(i)) }, 300, 300)
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(3))
+ reminder.hide()
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ return@runBlocking
+ }
+
+ @Test
+ fun testViewReminderOverride() = runBlocking(Dispatchers.Main) {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenCreated {
+ for (i in 1..10) {
+ val reminder = WindowManagerViewOverrideReminder(View(it).also { itx -> itx.background = shape(solid = color(i)) }, 300, 300)
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(3))
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ return@runBlocking
+ }
+
+ @Test
+ fun testViewReminderWhenActivityDestroyed() = runBlocking(Dispatchers.Main) {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenCreated {
+ for (i in 1..10) {
+ val reminder = WindowManagerViewOverrideReminder(View(it).also { itx -> itx.background = shape(solid = color(i)) }, 300, 300)
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(3))
+
+ if (i == 8) {
+ it.finish()
+ }
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+ @Test
+ fun testWarningFloat() = runBlocking(Dispatchers.Main) {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenCreated {
+ for (i in 1..10) {
+ val v = View(it).also {
+ it.background = shape(solid = color(i))
+ it.layoutParams = WindowManager.LayoutParams().also { itx ->
+ itx.width = 300
+ itx.height = 400
+ }
+ }
+ val builder = WarningFloat.with(it).setTag("test${i}").setLayout(v).setSidePattern(SidePattern.RESULT_TOP).setCountDownTime(TimeUnit.SECONDS.toMillis(10)).setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110).setImmersionStatusBar(true).addWarningStatusListener(object :
+ IMoGoWarningStatusListener {
+ override fun onShow() {
+
+ }
+ }).setAnimator(object : DefaultAnimator() {
+ override fun enterAnim(view: View, params: WindowManager.LayoutParams, windowManager: WindowManager, sidePattern: SidePattern): Animator? = super.enterAnim(view, params, windowManager, sidePattern)?.apply {
+ interpolator = OvershootInterpolator()
+ }
+
+ override fun exitAnim(view: View, params: WindowManager.LayoutParams, windowManager: WindowManager, sidePattern: SidePattern): Animator? = super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200)
+ })
+ Reminder.enqueue(it, WarningFloatReminder(builder))
+ delay(TimeUnit.SECONDS.toMillis(3))
+ }
+
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+
+ @Test
+ fun testActivityReminder() = runBlocking(Dispatchers.Main) {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenResumed {
+ for (i in 1..10) {
+ val reminder = ActivityNameReminder(it, "com.mogo.launcher.TestActivity")
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(6))
+ reminder.hide()
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+ @Test
+ fun testActivityReminderOverride() = runBlocking(Dispatchers.Main) {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenResumed {
+ for (i in 1..10) {
+ val reminder = ActivityNameOverrideReminder(it, "com.mogo.launcher.TestActivity")
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(6))
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+
+ @Test
+ fun testPopupWindowReminder() = runBlocking {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenResumed {
+ for (i in 1..10) {
+
+ val reminder = TestPopupWindowReminder(it.findViewById(android.R.id.content), PopupWindow(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT).also { itx ->
+ itx.contentView = View(it).also {
+ xx -> xx.background = shape(solid = color(i))
+ xx.layoutParams = ViewGroup.LayoutParams(300, 400)
+ }
+ })
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(3))
+ reminder.hide()
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+ @Test
+ fun testPopupWindowReminderOverride() = runBlocking {
+ launch.onActivity {
+ it.lifecycleScope.launchWhenResumed {
+ for (i in 1..10) {
+
+ val reminder = TestPopupWindowReminderOverride(it.findViewById(android.R.id.content), PopupWindow(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT).also { itx ->
+ itx.contentView = View(it).also {
+ xx -> xx.background = shape(solid = color(i))
+ xx.layoutParams = ViewGroup.LayoutParams(300, 400)
+ }
+ })
+ Reminder.enqueue(it, reminder)
+ delay(TimeUnit.SECONDS.toMillis(3))
+ }
+ }
+ }
+ delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+ @Test
+ fun testWarningFloatForProject() = runBlocking {
+// launch.onActivity {
+// it.lifecycleScope.launchWhenResumed {
+// for (i in 1..10) {
+// val notificationView = V2XNotificationView(it)
+// notificationView.setWarningIcon(EventTypeEnum.getWarningIcon("10003"))
+// notificationView.setWarningContent("XXXXXX${i}")
+// WarningFloat.with(it)
+// .setTag("tag")
+// .setLayout(notificationView)
+// .setSidePattern(SidePattern.RESULT_TOP)
+// .setCountDownTime(5000)
+// .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
+// .setImmersionStatusBar(true)
+// .addWarningStatusListener(object : IMoGoWarningStatusListener {
+// override fun onShow() {
+// }
+// })
+// .setAnimator(object : DefaultAnimator() {
+// override fun enterAnim(
+// view: View,
+// params: WindowManager.LayoutParams,
+// windowManager: WindowManager,
+// sidePattern: SidePattern
+// ): Animator? =
+// super.enterAnim(view, params, windowManager, sidePattern)?.apply {
+// interpolator = OvershootInterpolator()
+// }
+//
+// override fun exitAnim(
+// view: View,
+// params: WindowManager.LayoutParams,
+// windowManager: WindowManager,
+// sidePattern: SidePattern
+// ): Animator? =
+// super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200)
+// })
+// .show()
+// delay(2000)
+// }
+// }
+// }
+// delay(TimeUnit.SECONDS.toMillis(100))
+ }
+
+
+ class WarningFloatReminder(private val builder: WarningFloat.Builder) : ViewReminder(builder.config.layoutView!!) {
+
+ override fun show() {
+ builder.show()
+ }
+
+ override fun hide() {
+ WarningFloat.dismiss(builder.config.floatTag, false)
+ }
+
+ override fun isOverride(): Boolean {
+ return true
+ }
+ }
+
+
+ class WindowManagerViewUnOverrideReminder(private val content: View, private val width: Int, private val height: Int) : ViewReminder(content) {
+
+ private val wm by lazy {
+ content.context.getSystemService(Activity.WINDOW_SERVICE) as WindowManager
+ }
+
+ private var isAdd = false
+
+ override fun show() {
+ if (!isAdd) {
+ val params = WindowManager.LayoutParams().also {
+ it.width = width
+ it.height = height
+ }
+ params.gravity = Gravity.CENTER
+ wm.addView(content, params)
+ isAdd = true
+ }
+ }
+
+ override fun hide() {
+ if (isAdd && ViewCompat.isAttachedToWindow(content)) {
+ wm.removeView(content)
+ isAdd = false
+ }
+ }
+ }
+
+
+ class WindowManagerViewOverrideReminder(private val content: View, private val width: Int, private val height: Int) : ViewReminder(content) {
+
+ private val wm by lazy {
+ content.context.getSystemService(Activity.WINDOW_SERVICE) as WindowManager
+ }
+
+ private var isAdd = false
+
+ override fun show() {
+ if (!isAdd) {
+ val params = WindowManager.LayoutParams().also {
+ it.width = width
+ it.height = height
+ }
+ params.gravity = Gravity.CENTER
+ wm.addView(content, params)
+ isAdd = true
+ }
+ }
+
+ override fun hide() {
+ if (isAdd && ViewCompat.isAttachedToWindow(content)) {
+ wm.removeView(content)
+ isAdd = false
+ }
+ }
+
+ override fun isOverride(): Boolean {
+ return true
+ }
+ }
+
+
+ class ActivityNameReminder(private val context: Context, private val className: String): ActivityReminder(className) {
+
+ override fun show() {
+ Intent(context, Class.forName(className)).also {
+ context.startActivity(it)
+ }
+ }
+
+ override fun hide() {
+ AppStateManager.currentActivity()?.takeIf { it.javaClass.name == className }?.finish()
+ }
+ }
+
+ class ActivityNameOverrideReminder(private val context: Context, private val className: String): ActivityReminder(className) {
+
+ override fun show() {
+ Intent(context, Class.forName(className)).also {
+ context.startActivity(it)
+ }
+ }
+
+ override fun hide() {
+ AppStateManager.currentActivity()?.takeIf { it.javaClass.name == className }?.finish()
+ }
+
+ override fun isOverride(): Boolean {
+ return true
+ }
+ }
+
+ class TestPopupWindowReminder(private val anchor: View, private val popupWindow: PopupWindow): PopupWindowReminder(popupWindow) {
+
+ override fun show() {
+ popupWindow.showAtLocation(anchor, Gravity.CENTER, 0, 0)
+ }
+ }
+
+ class TestPopupWindowReminderOverride(private val anchor: View, private val popupWindow: PopupWindow): PopupWindowReminder(popupWindow) {
+
+ override fun show() {
+ popupWindow.showAtLocation(anchor, Gravity.CENTER, 0, 0)
+ }
+
+ override fun isOverride(): Boolean {
+ return true
+ }
+ }
+
+ private fun color(index: Int): Int {
+ if (index > 10) {
+ return Color.BLACK
+ }
+ val alpha = min(255, 255 - index * 20)
+ return Color.argb(alpha, Color.red(Color.RED), Color.green(Color.RED), Color.blue(Color.RED))
+ }
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/mogo/functions/test/RxJavaBackPressureTest.kt b/app/src/androidTest/java/com/mogo/functions/test/RxJavaBackPressureTest.kt
new file mode 100644
index 0000000000..679ebda8ab
--- /dev/null
+++ b/app/src/androidTest/java/com/mogo/functions/test/RxJavaBackPressureTest.kt
@@ -0,0 +1,57 @@
+package com.mogo.functions.test
+
+import android.os.Debug
+import android.util.Log
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.mogo.eagle.core.function.main.MainLauncherActivity
+import io.reactivex.Flowable
+import io.reactivex.plugins.RxJavaPlugins
+import io.reactivex.schedulers.Schedulers
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.text.SimpleDateFormat
+import java.util.*
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeUnit.MILLISECONDS
+
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class RxJavaBackPressureTest {
+
+ lateinit var launch: ActivityScenario
+
+ @Before
+ fun before() {
+ launch = ActivityScenario.launch(MainLauncherActivity::class.java)
+ RxJavaPlugins.setErrorHandler {
+ Log.e("RxJava2", it.message, it)
+ }
+ }
+
+ @Test
+ fun testIntervalBackPressure() = runBlocking(Dispatchers.Default) {
+ val subscription = Flowable.interval(50, MILLISECONDS).doOnNext {
+ Log.d("RxJava2", "-- do action --")
+ }.subscribeOn(Schedulers.computation()).observeOn(Schedulers.io()).subscribe {
+ Thread.sleep(2000)
+ }
+ repeat(10) {
+ delay(TimeUnit.SECONDS.toMillis(5))
+ try {
+ Debug.dumpHprofData(Date().toFileName())
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ }
+ }
+ delay(TimeUnit.HOURS.toMillis(1))
+ subscription.dispose()
+ }
+
+ private fun Date.toFileName(): String = SimpleDateFormat("yyyyMMdd_HH_mm_ss", Locale.getDefault()).format(this) + ".hprof"
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/mogo/functions/test/RxJavaSchedulersTest.kt b/app/src/androidTest/java/com/mogo/functions/test/RxJavaSchedulersTest.kt
new file mode 100644
index 0000000000..58ac995932
--- /dev/null
+++ b/app/src/androidTest/java/com/mogo/functions/test/RxJavaSchedulersTest.kt
@@ -0,0 +1,76 @@
+package com.mogo.functions.test
+
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import com.mogo.eagle.core.function.main.MainLauncherActivity
+import io.reactivex.Observable
+import io.reactivex.ObservableOnSubscribe
+import io.reactivex.schedulers.Schedulers
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.TimeUnit.SECONDS
+
+@RunWith(AndroidJUnit4::class)
+@LargeTest
+class RxJavaSchedulersTest {
+
+ lateinit var launch: ActivityScenario
+
+ @Before
+ fun before() {
+ launch = ActivityScenario.launch(MainLauncherActivity::class.java)
+ }
+
+ @Test
+ fun testRxJavaIoSchedulers() = runBlocking {
+ val list = mutableListOf()
+ for (i in 1..10) {
+ list += i
+ }
+ val result = Observable.fromIterable(list)
+ .doOnNext {
+ assert(Thread.currentThread().name.startsWith("io-pool-"))
+ }
+ .subscribeOn(Schedulers.io())
+ .reduce(0) { adder, toAdd ->
+ val sum = adder + toAdd
+ sum
+ }
+ .blockingGet()
+ assert(result == 55)
+
+ delay(SECONDS.toMillis(20))
+ }
+
+ @Test
+ fun testRxJavaCpuSchedulers() = runBlocking {
+ val result = Observable.create(ObservableOnSubscribe { emitter ->
+ for (i in 1..10) {
+ emitter.onNext(i)
+ }
+ assert(Thread.currentThread().name.startsWith("cpu-pool-"))
+ emitter.onComplete()
+ }).reduce(0) { adder, toAdd ->
+ adder + toAdd
+ }.subscribeOn(Schedulers.computation()).blockingGet()
+ assert(result == 55)
+ delay(SECONDS.toMillis(20))
+ }
+
+ @Test
+ fun testRxJavaIntervalSchedulers() = runBlocking {
+ var counter = 0
+ Observable.intervalRange(0, 10, 1, 1 ,SECONDS)
+ .doOnNext {
+ counter ++
+ }
+ .subscribe()
+ delay(SECONDS.toMillis(20))
+ assert(counter == 10)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java
index 21f685837a..46fb18b8dc 100644
--- a/app/src/main/java/com/mogo/launcher/MogoApplication.java
+++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java
@@ -1,27 +1,17 @@
package com.mogo.launcher;
-import com.apm.insight.AttachUserData;
-import com.apm.insight.CrashType;
-import com.apm.insight.MonitorCrash;
-import com.apm.insight.log.VLog;
import com.auto.zhidao.logsdk.CrashSystem;
-import com.bytedance.apm.insight.ApmInsight;
-import com.bytedance.apm.insight.ApmInsightInitConfig;
-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.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.data.config.HdMapBuildConfig;
+import com.mogo.eagle.core.data.config.HmiBuildConfig;
+import com.mogo.eagle.core.data.constants.MoGoConfig;
import com.mogo.eagle.core.function.main.MainMoGoApplication;
-import com.mogo.module.v2x.utils.ObuConfig;
+import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.test.crashreport.CrashReportConstants;
-import com.mogo.utils.AppUtils;
-import com.mogo.utils.CommonUtils;
-import com.mogo.utils.logger.LogLevel;
-import com.mogo.utils.logger.Logger;
-import com.mogo.utils.storage.SharedPrefsMgr;
-
-import java.util.HashMap;
-import java.util.Map;
/**
* @author congtaowang
@@ -30,14 +20,12 @@ import java.util.Map;
* Launcher application
*/
public class MogoApplication extends MainMoGoApplication {
- private static final String BYTEAMP_APPID = "302368";
@Override
protected void initCrashConfig() {
CrashSystem crashSystem = CrashSystem.getInstance(this);
crashSystem.init();
- initCrash();
- initApmInsight();
+
//设置debug模式,日志不上传
crashSystem.setDebug(BuildConfig.DEBUG);
}
@@ -48,95 +36,15 @@ public class MogoApplication extends MainMoGoApplication {
Logger.init(BuildConfig.DEBUG ? LogLevel.DEBUG : LogLevel.OFF);
}
- private void initCrash() {
-
- MonitorCrash crash = MonitorCrash.init(this, BYTEAMP_APPID, CommonUtils.getVersionCode(this), CommonUtils.getVersionName(this))
- .setCustomDataCallback(new AttachUserData() {
- @Override
- public Map extends String, ? extends String> getUserData(CrashType type) {
- HashMap map = new HashMap<>();
-// map.put("app_custom", "app_value");
- //SN
- map.put("serial", MoGoAiCloudClientConfig.getInstance().getSn());
- //地图版本
- String mapSDKVersion = AppUtils.getCustomMapSDKVersion(getApplicationContext());
- map.put("MAP_SDK_VERSION", mapSDKVersion);
- return map;
- }
- });
- crash.config().setChannel("eagle");
-// crash.config().setDeviceId("did");//可选,可以设置自定义did,不设置会使用内部默认的
-// crash.setReportUrl("www.xxx.com"); // 私有化部署:私有化部署才配置上报地址
-// crash.addTags("key", "value"); // 自定义筛选tag, 按需添加、可多次覆盖
- }
-
- /**
- * ApmInsight性能监控初始化
- */
- private void initApmInsight() {
-
- ApmInsightInitConfig.Builder builder = ApmInsightInitConfig.builder();
- //设置分配的appid
- builder.aid(BYTEAMP_APPID);
- //是否开启卡顿功能
- builder.blockDetect(true);
- //是否开启严重卡顿功能
- builder.seriousBlockDetect(true);
- //是否开启流畅性和丢帧
- builder.fpsMonitor(true);
- //控制是否打开WebVeiw监控
- builder.enableWebViewMonitor(true);
- //控制是否打开内存监控
- builder.memoryMonitor(true);
- //控制是否打开电量监控
- builder.batteryMonitor(true);
- //是否打印日志,注:线上release版本要配置为false
- builder.debugMode(true);
- //支持用户自定义user_id把平台数据和自己用户关联起来,可以不配置
-// builder.userId("user_id");
- //私有化部署:配置数据上报的域名 (私有化部署才需要配置,内部有默认域名),测试支持设置http://www.xxx.com 默认是https协议
-// builder.defaultReportDomain("www.xxx.com");
- //设置渠道。1.3.16版本增加接口
- builder.channel("local");
- //打开自定义日志回捞能力,1.4.1版本新增接口
- builder.enableLogRecovery(true);
- //设置数据和Rangers Applog数据打通,设备标识did必填。1.3.16版本增加接口
-// builder.setDynamicParams(new IDynamicParams() {
-// @Override
-// public String getUserUniqueID() {
-// //可选。依赖AppLog可以通过AppLog.getUserUniqueID()获取,否则可以返回null。
-// return null;
-// }
-//
-// @Override
-// public String getAbSdkVersion() {
-// //可选。如果依赖AppLog可以通过AppLog.getAbSdkVersion()获取,否则可以返回null。
-// return null;
-// }
-//
-// @Override
-// public String getSsid() {
-// //可选。依赖AppLog可以通过AppLog.getSsid()获取,否则可以返回null。
-// return null;
-// }
-//
-// @Override
-// public String getDid() {
-// //1.4.0版本及以上,可选,其他版本必填。设备的唯一标识,如果依赖AppLog可以通过 AppLog.getDid() 获取,也可以自己生成。
-// return AppLog.getDid();
-// }
-// });
- ApmInsight.getInstance().init(this, builder.build());
-
- //初始化自定日志,配置自定义日志最大占用磁盘,内部一般配置20,代表最大20M磁盘占用。1.4.1版本开始存在这个api
- VLog.init(this, 20);
-
- }
-
@Override
protected void initCloudClientConfig() {
// todo 使用旧Socket链路 true = 旧链路,false = 新链路
- //clientConfig.setUseOriginSocket(true);
+ if (DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxi")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchBus")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxiPassenger")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchBusPassenger")) {
+ clientConfig.setUseOriginSocket(true);
+ }
}
@Override
@@ -144,16 +52,13 @@ public class MogoApplication extends MainMoGoApplication {
DebugConfig.setNetMode(BuildConfig.NET_ENV);
DebugConfig.setDebug(BuildConfig.DEBUG);
DebugConfig.setLaunchLocationService(BuildConfig.LAUNCH_LOCATION_SERVICE);
- DebugConfig.setUseCustomNavi(BuildConfig.USE_CUSTOM_NAVI);
DebugConfig.setLauncher(BuildConfig.IS_LAUNCHER);
- DebugConfig.setActiveAIAssistFlag(BuildConfig.AI_ASSIST_ACTIVE_STAUTS);
DebugConfig.setUseMockObuData(false);
DebugConfig.setCarMachineType(BuildConfig.CAR_MACHINE_TYPE);
DebugConfig.setProductFlavor(BuildConfig.FLAVOR_product);
DebugConfig.setSocketAppId(BuildConfig.SOCKET_APP_ID);
DebugConfig.setScheduleCalculateNotHomeCompanyDistanceForPush(BuildConfig.IS_SUPPORT_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH);
DebugConfig.setMapBased(BuildConfig.IS_MAP_BASED);
- DebugConfig.setNeedHideAdasWhenShare(BuildConfig.IS_NEED_HIDE_ADAS_WHEN_SHARE);
DebugConfig.setNeedUploadCoordinatesInTime(BuildConfig.IS_NEED_UPLOAD_COORDINATES_IN_TIME);
DebugConfig.setObuType(SharedPrefsMgr.getInstance(this).getInt("OBU_TYPE", DebugConfig.OBU_TYPE_CIDI));
@@ -161,19 +66,49 @@ public class MogoApplication extends MainMoGoApplication {
AppConfigInfo.INSTANCE.setWorkingBranchName(BuildConfig.WORKING_BRANCH_NAME);
AppConfigInfo.INSTANCE.setWorkingBranchHash(BuildConfig.WORKING_BRANCH_HASH);
- ObuConfig.useObuLocation = false;
// 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU
FunctionBuildConfig.gpsProvider = BuildConfig.GPS_PROVIDER;
- // 配置BuglyAppID
+ // 演示模式,上一次勾选的数据
+ FunctionBuildConfig.isDemoMode = BuildConfig.IS_DEMO_MODE;
+ // app安装的身份信息
+ FunctionBuildConfig.appIdentityMode = BuildConfig.APP_IDENTITY_MODE;
+ // 不同身份对应不同的IP地址
+ FunctionBuildConfig.adasConnectIP = BuildConfig.ADAS_CONNECT_IP;
+
+ // 配置BuglyAppID:MoGoEagleEye
CrashReportConstants.buglyAppID = "ac71228f85";
- /* // TODO 这里是演示代码使用,控制HMI展示元素
- HmiBuildConfig.isShowSpeedView = false;
- HmiBuildConfig.isShowAutopilotStatusView = false;
- HmiBuildConfig.isShowPerspectiveSwitchView = false;
- HmiBuildConfig.isShowCheckStatusView = false;*/
- // TODO 这里指定自车模型 R.raw.xiaobache--小巴车,R.raw.chuzuche--出租车
- //HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche;
+ if (DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxi")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchBus")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxiPassenger")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchBusPassenger")) {
+ //控制HMI展示元素 将不用手动调用setXXXXXViewVisibility
+ HmiBuildConfig.isShowSpeedView = false;
+ HmiBuildConfig.isShowAutopilotStatusView = false;
+ HmiBuildConfig.isShowPerspectiveSwitchView = false;
+ HmiBuildConfig.isShowToolsView = false;
+ HmiBuildConfig.isShowBadCaseView = false;
+ //业务端可以根据需要控制是否展示刹车和转向灯的ui
+// HmiBuildConfig.isShowBrakeLightView = false;
+// HmiBuildConfig.isShowTurnLightView = false;
+ }
+
+ if (DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxi")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxiPassenger")) {
+ HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche;
+ } else if (DebugConfig.getProductFlavor().equals("fPadLenovoOchBus")
+ || DebugConfig.getProductFlavor().equals("fPadLenovoOchBusPassenger")) {
+ HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache;
+ HmiBuildConfig.isShowBrakeLightView = false;
+ HmiBuildConfig.isShowTurnLightView = false;
+ }
+
+ }
+
+ @Override
+ protected void initConfigWithSP() {
+ // 是否是演示(美化)模式,会存在SP中,方便做现场恢复
+ FunctionBuildConfig.isDemoMode = SharedPrefsMgr.getInstance(this).getBoolean(MoGoConfig.IS_DEMO_MODE, false);
}
}
diff --git a/build.gradle b/build.gradle
index 8d71cf9739..aa98125141 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,6 +4,7 @@ apply from: "javadoc.gradle"
buildscript {
repositories {
+
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url "https://artifact.bytedance.com/repository/byteX/" }
maven { url 'http://nexus.zhidaoauto.com/repository/maven-releases/' }
@@ -32,6 +33,9 @@ buildscript {
classpath "com.bytedance.android.byteX:base-plugin:0.3.0"
classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}"
classpath 'com.volcengine:apm_insight_plugin:1.4.1'
+ classpath 'com.mogo.cloud:thread_opt:1.0.1'
+ classpath 'com.mogo.cloud:systrace:1.0.1'
+
// classpath "com.bytedance.android.byteX:base-plugin:0.3.0"
// classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}"
diff --git a/config.gradle b/config.gradle
index 2d221db552..fd0958357f 100644
--- a/config.gradle
+++ b/config.gradle
@@ -99,8 +99,8 @@ ext {
videoprocessor : "com.zhidao.video:video-processor:1.0.2.1",
livesdk : "com.tencent.liteavsdk:LiteAVSDK_Smart:7.4.9211",
- coroutinescore : "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3",
- coroutinesandroid : "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3",
+ coroutinescore : "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2",
+ coroutinesandroid : "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2",
aspectj : "org.aspectj:aspectjrt:1.8.9",
@@ -114,7 +114,7 @@ ext {
obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3",
mogoobu : 'com.zhidao.support.obu:mogoobu:1.0.0.19',
mogoami : 'com.zhidao.support.obu.ami:mogoami:1.0.0.10',
- adasHigh : 'com.zhidao.support.adas:high:1.2.1.2',
+ adasHigh : 'com.zhidao.support.adas:high:1.2.1.2_bate21',
// google
googlezxing : "com.google.zxing:core:3.3.3",
@@ -147,6 +147,7 @@ ext {
mogomap : "com.mogo.map:mogo-map:${MOGO_MAP_VERSION}",
mogomapapi : "com.mogo.map:mogo-map-api:${MOGO_MAP_API_VERSION}",
mogocustommap : "com.zhidaoauto.machine:map:${MAP_SDK_VERSION}",
+ mogocustommapoperational : "com.zhidaoauto.map:operational:${MAP_SDK_OPERATION_VERSION}",
modulecommon : "com.mogo.module:module-common:${MOGO_MODULE_COMMON_VERSION}",
modulemain : "com.mogo.module:module-main:${MOGO_MODULE_MAIN_VERSION}",
@@ -162,7 +163,6 @@ ext {
// V2X
moduleV2x : "com.mogo.module:module-v2x:${MOGO_MODULE_V2X_VERSION}",
- moduleADAS : "com.mogo.module:mogo-module-adas:${MOGO_MODULE_ADAS_VERSION}",
modulesearch : "com.mogo.module:module-search:${MOGO_MODULE_SEARCH_VERSION}",
// push
modulepush : "com.mogo.module:module-push:${MOGO_MODULE_PUSH_VERSION}",
@@ -188,6 +188,7 @@ ext {
skinsupportlight : "com.mogo.skin:skin-light:${MOGO_SKIN_LIGHT_VERSION}",
crashreport : "com.mogo.test:crashreport:${CRASHREPORT_VERSION}",
crashreportbugly : "com.mogo.test:crashreport-bugly:${CRASHREPORT_BUGLY_VERSION}",
+ crashreportapmbyte : "com.mogo.test:crashreport-apmbyte:${CRASHREPORT_APMBYTE_VERSION}",
crashreportnoop : "com.mogo.test:crashreport-noop:${CRASHREPORT_NOOP_VERSION}",
crashreportupgrade : "com.mogo.test:crashreport-upgrade:${CRASHREPORT_UPGRADE_VERSION}",
skinsupportbase : "com.mogo.skin:skin-support-base:${SKIN_SUPPORT_VERSION}",
@@ -195,6 +196,9 @@ ext {
skinsupportcardview : "com.mogo.skin:skin-support-cardview:${SKIN_SUPPORT_CARDVIEW_VERSION}",
skinsupportconstraintlayout : "com.mogo.skin:skin-support-constraint-layout:${SKIN_SUPPORT_CONSTRAINT_LAYOUT_VERSION}",
skinsupportdesign : "com.mogo.skin:skin-support-design:${SKIN_SUPPORT_DESIGN_VERSION}",
+ apm_insight : 'com.volcengine:apm_insight:1.4.4.cn',
+ apm_insight_crash : 'com.volcengine:apm_insight_crash:1.4.2',
+
//========================= TTS语音 Maven 版本管理 =========================
ttsbase : "com.mogo.tts:tts-base:${TTS_BASE_VERSION}",
ttsdi : "com.mogo.tts:tts-di:${TTS_DI_VERSION}",
@@ -238,6 +242,23 @@ ext {
mogo_core_utils : "com.mogo.eagle.core:utils:${MOGO_CORE_UTILS_VERSION}",
mogo_core_network : "com.mogo.eagle.core:network:${MOGO_CORE_NETWORK_VERSION}",
+ //========================= V2X SDK =========================
+ mogo_v2x : "com.mogo.v2x:v2x:${MOGO_V2X_SDK_VERSION}",
+
+ life_cycle_scope : "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0",
+ view_model_scope : "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0",
+ live_data_scope : "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0",
+ life_cycle_java8 : "androidx.lifecycle:lifecycle-common-java8:2.2.0",
+
+
+ //========================== Unit Test ======================
+ androidx_test_core : "androidx.test:core:1.2.1",
+ androidx_test_core_ktx : "androidx.test:core-ktx:1.2.0",
+ androidx_unit_ext : "androidx.test.ext:junit:1.1.2",
+ androidx_unit_ext_ktx : "androidx.test.ext:junit-ktx:1.1.2",
+ androidx_runner : "androidx.test:runner:1.3.0",
+ androidx_espresso_core : "androidx.test.espresso:espresso-core:3.3.0"
+
]
}
\ No newline at end of file
diff --git a/core/README.md b/core/README.md
index 034c05e8b2..ba2ca3c14f 100644
--- a/core/README.md
+++ b/core/README.md
@@ -2,13 +2,16 @@
本模块用来编写鹰眼核型功能
- function-impl 目录下编写的都是对mogo-core-function-api定的功能实现,
- - mogo-core-function-check 程序及车辆检测模块
- - mogo-core-function-hmi UI呈现及交互模块
- - mogo-core-function-map 地图相关的模块
- - mogo-core-function-notice 云端公告、调度相关模块
- - mogo-core-function-obu-mogo 自研OBU预警模块
- - mogo-core-function-smp 小地图模块
- - mogo-core-function-v2x 自车+云端预警模块
+ - mogo-core-function-check 程序及车辆检测模块
+ - mogo-core-function-devatools 开发工具模块
+ - mogo-core-function-hmi UI呈现及交互模块
+ - mogo-core-function-main 主入口
+ - mogo-core-function-map 地图相关的模块
+ - mogo-core-function-monitoring 远距离监控查看,路测摄像头、前车直播
+ - mogo-core-function-notice 云端公告、调度相关模块
+ - mogo-core-function-obu-mogo 自研OBU预警模块
+ - mogo-core-function-smp 小地图模块
+ - mogo-core-function-v2x 自车+云端预警模块
- mogo-core-data:定义基础业务所需要的数据结构
diff --git a/core/function-impl/mogo-core-function-autopilot/build.gradle b/core/function-impl/mogo-core-function-autopilot/build.gradle
index 0cf2df7226..0dd305e15c 100644
--- a/core/function-impl/mogo-core-function-autopilot/build.gradle
+++ b/core/function-impl/mogo-core-function-autopilot/build.gradle
@@ -52,15 +52,24 @@ dependencies {
kapt rootProject.ext.dependencies.aroutercompiler
implementation rootProject.ext.dependencies.adasHigh
+ implementation rootProject.ext.dependencies.mogoami
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
+ implementation rootProject.ext.dependencies.modulecommon
+ implementation rootProject.ext.dependencies.moduleservice
+
implementation rootProject.ext.dependencies.mogo_core_data
implementation rootProject.ext.dependencies.mogo_core_utils
+ implementation rootProject.ext.dependencies.mogo_core_network
implementation rootProject.ext.dependencies.mogo_core_function_api
implementation rootProject.ext.dependencies.mogo_core_function_call
} else {
+ implementation project(':modules:mogo-module-common')
+ implementation project(':modules:mogo-module-service')
+
implementation project(':core:mogo-core-data')
implementation project(':core:mogo-core-utils')
+ implementation project(':core:mogo-core-network')
implementation project(':core:mogo-core-function-api')
implementation project(':core:mogo-core-function-call')
}
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt
index 0a59085289..fc67de4c1f 100644
--- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt
@@ -6,13 +6,22 @@ import androidx.annotation.RequiresPermission
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.autopilot.AutopilotControlCmdParameter
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
+import com.mogo.eagle.core.data.config.FunctionBuildConfig
+import com.mogo.eagle.core.data.constants.MoGoConfig
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotProvider
+import com.mogo.eagle.core.function.api.map.collect.IMoGoMapDataCollectProvider
+import com.mogo.eagle.core.function.autopilot.adapter.MoGoAdasListenerImpl
+import com.mogo.eagle.core.function.autopilot.adapter.MoGoAdasMsgConnectStatusListenerImpl
+import com.mogo.eagle.core.function.autopilot.adapter.MoGoHandAdasMsgManager
import com.mogo.eagle.core.function.autopilot.server.AsyncDataToAutopilotServer
+import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
+import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.GsonUtils
-import com.mogo.eagle.core.utilcode.util.LogUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.zhidao.support.adas.high.AdasManager
+import com.zhidao.support.adas.high.bean.IPCUpgradeInfo
import com.zhidao.support.adas.high.common.CupidLogUtils
import java.util.concurrent.TimeUnit
@@ -23,16 +32,46 @@ import java.util.concurrent.TimeUnit
*/
@Route(path = MogoServicePaths.PATH_AUTO_PILOT)
class MoGoAutopilotProvider :
- IMoGoAutopilotProvider {
+ IMoGoAutopilotProvider, IMoGoMapDataCollectProvider.OnMapCollectCmdListener {
private val TAG = "MoGoAutoPilotProvider"
+ private var mContext: Context? = null
override val functionName: String
get() = TAG
override fun init(context: Context) {
+ MoGoHandAdasMsgManager.getInstance();
+ Logger.d(TAG, "初始化工控机连接……")
+ mContext = context
// 初始化ADAS 域控制器
- //AdasManager.getInstance().create(context)
+ CupidLogUtils.setEnableLog(false)
+ CupidLogUtils.setIsWriteLog(false)
+ // TODO 临时方案,根据不同的身份标识,连接不同的工控机IP
+ when (FunctionBuildConfig.appIdentityMode) {
+ 0x00 -> // 司机
+ {
+ CallerMapDataCollectorManager.registerOnMapCollectTaskListener(this)
+ AdasManager.getInstance().create(context, FunctionBuildConfig.adasConnectIP)
+ }
+ 0x01 -> // 乘客
+ {
+ // 乘客端默认接收绘制全局路径+引导线
+ //FunctionBuildConfig.isDemoMode = true
+ //FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true
+ AdasManager.getInstance().create(context, FunctionBuildConfig.adasConnectIP)
+ }
+ else -> // 默认采用UDP寻址方式
+ AdasManager.getInstance().create(context)
+ }
+ //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听/////////////////////////////////////////////
+ // 监听 adas 连接状态
+ AdasManager.getInstance().setOnAdasConnectStatusListener(MoGoAdasMsgConnectStatusListenerImpl())
+ // 监听ADAS-SDK获取到的工控机数据
+ AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl())
+ // 同步数据给工控机的服务
AsyncDataToAutopilotServer.INSTANCE.initServer()
+ // 同步是否开启美化模式
+ setDemoMode(FunctionBuildConfig.isDemoMode)
}
/**
@@ -47,6 +86,8 @@ class MoGoAutopilotProvider :
ThreadUtils.executeBySingleWithDelay(object : ThreadUtils.SimpleTask() {
@RequiresPermission(permission.INTERNET)
override fun doInBackground(): String {
+ // 保存本地 AutoPilot IP地址
+ mContext?.let { SharedPrefsMgr.getInstance(it).putString(MoGoConfig.AUTOPILOT_IP, autoPilotIp) }
// 设置IP地址
AdasManager.getInstance().setIPCIp(autoPilotIp)
// 打开通讯连接
@@ -60,12 +101,22 @@ class MoGoAutopilotProvider :
}, 1000, TimeUnit.MILLISECONDS)
}
+ override fun onMapCollectStart(cmdId: Int, cmdTime: Long) {
+ val result = recordPackage(2, cmdId)
+ Logger.d(TAG, "开始记录包: [$cmdId, $result]")
+ }
+
+ override fun onMapCollectEnd(cmdId: Int, cmdTime: Long) {
+ val result = stopRecord(2, cmdId)
+ Logger.d(TAG, "结束记录包: [$cmdId, $result]")
+ }
+
override fun startAutoPilot(result: AutopilotControlParameters) {
if (AdasManager.getInstance().isSocketConnect) {
val parameter = AutopilotControlCmdParameter("aiCloudToStartAutopilot", result)
AdasManager.getInstance().aiCloudToAdasData(GsonUtils.toJson(parameter))
} else {
- LogUtils.eTag(TAG, "车机与工控机链接失败,无法开启自动驾驶")
+ Logger.e(TAG, "车机与工控机链接失败,无法开启自动驾驶")
}
}
@@ -77,12 +128,25 @@ class MoGoAutopilotProvider :
if (AdasManager.getInstance().isSocketConnect) {
AdasManager.getInstance().controlAutopilotCarHead()
} else {
- LogUtils.eTag(TAG, "车机与工控机链接失败,无法断开自动驾驶")
+ Logger.e(TAG, "车机与工控机链接失败,无法断开自动驾驶")
}
}
override fun recordPackage(): Boolean {
- return AdasManager.getInstance().recordPackage(1, (System.currentTimeMillis() / 1000).toInt())
+ return AdasManager.getInstance()
+ .recordPackage(1, (System.currentTimeMillis() / 1000).toInt())
+ }
+
+ override fun recordPackage(type: Int, id: Int): Boolean {
+ return AdasManager.getInstance().recordPackage(type, id)
+ }
+
+ override fun recordPackage(type: Int, id: Int, duration: Int): Boolean {
+ return AdasManager.getInstance().recordPackage(type, id, duration)
+ }
+
+ override fun stopRecord(type: Int, id: Int): Boolean {
+ return AdasManager.getInstance().stopRecord(type, id)
}
override fun setEnableLog(isEnableLog: Boolean) {
@@ -94,10 +158,62 @@ class MoGoAutopilotProvider :
}
override fun onDestroy() {
-
+ CallerMapDataCollectorManager.unRegisterOnMapCollectTaskListener(this)
}
override fun setAutoPilotSpeed(speed: Int): Boolean {
return AdasManager.getInstance().setSpeed(speed)
}
+
+ override fun setIPCShutDown() {
+ AdasManager.getInstance().shutdownIPC()
+ }
+
+ override fun setIPCReboot() {
+ AdasManager.getInstance().rebootIPC()
+ }
+
+ override fun recordCause(key: String?, name: String?, id: String?, reason: String?) {
+ AdasManager.getInstance().recordCause(key, name, id, reason)
+ }
+
+ /**
+ * 工控机升级确认
+ */
+ override fun setIPCUpgradeAffirm() {
+ AdasManager.getInstance().sendBaseInfo(IPCUpgradeInfo.affirm());
+ }
+
+ /**
+ * 工控机升级取消
+ */
+ override fun setIPCUpgradeCancel() {
+ AdasManager.getInstance().sendBaseInfo(IPCUpgradeInfo.cancel());
+ }
+
+ /**
+ * 演示模式(美化模式)
+ * isEnable = true 开启
+ * isEnable = false 关闭
+ */
+ override fun setDemoMode(isEnable: Boolean) {
+ if (isEnable) {
+ AdasManager.getInstance().enableDemoMode()
+ } else {
+ AdasManager.getInstance().disableDemoMode()
+ }
+ }
+
+ /**
+ * 办公室调试使用,强制开启自动驾驶,将 status,pilotmode,control_pilotmode,强追设置为 1
+ * isEnable = true 开启
+ * isEnable = false 关闭
+ */
+ override fun setControlAutopilotCarAuto(isEnable: Boolean) {
+ if (isEnable) {
+ AdasManager.getInstance().controlAutopilotCarAuto()
+ } else {
+ AdasManager.getInstance().controlAutopilotCarHead()
+ }
+ }
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.java
new file mode 100644
index 0000000000..a2b9997f1f
--- /dev/null
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.java
@@ -0,0 +1,325 @@
+package com.mogo.eagle.core.function.autopilot.adapter;
+
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo;
+import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult;
+import com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotWarnMessage;
+import com.mogo.eagle.core.data.config.HdMapBuildConfig;
+import com.mogo.eagle.core.data.traffic.TrafficData;
+import com.mogo.eagle.core.function.autopilot.utils.AdasObjectConvertUtils;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.datacenter.SnapshotLocationDataCenter;
+import com.mogo.module.service.MarkerServiceHandler;
+import com.mogo.module.service.timedelay.TimeDelayUploadManager;
+import com.zhidao.support.adas.high.AdasManager;
+import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.bean.AutopilotRoute;
+import com.zhidao.support.adas.high.bean.AutopilotStatus;
+import com.zhidao.support.adas.high.bean.AutopilotWayArrive;
+import com.zhidao.support.adas.high.bean.CarLaneInfo;
+import com.zhidao.support.adas.high.bean.CarStateInfo;
+import com.zhidao.support.adas.high.bean.IPCUpgradeStateInfo;
+import com.zhidao.support.adas.high.bean.LightStatueInfo;
+import com.zhidao.support.adas.high.bean.ObstaclesInfo;
+import com.zhidao.support.adas.high.bean.RectInfo;
+import com.zhidao.support.adas.high.bean.SSHResult;
+import com.zhidao.support.adas.high.bean.TrajectoryInfo;
+import com.zhidao.support.adas.high.bean.WarnMessageInfo;
+import com.zhidao.support.adas.high.bean.guardian.AutopilotGuardianInfo;
+import com.zhidao.support.adas.high.bean.record.AutopilotRecordResult;
+import com.zhidao.support.obu.ami.AmiClientManager;
+
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author congtaowang
+ * @since 2020/10/22
+ *
+ * 适配ADAS 回调监听分发
+ */
+public class MoGoAdasListenerImpl implements OnAdasListener {
+ private final String TAG = "OnAdasListenerAdapter";
+
+
+ @Override
+ public void onRectData(RectInfo rectInfo) {
+ if (HdMapBuildConfig.isMapLoaded) {
+ ArrayList recognizedListResults = AdasObjectConvertUtils.INSTANCE.regroupTrafficDataData(rectInfo.getModels());
+ CallerAutopilotIdentifyListenerManager.INSTANCE.invokeAutopilotIdentifyDataUpdate(recognizedListResults);
+ }
+ }
+
+ @Override
+ public void onCarStateData(CarStateInfo carStateInfo) {
+ if (HdMapBuildConfig.isMapLoaded) {
+// Logger.d(TAG, "--------carStateInfo.toString() = " + carStateInfo.toString());
+ //can数据转发
+ CarStateInfo.ValuesBean bean = carStateInfo.getValues();
+// Log.w("DHY-location", bean.getLon() + "," + bean.getLat() + " OnAdasListenerAdapter-onCarStateData:");
+ if (bean != null) {
+ int turnLight = bean.getTurnLightOften(); //转向灯状态 0是正常 1是左转 2是右转
+ AmiClientManager.getInstance().setTurnLightState(turnLight);
+ int brakeLight = bean.getBrake_light(); //TODO
+// Logger.d(TAG, "onCarStateData ---- turnLight = " + turnLight + "---brakeLight = " + brakeLight);
+ //设置转向灯
+ CallerHmiManager.INSTANCE.showTurnLight(turnLight);
+ //设置刹车信息
+ CallerHmiManager.INSTANCE.showBrakeLight(brakeLight);
+ } else {
+ Logger.e(TAG, "bean == null ");
+ }
+ AutopilotCarStateInfo autopilotCarStateInfo = AdasObjectConvertUtils.INSTANCE.fromAdasCarStateInfoObject(carStateInfo);
+ // 将数据通过数据中心分发出去
+ CallerAutopilotCarStatusListenerManager.INSTANCE.invokeAutopilotCarStateData(autopilotCarStateInfo);
+ // 同步给MAP地图
+ adasCarDataCallback(autopilotCarStateInfo);
+ }
+ }
+
+
+ public void adasCarDataCallback(@Nullable AutopilotCarStateInfo stateInfo) {
+
+ //模拟数据时,不更新由工控机传输的自车位置
+ if (TimeDelayUploadManager.getInstance().isMock()) {
+ return;
+ }
+
+ if (stateInfo != null && stateInfo.getValues() != null) {
+ //Logger.d(TAG,"同步自车数据给地图……");
+
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().setLastLat(stateInfo.getValues().getLat());
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().setLastLon(stateInfo.getValues().getLon());
+ MogoApisHandler.getInstance().getApis().getAdasControllerApi().setSatelliteTime(stateInfo.getValues().getSatelliteTime());
+ JSONObject data = new JSONObject();
+ try {
+ data.putOpt("lon", stateInfo.getValues().getLon());
+ data.putOpt("lat", stateInfo.getValues().getLat());
+ data.putOpt("alt", stateInfo.getValues().getAlt());
+ data.putOpt("speed", stateInfo.getValues().getGnss_speed());
+ data.putOpt("heading", stateInfo.getValues().getHeading());
+ data.putOpt("acceleration", stateInfo.getValues().getAcceleration());
+ data.putOpt("yawRate", stateInfo.getValues().getYaw_rate());
+ data.putOpt("gpsProvider", 1);
+ try {
+ data.putOpt("systemTime", Long.parseLong(stateInfo.getValues().getSystemTime()));
+ } catch (Exception e) {
+// e.printStackTrace();
+ }
+ try {
+ data.putOpt("satelliteTime", Long.parseLong(stateInfo.getValues().getSatelliteTime()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ data.putOpt("receiverDataTime", Long.parseLong(stateInfo.getValues().getReceiverDataTime()));
+ } catch (Exception e) {
+// e.printStackTrace();
+ }
+ try {
+ data.putOpt("adasSatelliteTime", Long.parseLong(stateInfo.getValues().getAdasSatelliteTime()));
+ } catch (Exception e) {
+// e.printStackTrace();
+ }
+ MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map(data);
+ SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo(data);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void autopilotStatus(AutopilotStatus autopilotStatus) {
+ if (HdMapBuildConfig.isMapLoaded) {
+ AutopilotStatus.ValuesBean autopilotStatusValues = autopilotStatus.getValues();
+
+ if (autopilotStatusValues != null) {
+ // 初始化自动驾驶状态信息
+ AutopilotStatusInfo autopilotStatusInfo = CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo();
+ autopilotStatusInfo.setState(autopilotStatusValues.getState());
+ autopilotStatusInfo.setPilotmode(autopilotStatusValues.getPilotmode());
+ autopilotStatusInfo.setControl_pilotmode(autopilotStatusValues.getControl_pilotmode());
+ autopilotStatusInfo.setReason(autopilotStatusValues.getReason());
+ autopilotStatusInfo.setCamera(autopilotStatusValues.getCamera());
+ autopilotStatusInfo.setRtk(autopilotStatusValues.getRtk());
+ autopilotStatusInfo.setRadar(autopilotStatusValues.getRadar());
+ autopilotStatusInfo.setSpeed(autopilotStatusValues.getSpeed());
+ // 初始化自动驾驶状态信息
+ if (autopilotStatusInfo.getVersion() == null) {
+ autopilotStatusInfo.setVersion(AdasManager.getInstance().getAdasConfig().getVersion());
+ }
+ if (autopilotStatusInfo.getConnectIP() == null) {
+ autopilotStatusInfo.setConnectIP(AdasManager.getInstance().getAdasConfig().getAddress());
+ }
+ if (autopilotStatusInfo.getDockVersion() == null) {
+ autopilotStatusInfo.setDockVersion(AdasManager.getInstance().getAdasConfig().getDockVersion());
+ }
+
+ CallerAutoPilotStatusListenerManager.INSTANCE.invokeAutoPilotStatus();
+ }
+ }
+ }
+
+ @Override
+ public void autopilotArrive(AutopilotWayArrive autopilotWayArrive) {
+ if (HdMapBuildConfig.isMapLoaded) {
+ Logger.d(TAG, "autopilotArrive : " + autopilotWayArrive);
+ if (autopilotWayArrive != null) {
+ AutopilotWayArrive.ResultBean result = autopilotWayArrive.getResult();
+ if (result != null) {
+ AutopilotWayArrive.ResultBean.EndLatLonBean endLatLon = result.getEndLatLon();
+ if (endLatLon != null) {
+ AutopilotStationInfo stationInfo = new AutopilotStationInfo(result.getCarType(), endLatLon.getLon(), endLatLon.getLat());
+
+ CallerAutoPilotStatusListenerManager.INSTANCE.invokeArriveAtStation(stationInfo);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onAutopilotRoute(AutopilotRoute route) {
+ if (HdMapBuildConfig.isMapLoaded) {
+ Logger.d(TAG, "onAutopilotRoute : " + route.toString());
+ AutopilotRouteInfo autopilotRoute = AdasObjectConvertUtils.INSTANCE.fromAdasAutopilotRoute(route);
+ CallerAutopilotPlanningListenerManager.INSTANCE.invokeAutopilotRotting(autopilotRoute);
+ }
+ }
+
+ @Override
+ public void onAutopilotTrajectory(List trajectoryList) {
+ if (HdMapBuildConfig.isMapLoaded) {
+ Logger.d(TAG, "onAutopilotTrajectory : " + trajectoryList);
+ ArrayList trajectoryInfoArrayList = new ArrayList<>();
+ if (trajectoryList != null && trajectoryList.size() > 0) {
+ for (TrajectoryInfo trajectory : trajectoryList) {
+ ADASTrajectoryInfo adasTrajectoryInfo = new ADASTrajectoryInfo();
+ adasTrajectoryInfo.setLat(trajectory.getLat());
+ adasTrajectoryInfo.setLon(trajectory.getLon());
+ adasTrajectoryInfo.setAcceleration(trajectory.getAcceleration());
+ adasTrajectoryInfo.setAccumulatedDis(trajectory.getAccumulatedDis());
+ adasTrajectoryInfo.setTime(trajectory.getTime());
+ adasTrajectoryInfo.setVelocity(trajectory.getVelocity());
+ adasTrajectoryInfo.setAlt(trajectory.getAlt());
+ adasTrajectoryInfo.setKappa(trajectory.getKappa());
+ adasTrajectoryInfo.setTheta(trajectory.getTheta());
+ trajectoryInfoArrayList.add(adasTrajectoryInfo);
+ }
+ Log.e(TAG, "time:" + System.currentTimeMillis() + "trajectoryInfoArrayList:" + trajectoryInfoArrayList);
+ }
+ CallerAutopilotPlanningListenerManager.INSTANCE.invokeAutopilotTrajectory(trajectoryInfoArrayList);
+ }
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+ CallerAutoPilotStatusListenerManager.INSTANCE.invokeAutopilotSNRequest();
+ }
+
+ @Override
+ public void onAutopilotGuardian(AutopilotGuardianInfo guardianInfo) {
+ if (HdMapBuildConfig.isMapLoaded) {
+ AutopilotGuardianStatusInfo autopilotRoute = AdasObjectConvertUtils.INSTANCE.fromAutopilotGuardianInfo(guardianInfo);
+ CallerAutoPilotStatusListenerManager.INSTANCE.invokeAutopilotGuardian(autopilotRoute);
+ }
+ }
+
+ @Override
+ public void onAutopilotRecord(AutopilotRecordResult result) {
+ if (result != null) {
+ AutoPilotRecordResult real = new AutoPilotRecordResult();
+ real.setDiskFree(result.getDiskFree());
+ real.setId(result.getId());
+ real.setDuration(result.getDuration());
+ real.setNote(result.getNote());
+ real.setTotal(result.getTotalSize());
+ real.setType(result.getType());
+ real.setFileName(result.getFilename());
+ real.setKey(result.getKey());
+ real.setStat(result.getStat());
+ real.setTimestamp(result.getTimestamp());
+ CallerAutopilotIdentifyListenerManager.INSTANCE.invokeAutopilotRecordResult(real);
+ }
+ }
+
+
+ @Override
+ public void onLightStateData(LightStatueInfo lightStatueInfo) {
+
+ }
+
+ @Override
+ public void onObstaclesInfo(ObstaclesInfo obstaclesInfo) {
+
+ }
+
+ @Override
+ public void onCarLaneInfo(CarLaneInfo carLaneInfo) {
+
+ }
+
+
+ @Override
+ public void onWarnMessage(WarnMessageInfo warnMessageInfo) {
+ final AutopilotWarnMessage warnMessage = AdasObjectConvertUtils.INSTANCE.fromAdasObject(warnMessageInfo);
+ CallerAutopilotIdentifyListenerManager.INSTANCE.invokeAutopilotWarnMessage(warnMessage);
+ }
+
+ @Override
+ public void onVideoSize(int width, int height) {
+
+ }
+
+ /**
+ * 工控机升级状态
+ *
+ * @param info 工控机升级状态
+ */
+ @Override
+ public void onUpgradeStateInfo(IPCUpgradeStateInfo info) {
+ if (info != null) {
+ Logger.d(TAG, "onUpgradeStateInfo " +
+ " upgrade mode=" + info.getUpgradeMode() +
+ " download status=" + info.getDownloadStatus() +
+ " download progress current=" + info.getProgress().getCurrent() +
+ " download progress total=" + info.getProgress().getTotal() +
+ " download version=" + info.getImages() +
+ " upgrade status=" + info.getUpgradeStatus());
+ CallerHmiManager.INSTANCE.showAdUpgradeStatus(info.getUpgradeMode(), info.getDownloadStatus(), info.getProgress().getCurrent(),
+ info.getProgress().getTotal(), info.getImages(), info.getUpgradeStatus());
+ } else {
+ Logger.d(TAG, "onUpgradeStateInfo : upgrade state info is null");
+ }
+ }
+
+ /**
+ * 命令返回结果
+ * @param info 结果返回实体
+ */
+ @Override
+ public void onSSHResult(SSHResult info) {
+ if(info!=null && "docker restart autocar_default_1".equals(info.cmd)){
+ CallerHmiManager.INSTANCE.showDockerRebootResult(info.code, info.msg);
+ }else{
+ Logger.d(TAG,"onSSHResult : result info is null");
+ }
+ }
+}
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt
new file mode 100644
index 0000000000..91731111c7
--- /dev/null
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt
@@ -0,0 +1,106 @@
+package com.mogo.eagle.core.function.autopilot.adapter
+
+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.data.autopilot.AutopilotStationInfo
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
+import com.mogo.eagle.core.data.constants.MoGoConfig
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
+import com.mogo.eagle.core.function.autopilot.network.AdasServiceModel
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
+import com.zhidao.support.adas.high.AdasManager
+import com.zhidao.support.adas.high.OnAdasMsgConnectStatusListener
+import com.zhidao.support.adas.high.bean.BasicInfo
+import io.reactivex.Flowable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import java.util.concurrent.TimeUnit
+
+/**
+ * ADAS-SDK与工控机连接状态回调
+ *
+ * @author donghongyu
+ */
+class MoGoAdasMsgConnectStatusListenerImpl : OnAdasMsgConnectStatusListener, IMoGoAutopilotStatusListener {
+ private val TAG = "MoGoAdasMsgConnectStatusListenerImpl"
+
+ //自动驾驶状态
+ private var mCurrentAutopilotStatus = -1
+
+ //自动驾驶车速度
+ private var mCurrentAutopilotSpeed = 0f
+
+ override fun onWebSocketConnectSuccess() {
+ Logger.d(TAG, "webSocket 连接成功")
+ // 初始化自动驾驶状态信息
+ CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = AdasManager.getInstance().adasConfig.address
+ CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = true
+ CallerAutoPilotStatusListenerManager.invokeAutoPilotStatus()
+
+ // 同步SN给工控机
+ syncBasicInfoToAutopilot()
+
+ // 开启轮训上传自动驾驶状态
+ updateDriveStatusTask()
+ }
+
+ override fun onWebSocketConnectFailed(reason: String) {
+ Logger.d(TAG, "webSocket 连接失败 reason:$reason")
+ CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = AdasManager.getInstance().adasConfig.address
+ CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = false
+ CallerAutoPilotStatusListenerManager.invokeAutoPilotStatus()
+ }
+
+ /**
+ * 工控机获取SN
+ */
+ override fun onAutopilotSNRequest() {
+ syncBasicInfoToAutopilot()
+ }
+
+ override fun onAutopilotArriveAtStation(autopilotWayArrive: AutopilotStationInfo?) {
+ if (autopilotWayArrive != null) {
+ val lon = autopilotWayArrive.lon
+ val lat = autopilotWayArrive.lat
+ AdasServiceModel.getInstance().reportSite(lon, lat)
+ }
+ }
+
+ override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
+ val state = autoPilotStatusInfo.state
+ val speed = autoPilotStatusInfo.speed
+ mCurrentAutopilotStatus = state
+ mCurrentAutopilotSpeed = speed
+ }
+
+ /**
+ * 同步SN信息给工控机
+ */
+ private fun syncBasicInfoToAutopilot() {
+ Logger.d(TAG, "同步PAD的SN给工控机……")
+ val info = BasicInfo()
+ // 设置PAD-SN给工控
+ info.setSn(MoGoAiCloudClientConfig.getInstance().sn)
+ // 设置网络环境
+ info.setNetEnvironment(DebugConfig.getNetMode())
+ AdasManager.getInstance().setBasicInfo(info)
+ }
+
+ /**
+ * 上传自动驾驶状态任务
+ */
+ private fun updateDriveStatusTask() {
+ Logger.d(TAG, "updateDriveStatusTask")
+ Flowable.interval(0, 5, TimeUnit.SECONDS)
+ .subscribeOn(Schedulers.io())
+ .unsubscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe { aLong: Long? ->
+ AdasServiceModel.getInstance().updateDriveStatus(mCurrentAutopilotStatus, mCurrentAutopilotSpeed)
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAutopilotStatusListenerImpl.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAutopilotStatusListenerImpl.java
deleted file mode 100644
index b4ef89d40c..0000000000
--- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAutopilotStatusListenerImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.mogo.eagle.core.function.autopilot.adapter;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
-import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
-import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
-
-/**
- * @author xiaoyuzhou
- * @date 2021/10/20 1:02 下午
- * 自动驾驶状态回调用
- */
-public class MoGoAutopilotStatusListenerImpl implements IMoGoAutopilotStatusListener {
- @Override
- public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) {
-
- }
-
- @Override
- public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo autopilotWayArrive) {
-
- }
-
-
- @Override
- public void onAutopilotSNRequest() {
-
- }
-
- @Override
- public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo guardianInfo) {
-
- }
-
-}
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java
new file mode 100644
index 0000000000..319a1a79c7
--- /dev/null
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java
@@ -0,0 +1,85 @@
+package com.mogo.eagle.core.function.autopilot.adapter;
+
+import androidx.annotation.Nullable;
+
+import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult;
+import com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo;
+import com.mogo.eagle.core.data.autopilot.AutopilotWarnMessage;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.data.traffic.TrafficData;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager;
+import com.mogo.eagle.core.utilcode.util.ThreadUtils;
+import com.mogo.module.common.drawer.IdentifyDataDrawer;
+import com.zhidao.support.obu.ami.AmiClientManager;
+
+import java.util.ArrayList;
+
+public class MoGoHandAdasMsgManager implements
+ IMoGoAutopilotIdentifyListener,
+ IMoGoAutopilotCarStateListener {
+
+ private final String TAG = "AdasEventManager";
+
+ private static volatile MoGoHandAdasMsgManager moGoHandAdasMsgManager;
+
+ private MoGoHandAdasMsgManager() {
+ CallerAutopilotIdentifyListenerManager.INSTANCE.addListener(TAG, this);
+ CallerAutopilotCarStatusListenerManager.INSTANCE.addListener(TAG, this);
+ }
+
+ public static MoGoHandAdasMsgManager getInstance() {
+ if (moGoHandAdasMsgManager == null) {
+ synchronized (MoGoHandAdasMsgManager.class) {
+ if (moGoHandAdasMsgManager == null) {
+ moGoHandAdasMsgManager = new MoGoHandAdasMsgManager();
+ }
+ }
+ }
+ return moGoHandAdasMsgManager;
+ }
+
+
+ @Override
+ public void onAutopilotCarStateData(@Nullable AutopilotCarStateInfo autoPilotCarStateInfo) {
+ // 获取的自动驾驶车辆信息不是空的时候
+ if (autoPilotCarStateInfo != null) {
+ //can数据转发
+ AutopilotCarStateInfo.ValuesBean bean = autoPilotCarStateInfo.getValues();
+ if (bean != null) {
+ //转向灯状态 0是正常 1是左转 2是右转
+ int turnLight = bean.getTurn_light();
+ AmiClientManager.getInstance().setTurnLightState(turnLight);
+ }
+ }
+ }
+
+
+ @Override
+ public void onAutopilotIdentifyDataUpdate(@Nullable ArrayList trafficData) {
+ try {
+ if (FunctionBuildConfig.isDrawIdentifyData) {
+ ThreadUtils.getSinglePool().execute(() ->
+ IdentifyDataDrawer.getInstance().renderAdasRecognizedResult(trafficData)
+ );
+ } else {
+ IdentifyDataDrawer.getInstance().clearOldMarker();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onAutopilotWarnMessage(@Nullable AutopilotWarnMessage autopilotWarnMessage) {
+
+ }
+
+
+ @Override
+ public void onAutopilotRecordResult(AutoPilotRecordResult result) {
+
+ }
+}
\ No newline at end of file
diff --git a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/entity/AutonomousDriveStatusBean.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java
similarity index 93%
rename from modules/mogo-module-adas/src/main/java/com/mogo/module/adas/entity/AutonomousDriveStatusBean.java
rename to core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java
index e4bba0a1e2..2557f03e5e 100644
--- a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/entity/AutonomousDriveStatusBean.java
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/AutonomousDriveStatusBean.java
@@ -1,4 +1,4 @@
-package com.mogo.module.adas.entity;
+package com.mogo.eagle.core.function.autopilot.entity;
/**
* Created by XuYong on 2021/5/28 16:12
diff --git a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/entity/ReportSiteBean.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java
similarity index 92%
rename from modules/mogo-module-adas/src/main/java/com/mogo/module/adas/entity/ReportSiteBean.java
rename to core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java
index ed0f765e2e..9b1f9f4328 100644
--- a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/entity/ReportSiteBean.java
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/entity/ReportSiteBean.java
@@ -1,4 +1,4 @@
-package com.mogo.module.adas.entity;
+package com.mogo.eagle.core.function.autopilot.entity;
/**
* Created by XuYong on 2021/5/31 16:24
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java
new file mode 100644
index 0000000000..009c446151
--- /dev/null
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/AdasServiceModel.java
@@ -0,0 +1,98 @@
+package com.mogo.eagle.core.function.autopilot.network;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.context.ContextHolderUtil;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.function.autopilot.entity.AutonomousDriveStatusBean;
+import com.mogo.eagle.core.function.autopilot.entity.ReportSiteBean;
+import com.mogo.eagle.core.network.RequestOptions;
+import com.mogo.eagle.core.network.SubscribeImpl;
+import com.mogo.eagle.core.network.utils.GsonUtil;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.constants.HostConst;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+
+/**
+ * 将自动驾驶状态及站点信息上传给云平台,云平台会根据此数据做路线的绘制
+ *
+ * @author dongghongyu
+ */
+public class AdasServiceModel {
+
+ private static final String TAG = "AdasServiceModel";
+ private static volatile AdasServiceModel instance;
+ private static final byte[] obj = new byte[0];
+
+ private final IAdasApiService mAdasApiService;
+
+ private AdasServiceModel() {
+ this.mAdasApiService = MogoApisHandler.getInstance().getApis().getNetworkApi().create(IAdasApiService.class, HostConst.DATA_SERVICE_HOST);
+ }
+
+ public static AdasServiceModel getInstance() {
+ if (instance == null) {
+ synchronized (obj) {
+ if (instance == null) {
+ instance = new AdasServiceModel();
+ }
+ }
+ }
+ return instance;
+ }
+
+ public void updateDriveStatus(int autoPilotStatus, float autoPilotSpeed) {
+ String sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ AutonomousDriveStatusBean request = new AutonomousDriveStatusBean(sn, autoPilotStatus, autoPilotSpeed);
+ RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request));
+ mAdasApiService.updateAutonomousDriveStatus(requestBody).
+ subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new SubscribeImpl(RequestOptions.create(ContextHolderUtil.getContext())) {
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ }
+
+ @Override
+ public void onSuccess(BaseData o) {
+ super.onSuccess(o);
+ Logger.d(TAG, "updateDriveStatus success");
+ }
+ });
+ }
+
+ public void reportSite(double lon, double lat) {
+ String sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ ReportSiteBean reportSiteBean = new ReportSiteBean(sn, lon, lat);
+ RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(reportSiteBean));
+ mAdasApiService.updateReportSite(requestBody).
+ subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+ .subscribe(new SubscribeImpl(RequestOptions.create(ContextHolderUtil.getContext())) {
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ }
+
+ @Override
+ public void onSuccess(BaseData o) {
+ super.onSuccess(o);
+ Logger.d(TAG, "autopilotArrive success");
+ }
+ });
+ }
+
+}
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java
new file mode 100644
index 0000000000..b9565cf782
--- /dev/null
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/network/IAdasApiService.java
@@ -0,0 +1,31 @@
+package com.mogo.eagle.core.function.autopilot.network;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import io.reactivex.Observable;
+import okhttp3.RequestBody;
+import retrofit2.http.Body;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+
+public interface IAdasApiService {
+
+ /**
+ * 上传自动驾驶状态接口
+ * @param requestBody
+ * @return
+ */
+ @Headers({"Content-Type:application/json;charset=UTF-8"})
+ @POST("/dataService/autonomousDrive/updateAutonomousDriveStatus")
+ Observable updateAutonomousDriveStatus(@Body RequestBody requestBody);
+
+ /**
+ * 站点上报 用于网约车业务 云平台绘制路线使用
+ * @param requestBody
+ * @return
+ */
+ @Headers({"Content-Type:application/json;charset=UTF-8"})
+ @POST("/dataService/autonomousDrive/reportSite")
+ Observable updateReportSite(@Body RequestBody requestBody);
+
+}
diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/utils/AdasObjectConvertUtils.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/utils/AdasObjectConvertUtils.kt
index d698761766..e729b26521 100644
--- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/utils/AdasObjectConvertUtils.kt
+++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/utils/AdasObjectConvertUtils.kt
@@ -1,10 +1,102 @@
package com.mogo.eagle.core.function.autopilot.utils
+import com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo
+import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo
+import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo
+import com.mogo.eagle.core.data.autopilot.AutopilotWarnMessage
+import com.mogo.eagle.core.data.enums.TrafficTypeEnum
+import com.mogo.eagle.core.data.traffic.TrafficData
+import com.zhidao.support.adas.high.bean.AutopilotRoute
+import com.zhidao.support.adas.high.bean.CarStateInfo
+import com.zhidao.support.adas.high.bean.RectInfo
+import com.zhidao.support.adas.high.bean.WarnMessageInfo
+import com.zhidao.support.adas.high.bean.guardian.AutopilotGuardianInfo
+import com.zhidao.utils.common.GsonUtil
+
/**
* @author xiaoyuzhou
* @date 2021/10/18 1:32 下午
*/
-class AdasObjectConvertUtils {
+object AdasObjectConvertUtils {
+ val TAG = "AdasObjectConvertUtils"
+
+ fun fromAutopilotGuardianInfo(autopilotGuardianInfo: AutopilotGuardianInfo): AutopilotGuardianStatusInfo? {
+ return GsonUtil.objectFromJson(
+ GsonUtil.jsonFromObject(autopilotGuardianInfo),
+ AutopilotGuardianStatusInfo::class.java
+ )
+ }
+
+ fun fromAdasAutopilotRoute(carStateInfo: AutopilotRoute): AutopilotRouteInfo? {
+ return GsonUtil.objectFromJson(
+ GsonUtil.jsonFromObject(carStateInfo),
+ AutopilotRouteInfo::class.java
+ )
+ }
+
+ fun fromAdasCarStateInfoObject(carStateInfo: CarStateInfo): AutopilotCarStateInfo? {
+ return GsonUtil.objectFromJson(
+ GsonUtil.jsonFromObject(carStateInfo),
+ AutopilotCarStateInfo::class.java
+ )
+ }
+
+ fun fromAdasObject(info: WarnMessageInfo?): AutopilotWarnMessage? {
+ if (info == null) {
+ return null
+ }
+ val warnMessage = AutopilotWarnMessage()
+ warnMessage.content = info.content
+ warnMessage.level = info.level
+ try {
+ warnMessage.type = info.type.toInt()
+ } catch (e: NumberFormatException) {
+ return null
+ }
+ warnMessage.value = info.value
+ return warnMessage
+ }
+
+ fun regroupTrafficDataData(datums: List?): ArrayList? {
+ if (datums == null || datums.isEmpty()) {
+ return null
+ }
+ val recognizedListResults: ArrayList = ArrayList()
+ for (model in datums) {
+ if (model == null) {
+ continue
+ }
+ val recognizedListResult = fromAdasTrafficDataObject(model)
+ if (recognizedListResult != null) {
+ recognizedListResults.add(recognizedListResult)
+ }
+ }
+ return recognizedListResults
+ }
+
+ fun fromAdasTrafficDataObject(model: RectInfo.RectBean?): TrafficData? {
+ if (model == null) {
+ return null
+ }
+ val result = TrafficData()
+ result.uuid = model.uuid
+ result.lat = model.lat
+ result.lon = model.lon
+ result.type = TrafficTypeEnum.getType(model.type.toInt())
+ result.heading = model.heading
+ result.systemTime = model.systemTime.toLong()
+ result.satelliteTime = model.satelliteTime.toLong()
+ result.alt = model.alt
+ result.speed = model.speed
+ result.carId = model.carId
+ result.dataAccuracy = model.dataAccuracy
+ result.distance = model.distance
+ result.threatLevel = model.drawlevel
+
+ //Log.d(TAG, "TrafficData = $result")
+ return result
+ }
+
}
diff --git a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt
index e7c6518596..7b375408f3 100644
--- a/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt
+++ b/core/function-impl/mogo-core-function-check/src/main/java/com/mogo/eagle/core/function/check/VehicleMonitoringManager.kt
@@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.check
import android.content.Context
import android.content.Intent
-import android.util.Log
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.api.check.ICheckProvider
@@ -12,14 +11,11 @@ import com.mogo.eagle.core.function.check.net.CheckNetWork.checkNetWork
import com.mogo.eagle.core.function.check.net.CheckResultData
import com.mogo.eagle.core.function.check.view.CheckActivity
import com.mogo.eagle.core.function.check.view.CheckDialog
-import com.mogo.eagle.core.utilcode.util.ActivityUtils
-import com.mogo.eagle.core.utilcode.util.AppUtils
-import com.mogo.eagle.core.utilcode.util.LogUtils
+import com.mogo.eagle.core.utilcode.util.*
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.service.receiver.MogoReceiver
import com.mogo.service.statusmanager.IMogoStatusChangedListener
import com.mogo.service.statusmanager.StatusDescriptor
-import com.mogo.utils.ActivityLifecycleManager
import java.util.concurrent.ConcurrentHashMap
/**
@@ -89,7 +85,7 @@ class VehicleMonitoringManager : ICheckProvider, IMogoStatusChangedListener {
*/
private fun showDialog(context: Context) {
try {
- if (ActivityLifecycleManager.getInstance().isAppActive && AppUtils.isAppRunning(
+ if (AppStateManager.isActive() && AppUtils.isAppRunning(
AppUtils.getAppPackageName()
) && ActivityUtils.getTopActivity() !is CheckActivity
) {
diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt
index d9dfd1b9da..cdff9714ed 100644
--- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt
@@ -9,13 +9,13 @@ import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.network.NetConfig
+import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.module.common.MogoApisHandler
import com.mogo.service.cloud.socket.IMogoOnMessageListener
-import com.mogo.utils.logger.LogLevel
-import com.mogo.utils.logger.Logger
import com.zhidao.loglib.bean.RemoteLogPushContent
import com.zhidao.loglib.call.LogInfoManagerFactory
import com.zhidao.loglib.core.ILogListener
@@ -47,7 +47,7 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl
MogoApisHandler.getInstance().apis
.getSocketManagerApi(AbsMogoApplication.getApp().applicationContext)
.registerOnMessageListener(LOG_PUSH_TYPE, this)
- manualContent.duration = 60
+ manualContent.duration = 10
manualContent.pkgName = context.packageName
}
@@ -98,19 +98,23 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl
private fun startCatchLog(content: RemoteLogPushContent) {
catchingList.add(content.pkgName)
- var delay = (content.duration * 60 * 1000).toLong()
+ var delay = (content.duration).toLong()
handler.removeMessages(MSG_TRY_CLOSE_LOG)
if (delay <= 0) {
// 如果push 下来的delay小于等于0,那就给个默认最大值一小时
- delay = 60 * 60 * 1000L
+ delay = 10
}
- handler.sendEmptyMessageDelayed(MSG_TRY_CLOSE_LOG, delay)
+ handler.sendEmptyMessageDelayed(MSG_TRY_CLOSE_LOG, delay * 1000L * 60)
openLoggerLevel()
logInfoManager = LogInfoManagerFactory.createPushLogInfoManager(
mContext,
MoGoAiCloudClientConfig.getInstance().sn + File.separator + TimeUtils.formatYMD(System.currentTimeMillis()),
- content, this)
+ content, this
+ )
logInfoManager?.start()
+ logInfoManager?.registerLogOutListener { lineLog ->
+ CallerDevaToolsListenerManager.invokeDevaToolsLogCatchLines(lineLog)
+ }
}
private fun stopCatchLog(content: RemoteLogPushContent) {
diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle
index 56eebd3443..a6f481b4a8 100644
--- a/core/function-impl/mogo-core-function-hmi/build.gradle
+++ b/core/function-impl/mogo-core-function-hmi/build.gradle
@@ -53,6 +53,10 @@ dependencies {
implementation rootProject.ext.dependencies.mogoaicloudtrafficlive
kapt rootProject.ext.dependencies.aroutercompiler
+ kapt rootProject.ext.dependencies.androidxroomcompiler
+ implementation rootProject.ext.dependencies.androidxroomruntime
+ implementation rootProject.ext.dependencies.androidxroomktx
+
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.androidxrecyclerview
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml
index 908d7fa563..a606583b11 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml
@@ -38,5 +38,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt
index 18a97b553a..b614320418 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt
@@ -1,12 +1,18 @@
package com.mogo.eagle.core.function.hmi.notification
import android.content.Context
+import android.view.LayoutInflater
import android.view.View
+import androidx.appcompat.view.ContextThemeWrapper
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.ProcessLifecycleOwner
import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern
import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
-import com.mogo.utils.WindowUtils
-import com.mogo.utils.logger.Logger
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
+import com.mogo.eagle.core.utilcode.reminder.Reminder
+import com.mogo.eagle.core.utilcode.reminder.api.impl.ViewReminder
+import com.mogo.eagle.core.utilcode.util.WindowUtils
/**
* @author donghongyu
@@ -33,7 +39,6 @@ class WarningFloat {
}
-
/**
* 浮窗的属性构建类,支持链式调用
*/
@@ -147,6 +152,22 @@ class WarningFloat {
}
}
+ fun setWindowWidth(width: Int) = apply {
+ this.config.width = width
+ }
+
+ fun setWindowHeight(height: Int) = apply {
+ this.config.height = height
+ }
+
+ fun isOverride(isOverride: Boolean) = apply {
+ this.config.isOverride = isOverride
+ }
+
+ fun isEnqueue(enqueue: Boolean) = apply {
+ this.config.isEnqueue = enqueue
+ }
+
/**
* 创建浮窗,包括Activity浮窗和系统浮窗,如若系统浮窗无权限,先进行权限申请
*/
@@ -156,9 +177,66 @@ class WarningFloat {
config.layoutId == null && config.layoutView == null ->
Logger.e(TAG, "需要传入 layoutId 或 layoutView ")
// 申请浮窗权限
- else -> WarningFloatWindowManager.create(activity, config)
+ else -> {
+ var content: View? = null
+ if (config.layoutView != null) {
+ content = config.layoutView
+ } else if (config.layoutId != null) {
+ content = LayoutInflater.from(activity).inflate(config.layoutId!!, null)
+ }
+ if (config.isEnqueue) {
+ content?.let {
+ config.layoutId = null
+ config.layoutView = it
+ Reminder.enqueue(getLifecycleOwner(activity), WarningFloatReminder(activity, config, it))
+ }
+ } else {
+ WarningFloatWindowManager.create(activity, config)
+ }
+ }
}
}
+ private fun getLifecycleOwner(context: Context): LifecycleOwner {
+ if (context is LifecycleOwner) {
+ return context
+ }
+ if (context is ContextThemeWrapper) {
+ return getLifecycleOwner(context.baseContext)
+ }
+ return ProcessLifecycleOwner.get()
+ }
+
+
+ internal class WarningFloatReminder(private val activity: Context, private val config: WarningNotificationConfig, content: View): ViewReminder(content) {
+
+ private var hasShow = false
+
+ override fun show() {
+ hasShow = !WarningFloatWindowManager.create(activity, config)
+ }
+
+ override fun hide() {
+ dismiss(config.floatTag, false)
+ }
+
+ override fun isOverride(): Boolean {
+ return config.isOverride
+ }
+
+ override fun maxProtectDuration(): Long {
+ return if (hasShow) 0L else super.maxProtectDuration()
+ }
+ }
+
+ fun isShow(): Boolean = WarningFloatWindowManager.getHelper(config.floatTag)?.isShow() ?: false
+
+ fun resetExpireTime(expireTime: Long) {
+ if (!isShow()) {
+ return
+ }
+ WarningFloatWindowManager.getHelper(config.floatTag)?.resetDownTime(expireTime)
+ }
}
+
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt
index fa8f7bedfc..566fb26c10 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt
@@ -12,12 +12,11 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.WindowManager
-import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.notification.anim.AnimatorManager
import com.mogo.eagle.core.function.hmi.notification.enums.ShowPattern
import com.mogo.eagle.core.function.hmi.notification.widget.ParentFrameLayout
-import com.mogo.utils.WindowUtils
-import com.mogo.utils.logger.Logger
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
+import com.mogo.eagle.core.utilcode.util.WindowUtils
/**
* @author donghongyu
@@ -66,8 +65,8 @@ internal class WarningFloatWindowHelper(
// 没有边界限制,允许窗口扩展到屏幕外
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
else WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- width = WindowManager.LayoutParams.WRAP_CONTENT
- height = WindowManager.LayoutParams.WRAP_CONTENT
+ width = config.width
+ height = config.height
// 如若设置了固定坐标,直接定位
if (config.locationPair != Pair(0, 0)) {
@@ -132,6 +131,11 @@ internal class WarningFloatWindowHelper(
}
}
+ fun resetDownTime(expireTime: Long) {
+ config.countDownTime = expireTime
+ resetDownTime()
+ }
+
/**
* 入场动画
*/
@@ -293,5 +297,5 @@ internal class WarningFloatWindowHelper(
windowManager.updateViewLayout(view, params)
}
-
+ fun isShow(): Boolean = config.isShow
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt
index a4b640d1d8..856bcd8934 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowManager.kt
@@ -18,15 +18,17 @@ internal object WarningFloatWindowManager {
* 创建浮窗,tag不存在创建,tag存在创建失败
* 创建结果通过tag添加到相应的map进行管理
*/
- fun create(context: Context, config: WarningNotificationConfig) {
+ fun create(context: Context, config: WarningNotificationConfig): Boolean {
if (!checkTag(config)) {
val helper = WarningFloatWindowHelper(context, config)
if (helper.createWindow()) windowMap[config.floatTag!!] = helper
+ return true
} else {
Log.w(TAG, "存在相同的tag,延长弹窗时间")
// 存在相同的tag,直接创建失败
config.callbacks?.createdResult(false, "存在相同的tag,延长弹窗时间", null)
windowMap[config.floatTag!!]?.resetDownTime()
+ return false
}
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt
index edb0f3e1d1..722c037e3d 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt
@@ -1,6 +1,7 @@
package com.mogo.eagle.core.function.hmi.notification
import android.view.View
+import android.view.WindowManager
import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
import com.mogo.eagle.core.function.hmi.notification.enums.ShowPattern
import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern
@@ -59,4 +60,12 @@ data class WarningNotificationConfig(
// Callbacks
var callbacks: OnFloatCallbacks? = null,
- )
\ No newline at end of file
+ // 窗口宽度
+ var width: Int = WindowManager.LayoutParams.WRAP_CONTENT,
+
+ // 窗口高度
+ var height: Int = WindowManager.LayoutParams.WRAP_CONTENT
+ ) {
+ var isEnqueue: Boolean = false
+ var isOverride: Boolean = true
+}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt
index f80831999c..675ed6ddda 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt
@@ -7,7 +7,7 @@ import android.view.View
import android.view.WindowManager
import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern
import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator
-import com.mogo.utils.WindowUtils
+import com.mogo.eagle.core.utilcode.util.WindowUtils
import kotlin.math.min
/**
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/NoticeNormalBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/NoticeNormalBroadcastReceiver.kt
index 9f44cb8aa0..93fad68c28 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/NoticeNormalBroadcastReceiver.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/NoticeNormalBroadcastReceiver.kt
@@ -4,15 +4,11 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.alibaba.android.arouter.launcher.ARouter
-import com.mogo.module.common.enums.EventTypeEnum
-import com.mogo.eagle.core.function.hmi.WaringConst
import com.mogo.service.IMogoServiceApis
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.notice.NoticeNormalData
-import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.util.SharedPrefs
-import com.mogo.utils.logger.Logger
/**
* 用于普通云公告的测试
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/TurnLightBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/TurnLightBroadcastReceiver.kt
new file mode 100644
index 0000000000..5fcdff1252
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/TurnLightBroadcastReceiver.kt
@@ -0,0 +1,50 @@
+package com.mogo.eagle.core.function.hmi.receiver
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+import com.alibaba.android.arouter.launcher.ARouter
+import com.mogo.eagle.core.data.constants.MogoServicePaths
+import com.mogo.eagle.core.data.notice.NoticeNormalData
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showBrakeLight
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showTurnLight
+import com.mogo.eagle.core.function.hmi.WaringConst
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
+import com.mogo.eagle.core.utilcode.util.SharedPrefs
+import com.mogo.service.IMogoServiceApis
+
+/**
+ * 转向灯,刹车
+ *
+ * @author lixiaopeng
+ */
+class TurnLightBroadcastReceiver : BroadcastReceiver() {
+
+ companion object {
+ private const val TAG = "TurnLightBroadcastReceiver"
+ }
+
+ override fun onReceive(context: Context, intent: Intent) {
+ try {
+ val type = intent.getIntExtra("type", 0)
+ val lightInt = intent.getIntExtra("light", 0)
+ showTurnLight(type, lightInt)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+
+ private fun showTurnLight( //type 1,转向灯,2刹车
+ type: Int,
+ lightInt: Int
+ ) {
+ if (type == 1) {
+ showTurnLight(lightInt) //设置转向灯
+ } else if (type == 2) {
+ showBrakeLight(lightInt) //设置刹车信息
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt
index 03c9780f2b..554c398818 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt
@@ -7,8 +7,8 @@ import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.WaringConst
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.service.IMogoServiceApis
-import com.mogo.utils.logger.Logger
/**
* V2X 预警广播接收。用于跨应用,跨进程,内部也可以通过这种方式 控制限速标志
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XTrafficLightBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XTrafficLightBroadcastReceiver.kt
index 3d6b064735..9cfd191f6c 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XTrafficLightBroadcastReceiver.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XTrafficLightBroadcastReceiver.kt
@@ -7,8 +7,8 @@ import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.WaringConst
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.service.IMogoServiceApis
-import com.mogo.utils.logger.Logger
/**
* V2X 预警广播接收。用于跨应用,跨进程,内部也可以通过这种方式 触发红绿灯场景
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt
index d5b6f7e4d3..3e435c02db 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt
@@ -7,9 +7,9 @@ import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.WaringConst
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.module.common.enums.EventTypeEnum
import com.mogo.service.IMogoServiceApis
-import com.mogo.utils.logger.Logger
/**
* V2X 预警广播接收。用于跨应用,跨进程,内部也可以通过这种方式弹出预警提示框
@@ -78,12 +78,6 @@ class V2XWarningBroadcastReceiver : BroadcastReceiver() {
if (EventTypeEnum.TYPE_USECASE_ID_IVP.poiType == v2xType.toString()) {
CallerHmiManager.showLimitingVelocity(1)
}
- CallerHmiManager.showWarningV2X(
- v2xType,
- alertContent,
- ttsContent,
- tag,
- null
- )
+ CallerHmiManager.showWarningV2X(v2xType, alertContent, ttsContent, tag, null, true, 5000L)
}
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt
index e3161d576c..952cc5fe00 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt
@@ -1,24 +1,35 @@
package com.mogo.eagle.core.function.hmi.ui
import android.animation.Animator
+import android.os.Bundle
+import android.os.Handler
import android.text.TextUtils
import android.util.Log
-import android.view.Gravity
-import android.view.View
-import android.view.WindowManager
+import android.view.*
import android.view.animation.OvershootInterpolator
+import androidx.lifecycle.Lifecycle.Event.ON_DESTROY
+import androidx.lifecycle.LifecycleEventObserver
+import androidx.lifecycle.lifecycleScope
+import androidx.transition.*
import com.alibaba.android.arouter.facade.annotation.Route
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.voice.AIAssist
+import com.mogo.eagle.core.data.autopilot.AdUpgradeStateHelper
+import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.constants.MoGoFragmentPaths
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
import com.mogo.eagle.core.data.notice.NoticeNormalData
import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.call.check.CallerCheckManager
+import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager
import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.WaringConst
@@ -31,12 +42,23 @@ import com.mogo.eagle.core.function.hmi.ui.notice.NoticeBannerView
import com.mogo.eagle.core.function.hmi.ui.notice.NoticeNormalBannerView
import com.mogo.eagle.core.function.hmi.ui.setting.DebugSettingView
import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotAndCheckView
+import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotBadCaseView
+import com.mogo.eagle.core.function.hmi.ui.tools.Repository
+import com.mogo.eagle.core.function.hmi.ui.tools.post
import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView
+import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
+import com.mogo.eagle.core.utilcode.kotlin.onClick
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.module.common.enums.EventTypeEnum
-import com.mogo.utils.logger.Logger
import kotlinx.android.synthetic.main.fragment_hmi.*
+import kotlinx.coroutines.*
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED
+import java.text.SimpleDateFormat
+import java.util.*
+import java.util.concurrent.TimeUnit
/**
* @author xiaoyuzhou
@@ -46,7 +68,7 @@ import kotlinx.android.synthetic.main.fragment_hmi.*
@Route(path = MoGoFragmentPaths.PATH_FRAGMENT_HMI)
class MoGoHmiFragment : MvpFragment(),
IMoGoWaringProvider,
- MoGoWarningContract.View {
+ MoGoWarningContract.View, IMoGoAutopilotIdentifyListener {
private val TAG = "MoGoHmiFragment"
// DebugSettingView
@@ -56,7 +78,6 @@ class MoGoHmiFragment : MvpFragment
// V2X、OBU、云端推送,预警弹窗
private var mWarningFloat: WarningFloat.Builder? = null
- // 通知、云公告弹窗
private var mNoticeFloat: WarningFloat.Builder? = null
// 超视距、路侧、前车直播
@@ -65,9 +86,133 @@ class MoGoHmiFragment : MvpFragment
private var toolsView: AutoPilotAndCheckView? = null
+ private var autoPilotToolsFloat: WarningFloat.Builder? = null
+
// 检测、自动驾驶速度设置
private var toolsViewFloat: WarningFloat.Builder? = null
+ @Volatile
+ private var autoPilotBadCaseEntrance: View? = null
+
+ private var autoPilotBadCaseView: AutoPilotBadCaseView? = null
+
+ private var onBadCaseShow: (() -> View)? = null
+ private var onBadCaseHide: (() -> Unit)? = null
+
+ companion object {
+ private const val MSG_WHAT_DISMISS_BAD_CASE_ENTRY = 0x1010
+ private val CASE_EXPIRE_DURATION = TimeUnit.HOURS.toMillis(4)
+ }
+
+ @ExperimentalCoroutinesApi
+ private val channel by lazy {
+ Channel(UNLIMITED).also {
+ lifecycleScope.launchWhenResumed {
+ withContext(Dispatchers.Default) {
+ while (!it.isClosedForReceive) {
+ try {
+ val entrance = autoPilotBadCaseEntrance
+ val old = entrance?.getTag(R.id.autopilot_badcase_record) as? AutoPilotRecordResult
+ if (entrance == null || old == null || old.consumed) {
+ Log.d("QQQ", "-- step -- 1 --")
+ var oldT = try {
+ old?.timestamp?.takeIf { it.isNotBlank() }?.let {
+ SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).parse(it)?.time ?: 0L
+ } ?: 0L
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ 0L
+ }
+ var record: AutoPilotRecordResult? = null
+ var newT = try {
+ it.receive()?.also { record = it }?.timestamp?.takeIf { it.isNotBlank() }?.let {
+ SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).parse(it)?.time
+ ?: 0L
+ } ?: 0L
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ 0L
+ }
+
+ if (oldT == 0L || (newT > 0L && (newT - oldT > 0L) && (newT - oldT) < CASE_EXPIRE_DURATION)) {
+ Log.d("QQQ", "-- step -- 2 --")
+ record?.takeIf { it.key != old?.key && it.timestamp != old?.timestamp }?.also {
+ Log.d("QQQ", "record: [$record] is displaying and consuming ~~~" )
+ showBadCaseEntrance(it)
+ }
+ continue
+ }
+
+ while (oldT != 0L && newT != 0L && (newT - oldT) >= CASE_EXPIRE_DURATION) {
+ Log.d("QQQ", "record: [$record] has been discarded, because it has been timeout." )
+ oldT = newT
+ newT = try {
+ it.receive()?.also {
+ record = it
+ }?.timestamp?.takeIf { it.isNotBlank() }?.let {
+ SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).parse(it)?.time ?: 0L
+ } ?: 0L
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ 0L
+ }
+ }
+ record?.takeIf { it.key != old?.key && it.timestamp != old?.timestamp }?.also {
+ Log.d("QQQ", "record: [$record] is displaying for rest ..." )
+ showBadCaseEntrance(it)
+ }
+ } else {
+ withContext(Dispatchers.Main) {
+ entrance.takeIf { it.visibility != View.VISIBLE }?.also {
+ (entrance.parent as? ViewGroup)?.let { g ->
+ TransitionManager.beginDelayedTransition(g, AutoTransition())
+ }
+ it.visibility = View.VISIBLE
+ }
+ }
+ Log.d("QQQ", "record: [$old] hasn't been consumed~~~~" )
+ }
+ } finally {
+ delay(1000)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private val handler by lazy {
+ Handler(Handler.Callback { it ->
+ if (it.what == MSG_WHAT_DISMISS_BAD_CASE_ENTRY) {
+ val entrance = autoPilotBadCaseEntrance
+ if (entrance != null && entrance.visibility == View.VISIBLE) {
+ val record = entrance.getTag(R.id.autopilot_badcase_record) as? AutoPilotRecordResult
+ record?.consumed = true
+ record?.let { itx ->
+ lifecycleScope.launch(Dispatchers.IO) {
+ try {
+ val i = Repository.dao().deleteRecord(itx)
+ Log.d("QQQ", "delete result: $i")
+ } catch (t: Throwable) {
+ Log.d("QQQ", "---- delete error: ${t.message}")
+ }
+ }
+ }
+ dismissBadCaseFloatView()
+ if (entrance.visibility != View.GONE) {
+ (entrance.parent as? ViewGroup)?.let { g ->
+ TransitionManager.beginDelayedTransition(g, AutoTransition())
+ }
+ entrance.visibility = View.GONE
+ onBadCaseHide?.invoke()
+ }
+ }
+ return@Callback true
+ }
+ return@Callback false
+ })
+ }
+
override fun vipIdentification(visible: Boolean) {
ThreadUtils.runOnUiThread {
Logger.d(TAG, "vipIdentification")
@@ -99,50 +244,243 @@ class MoGoHmiFragment : MvpFragment
}
viewShowDebugView.setOnLongClickListener {
- Log.d(TAG, "长按显示状态工具栏")
- context?.let {
- if (mDebugSettingViewFloat != null) {
- WarningFloat.dismiss(mDebugSettingViewFloat!!.config.floatTag, false)
- mDebugSettingViewFloat = null
- mDebugSettingView = null
- } else {
- if (mDebugSettingView == null) {
- mDebugSettingView = DebugSettingView(it)
- }
- mDebugSettingViewFloat = WarningFloat.with(it)
- .setTag("DebugSettingView")
- .setLayout(mDebugSettingView!!)
- .setSidePattern(SidePattern.RIGHT)
- .setGravity(Gravity.RIGHT, offsetY = 70)
- .setImmersionStatusBar(true)
- .setAnimator(object : DefaultAnimator() {
- override fun enterAnim(
- view: View,
- params: WindowManager.LayoutParams,
- windowManager: WindowManager,
- sidePattern: SidePattern
- ): Animator? =
- super.enterAnim(view, params, windowManager, sidePattern)
- ?.apply {
- interpolator = OvershootInterpolator()
- }
-
- override fun exitAnim(
- view: View,
- params: WindowManager.LayoutParams,
- windowManager: WindowManager,
- sidePattern: SidePattern
- ): Animator? =
- super.exitAnim(view, params, windowManager, sidePattern)
- ?.setDuration(200)
- })
- .show()
- }
- }
+ toggleDebugView()
true
}
}
+ @OptIn(ExperimentalCoroutinesApi::class)
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
+ lifecycleScope.launchWhenResumed {
+ withContext(Dispatchers.IO) {
+ val dao = Repository.dao()
+ try {
+ dao.getAllUnConsumedRecords()?.forEach {
+ channel.send(it)
+ }
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ }
+ }
+ }
+ }
+
+ @OptIn(ExperimentalCoroutinesApi::class)
+ override fun onAutopilotRecordResult(record: AutoPilotRecordResult?) {
+ record ?: return
+ Log.d("QQQ", "onAutopilotRecordResult:$record")
+ if (record.type == 1 && record.stat == 100) {
+ lifecycleScope.launchWhenResumed {
+ withContext(Dispatchers.IO) {
+ val dao = Repository.dao()
+ try {
+ dao.insertRecord(record)
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ }
+ record.also {
+ channel.send(it)
+ }
+ }
+ }
+ }
+ if (record.type == 2 && (record.stat == 101 || record.stat == 100)) {
+ CallerMapDataCollectorManager.finish(record.id, record.stat, "", record.fileName ?: "", record.note ?: "")
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ CallerAutopilotIdentifyListenerManager.removeListener(TAG)
+ }
+
+ private fun showBadCaseEntrance(record: AutoPilotRecordResult) {
+ Log.d("QQQ", "showBadCaseEntrance:$record")
+ lifecycleScope.launch {
+ if (HmiBuildConfig.isShowBadCaseView) {
+ if (vsBadCaseToolsView?.parent != null) {
+ val inflateView = vsBadCaseToolsView.inflate()
+ autoPilotBadCaseEntrance = inflateView
+ }
+ }
+ val entrance = autoPilotBadCaseEntrance
+ Log.d("QQQ", "show --- 1 ----")
+ if (entrance != null) {
+ if (entrance.visibility != View.VISIBLE) {
+ (entrance.parent as? ViewGroup)?.let { g ->
+ TransitionManager.beginDelayedTransition(g, AutoTransition())
+ }
+ entrance.visibility = View.VISIBLE
+ }
+ entrance.setTag(R.id.autopilot_badcase_record, record)
+ entrance.onClick {
+ showBadCasesFloat {
+ if (it.visibility != View.GONE) {
+ (entrance.parent as? ViewGroup)?.let { g ->
+ TransitionManager.beginDelayedTransition(g, AutoTransition())
+ }
+ it.visibility = View.GONE
+ onBadCaseHide?.invoke()
+ }
+ }
+ }
+ dismissBadCaseEntryAfterSomeTime()
+ } else {
+ val view = onBadCaseShow?.invoke()
+ if (view != null) {
+ view.lifecycleOwner.lifecycle.addObserver(badCaseEntranceObserver)
+ view.visibility = View.GONE
+ autoPilotBadCaseEntrance = view
+ showBadCaseEntrance(record)
+ }
+ }
+ }
+ }
+
+ private val badCaseEntranceObserver = LifecycleEventObserver { _, event ->
+ if (event == ON_DESTROY) {
+ onBadCaseShow = null
+ onBadCaseHide = null
+ autoPilotBadCaseEntrance = null
+ }
+ }
+
+ override fun registerBadCaseCallback(onShow: () -> View, onHide: (() -> Unit)?) {
+ onBadCaseShow = onShow
+ onBadCaseHide = onHide
+ }
+
+ /**
+ * 工控机重启返回结果
+ * @param code
+ * @param msg
+ */
+ override fun showDockerRebootResult(code: Int, msg: String) {
+ ThreadUtils.runOnUiThread{
+ if(code>=-1){
+ //重启成功
+ ToastUtils.showShort("重启成功")
+ }else{
+ //重启失败
+ msg?.let {
+ ToastUtils.showShort(it)
+ }
+ }
+ }
+ }
+
+ private fun showBadCasesFloat(dismiss: (() -> Unit)?) {
+ Log.d("QQQ", "showBadCaseToolsFloat")
+ context?.let { it ->
+ if (autoPilotToolsFloat == null) {
+ if (autoPilotBadCaseView == null) {
+ autoPilotBadCaseView = AutoPilotBadCaseView(it).also { itx ->
+ val record =
+ autoPilotBadCaseEntrance?.getTag(R.id.autopilot_badcase_record) as? AutoPilotRecordResult
+ itx.tag = record
+ itx.onDismiss {
+ dismissBadCaseFloatView()
+ }
+ itx.onSelect {
+ lifecycleScope.launch {
+ try {
+ val params = mutableMapOf()
+ autoPilotBadCaseEntrance?.apply {
+ params["carLicense"] =
+ MoGoAiCloudClientConfig.getInstance().sn
+ params["filename"] = record?.fileName ?: ""
+ params["filesize"] = record?.total.toString()
+ params["key"] = record?.key ?: ""
+ params["reason"] = it.reason ?: ""
+ params["duration"] = record?.duration?.toInt()?.toString() ?: ""
+ params["timestamp"] = record?.timestamp ?: ""
+ }
+ val response = post(params)
+ if (response.isSuccessful) {
+ val body = response.body()
+ if (body == null) {
+ Log.e("QQQ", "返回的body是空的~~~")
+ return@launch
+ }
+ if (body.code == 200) {
+ Logger.i(TAG, "ok:${body}")
+ dismissBadCaseFloatView()
+ dismiss?.invoke()
+ CallerAutoPilotManager.recordCause(
+ record?.key,
+ record?.fileName,
+ it.id, it.reason)
+ ToastUtils.showShort("接管反馈成功~")
+ record?.also {
+ it.consumed = true
+ withContext(Dispatchers.IO) {
+ try {
+ Repository.dao().deleteRecord(record)
+ } catch (t: Throwable) {
+ Log.d("QQQ", "---- delete error 2: ${t.message}")
+ }
+ }
+ }
+ return@launch
+ }
+ Log.e("QQQ", "fail:${body}")
+ }
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ ToastUtils.showShort("网络请求失败,请尝试联网~")
+ Log.e("QQQ", "exception:${t.message}")
+ }
+ }
+ }
+ }
+ }
+ autoPilotToolsFloat = WarningFloat.with(it)
+ .setTag("BadCaseCollectFloat")
+ .setLayout(autoPilotBadCaseView!!)
+ .setSidePattern(SidePattern.LEFT)
+ .setGravity(Gravity.LEFT, offsetY = 72)
+ .setImmersionStatusBar(true)
+ .setAnimator(object : DefaultAnimator() {
+ override fun enterAnim(
+ view: View,
+ params: WindowManager.LayoutParams,
+ windowManager: WindowManager,
+ sidePattern: SidePattern
+ ): Animator? =
+ super.enterAnim(view, params, windowManager, sidePattern)
+ ?.apply {
+ interpolator = OvershootInterpolator()
+ }
+
+ override fun exitAnim(
+ view: View,
+ params: WindowManager.LayoutParams,
+ windowManager: WindowManager,
+ sidePattern: SidePattern
+ ): Animator? =
+ super.exitAnim(view, params, windowManager, sidePattern)
+ ?.setDuration(200)
+ })
+ .addWarningStatusListener(object : IMoGoWarningStatusListener {
+ override fun onDismiss() {
+ autoPilotToolsFloat = null
+ autoPilotBadCaseView = null
+ }
+ })
+ .show()
+ } else {
+ autoPilotToolsFloat?.show()
+ }
+ }
+ }
+
+ private fun dismissBadCaseEntryAfterSomeTime() {
+ handler.removeMessages(MSG_WHAT_DISMISS_BAD_CASE_ENTRY)
+ handler.sendEmptyMessageDelayed(MSG_WHAT_DISMISS_BAD_CASE_ENTRY, CASE_EXPIRE_DURATION)
+ }
+
private fun showToolsFloat() {
Logger.d(TAG, "showToolsFloat")
context?.let {
@@ -159,6 +497,10 @@ class MoGoHmiFragment : MvpFragment
override fun onClose(v: View) {
dismissToolsFloatView()
}
+
+ override fun showDebugPanelView() {
+ toggleDebugView()
+ }
})
}
toolsViewFloat = WarningFloat.with(it)
@@ -167,6 +509,7 @@ class MoGoHmiFragment : MvpFragment
.setSidePattern(SidePattern.LEFT)
.setGravity(Gravity.LEFT, offsetY = 72)
.setImmersionStatusBar(true)
+ .setWindowHeight(WindowManager.LayoutParams.MATCH_PARENT)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
@@ -233,7 +576,6 @@ class MoGoHmiFragment : MvpFragment
} else {
setToolsViewVisibility(View.GONE)
}
-
}
override fun getLayoutId(): Int {
@@ -264,6 +606,52 @@ class MoGoHmiFragment : MvpFragment
ivToolsIcon?.visibility = visibility
}
+ /**
+ * 开关DebugView
+ */
+ override fun toggleDebugView() {
+ Log.d(TAG, "长按显示状态工具栏")
+ context?.let {
+ if (mDebugSettingViewFloat != null) {
+ WarningFloat.dismiss(mDebugSettingViewFloat!!.config.floatTag, false)
+ mDebugSettingViewFloat = null
+ mDebugSettingView = null
+ } else {
+ if (mDebugSettingView == null) {
+ mDebugSettingView = DebugSettingView(it)
+ }
+ mDebugSettingViewFloat = WarningFloat.with(it)
+ .setTag("DebugSettingView")
+ .setLayout(mDebugSettingView!!)
+ .setSidePattern(SidePattern.RIGHT)
+ .setGravity(Gravity.RIGHT, offsetY = 70)
+ .setImmersionStatusBar(true)
+ .setAnimator(object : DefaultAnimator() {
+ override fun enterAnim(
+ view: View,
+ params: WindowManager.LayoutParams,
+ windowManager: WindowManager,
+ sidePattern: SidePattern
+ ): Animator? =
+ super.enterAnim(view, params, windowManager, sidePattern)
+ ?.apply {
+ interpolator = OvershootInterpolator()
+ }
+
+ override fun exitAnim(
+ view: View,
+ params: WindowManager.LayoutParams,
+ windowManager: WindowManager,
+ sidePattern: SidePattern
+ ): Animator? =
+ super.exitAnim(view, params, windowManager, sidePattern)
+ ?.setDuration(200)
+ })
+ .show()
+ }
+ }
+ }
+
/**
* 展示VR下V2X预警
*
@@ -273,73 +661,75 @@ class MoGoHmiFragment : MvpFragment
* @param tag tag绑定弹窗的标志
*/
@Synchronized
- override fun showWarningV2X(
- v2xType: Int,
- alertContent: String?,
- ttsContent: String?,
- tag: String?,
- listenerIMoGo: IMoGoWarningStatusListener?
- ) {
-
- activity?.let {
-
- val notificationView = V2XNotificationView(it)
- notificationView.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType.toString()))
- val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType.toString())
- if (warningContent.isNullOrEmpty()) {
- Logger.e(TAG, "Show warningContent is null or empty!")
- return
- } else {
- notificationView.setWarningContent(warningContent)
- }
-
- if (mWarningFloat != null && mWarningFloat!!.config.floatTag != tag) {
- WarningFloat.dismiss(mWarningFloat!!.config.floatTag, true)
- }
-
- mWarningFloat = WarningFloat.with(it)
- .setTag(tag)
- .setLayout(notificationView)
- .setSidePattern(SidePattern.RESULT_TOP)
- .setCountDownTime(5000)
- .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
- .setImmersionStatusBar(true)
- .addWarningStatusListener(listenerIMoGo)
- .addWarningStatusListener(object : IMoGoWarningStatusListener {
- override fun onShow() {
- // 创建弹窗成功才进行TTS播报
- Logger.d(
+ override fun showWarningV2X(v2xType: Int, alertContent: CharSequence?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long) {
+ lifecycleScope.launchWhenResumed {
+ activity?.let {
+ val floatWindow = mWarningFloat
+ val showTag = floatWindow?.config?.floatTag
+ if (floatWindow == null || TextUtils.isEmpty(showTag) || !floatWindow.isShow() || floatWindow.config.floatTag != tag) {
+ val notificationView = V2XNotificationView(it)
+ notificationView.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType.toString()))
+ val warningContent = alertContent ?: EventTypeEnum.getWarningContent(v2xType.toString())
+ if (warningContent.isEmpty()) {
+ Logger.e(TAG, "Show warningContent is null or empty!")
+ return@launchWhenResumed
+ } else {
+ notificationView.setWarningContent(warningContent)
+ }
+ if (floatWindow != null && floatWindow.isShow()) {
+ WarningFloat.dismiss(floatWindow.config.floatTag, true)
+ }
+ mWarningFloat = WarningFloat.with(it)
+ .setTag(tag)
+ .setLayout(notificationView)
+ .setSidePattern(SidePattern.RESULT_TOP)
+ .setCountDownTime(expireTime)
+ .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
+ .setImmersionStatusBar(true)
+ .isEnqueue(true)
+ .addWarningStatusListener(listenerIMoGo)
+ .addWarningStatusListener(object : IMoGoWarningStatusListener {
+ override fun onShow() {
+ // 创建弹窗成功才进行TTS播报
+ Logger.d(
"MoGoWarningFragment",
"mWarningFloat = $mWarningFloat---ttsContent = $ttsContent"
- )
- if (mWarningFloat != null && !TextUtils.isEmpty(ttsContent)) {
- Logger.d("MoGoWarningFragment", "---> ttsContent = $ttsContent")
- AIAssist.getInstance(activity)
+ )
+ if (mWarningFloat != null && !TextUtils.isEmpty(ttsContent) && playTts) {
+ Logger.d("MoGoWarningFragment", "---> ttsContent = $ttsContent")
+ AIAssist.getInstance(activity)
.speakTTSVoice(ttsContent)
+ }
}
- }
- })
- .setAnimator(object : DefaultAnimator() {
- override fun enterAnim(
+ })
+ .setAnimator(object : DefaultAnimator() {
+ override fun enterAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
- ): Animator? =
+ ): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)?.apply {
interpolator = OvershootInterpolator()
}
- override fun exitAnim(
+ override fun exitAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
- ): Animator? =
+ ): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)?.setDuration(200)
- })
- .show()
-
+ })
+ .show()
+ } else {
+ val notification = floatWindow.config.layoutView as? V2XNotificationView
+ if (alertContent?.isNotEmpty() == true) {
+ notification?.setWarningContent(alertContent)
+ floatWindow.resetExpireTime(expireTime)
+ }
+ }
+ }
}
}
@@ -434,6 +824,10 @@ class MoGoHmiFragment : MvpFragment
flV2XWarningView?.showWarning(direction, closeTime)
}
+ override fun dismissWarning(direction: WarningDirectionEnum) {
+ flV2XWarningView?.dismissWarning(direction)
+ }
+
/**
* 展示云公告顶部弹窗
* @param trafficStylePushData
@@ -641,9 +1035,76 @@ class MoGoHmiFragment : MvpFragment
}
}
+ /**
+ * 显示转向灯效果 if (HmiBuildConfig.isShowBadCaseView) {
+ */
+ override fun showTurnLight(light: Int) {
+ if (HmiBuildConfig.isShowTurnLightView) {
+ //Log.d("liyz", "showTurnLight light = $light")
+ turnLightView.setTurnLight(light)
+ }
+ }
+
+ /**
+ * 显示刹车效果
+ */
+ override fun showBrakeLight(light: Int) {
+ if (HmiBuildConfig.isShowBrakeLightView) {
+// Log.d("liyz", "showBrakeLight light = $light")
+ brakeView.setBrakeLight(light)
+ }
+ }
+
+ override fun setTurnLightFunction(isOpen: Boolean) {
+ HmiBuildConfig.isShowTurnLightView = isOpen
+ }
+
+ override fun setBrakeLightFunction(isOpen: Boolean) {
+ HmiBuildConfig.isShowBrakeLightView = isOpen
+ }
+
+ /**
+ * 展示工控机下载、升级状态信息
+ * @param upgradeMode 升级模式(提示升级、静默升级)
+ * @param downloadStatus 下载状态
+ * @param currentProgress 当前已经下载包体大小
+ * @param totalProgress 下载包体总大小
+ * @param downloadVersion 下载版本
+ * @param upgradeStatus 升级状态
+ */
+ override fun showAdUpgradeStatus(
+ upgradeMode: Int,
+ downloadStatus: Int,
+ currentProgress: Int,
+ totalProgress: Int,
+ downloadVersion: String,
+ upgradeStatus: Int
+ ) {
+ ThreadUtils.runOnUiThread{
+ //如果工控机处于“下载中”、“可升级(下载完成)”、“升级中”、“升级失败”状态时,工具箱入口显示红色角标
+ if(AdUpgradeStateHelper.showUpgradeTips(downloadStatus, upgradeStatus)){
+ viewUpgradeTips.visibility = View.VISIBLE
+ }else{
+ viewUpgradeTips.visibility = View.GONE
+ }
+ //将状态同步到工具箱
+ toolsView?.showAdUpgradeStatus(upgradeMode,downloadStatus, currentProgress, totalProgress, downloadVersion, upgradeStatus)
+ }
+
+ }
+
+ private fun dismissBadCaseFloatView() {
+ autoPilotToolsFloat?.let {
+ WarningFloat.dismiss(it.config.floatTag, false)
+ autoPilotToolsFloat = null
+ autoPilotBadCaseView = null
+ }
+ }
+
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy")
+ handler.removeCallbacksAndMessages(null)
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt
index 0850bb341d..66a91604f8 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/camera/CameraListView.kt
@@ -23,8 +23,8 @@ import com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager
import com.mogo.eagle.core.function.hmi.R
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer
-import com.mogo.utils.logger.Logger
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.model.VideoOptionModel
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsLogView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsLogView.kt
new file mode 100644
index 0000000000..8af3873f7b
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsLogView.kt
@@ -0,0 +1,496 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.ValueAnimator
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.res.Resources
+import android.graphics.PixelFormat
+import android.util.Log
+import android.view.*
+import android.widget.FrameLayout
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+import androidx.core.view.GravityCompat
+import com.mogo.commons.context.ContextHolderUtil
+import com.mogo.eagle.core.utilcode.util.ScreenUtils
+import com.mogo.eagle.core.utilcode.util.Utils
+
+abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener {
+
+ class ViewArgs {
+ var edgePinned = false
+ }
+
+ private val mInnerReceiver = InnerReceiver()
+
+ @JvmField
+ protected var mWindowManager =
+ ContextHolderUtil.getContext().getSystemService(Context.WINDOW_SERVICE) as WindowManager
+
+ /**
+ * 创建FrameLayout#LayoutParams 系统悬浮窗调用
+ */
+ protected var systemLayoutParams: WindowManager.LayoutParams? = null
+
+ /**
+ * 整个悬浮窗的View
+ */
+ private var mRootView: FrameLayout? = null
+
+ /**
+ * rootView的直接子View 一般是用户的xml布局 被添加到mRootView中
+ */
+ private var mChildView: View? = null
+
+ val logView: View?
+ get() = mRootView
+
+ /**
+ * 手势代理
+ */
+ @JvmField
+ var mTouchProxy = TouchProxy(this)
+
+ private val viewProps = ViewArgs()
+
+ /**
+ * 控件在布局边界发生大小变化被裁剪的原因
+ */
+ val parentView: LogFrameLayout?
+ get() = if (mRootView != null) {
+ mRootView!!.parent as LogFrameLayout
+ } else null
+
+ fun show(context: Context) {
+ if (isShow) {
+ Log.d("EmArrow", "isShow : $isShow")
+ return
+ }
+ performCreate(context)
+ createView()
+ onResume()
+ }
+
+ fun dismiss() {
+ removeView()
+ performDestroy()
+ }
+
+ /**
+ * 执行floatPage create
+ *
+ * @param context 上下文环境
+ */
+ @SuppressLint("ClickableViewAccessibility")
+ private fun performCreate(context: Context) {
+ try {
+ //调用onCreate方法
+ onCreate(context)
+
+ //系统悬浮窗的返回按键监听
+ mRootView = object : LogFrameLayout(context, LogFrameLayoutFlag_CHILD) {
+ override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+ if (event.action == KeyEvent.ACTION_UP && shouldDealBackKey()) {
+ //监听返回键
+ if (event.keyCode == KeyEvent.KEYCODE_BACK || event.keyCode == KeyEvent.KEYCODE_HOME) {
+ return onBackPressed()
+ }
+ }
+ return super.dispatchKeyEvent(event)
+ }
+ }
+ //添加根布局的layout回调
+ addViewTreeObserverListener()
+ //调用onCreateView抽象方法
+ mChildView = onCreateView(context, mRootView)
+ //将子View添加到rootView中
+ mRootView?.addView(mChildView)
+ //设置根布局的手势拦截
+ mRootView?.setOnTouchListener { v, event -> mTouchProxy.onTouchEvent(v, event) }
+ //调用onViewCreated回调
+ onViewCreated(mRootView)
+
+ mLogViewLayoutParams = LogViewLayoutParams()
+ //分别创建对应的LayoutParams
+ systemLayoutParams = WindowManager.LayoutParams()
+ //shouldDealBackKey : false 不自己收返回事件处理
+ if (shouldDealBackKey()) {
+ //自己处理返回按键
+ systemLayoutParams?.flags =
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+ mLogViewLayoutParams.flags =
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or LogViewLayoutParams.FLAG_LAYOUT_NO_LIMITS
+ } else {
+ //设置WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE会导致RootView监听不到返回按键的监听失效 系统处理返回按键
+ systemLayoutParams?.flags =
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+ mLogViewLayoutParams.flags =
+ LogViewLayoutParams.FLAG_NOT_FOCUSABLE or LogViewLayoutParams.FLAG_LAYOUT_NO_LIMITS
+ }
+ systemLayoutParams?.apply {
+ format = PixelFormat.TRANSPARENT
+ gravity = GravityCompat.START or Gravity.TOP
+ }
+ mLogViewLayoutParams.gravity = GravityCompat.START or Gravity.TOP
+ //动态注册关闭系统弹窗的广播
+ val intentFilter = IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)
+ context.registerReceiver(mInnerReceiver, intentFilter)
+ initViewLayoutParams(mLogViewLayoutParams)
+ onSystemLayoutParamsCreated()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ private fun createView() {
+ mWindowManager.addView(logView, systemLayoutParams)
+ }
+
+ override fun onResume() {
+ mRootView?.requestLayout()
+ }
+
+ private fun removeView() {
+ mWindowManager.removeView(logView)
+ }
+
+ private fun performDestroy() {
+ context?.unregisterReceiver(mInnerReceiver)
+ //移除布局监听
+ removeViewTreeObserverListener()
+ mRootView = null
+ onDestroy()
+ }
+
+ /**
+ * 用来保存rootView的LayoutParams
+ */
+ private lateinit var mLogViewLayoutParams: LogViewLayoutParams
+
+ /**
+ * 上一次LogView的位置信息
+ */
+ private val mLastLogViewPosInfo: LastLogViewPosInfo = LastLogViewPosInfo()
+
+ /**
+ * 根布局的实际宽
+ */
+ private var mLogViewWidth = 0
+
+ /**
+ * 根布局的实际高
+ */
+ private var mLogViewHeight = 0
+
+ private var mViewTreeObserver: ViewTreeObserver? = null
+
+ private val mOnGlobalLayoutListener: ViewTreeObserver.OnGlobalLayoutListener =
+ ViewTreeObserver.OnGlobalLayoutListener {
+ //每次布局发生变动的时候重新赋值
+ mRootView?.let {
+ mLogViewWidth = it.measuredWidth
+ mLogViewHeight = it.measuredHeight
+ mLastLogViewPosInfo.logViewWidth = mLogViewWidth
+ mLastLogViewPosInfo.logViewHeight = mLogViewHeight
+ }
+ }
+
+ private fun addViewTreeObserverListener() {
+ if (mViewTreeObserver == null && mRootView != null) {
+ mViewTreeObserver = mRootView!!.viewTreeObserver
+ mViewTreeObserver?.addOnGlobalLayoutListener(mOnGlobalLayoutListener)
+ }
+ }
+
+ private fun removeViewTreeObserverListener() {
+ mViewTreeObserver?.let {
+ if (it.isAlive) {
+ it.removeOnGlobalLayoutListener(mOnGlobalLayoutListener)
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ }
+
+ /**
+ * 确定系统浮标的初始位置
+ * LayoutParams创建完以后调用
+ * 调用时建议放在实现下方
+ */
+ private fun onSystemLayoutParamsCreated() {
+ //如果有上一个页面的位置记录 这更新位置
+ systemLayoutParams?.flags = mLogViewLayoutParams.flags
+ systemLayoutParams?.gravity = mLogViewLayoutParams.gravity
+ systemLayoutParams?.width = mLogViewLayoutParams.width
+ systemLayoutParams?.height = mLogViewLayoutParams.height
+ systemLayoutParams?.x = mLogViewLayoutParams.x
+ systemLayoutParams?.y = mLogViewLayoutParams.y
+ }
+
+ /**
+ * 默认实现为true
+ *
+ * @return
+ */
+ override fun canDrag(): Boolean {
+ return true
+ }
+
+ /**
+ * 搭配shouldDealBackKey使用 自定义处理完以后需要返回true
+ * 默认模式的onBackPressed 拦截在NormViewManager#getRootContentView中被处理
+ * 系统模式下的onBackPressed 在当前类的performCreate 初始化View时被处理
+ * 返回false 表示交由系统处理
+ * 返回 true 表示当前的返回事件已由自己处理 并拦截了改返回事件
+ */
+ override fun onBackPressed(): Boolean {
+ return false
+ }
+
+ /**
+ * 默认不自己处理返回按键
+ *
+ * @return
+ */
+ override fun shouldDealBackKey(): Boolean {
+ return false
+ }
+
+ override fun onEnterBackground() {
+ mRootView?.let {
+ it.visibility = View.GONE
+ }
+ }
+
+ override fun onEnterForeground() {
+ mRootView?.let {
+ it.visibility = View.VISIBLE
+ }
+ }
+
+ override fun onMove(x: Int, y: Int, dx: Int, dy: Int) {
+ if (!canDrag()) {
+ return
+ }
+ systemLayoutParams?.apply {
+ this.x += dx
+ this.y += dy
+ }
+ //限制布局边界
+ resetBorderline(systemLayoutParams)
+ mWindowManager.updateViewLayout(mRootView, systemLayoutParams)
+ }
+
+ /**
+ * 限制边界 调用的时候必须保证是在控件能获取到宽高德前提下
+ */
+ private fun resetBorderline(
+ windowLayoutParams: WindowManager.LayoutParams?
+ ) {
+ //如果是系统模式或者手动关闭动态限制边界
+ if (!restrictBorderline()) {
+ return
+ }
+
+ if (windowLayoutParams != null) {
+
+ // 均是横向计算
+ if (windowLayoutParams.y >= screenShortSideLength - mLogViewHeight) {
+ windowLayoutParams.y = screenShortSideLength - mLogViewHeight
+ }
+ // 均是横向计算
+ if (windowLayoutParams.x >= screenLongSideLength - mLogViewWidth) {
+ windowLayoutParams.x = screenLongSideLength - mLogViewWidth
+ }
+
+ //系统模式
+ if (windowLayoutParams.y <= 0) {
+ windowLayoutParams.y = 0
+ }
+
+ if (windowLayoutParams.x <= 0) {
+ windowLayoutParams.x = 0
+ }
+ }
+ }
+
+ /**
+ * 手指弹起时保存当前浮标位置
+ *
+ * @param x
+ * @param y
+ */
+ override fun onUp(x: Int, y: Int) {
+ if (!canDrag()) {
+ return
+ }
+ if (!viewProps.edgePinned) {
+ endMoveAndRecord()
+ return
+ }
+ animatedMoveToEdge()
+ }
+
+ private fun endMoveAndRecord() {
+ systemLayoutParams?.let {
+ mLastLogViewPosInfo.logViewWidth = it.x
+ mLastLogViewPosInfo.logViewHeight = it.y
+ }
+ }
+
+ private fun animatedMoveToEdge() {
+ val viewSize = mRootView?.width ?: return
+ systemLayoutParams?.also { layoutAttrs ->
+ makeAnimator(layoutAttrs.x, viewSize, ViewGroup.LayoutParams.MATCH_PARENT) {
+ addUpdateListener { v ->
+ layoutAttrs.x = v.animatedValue as Int
+ mWindowManager.updateViewLayout(mRootView, layoutAttrs)
+ }
+ addListener(object : AnimatorListenerAdapter() {
+ override fun onAnimationEnd(animation: Animator?) {
+ endMoveAndRecord()
+ }
+ })
+ }
+ }
+ }
+
+ private inline fun makeAnimator(
+ from: Int,
+ size: Int,
+ containerSize: Int,
+ setup: ValueAnimator.() -> Unit
+ ) {
+ if (size <= 0 || containerSize <= 0) return
+ ValueAnimator.ofInt(
+ from,
+ if (from <= (containerSize - size) / 2) 0 else (containerSize - size)
+ )
+ .apply {
+ duration = 150L
+ setup()
+ }
+ .start()
+ }
+
+ /**
+ * 手指按下时的操作
+ *
+ * @param x
+ * @param y
+ */
+ override fun onDown(x: Int, y: Int) {
+ if (!canDrag()) {
+ return
+ }
+ }
+
+ /**
+ * home键被点击 只有系统悬浮窗控件才会被调用
+ */
+ open fun onHomeKeyPress() {}
+
+ /**
+ * 菜单键被点击 只有系统悬浮窗控件才会被调用
+ */
+ open fun onRecentAppKeyPress() {}
+
+ override fun onPause() {}
+
+ /**
+ * 系统悬浮窗需要调用
+ *
+ * @return
+ */
+ val context: Context?
+ get() = if (mRootView != null) {
+ mRootView!!.context
+ } else {
+ null
+ }
+
+ val resources: Resources?
+ get() = if (context == null) {
+ null
+ } else context!!.resources
+
+ fun getString(@StringRes resId: Int): String? {
+ return if (context == null) {
+ null
+ } else context!!.getString(resId)
+ }
+
+ private val isShow: Boolean
+ get() = mRootView?.isShown ?: false
+
+ protected fun findViewById(@IdRes id: Int): T? {
+ if (mRootView == null) {
+ return null
+ }
+ return mRootView?.findViewById(id)
+ }
+
+ /**
+ * 是否限制布局边界
+ *
+ * @return
+ */
+ open fun restrictBorderline(): Boolean {
+ return true
+ }
+
+ /**
+ * 获取屏幕短边的长度(横屏) 不包含statusBar
+ *
+ * @return
+ */
+ private val screenShortSideLength: Int
+ get() = ScreenUtils.getAppScreenHeight()
+
+ /**
+ * 获取屏幕长边的长度(横屏) 不包含statusBar
+ *
+ * @return
+ */
+ private val screenLongSideLength: Int
+ get() = ScreenUtils.getAppScreenWidth()
+
+ /**
+ * 强制刷新当前view
+ */
+ open fun immInvalidate() {
+ mRootView?.requestLayout()
+ }
+
+ /**
+ * 广播接收器 系统悬浮窗需要调用
+ */
+ private inner class InnerReceiver : BroadcastReceiver() {
+
+ private val SYSTEM_DIALOG_REASON_KEY = "reason"
+ private val SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"
+ private val SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"
+
+ override fun onReceive(context: Context, intent: Intent) {
+ val action = intent.action
+ if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS == action) {
+ val reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY)
+ if (reason != null) {
+ if (reason == SYSTEM_DIALOG_REASON_HOME_KEY) {
+ //点击home键
+ onHomeKeyPress()
+ } else if (reason == SYSTEM_DIALOG_REASON_RECENT_APPS) {
+ //点击menu按钮
+ onRecentAppKeyPress()
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsRecyclerAdapter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsRecyclerAdapter.java
new file mode 100644
index 0000000000..a3b5ebc955
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsRecyclerAdapter.java
@@ -0,0 +1,148 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 内置一个List的通用、简化的适用于RecyclerView的Adapter。
+ */
+public abstract class AbsRecyclerAdapter extends RecyclerView.Adapter {
+ protected List mList;
+ private LayoutInflater mInflater;
+ protected Context mContext;
+
+ public AbsRecyclerAdapter(Context context) {
+ if (context == null) {
+ return;
+ }
+ mContext = context;
+ mList = new ArrayList<>();
+ mInflater = LayoutInflater.from(context);
+ }
+
+ @NonNull
+ @Override
+ public final T onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = createView(mInflater, parent, viewType);
+ return createViewHolder(view, viewType);
+ }
+
+ protected abstract T createViewHolder(View view, int viewType);
+
+ /**
+ * 如果是通过LayoutInflater创建的View,不要绑定到父View,RecyclerView会负责添加。
+ */
+ protected abstract View createView(LayoutInflater inflater, ViewGroup parent, int viewType);
+
+ @Override
+ public final void onBindViewHolder(T holder, int position) {
+ V data = mList.get(position);
+ holder.setData(data);
+ holder.bind(data, position);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mList.size();
+ }
+
+ /**
+ * 列表末尾追加一个元素
+ */
+ @SuppressLint("NotifyDataSetChanged")
+ public void append(V item) {
+ if (item == null) {
+ return;
+ }
+ mList.add(item);
+ notifyDataSetChanged();
+ }
+
+ /**
+ * 在特定位置增加一个元素
+ */
+ public void append(V item, int position) {
+ if (item == null) {
+ return;
+ }
+ if (position < 0) {
+ position = 0;
+ } else if (position > mList.size()) {
+ position = mList.size();
+ }
+ mList.add(position, item);
+ notifyItemChanged(position, item);
+ }
+
+ /**
+ * 追加一个集合
+ */
+ @SuppressLint("NotifyDataSetChanged")
+ public final void append(Collection items) {
+ if (items == null || items.size() == 0) {
+ return;
+ }
+ mList.addAll(items);
+ notifyDataSetChanged();
+ }
+
+ /**
+ * 清空集合
+ */
+ @SuppressLint("NotifyDataSetChanged")
+ public final void clear() {
+ if (mList.isEmpty()) {
+ return;
+ }
+ mList.clear();
+ notifyDataSetChanged();
+ }
+
+ /**
+ * 删除一个元素
+ */
+ @SuppressLint("NotifyDataSetChanged")
+ public final void remove(V item) {
+ if (item == null) {
+ return;
+ }
+ if (mList.contains(item)) {
+ mList.remove(item);
+ notifyDataSetChanged();
+ }
+ }
+
+ /**
+ * 删除一个元素
+ */
+ public final void remove(int index) {
+ if (index < mList.size()) {
+ mList.remove(index);
+ notifyItemRemoved(index);
+ }
+ }
+
+ /**
+ * 删除一个集合
+ */
+ @SuppressLint("NotifyDataSetChanged")
+ public final void remove(Collection items) {
+ if (items == null || items.size() == 0) {
+ return;
+ }
+ if (mList.removeAll(items)) {
+ notifyDataSetChanged();
+ }
+ }
+
+}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsViewBinder.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsViewBinder.java
new file mode 100644
index 0000000000..c3c08f142e
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsViewBinder.java
@@ -0,0 +1,55 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch;
+
+import android.content.Context;
+import android.view.View;
+
+import androidx.annotation.IdRes;
+import androidx.recyclerview.widget.RecyclerView;
+
+/**
+ * 简单封装的适用于RecyclerView的ViewHolder
+ */
+public abstract class AbsViewBinder extends RecyclerView.ViewHolder {
+ private T data;
+
+ private View mView;
+
+ public AbsViewBinder(final View view) {
+ super(view);
+ mView = view;
+ getViews();
+ view.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onViewClick(view, data);
+ }
+ });
+ }
+
+ protected final View getView() {
+ return mView;
+ }
+
+ protected abstract void getViews();
+
+ public final V getView(@IdRes int id) {
+ return (V) mView.findViewById(id);
+ }
+
+ public abstract void bind(T t);
+
+ public void bind(T t, int position) {
+ bind(t);
+ }
+
+ protected void onViewClick(View view, T data) {
+ }
+
+ protected final void setData(T data) {
+ this.data = data;
+ }
+
+ protected final Context getContext() {
+ return mView.getContext();
+ }
+}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/ILogView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/ILogView.kt
new file mode 100644
index 0000000000..4c49bd8610
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/ILogView.kt
@@ -0,0 +1,82 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch
+
+import android.content.Context
+import android.view.View
+import android.widget.FrameLayout
+
+interface ILogView {
+ /**
+ * view 创建时调用 做一些变量的初始化 当还不能进行View的操作
+ *
+ * @param context
+ */
+ fun onCreate(context: Context?)
+
+ /**
+ * 传入rootView 用于创建控件
+ *
+ * @param context
+ * @param rootView
+ * @return 返回创建的childView
+ */
+ fun onCreateView(context: Context?, rootView: FrameLayout?): View?
+
+ /**
+ * 将xml中的控件添加到rootView以后调用,在当前方法中可以进行view的一些操作
+ *
+ * @param rootView
+ */
+ fun onViewCreated(rootView: FrameLayout?)
+
+ /**
+ * 当前的View添加到根布局里时调用
+ */
+ fun onResume()
+
+ /**
+ * 当前activity onPause时调用
+ */
+ fun onPause()
+
+ /**
+ * 确定系统悬浮窗浮标的初始位置
+ * LayoutParams创建完以后调用
+ *
+ * @param params
+ */
+ fun initViewLayoutParams(params: LogViewLayoutParams?)
+
+ /**
+ * app进入后台时调用 内置View 不需要实现
+ */
+ fun onEnterBackground()
+
+ /**
+ * app回到前台时调用 内置view 不需要实现
+ */
+ fun onEnterForeground()
+
+ /**
+ * 浮标控件是否可以拖动
+ *
+ * @return
+ */
+ fun canDrag(): Boolean
+
+ /**
+ * 是否需要自己处理返回键
+ *
+ * @return
+ */
+ fun shouldDealBackKey(): Boolean
+
+ /**
+ * shouldDealBackKey == true 时调用
+ */
+ fun onBackPressed(): Boolean
+
+ /**
+ * 悬浮窗主动销毁时调用 不能在当前生命周期回调函数中调用 detach自己 否则会出现死循环
+ */
+ fun onDestroy()
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/ILogViewListener.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/ILogViewListener.kt
new file mode 100644
index 0000000000..16c65363b0
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/ILogViewListener.kt
@@ -0,0 +1,6 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch
+
+interface ILogViewListener {
+ fun onAttach()
+ fun onDetach()
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LastLogViewPosInfo.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LastLogViewPosInfo.kt
new file mode 100644
index 0000000000..3a6780a289
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LastLogViewPosInfo.kt
@@ -0,0 +1,30 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch
+
+import com.mogo.eagle.core.utilcode.util.ScreenUtils
+
+/**
+ * 保存上一次LogView的位置信息
+ */
+class LastLogViewPosInfo {
+ var logViewWidth = 0
+ var logViewHeight = 0
+ var leftMarginPercent = 0f
+ private set
+ var topMarginPercent = 0f
+ private set
+
+ fun setLeftMargin(leftMargin: Int) {
+ leftMarginPercent = leftMargin.toFloat() / ScreenUtils.getAppScreenWidth().toFloat()
+ }
+
+ fun setTopMargin(topMargin: Int) {
+ topMarginPercent = topMargin.toFloat() / ScreenUtils.getAppScreenHeight().toFloat()
+ }
+
+ override fun toString(): String {
+ return "LastLogViewPosInfo{" +
+ ", leftMarginPercent=" + leftMarginPercent +
+ ", topMarginPercent=" + topMarginPercent +
+ '}'
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogFrameLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogFrameLayout.kt
new file mode 100644
index 0000000000..352ad9b2ea
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogFrameLayout.kt
@@ -0,0 +1,26 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.FrameLayout
+
+open class LogFrameLayout : FrameLayout {
+ private var mFlag = LogFrameLayoutFlag_ROOT
+
+ constructor(context: Context, flag: Int) : super(context) {
+ mFlag = flag
+ }
+
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
+ context,
+ attrs,
+ defStyleAttr
+ ) {
+ }
+
+ companion object {
+ const val LogFrameLayoutFlag_ROOT = 100
+ const val LogFrameLayoutFlag_CHILD = 200
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogInfoView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogInfoView.kt
new file mode 100644
index 0000000000..6a8e8bf27c
--- /dev/null
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/LogInfoView.kt
@@ -0,0 +1,287 @@
+package com.mogo.eagle.core.function.hmi.ui.logcatch
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.text.Editable
+import android.text.TextWatcher
+import android.util.Log
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.WindowManager
+import android.widget.*
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.mogo.eagle.core.function.hmi.R
+import java.util.*
+
+class LogInfoView : AbsLogView() {
+
+ companion object {
+ const val MAX_LOG_LINE_NUM = 10000
+ const val UPDATE_CHECK_INTERVAL = 200
+ }
+
+ private var logLines = LinkedList()
+ private var counter = 0
+ private var mAutoScrollToBottom = true
+ private var mIsLoaded = false
+
+ private var mLogRv: RecyclerView? = null
+ private var mLogItemAdapter: LogItemAdapter? = null
+ private var mLogFilter: EditText? = null
+ private var mRadioGroup: RadioGroup? = null
+ private var mLinearLayout: LinearLayout? = null
+
+ /**
+ * 单行的log
+ */
+ private var mLogHint: TextView? = null
+ private var mLogRvWrap: RelativeLayout? = null
+
+ private var logViewListener: ILogViewListener? = null
+
+ override fun onCreate(context: Context?) {}
+ override fun onCreateView(context: Context?, rootView: FrameLayout?): View? {
+ return LayoutInflater.from(context).inflate(R.layout.log_view, rootView, false)
+ }
+
+ override fun onViewCreated(rootView: FrameLayout?) {
+ initView()
+ }
+
+ private fun initView() {
+ mLogHint = findViewById(R.id.log_hint)
+ mLogRvWrap = findViewById(R.id.log_page)
+ mLogRv = findViewById(R.id.log_list)
+ mLogRv!!.layoutManager = LinearLayoutManager(context)
+ mLogItemAdapter = LogItemAdapter(context!!)
+ mLogRv!!.adapter = mLogItemAdapter
+ mLogFilter = findViewById(R.id.log_filter)
+ mLogFilter!!.addTextChangedListener(object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
+ override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
+ override fun afterTextChanged(s: Editable) {
+ mLogItemAdapter!!.filter.filter(s)
+ }
+ })
+ val mTitleBar = findViewById(R.id.title_bar)
+ mTitleBar!!.setListener(object : LogTitleBar.OnTitleBarClickListener {
+ override fun onRightClick() {
+ if (logViewListener != null) {
+ logViewListener!!.onDetach()
+ }
+ }
+
+ override fun onLeftClick() {
+ minimize()
+ }
+ })
+ mLogHint!!.setOnClickListener { v: View? -> maximize() }
+ mRadioGroup = findViewById(R.id.radio_group)
+ mRadioGroup!!.setOnCheckedChangeListener { group: RadioGroup?, checkedId: Int ->
+ when (checkedId) {
+ R.id.verbose -> {
+ mLogItemAdapter!!.logLevelLimit = Log.VERBOSE
+ }
+ R.id.debug -> {
+ mLogItemAdapter!!.logLevelLimit = Log.DEBUG
+ }
+ R.id.info -> {
+ mLogItemAdapter!!.logLevelLimit = Log.INFO
+ }
+ R.id.warn -> {
+ mLogItemAdapter!!.logLevelLimit = Log.WARN
+ }
+ R.id.error -> {
+ mLogItemAdapter!!.logLevelLimit = Log.ERROR
+ }
+ }
+ mLogItemAdapter!!.filter.filter(mLogFilter!!.text)
+ }
+ mLogRv!!.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+ override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+ super.onScrollStateChanged(recyclerView, newState)
+ }
+
+ override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+ super.onScrolled(recyclerView, dx, dy)
+ val layoutManager = recyclerView.layoutManager as LinearLayoutManager?
+ // if the bottom of the list isn't visible anymore, then stop autoscrolling
+ mAutoScrollToBottom =
+ layoutManager!!.findLastCompletelyVisibleItemPosition() == recyclerView.adapter!!
+ .itemCount - 1
+ }
+ })
+ mRadioGroup!!.check(R.id.verbose)
+ val mBtnTop = findViewById