endSitePoint;
+ public String carNumber;
+ public long createTime;
+ public long startTime;
+ public List< Double > startSiteGcjPoint;
+ public List< Double > endSiteGcjPoint;
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOperationStatusRequest.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOperationStatusRequest.java
new file mode 100644
index 0000000000..c8caf0efb3
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOperationStatusRequest.java
@@ -0,0 +1,43 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+public
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+class SweepersOperationStatusRequest {
+
+ private String sn;
+ private double lat;
+ private double lon;
+ public SweepersOperationStatusRequest(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-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOperationStatusResponse.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOperationStatusResponse.java
new file mode 100644
index 0000000000..e09ea9c78d
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOperationStatusResponse.java
@@ -0,0 +1,20 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态返回参数
+ */
+public class SweepersOperationStatusResponse extends BaseData {
+
+ public Result data;
+
+ public static class Result {
+
+ public int serviceStatus;//0:已收车,1:已出车
+
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOrderBean.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOrderBean.java
new file mode 100644
index 0000000000..d0a7b61901
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOrderBean.java
@@ -0,0 +1,86 @@
+package com.mogo.och.sweepers.bean;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 小巴订单
+ */
+public class SweepersOrderBean {
+
+ /**
+ * orderNo number
+ * passengerPhone string 下单用户电话
+ * startStationId integer 开始站点
+ * startStationName string
+ * endStationId integer 结束站点
+ * endStationName string
+ */
+
+ private String orderNo;
+ private String passengerPhone;
+ private int startStationId;//乘客上车点
+ private String startStationName;
+ private String endStationName;
+ private int endStationId;//乘客下车点
+
+ public void setOrderNo(String orderNo) {
+ this.orderNo = orderNo;
+ }
+
+ public void setPassengerPhone(String passengerPhone) {
+ this.passengerPhone = passengerPhone;
+ }
+
+ public void setStartStationId(int startStationId) {
+ this.startStationId = startStationId;
+ }
+
+ public void setStartStationName(String startStationName) {
+ this.startStationName = startStationName;
+ }
+
+ public void setEndStationName(String endStationName) {
+ this.endStationName = endStationName;
+ }
+
+ public void setEndStationId(int endStationId) {
+ this.endStationId = endStationId;
+ }
+
+ public String getOrderNo() {
+ return orderNo;
+ }
+
+ public String getPassengerPhone() {
+ return passengerPhone;
+ }
+
+ public int getStartStationId() {
+ return startStationId;
+ }
+
+ public String getStartStationName() {
+ return startStationName;
+ }
+
+ public String getEndStationName() {
+ return endStationName;
+ }
+
+ public int getEndStationId() {
+ return endStationId;
+ }
+
+ @Override
+ public String toString() {
+ return "BusOrderBean{" +
+ "orderNo=" + orderNo +
+ ", passengerPhone='" + passengerPhone + '\'' +
+ ", startStationId=" + startStationId +
+ ", startStationName='" + startStationName + '\'' +
+ ", endStationName='" + endStationName + '\'' +
+ ", endStationId=" + endStationId +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOrdersResponse.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOrdersResponse.java
new file mode 100644
index 0000000000..4bc9d1782e
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersOrdersResponse.java
@@ -0,0 +1,23 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/19
+ */
+public class SweepersOrdersResponse extends BaseData {
+ public Result data;
+ public static class Result{
+ public List orders;
+ }
+
+ @Override
+ public String toString() {
+ return "BusOrdersResponse{" +
+ "data=" + data +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersQueryLineStationsRequest.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersQueryLineStationsRequest.java
new file mode 100644
index 0000000000..5af26f3404
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersQueryLineStationsRequest.java
@@ -0,0 +1,61 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 根据车机行驶线路站点信息
+ */
+public class SweepersQueryLineStationsRequest {
+
+ private String sn;
+ private double lat;
+ private double lon;
+ private boolean markDrivingStatus; // 默认false;true:是否需要返回站点的行驶状态,对应返回的drivingStatus
+ // 0 - 关闭、1 - 启动
+// public String status;
+ public SweepersQueryLineStationsRequest(double lon, double lat, boolean markDrivingStatus) {
+ this.sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lat = lat;
+ this.lon = lon;
+ this.markDrivingStatus = markDrivingStatus;
+ }
+
+ public boolean isMarkDrivingStatus() {
+ return markDrivingStatus;
+ }
+
+ public void setMarkDrivingStatus(boolean markDrivingStatus) {
+ this.markDrivingStatus = markDrivingStatus;
+ }
+
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+ // public BusOperationStatusRequest shutdown() {
+// status = "0";
+// return this;
+// }
+//
+// public BusOperationStatusRequest launch() {
+// status = "1";
+// return this;
+// }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersQueryLinesResponse.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersQueryLinesResponse.java
new file mode 100644
index 0000000000..74d27da78a
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersQueryLinesResponse.java
@@ -0,0 +1,23 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public class SweepersQueryLinesResponse extends BaseData {
+ public List data;
+
+ public static class Result {
+
+ public int lineId;//线路id
+ public String name;//线路名字
+ public int choose; // 1:绑定 2:未被绑定
+ public String startSiteName;//始发站名称
+ public String endSiteName;//终点名称
+
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersResetDrivingLineRequest.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersResetDrivingLineRequest.java
new file mode 100644
index 0000000000..2e37a268ae
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersResetDrivingLineRequest.java
@@ -0,0 +1,18 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/18
+ */
+public class SweepersResetDrivingLineRequest {
+ public String sn;
+ public int lineId; //切换到的线路id
+
+ public SweepersResetDrivingLineRequest(int lineId) {
+ sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ this.lineId = lineId;
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutePlanningUpdateReqBean.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutePlanningUpdateReqBean.java
new file mode 100644
index 0000000000..753eb46550
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutePlanningUpdateReqBean.java
@@ -0,0 +1,30 @@
+package com.mogo.och.sweepers.bean;
+
+import java.util.List;
+
+/**
+ * Created by pangfan on 2021/8/19
+ *
+ * 订单状态更新请求数据结构
+ */
+public class SweepersRoutePlanningUpdateReqBean {
+ public String sn;
+ public int lineId;
+ public int startSiteId;
+ public int endSiteId;
+ public List points;
+
+ public static class Result {
+ public Double latitude;
+ public Double longitude;
+ }
+
+ public SweepersRoutePlanningUpdateReqBean(String sn, int lineId, int startSiteId
+ , int endSiteId, List points) {
+ this.sn = sn;
+ this.lineId = lineId;
+ this.startSiteId = startSiteId;
+ this.endSiteId = endSiteId;
+ this.points = points;
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutesResponse.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutesResponse.java
new file mode 100644
index 0000000000..b8cf05d80c
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutesResponse.java
@@ -0,0 +1,27 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.eagle.core.data.BaseData;
+
+/**
+ * 网约车小巴路线接口请求响应结果
+ *
+ * @author tongchenfei
+ */
+public class SweepersRoutesResponse extends BaseData {
+ private SweepersRoutesResult data;
+
+ public SweepersRoutesResult getResult() {
+ return data;
+ }
+
+ public void setResult(SweepersRoutesResult data) {
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return "BusRoutesResponse{" +
+ "data=" + data +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutesResult.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutesResult.java
new file mode 100644
index 0000000000..9a5c5709ae
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersRoutesResult.java
@@ -0,0 +1,69 @@
+package com.mogo.och.sweepers.bean;
+
+import java.util.List;
+
+/**
+ * 网约车小巴路线接口返回接口数据封装
+ *
+ * @author tongchenfei
+ */
+public class SweepersRoutesResult {
+ private List sites;
+ private int lineId;
+ private String name;
+ private int lineType; //线路类型,0:环形
+ private String description;
+ private int status;
+
+ //线路轨迹相关字段
+ public String csvFileUrl = ""; //轨迹文件下载的cos url,默认“”
+ public String csvFileMd5 = ""; //轨迹文件md5,默认“”
+ public String txtFileUrl = ""; //打点文件下载的cos url,默认“”
+ public String txtFileMd5 = ""; //轨迹文件md5,默认“”
+ public long contrailSaveTime; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
+ public String carModel = ""; //[optional] 车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题
+ public String csvFileUrlDPQP = ""; //轨迹文件下载的cos url,默认“”
+ public String csvFileMd5DPQP = ""; //轨迹文件md5,默认“”
+ public String txtFileUrlDPQP = ""; //打点文件下载的cos url,默认“”
+ public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“”
+ public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
+
+ public int getLineId() {
+ return lineId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getSites() {
+ return sites;
+ }
+
+ public void setSite(List site) {
+ this.sites = sites;
+ }
+
+ @Override
+ public String toString() {
+ return "BusRoutesResult{" +
+ "sites=" + sites +
+ ", lineId=" + lineId +
+ ", name='" + name + '\'' +
+ ", lineType=" + lineType +
+ ", description='" + description + '\'' +
+ ", status=" + status +
+ ", csvFileUrl='" + csvFileUrl + '\'' +
+ ", csvFileMd5='" + csvFileMd5 + '\'' +
+ ", txtFileUrl='" + txtFileUrl + '\'' +
+ ", txtFileMd5='" + txtFileMd5 + '\'' +
+ ", contrailSaveTime=" + contrailSaveTime +
+ ", carModel='" + carModel + '\'' +
+ ", csvFileUrlDPQP='" + csvFileUrlDPQP + '\'' +
+ ", csvFileMd5DPQP='" + csvFileMd5DPQP + '\'' +
+ ", txtFileUrlDPQP='" + txtFileUrlDPQP + '\'' +
+ ", txtFileMd5DPQP='" + txtFileMd5DPQP + '\'' +
+ ", contrailSaveTimeDPQP=" + contrailSaveTimeDPQP +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersStationBean.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersStationBean.java
new file mode 100644
index 0000000000..7c91bde918
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersStationBean.java
@@ -0,0 +1,162 @@
+package com.mogo.och.sweepers.bean;
+
+/**
+ * 单个网约车小巴车站信息
+ *
+ * @author tongchenfei
+ */
+public class SweepersStationBean {
+// 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 double gcjLon; //高德
+ private double gcjLat; //高德
+ 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 double getGcjLon() {
+ return gcjLon;
+ }
+
+ public double getGcjLat() {
+ return gcjLat;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setCityCode(String cityCode) {
+ this.cityCode = cityCode;
+ }
+
+ public void setLon(double lon) {
+ this.lon = lon;
+ }
+
+ public void setLat(double lat) {
+ this.lat = lat;
+ }
+
+ public void setBusinessType(int businessType) {
+ this.businessType = businessType;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public void setSiteId(int siteId) {
+ this.siteId = siteId;
+ }
+
+ public void setSeq(int seq) {
+ this.seq = seq;
+ }
+
+ public void setDrivingStatus(int drivingStatus) {
+ this.drivingStatus = drivingStatus;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getCityCode() {
+ return cityCode;
+ }
+
+
+ public int getBusinessType() {
+ return businessType;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public int getSiteId() {
+ return siteId;
+ }
+
+ public int getSeq() {
+ return seq;
+ }
+
+ public int getDrivingStatus() {
+ return drivingStatus;
+ }
+
+ public double getLon() {
+ return lon;
+ }
+
+ public double getLat() {
+ return lat;
+ }
+
+ public void setIfStop(int ifStop) {
+ this.ifStop = ifStop;
+ }
+
+ public int getIfStop() {
+ return ifStop;
+ }
+
+ public void setLeaving(boolean leaving) {
+ this.leaving = leaving;
+ }
+
+ public boolean isLeaving() {
+ return leaving;
+ }
+
+ @Override
+ public String toString() {
+ return "BusStationBean{" +
+ "name='" + name + '\'' +
+ ", description='" + description + '\'' +
+ ", cityCode='" + cityCode + '\'' +
+ ", lon=" + lon +
+ ", lat=" + lat +
+ ", businessType=" + businessType +
+ ", status=" + status +
+ ", siteId=" + siteId +
+ ", seq=" + seq +
+ ", drivingStatus=" + drivingStatus +
+ ", ifStop=" + ifStop +
+ ", leaving=" + leaving +
+ '}';
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersUpdateSiteStatusRequest.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersUpdateSiteStatusRequest.java
new file mode 100644
index 0000000000..1b1a4db91f
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/bean/SweepersUpdateSiteStatusRequest.java
@@ -0,0 +1,27 @@
+package com.mogo.och.sweepers.bean;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.network.Utils;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/22
+ *
+ * 小巴车运营状态请求参数
+ */
+public class SweepersUpdateSiteStatusRequest {
+
+ public String sn;
+ public int seq;//站点序号
+ public int siteId;//站点id
+ public double lon;
+ public double lat;
+
+ public SweepersUpdateSiteStatusRequest(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-sweepers/src/main/java/com/mogo/och/sweepers/callback/ICarOperationStatusCallback.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ICarOperationStatusCallback.java
new file mode 100644
index 0000000000..752f9f2ff4
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ICarOperationStatusCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.sweepers.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface ICarOperationStatusCallback {
+ void changeOperationStatus(boolean changeStatus);
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/IRefreshSweepersStationsCallback.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/IRefreshSweepersStationsCallback.java
new file mode 100644
index 0000000000..975dc0c674
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/IRefreshSweepersStationsCallback.java
@@ -0,0 +1,13 @@
+package com.mogo.och.sweepers.callback;
+
+import com.mogo.och.sweepers.bean.SweepersStationBean;
+
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface IRefreshSweepersStationsCallback {
+ void refreshBusStations(String lineName, List stationList, int currentStation, int nextStation, boolean isArrived);
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISlidePannelHideCallback.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISlidePannelHideCallback.java
new file mode 100644
index 0000000000..6c59de2916
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISlidePannelHideCallback.java
@@ -0,0 +1,9 @@
+package com.mogo.och.sweepers.callback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/22
+ */
+public interface ISlidePannelHideCallback {
+ void hideSlidePanel();
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISweepersControllerStatusCallback.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISweepersControllerStatusCallback.java
new file mode 100644
index 0000000000..e2eaa5d4f2
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISweepersControllerStatusCallback.java
@@ -0,0 +1,17 @@
+package com.mogo.och.sweepers.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 ISweepersControllerStatusCallback {
+ // 是否vr map模式
+ void onVRModeChanged(boolean isVRMode);
+ // 自车定位
+ void onCarLocationChanged(Location location);
+ //开始开启自动驾驶
+ void startOpenAutopilot();
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISweepersLinesCallback.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISweepersLinesCallback.java
new file mode 100644
index 0000000000..ab33f73188
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/callback/ISweepersLinesCallback.java
@@ -0,0 +1,12 @@
+package com.mogo.och.sweepers.callback;
+
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public interface ISweepersLinesCallback {
+ void onBusLinesChange(SweepersQueryLinesResponse lines);
+ void onChangeLineIdSuccess();
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/constant/SweepersConst.kt b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/constant/SweepersConst.kt
new file mode 100644
index 0000000000..271575ff21
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/constant/SweepersConst.kt
@@ -0,0 +1,79 @@
+package com.mogo.och.sweepers.constant
+
+import com.mogo.commons.debug.DebugConfig
+
+/**
+ * Created on 2021/12/6
+ */
+class SweepersConst {
+ 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_SWEEPERS_CONTROL_TYPE_EXTRA_KEY = "sceneType"
+ // 无状态
+ const val STATION_STATUS_IDLE = 0
+ // 已过站(历史站)
+ const val STATION_STATUS_LEAVING = 1
+ // 到站(当前站)
+ const val STATION_STATUS_STOPPED = 2
+ // 未到站(未到站)
+ const val STATION_STATUS_ARRIVING = 3
+
+ // 上报心跳轮询ms
+ const val LOOP_PERIOD_60S = 60 * 1000L
+ // 开始服务启动自动驾驶等待时间(埋点上传)
+ const val LOOP_PERIOD_15S = 15 * 1000L
+ const val LOOP_PERIOD_1S = 1 * 1000L
+ const val LOOP_DELAY = 100L
+
+ // 下发给MEC轨迹信息间隔时间 10秒
+ const val LOOP_PERIOD_10S = 10 * 1000L
+ // 尝试下发给MEC轨迹最多10次
+ const val LOOP_SEND_TRAJ_TIMES = 10
+
+ //起点UUID
+ const val SWEEPERS_START_MAP_MAKER = "sweepers_start_map_maker";
+ //终点UUID
+ const val SWEEPERS_END_MAP_MAKER = "sweepers_end_map_maker";
+
+ // 埋点key:接管后点击'自动驾驶'按钮启动
+ const val EVENT_KEY_RESTART_AUTOPILOT = "event_key_och_sweepers_restart_autopilot"
+ // 埋点key:开始服务开启自动驾驶(成功/失败)
+ const val EVENT_KEY_START_SERVICE = "event_key_och_sweepers_start_service"
+ const val EVENT_PARAM_SN = "sn"
+ const val EVENT_PARAM_TIME = "time"
+ const val EVENT_PARAM_START_NAME = "start_name"
+ const val EVENT_PARAM_END_NAME = "end_name"
+ const val EVENT_PARAM_LINE_ID = "line_id"
+ const val EVENT_PARAM_START_RESULT = "start_autopilot" // true/false
+ const val EVENT_PARAM_PLATE_NUM = "plate_number" // 车牌号
+ const val EVENT_PARAM_ENV_ONLINE = "env_online" // 是否线上环境:true/false
+
+ /**
+ * 订单起终点Marker类型
+ */
+ const val TYPE_MARKER_SWEEPERS_ORDER = "TYPE_MARKER_SWEEPERS_ORDER"
+
+ const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L
+
+ //围栏到站 暂定10米
+ const val ARRIVE_AT_END_STATION_DISTANCE = 10
+ }
+}
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/fragment/BaseSweepersTabFragment.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/fragment/BaseSweepersTabFragment.java
new file mode 100644
index 0000000000..6696196fb8
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/fragment/BaseSweepersTabFragment.java
@@ -0,0 +1,565 @@
+package com.mogo.och.sweepers.fragment;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+import static com.mogo.och.sweepers.constant.SweepersConst.TIMER_START_AUTOPILOT_INTERVAL;
+
+import android.animation.ObjectAnimator;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.Group;
+
+import 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.eagle.core.data.config.HmiBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager;
+import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.function.hmi.ui.widget.TrafficDataView;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.MogoMapUIController;
+import com.mogo.map.MogoMarkerManager;
+import com.mogo.map.listener.IMogoMapListener;
+import com.mogo.map.uicontroller.VisualAngleMode;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.module.common.constants.DataTypes;
+import com.mogo.module.common.view.OnPreventFastClickListener;
+import com.mogo.och.sweepers.R;
+import com.mogo.och.sweepers.bean.SweepersRoutesResult;
+import com.mogo.och.sweepers.constant.SweepersConst;
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+import com.mogo.och.sweepers.util.BDRouteDataTestUtils;
+import com.mogo.och.sweepers.view.SlidePanelView;
+
+import mogo.telematics.pad.MessagePad;
+import record_cache.RecordPanelOuterClass;
+
+/**
+ * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况
+ *
+ * 部分业务放在了此处处理
+ *
+ * @author tongchenfei
+ */
+public abstract class BaseSweepersTabFragment> extends MvpFragment implements IMogoMapListener, IMoGoAutopilotRecordListener {
+
+ private static final String TAG = "BaseOchFragment";
+
+ protected SlidePanelView slidePanelView;
+ private RelativeLayout ctvAutopilotStatus;
+ private ImageView ctvAutopilotStatusIv;
+ private TextView ctvAutopilotStatusTv;
+ protected TextView tvOperationStatus;
+ protected RelativeLayout mSettingBtn;
+ protected RelativeLayout mBadcaseBtn;
+ protected RelativeLayout mAICollectBtn;
+ public boolean isOperationStatus;//false-收车,true-出车
+ private FrameLayout flStationPanelContainer;
+ private Group groupTestPanel;
+ private FrameLayout flSpeed;
+// private BusArcView mouduleArc;
+ private TrafficDataView mTrafficDataView;
+ private ImageView mUpgradeTipIv;
+ // private BusTrafficLightView mTrafficLightView;
+
+ public static final String TYPE_ENTRANCE = "entrance";
+
+ //远景和中景的切换
+ private ImageView mSwitchMapModeImage;
+ private LinearLayout mSwitchMapModeLayout;
+
+ private ObjectAnimator autopilotLoadingAnimator;
+
+ public boolean isAnimateRunning = false;
+
+ /**
+ * 滑动按钮触发的事件
+ */
+ private final SlidePanelView.OnSlidePanelMoveToEndListener onSlideToEndListener = () -> {
+ // 此处做一个代理,处理一下共有情况
+ if (getSlidePanelOnEndListener() != null) {
+ getSlidePanelOnEndListener().moveToEnd();
+ }
+ };
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.sweepers_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.sweepers_autopilot_btn_iv);
+ ctvAutopilotStatusTv = findViewById(R.id.sweepers_autopolot_btn_tv);
+ flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
+
+ // mTrafficLightView = findViewById(R.id.bus_traffic_light_view);
+ // CallerHmiManager.INSTANCE.setProxyTrafficLightView(mTrafficLightView);
+
+ tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
+
+ flSpeed = (FrameLayout) findViewById(R.id.fl_speed);
+ mTrafficDataView = (TrafficDataView) findViewById(R.id.sweepers_arc);
+
+ panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
+ slidePanelView.setOnSlidePanelMoveToEndListener(onSlideToEndListener);
+
+ mSwitchMapModeLayout = findViewById(R.id.sweepers_switch_model_layout);
+ mSwitchMapModeImage = findViewById(R.id.sweepers_switch_model_icon);
+ updateSwitchMapIcon();
+
+ mSwitchMapModeLayout.setOnClickListener(new OnPreventFastClickListener() {
+
+ @Override
+ public void onClickImpl(View v) {
+ //切换地图的远近视图
+ if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight()) {
+ MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).visibleAllMarkers();
+ MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweepers_switch_map_medium);
+ } else if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isMediumSight()) {
+ MogoMarkerManager.getInstance(AbsMogoApplication.getApp())
+ .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS, SweepersConst.TYPE_MARKER_SWEEPERS_ORDER);
+ MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
+ mSwitchMapModeImage.setImageResource(R.drawable.sweepers_switch_map_long);
+ }
+ }
+ });
+
+ if (DebugConfig.isDebug()) {
+ mTrafficDataView.setLongClickable(true);
+ mTrafficDataView.setOnLongClickListener(v -> {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "长按显示状态工具栏");
+ Intent intent = new Intent();
+ intent.putExtra("oper", 52);
+ MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent);
+ return true;
+ });
+ }
+ initListener();
+ ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener(){
+
+ @Override
+ public void onClickImpl(View v) {
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){
+ restartAutopilot();
+ }else {
+ ToastUtils.showShort(getResources().getString(R.string.sweepers_auto_disable_tip));
+ }
+ }
+ });
+
+ setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+ // 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
+ findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE)
+ );
+
+ // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
+ findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE)
+ );
+
+ // 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
+ findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
+ debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING)
+ );
+
+ // 模拟 自动驾驶网约车回调数据
+ findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
+ debugArrivedStation()
+ );
+
+ findViewById(R.id.btnAutopilotRoute).setOnClickListener(view -> debugArrivedRoute());
+
+ 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_rl);
+// CallerHmiManager.INSTANCE.registerBadCaseCallback(
+// () -> { // onShow()
+// return mBadcaseBtn; },
+// () -> { // onHide()
+// return null; });
+
+ if (mBadcaseBtn != null) {
+ CallerDevaToolsManager.INSTANCE.initBadCase(mBadcaseBtn);
+ if (!HmiBuildConfig.isShowBadCaseView) {
+ CallerAutopilotRecordListenerManager.INSTANCE.addListener(TAG, this);
+ }
+ }
+
+ mAICollectBtn = findViewById(R.id.module_mogo_och_ai_collet_rl);
+ if (mAICollectBtn != null){
+ CallerDevaToolsManager.INSTANCE.initAiCollect(mAICollectBtn);
+ }
+ }
+
+ private void updateSwitchMapIcon(){
+ if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight()) {
+ mSwitchMapModeImage.setImageResource(R.drawable.sweepers_switch_map_long);
+ } else if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isMediumSight()) {
+ mSwitchMapModeImage.setImageResource(R.drawable.sweepers_switch_map_medium);
+ } else {
+ mSwitchMapModeImage.setImageResource(R.drawable.sweepers_switch_map_medium);
+ }
+ }
+
+ private void debugArrivedRoute() {
+ BDRouteDataTestUtils.converToRouteData();
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ if (!HmiBuildConfig.isShowBadCaseView) {
+ CallerAutopilotRecordListenerManager.INSTANCE.removeListener(TAG);
+ }
+ }
+
+
+ @Override
+ public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) {
+// if (!HmiBuildConfig.isShowBadCaseView && recordPanel != null && recordPanel.getType() == 1 && recordPanel.getStat() == 100) {
+// CallerDevaToolsManager.INSTANCE.onReceiveBadCaseRecord(recordPanel);
+// }
+ }
+
+ @Override
+ public void onAutopilotRecordConfig(@NonNull MessagePad.RecordDataConfig config) {
+ }
+
+
+ /**
+ * 测试到站
+ */
+ 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);
+ });
+ }
+
+ /**
+ * 改变自动驾驶状态
+ *
+ * @param autopilotStatus 0:不可用 1:可用状态 2:自动驾驶中
+ */
+ public void onAutopilotStatusChanged(int autopilotStatus) {
+ getActivity().runOnUiThread(() -> {
+ changeAutopilotBtnView(autopilotStatus, isAnimateRunning);
+ });
+ }
+
+ public void setAutopilotBtnStatus(int autopilotStatus) {
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+ == autopilotStatus) {//0不可用
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweepers_autopilot_text_color_disable));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweepers_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusIv.setImageResource(R.drawable.sweepers_disable_autopilot_icon);
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+
+ } else {
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweepers_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweepers_loading_autopilot_runnig_tv));
+ ctvAutopilotStatusIv.setImageResource(R.drawable.sweepers_ic_autopilot);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == autopilotStatus) {//1可用
+ ctvAutopilotStatus.setSelected(false);
+ }else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == autopilotStatus){
+ ctvAutopilotStatus.setSelected(true);
+ }
+ }
+ }
+
+ public void updateAutopilotStatus(int autopilotStatus){
+ if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
+ == autopilotStatus) {//2 running
+ ctvAutopilotStatusIv.setImageResource(R.drawable.sweepers_right_autopilot_icon);
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweepers_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweepers_loading_autopilot_success_tv));
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(false);
+ }else {
+ ctvAutopilotStatusIv.setImageResource(R.drawable.sweepers_wrong_autopilot_icon);
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweepers_autopilot_text_color_normal));
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweepers_loading_autopilot_failure_tv));
+ ctvAutopilotStatus.setFocusableInTouchMode(false);
+ ctvAutopilotStatus.setSelected(false);
+ }
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ setAutopilotBtnStatus(autopilotStatus);
+ }
+ },1000);
+ }
+
+ private void changeAutopilotBtnView(int autopilotStatus, boolean isAnimateRunning) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChangeChangeAutopilotBtnView: "
+ + autopilotStatus + "isAnimateRunning = " + isAnimateRunning);
+ if (isAnimateRunning && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
+ != autopilotStatus) {
+ // 主动开启自动驾驶中,不为2(为0、1)则继续loading
+ return;
+ }
+ if (isAnimateRunning){
+ stopAutopilotAnimation();
+ updateAutopilotStatus(autopilotStatus);
+ }else {
+ setAutopilotBtnStatus(autopilotStatus);
+ }
+
+ }
+
+ /**
+ * 隐藏【自动驾驶】按钮
+ */
+ public void hideAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+// ctvAutopilotStatus.setVisibility(View.GONE);
+// slidePanelView.setVisibility(View.GONE);
+ });
+ }
+
+ /**
+ * 展示【自动驾驶】按钮
+ */
+ public void showAutopilotBiz() {
+ getActivity().runOnUiThread(() -> {
+ ctvAutopilotStatus.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public void hidPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.GONE);
+ });
+ }
+
+ public void showPanel() {
+ getActivity().runOnUiThread(() -> {
+ flStationPanelContainer.setVisibility(View.VISIBLE);
+ });
+ }
+
+ public View getPanelView() {
+ return panelView;
+ }
+
+ public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
+ return null;
+ }
+
+ /**
+ * 获取站点面板view,在{@link #initViews()}时候添加到container中
+ *
+ * @return 站点面板view
+ */
+ public abstract int getStationPanelViewId();
+
+ /**
+ * 重新开启自动驾驶
+ */
+ public abstract void restartAutopilot();
+
+ /**
+ * 模拟自动驾驶返回状态
+ *
+ * @param status
+ */
+ public abstract void debugAutoPilotStatus(int status);
+
+ /**
+ * 开启自动驾驶中间动画
+ */
+ public void startAutopilotAnimation() {
+ isAnimateRunning = true;
+ ctvAutopilotStatusTv.setText(getResources().getString(R.string.sweepers_loading_autopilot_tv));
+ ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.sweepers_autopilot_text_color_normal));
+ ctvAutopilotStatus.setSelected(false);
+ ctvAutopilotStatus.setFocusableInTouchMode(true);
+ ctvAutopilotStatusIv.setImageResource(R.drawable.sweepers_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();//动画开始
+
+ startingAutoApilotCountDown();
+
+ }
+
+ private void startingAutoApilotCountDown(){
+ //10s 若自动驾驶没有开启,则结束动画
+ UiThreadHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() { //未启动成功做处理
+ if (isAnimateRunning){// 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态
+ stopAutopilotAnimation();
+ updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+ }
+ }
+ },TIMER_START_AUTOPILOT_INTERVAL);
+
+ }
+ /**
+ * 停止自动驾驶中间动画
+ */
+ protected void stopAutopilotAnimation() {
+ if (autopilotLoadingAnimator != null) {
+ autopilotLoadingAnimator.end();
+ ctvAutopilotStatusIv.clearAnimation();
+ autopilotLoadingAnimator = null;
+ isAnimateRunning = false;
+ }
+ }
+
+ /**
+ * 迈速表实时更新
+ *
+ * @param newSpeed
+ */
+ public void updateSpeedView(float newSpeed) {
+ int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
+ if (mTrafficDataView != null){
+ mTrafficDataView.updateSpeedWithValue(speed);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ MogoApisHandler.getInstance().getApis().getRegisterCenterApi().unregisterMogoMapListener(TYPE_ENTRANCE);
+ }
+
+ @Override
+ public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
+ if (visualAngleMode.isMediumSight()) {
+ mSwitchMapModeLayout.setVisibility(View.VISIBLE);
+ } else if (visualAngleMode.isLongSight()) {
+ mSwitchMapModeLayout.setVisibility(View.VISIBLE);
+ } else if (visualAngleMode.isCloseSight()) {
+ mSwitchMapModeLayout.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * bus调试面板打开关闭
+ */
+ public void debugTestBar() {
+ if (groupTestPanel.getVisibility() == View.VISIBLE) {
+ groupTestPanel.setVisibility(View.GONE);
+ } else {
+ groupTestPanel.setVisibility(View.VISIBLE);
+ }
+ }
+
+ /**
+ * Bus调试信息:线路、轨迹等信息
+ *
+ * START
+ */
+ private View busTestBar;
+ private TextView lineIdTV;
+ private TextView trajMd5TV;
+ private TextView stopMd5TV;
+ private TextView trajMd5DPQPTV;
+ private TextView stopMd5DPQPTV;
+
+ public void showHideTestBar() {
+ if (busTestBar == null) {
+ busTestBar = findViewById(R.id.module_mogo_och_sweepers_test_bar);
+ lineIdTV = findViewById(R.id.sweepers_test_bar_current_line_id);
+ trajMd5TV = findViewById(R.id.sweepers_test_bar_current_traj_md5);
+ stopMd5TV = findViewById(R.id.sweepers_test_bar_current_stop_md5);
+ trajMd5DPQPTV = findViewById(R.id.sweepers_test_bar_current_traj_md5_dpqp);
+ stopMd5DPQPTV = findViewById(R.id.sweepers_test_bar_current_stop_md5_dpqp);
+ }
+
+ if (busTestBar.getVisibility() == View.VISIBLE) {
+ busTestBar.setVisibility(View.GONE);
+ } else {
+ SweepersRoutesResult routesResult = SweepersOrderModel.getInstance().getBusRoutesResult();
+ lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId())));
+ trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5));
+ stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5));
+ trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP));
+ stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP));
+ busTestBar.setVisibility(View.VISIBLE);
+ }
+ }
+
+ public void updateSweepersTestBarInfo() {
+ if (busTestBar != null && busTestBar.getVisibility() == View.VISIBLE) {
+ SweepersRoutesResult routesResult = SweepersOrderModel.getInstance().getBusRoutesResult();
+ lineIdTV.setText("lineId:" + (routesResult == null ? "" : String.valueOf(routesResult.getLineId())));
+ trajMd5TV.setText("TMd5:" + (routesResult == null ? "" : routesResult.csvFileMd5));
+ stopMd5TV.setText("SMd5:" + (routesResult == null ? "" : routesResult.txtFileMd5));
+ trajMd5DPQPTV.setText("TMd5DPQP:" + (routesResult == null ? "" : routesResult.csvFileMd5DPQP));
+ stopMd5DPQPTV.setText("SMd5DPQP:" + (routesResult == null ? "" : routesResult.txtFileMd5DPQP));
+ }
+ }
+ /**
+ * END
+ */
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/fragment/SweepersFragment.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/fragment/SweepersFragment.java
new file mode 100644
index 0000000000..ce81df1255
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/fragment/SweepersFragment.java
@@ -0,0 +1,401 @@
+package com.mogo.och.sweepers.fragment;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.Intent;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.map.CenterLine;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.function.call.map.CallerHDMapManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.map.MogoMarkerManager;
+import com.mogo.map.marker.IMogoMarker;
+import com.mogo.map.marker.MogoMarkerOptions;
+import com.mogo.och.sweepers.R;
+import com.mogo.och.sweepers.bean.SweepersStationBean;
+import com.mogo.och.sweepers.constant.SweepersConst;
+import com.mogo.och.sweepers.presenter.SweepersPresenter;
+import com.mogo.och.sweepers.ui.SweepersSwitchLineActivity;
+import com.mogo.och.sweepers.view.SlidePanelView;
+import com.mogo.och.common.module.utils.OCHThreadPoolManager;
+
+import java.util.List;
+
+
+/**
+ * 网约车小巴界面
+ *
+ * @author tongchenfei
+ */
+public class SweepersFragment extends BaseSweepersTabFragment
+ implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener {
+ private static final String TAG = "SweepersFragment";
+
+ private TextView mCurrentStationName;
+ private TextView mNextStationName;
+ private TextView mCurrentTag;
+ private TextView mNextTag;
+ private TextView mSwitchLine; //切换路线
+ private TextView mLineName;
+ private int mCurrentStation = 0;
+
+ private View mSweepers;
+
+ private SweepersStationBean startStation = null;
+ private SweepersStationBean endStation = null;
+
+ @Override
+ public String getTagName() {
+ return "SweepersFragment";
+ }
+
+ @Override
+ protected void initViews() {
+ super.initViews();
+ mSweepers = findViewById(R.id.module_och_sweepers_tag);
+ mCurrentStationName = findViewById(R.id.module_och_sweepers_current_station);
+ mCurrentTag = findViewById(R.id.module_och_sweepers_current_station_anchor);
+ mNextStationName = findViewById(R.id.module_och_sweepers_order_end_station);
+ mNextTag = findViewById(R.id.module_och_sweepers_next_station_anchor);
+ mSwitchLine = findViewById(R.id.switch_line_btn);
+ mLineName = findViewById(R.id.module_och_sweepers_line_name);
+
+ if (DebugConfig.isDebug()) {
+ mSweepers.setOnClickListener(view -> {
+ ToastUtils.showShort("重置了车站状态");
+ mPresenter.querySweepersRoutes();
+ });
+
+ //debug下调用测试面板
+ mCurrentStationName.setOnLongClickListener(v -> {
+ debugTestBar();
+ showHideTestBar();
+ return true;
+ });
+ }
+
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
+ // 初始化的时候设置 UI 按钮状态
+ switch (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE:
+ hideAutopilotBiz();
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
+ showAutopilotBiz();
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE);
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
+ showAutopilotBiz();
+ onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ break;
+ default:
+ break;
+ }
+ mSwitchLine.setOnClickListener(this);
+ }
+
+ @Override
+ protected void debugArrivedStation() {
+ mPresenter.onAutopilotArriveAtStation(null);
+ }
+
+ @NonNull
+ @Override
+ protected SweepersPresenter createPresenter() {
+ return new SweepersPresenter(this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+
+ /**
+ * 根据站点列表信息刷新车站面板,滑块面板
+ *
+ * @param stationList 车站列表信息
+ * @param currentStation 当前站点
+ * @param nextStation 下个站点
+ * @param isArrived 是否都站
+ */
+ public void refreshSweepersStations(String lineName, List stationList
+ , int currentStation, int nextStation, boolean isArrived) {
+ mCurrentStation = currentStation;
+ if (getActivity() == null) {
+ return;
+ }
+ getActivity().runOnUiThread(() -> {
+ if (stationList == null) {
+ // 获取小巴数据失败
+ return;
+ }
+
+ // 渲染小巴路线数据
+ renderCurrentStationStatus(lineName,stationList, currentStation, nextStation, isArrived);
+ });
+ }
+
+ /**
+ * 重新刷新站点信息 isArrived 是否到站
+ */
+ private void renderCurrentStationStatus(String lineName, List stationList, int currentStation
+ , int nextStation, boolean isArrived) {
+ CallerLogger.INSTANCE.d(M_BUS + "MapMaker ", "currentStation=" + currentStation + ",nextStation=" + nextStation + "isArrived=" + isArrived);
+ String currentStationName = null;
+ String nextStationName = null;
+
+ boolean isArriveEndStation = false;
+ boolean isArriveAtStation = false;
+ boolean isArriveAtStartStation = false;
+
+ mLineName.setText(lineName);
+
+ // 获取当前站点的名称
+ currentStationName = stationList.get(currentStation).getName();
+
+ startStation = stationList.get(0);
+ endStation = stationList.get(stationList.size() - 1);
+
+ // 是否到达起点
+ if (currentStation == 0) {
+ isArriveAtStartStation = true;
+ mCurrentTag.setText(getResources().getString(R.string.sweepers_arrive_to_end_start));
+
+ setOrRemoveMapMaker(true, SweepersConst.SWEEPERS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+ setOrRemoveMapMaker(true, SweepersConst.SWEEPERS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ } else if (currentStation > 0 && currentStation < stationList.size() - 1) {// 是否到达站点
+ isArriveAtStation = true;
+ mCurrentTag.setText(getResources().getString(R.string.sweepers_arrive_to_current_tag));
+ mNextTag.setText(getResources().getString(R.string.sweepers_arrive_to_next_tag));
+
+ setOrRemoveMapMaker(false, SweepersConst.SWEEPERS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+ setOrRemoveMapMaker(true, SweepersConst.SWEEPERS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ } else if (currentStation == stationList.size() - 1) {// 是否到达终点
+ isArriveEndStation = true;
+ nextStationName = "--";
+ mNextTag.setText(getResources().getString(R.string.sweepers_arrive_to_end_end));
+
+ setOrRemoveMapMaker(false, SweepersConst.SWEEPERS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+
+ if (isArrived) {
+ setOrRemoveMapMaker(false, SweepersConst.SWEEPERS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ } else {
+ setOrRemoveMapMaker(true, SweepersConst.SWEEPERS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ }
+ }
+
+ // 获取下一站点名称
+ if (nextStation > currentStation && nextStation <= stationList.size() - 1) {
+ nextStationName = stationList.get(nextStation).getName();
+ }
+
+ // 是否到达终点
+ if ( nextStation == stationList.size() - 1 || nextStation == -1) {
+ mNextTag.setText(getResources().getString(R.string.sweepers_arrive_to_end_end));
+ }else {
+ mNextTag.setText(getResources().getString(R.string.sweepers_arrive_to_next_tag));
+ }
+
+ if (currentStation == 0 && isArrived){
+ showOrHideSwitchLineBtn(true);
+ }else {
+ showOrHideSwitchLineBtn(false);
+ }
+
+ // 重置滑动按钮文字
+ if (isArriveEndStation) {
+ showSlidePanle("单程结束");
+ } else if (isArriveAtStartStation) {
+ showSlidePanle("滑动出发");
+ } else if (isArriveAtStation) {
+ showSlidePanle("滑动出发");
+ }
+
+ mCurrentStationName.setText(currentStationName);
+ mNextStationName.setText(nextStationName);
+ updateSweepersTestBarInfo();
+ }
+
+ private void showOrHideSwitchLineBtn(boolean isShow) {
+ if (isShow){
+ mSwitchLine.setVisibility(View.VISIBLE);
+ }else {
+ mSwitchLine.setVisibility(View.GONE);
+ }
+ }
+
+ public void hideOchSweepers() {
+// tvNotice.setVisibility(View.GONE);
+ }
+
+ @Override
+ public int getStationPanelViewId() {
+ return R.layout.fragment_och_sweepers;
+ }
+
+ @Override
+ public void restartAutopilot() {
+ if (!isAnimateRunning) {
+ mPresenter.restartAutopilot();
+ }
+ }
+
+ @Override
+ public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() {
+ return this;
+ }
+
+ @Override
+ public void moveToEnd() {
+ // 开启自动驾驶到下一站
+ if (isAnimateRunning){
+ stopAutopilotAnimation();
+ }
+ 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.querySweepersRoutes();
+ tvOperationStatus.setText("收车");
+ showPanel();
+ } else {
+ AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
+ tvOperationStatus.setText("出车");
+ hideSlidePanel();
+ hidPanel();
+
+ //移除起点终点
+ if (null != startStation) {
+ setOrRemoveMapMaker(false, SweepersConst.SWEEPERS_START_MAP_MAKER, startStation.getLat()
+ , startStation.getLon(),R.raw.star_marker);
+ }
+ if (null != endStation) {
+ setOrRemoveMapMaker(false, SweepersConst.SWEEPERS_END_MAP_MAKER, endStation.getLat()
+ , endStation.getLon(),R.raw.end_marker);
+ }
+ }
+ }
+
+ /**
+ * VR模式切换
+ *
+ * @param isVRMode
+ */
+ public void onVRModeChanged(boolean isVRMode) {
+ if (mRootView != null) {
+ mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ /**
+ * 绘制地图起点终点
+ *
+ * @param isAdd
+ * @param uuid
+ */
+ private void setOrRemoveMapMaker(boolean isAdd, String uuid, double lat, double longi,int resourceId) {
+ if (isAdd) {
+ Runnable setMapMarkerRunnable = new Runnable() {
+ @Override
+ public void run() {
+ CallerLogger.INSTANCE.d(M_BUS + "setMapMaker= "+Thread.currentThread().getName(),
+ uuid + "=latitude=" + lat + ",longitude=" + longi);
+
+ MogoMarkerOptions options = new MogoMarkerOptions()
+ .owner(SweepersConst.TYPE_MARKER_SWEEPERS_ORDER)
+ .anchor(0.5f, 0.5f)
+ .set3DMode(true)
+ .gps(true)
+ .controlAngle(true)
+ .icon3DRes(resourceId)
+ .latitude(lat)
+ .longitude(longi);
+ IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .addMarker(uuid, options);
+ CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo(
+ longi,lat,-1);
+ if (null != centerLine){ // 有可能鹰眼map为空没有角度。判空使用后可能造成maker角度跟道路角度不一致
+ marker.setRotateAngle(centerLine.getAngle().floatValue());
+ }
+ }
+ };
+
+ OCHThreadPoolManager.getsInstance().execute(setMapMarkerRunnable);
+
+ }else {
+ Runnable removeMapMarkerRunnable = new Runnable() {
+ @Override
+ public void run() {
+ CallerLogger.INSTANCE.d(M_BUS + "RemoveMapMaker="+Thread.currentThread().getName(),
+ uuid+"=latitude="+lat+",longitude="+longi);
+ MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(uuid);
+ }
+ };
+
+ OCHThreadPoolManager.getsInstance().execute(removeMapMarkerRunnable);
+ }
+ }
+
+ @Override
+ public void debugAutoPilotStatus(int status) {
+ mPresenter.debugAutoPilotStatus(status);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线
+ //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线
+ if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()
+ == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ ToastUtils.showLong(getResources().getString(R.string.sweepers_switch_line_btn_warning1));
+ return;
+ }
+ if (mCurrentStation > 0) {
+ ToastUtils.showLong(getResources().getString(R.string.sweepers_switch_line_btn_warning2));
+ return;
+ }
+ Intent intent = new Intent(getContext(), SweepersSwitchLineActivity.class);
+ startActivity(intent);
+ }
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/model/SweepersLineModel.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/model/SweepersLineModel.java
new file mode 100644
index 0000000000..d88069ed19
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/model/SweepersLineModel.java
@@ -0,0 +1,86 @@
+package com.mogo.och.sweepers.model;
+
+import android.content.Context;
+
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+import com.mogo.och.sweepers.bean.SweepersRoutesResponse;
+import com.mogo.och.sweepers.callback.ISweepersLinesCallback;
+import com.mogo.och.sweepers.net.SweepersServiceManager;
+import com.mogo.och.sweepers.net.ISweepersServiceCallback;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public class SweepersLineModel {
+ private static volatile SweepersLineModel sInstance;
+ private Context mContext;
+ private ISweepersLinesCallback mBusLinesCallback;
+ public static SweepersLineModel getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( SweepersLineModel.class ) {
+ if ( sInstance == null ) {
+ sInstance = new SweepersLineModel();
+ }
+ }
+ }
+ return sInstance;
+ }
+ private SweepersLineModel() {
+
+ }
+ public void init() {
+ mContext = AbsMogoApplication.getApp();
+ }
+ public void setBusLinesCallback(ISweepersLinesCallback callback){
+ mBusLinesCallback = callback;
+ }
+ public void queryBusLines(){
+ SweepersServiceManager.getInstance().queryBusLines(mContext, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersQueryLinesResponse data) {
+ if (null == data && mBusLinesCallback != null) {
+ mBusLinesCallback.onBusLinesChange(null);
+ return;
+ }
+
+ if (mBusLinesCallback != null){
+ mBusLinesCallback.onBusLinesChange(data);
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ }else {
+ ToastUtils.showShort("查询所有绑定路线失败:"+failMsg);
+ }
+ }
+ });
+ }
+
+ public void commitSwitchLineId(int lineId){
+ SweepersServiceManager.getInstance().resetStationStatus(mContext,lineId, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersRoutesResponse o) {
+ if (mBusLinesCallback != null){
+ mBusLinesCallback.onChangeLineIdSuccess();
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ }else {
+ ToastUtils.showShort("切换路线失败:"+failMsg);
+ }
+ }
+ });
+ }
+
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/model/SweepersOrderModel.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/model/SweepersOrderModel.java
new file mode 100644
index 0000000000..250b3080cb
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/model/SweepersOrderModel.java
@@ -0,0 +1,1007 @@
+package com.mogo.och.sweepers.model;
+
+import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT;
+import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_ADAS;
+import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+import static com.mogo.och.sweepers.constant.SweepersConst.STATION_STATUS_STOPPED;
+
+import android.content.Context;
+import android.location.Location;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import com.amap.api.maps.model.LatLng;
+import com.elegant.network.utils.GsonUtil;
+import com.mogo.cloud.commons.utils.CoordinateUtils;
+import com.mogo.commons.AbsMogoApplication;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.commons.voice.AIAssist;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener;
+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.CallerLogger;
+import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
+import com.mogo.eagle.core.utilcode.util.NetworkUtils;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.map.navi.IMogoCarLocationChangedListener2;
+import com.mogo.module.common.MogoApisHandler;
+import com.mogo.och.sweepers.bean.SweepersOperationStatusResponse;
+import com.mogo.och.sweepers.bean.SweepersOrderBean;
+import com.mogo.och.sweepers.bean.SweepersOrdersResponse;
+import com.mogo.och.sweepers.bean.SweepersRoutePlanningUpdateReqBean;
+import com.mogo.och.sweepers.bean.SweepersRoutesResponse;
+import com.mogo.och.sweepers.bean.SweepersRoutesResult;
+import com.mogo.och.sweepers.bean.SweepersStationBean;
+import com.mogo.och.sweepers.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.sweepers.callback.ICarOperationStatusCallback;
+import com.mogo.och.sweepers.callback.ISweepersControllerStatusCallback;
+import com.mogo.och.sweepers.callback.IRefreshSweepersStationsCallback;
+import com.mogo.och.sweepers.callback.ISlidePannelHideCallback;
+import com.mogo.och.sweepers.constant.SweepersConst;
+import com.mogo.och.sweepers.net.SweepersServiceManager;
+import com.mogo.och.sweepers.net.ISweepersServiceCallback;
+import com.mogo.och.sweepers.presenter.SweepersModelLoopManager;
+import com.mogo.och.sweepers.util.SweepersAnalyticsManager;
+import com.mogo.och.sweepers.util.SweepersTrajectoryManager;
+import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil;
+import com.mogo.och.common.module.utils.PinYinUtil;
+import com.mogo.service.statusmanager.IMogoStatusChangedListener;
+import com.mogo.service.statusmanager.StatusDescriptor;
+import com.zhjt.service.chain.ChainLog;
+import com.zhjt.service.chain.TracingConstants;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.exceptions.UndeliverableException;
+import io.reactivex.functions.Consumer;
+import io.reactivex.plugins.RxJavaPlugins;
+import io.reactivex.schedulers.Schedulers;
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author congtaowang
+ * @since 2021/3/23
+ *
+ * 小巴订单管理
+ */
+public class SweepersOrderModel {
+ private final String TAG = SweepersOrderModel.class.getSimpleName();
+ private int currentLineId = -1;
+ private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引
+ /**
+ * 运营状态、后端更具运营状态来判断车辆是否派单
+ */
+ private boolean mIsWorking = false;
+ private static volatile SweepersOrderModel sInstance;
+ public double mLongitude = 0;
+ public double mLatitude = 0;
+ private Context mContext;
+ private Disposable mBusOrdersDisposable; //定时轮询小巴车订单
+ private List prevBusOrderNos = new ArrayList<>();
+ private final List stationList = new ArrayList<>();
+ private SweepersRoutesResult sweepersRoutesResult = null;
+ /**
+ * 用来表示是否正在开往下一站
+ */
+ private boolean isGoingToNextStation = false;
+ // 运营类型
+ private static final int VEHICLE_TYPE = 10;
+ private static final int MSG_QUERY_BUS_STATION = 1001;
+ private static final long QUERY_BUS_STATION_DELAY = 5000;
+
+ private ICarOperationStatusCallback carOperationStatusCallback;
+ private IRefreshSweepersStationsCallback refreshBusStationsCallback;
+ private ISlidePannelHideCallback slidePannelHideCallback;
+ private ISweepersControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
+
+ List points = new ArrayList<>();//全路径信息
+
+ private boolean hadQueryLeaveAwayPassager = false;
+
+ private volatile boolean isArrivedStation = false;
+
+ private final Handler handler = new Handler(new Handler.Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ if ( msg.what == MSG_QUERY_BUS_STATION ) {
+ SweepersOrderModel.getInstance().querySweepersRoutes();
+ return true;
+ }
+ return false;
+ }
+ });
+
+ public static SweepersOrderModel getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( SweepersOrderModel.class ) {
+ if ( sInstance == null ) {
+ sInstance = new SweepersOrderModel();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ private SweepersOrderModel() {
+
+ }
+
+ 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 );
+
+ //自动驾驶路线规划接口
+ CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener);
+ }
+
+ //2022.1.28
+ // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
+ // The exception could not be delivered to the consumer because it has already canceled/disposed
+ // the flow or the excTeption has nowhere to go to begin with
+ RxJavaPlugins.setErrorHandler(new Consumer() {
+ @Override
+ public void accept(Throwable e) {
+ if (e instanceof UndeliverableException) {
+ e = e.getCause();
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"UndeliverableException");
+ }
+ if ((e instanceof IOException)) {//
+ // fine, irrelevant network problem or API that throws on cancellation
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"IOException");
+ return;
+ }
+ if (e instanceof InterruptedException) {
+ // fine, some blocking code was interrupted by a dispose call
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"InterruptedException");
+ return;
+ }
+ if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) {
+ // that's likely a bug in the application
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"NullPointerException or IllegalArgumentException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ if (e instanceof IllegalStateException) {
+ // that's a bug in RxJava or in a custom operator
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"IllegalStateException");
+ Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e);
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"Undeliverable exception");
+ }
+ });
+
+ //2021/10/20 轮询小巴车订单,暂时用来播报
+ startLoopBusOrders();
+ }
+
+ public void setCarOperationStatusCallback(ICarOperationStatusCallback callback){
+ this.carOperationStatusCallback = callback;
+ }
+
+ public void setRefreshBusStationsCallback(IRefreshSweepersStationsCallback callback){
+ this.refreshBusStationsCallback = callback;
+ }
+
+ public void setSlidePannelHideCallback(ISlidePannelHideCallback callback){
+ this.slidePannelHideCallback = callback;
+ }
+
+ public void setControllerStatusCallback(ISweepersControllerStatusCallback callback) {
+ this.mControllerStatusCallback = callback;
+ }
+
+ private final IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener() {
+
+ @Override
+ public void onAutopilotTrajectory(@NonNull List trajectoryInfos) {
+
+ }
+
+ @Override
+ public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) {
+ if (null != routeList && routeList.getWayPointsList().size() > 0){
+ points.clear();
+ points.addAll(coordinateConverterWgsToGcjList(mContext,routeList.getWayPointsList()));
+ updateOrderRoute();
+ }
+ }
+
+ };
+
+ public static List coordinateConverterWgsToGcjList(Context mContext, List mogoLatLngList) {
+ List points = new ArrayList<>();
+ for (MessagePad.Location m : mogoLatLngList) {
+ LatLng mogoLatLng = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(mContext, m);
+ SweepersRoutePlanningUpdateReqBean.Result result = new SweepersRoutePlanningUpdateReqBean.Result();
+ result.latitude = mogoLatLng.latitude;
+ result.longitude = mogoLatLng.longitude;
+ points.add(result);
+ }
+ return points;
+ }
+
+ /**
+ * 上报订单全路径规划数据
+ */
+ public void updateOrderRoute() {
+ if (!isGoingToNextStation || backgroundCurrentStationIndex+1 >= stationList.size() || points.size() == 0){
+ return;
+ }
+
+ SweepersStationBean currentStation = stationList.get( backgroundCurrentStationIndex);
+ SweepersStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1);
+
+ SweepersServiceManager.getInstance().updateOrderRoute(mContext, currentLineId, currentStation.getSiteId()
+ , nextStation.getSiteId(), points, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ if (isGoingToNextStation){//重试
+ updateOrderRoute();
+ }
+ }
+ });
+ }
+
+ public void debugUpdateOrderRoute(List list){
+ points.clear();
+ points.addAll(coordinateConverterWgsToGcjList(mContext,list));
+ updateOrderRoute();
+ }
+
+ /**
+ * 轮询bus待服务订单
+ */
+ private void startLoopBusOrders() {
+ if (mBusOrdersDisposable != null && !mBusOrdersDisposable.isDisposed()) {
+ return;
+ }
+ mBusOrdersDisposable = Observable.interval(SweepersConst.LOOP_DELAY,
+ SweepersConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> queryBusOrders());
+ }
+
+ private void queryBusOrders() {
+ SweepersServiceManager.getInstance().queryBusOrders(mContext, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersOrdersResponse o) {
+ if (o.data != null && o.data.orders != null && o.data.orders.size() > 0) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "获取到bus订单数据: " + o.data.orders.toString() );
+ List busOrders = o.data.orders;
+ for (int i = 0; i < busOrders.size(); i++) {
+ SweepersOrderBean order = busOrders.get(i);
+ if (order == null) return;
+ if (TextUtils.isEmpty(order.getPassengerPhone())) return;
+ if (prevBusOrderNos.contains(order.getOrderNo())) continue;
+ try {
+ String tailNum = null;
+ try {
+ tailNum = order.getPassengerPhone().substring(order.getPassengerPhone().length() - 4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ tailNum = order.getPassengerPhone();
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + tailNum);
+ AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum
+ + " 上车站点为 " + order.getStartStationName());
+ prevBusOrderNos.add(order.getOrderNo());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ public void release(){
+ if (mBusOrdersDisposable != null) {
+ mBusOrdersDisposable.dispose();
+ }
+ startOrStopOrderLoop(false);
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getStatusManagerApi()
+ .unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
+
+ // 注销到达起始站围栏监听
+ MogoApisHandler.getInstance()
+ .getApis()
+ .getRegisterCenterApi()
+ .unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
+
+ //自动驾驶路线规划接口
+ CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
+ }
+
+ private Object readResolve() {
+ // 阻止反序列化,必须实现 Serializable 接口
+ return sInstance;
+ }
+
+ private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
+ // VR mode变更回调
+ @Override
+ public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
+ if (StatusDescriptor.VR_MODE == descriptor) {
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onVRModeChanged(isTrue);
+ }
+ }
+ }
+ };
+
+ // 自车定位
+ private final IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
+
+ @Override
+ public void onCarLocationChanged2( Location location ) {
+// CallerLogger.INSTANCE.d(M_BUS + TAG,"location = "+location.getLongitude()+","+location.getLatitude());
+ mLongitude = location.getLongitude();
+ mLatitude = location.getLatitude();
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.onCarLocationChanged(location);
+ }
+
+ //是否到站的围栏判断 离站状态并且自动驾驶还未触发到站
+ if (isGoingToNextStation && !isArrivedStation){
+ judgeStartStation(location);
+ }
+ }
+ };
+
+ //根据围栏判断,是否到达起点
+ private void judgeStartStation(Location location) {
+
+ if (backgroundCurrentStationIndex +1 > stationList.size() - 1 ){
+ return;
+ }
+ SweepersStationBean upcomingStation = stationList.get( backgroundCurrentStationIndex +1);
+
+ double startLon = upcomingStation.getGcjLon();
+ double startLat = upcomingStation.getGcjLat();
+ double distance = CoordinateUtils.calculateLineDistance(
+ startLon, startLat,
+ location.getLongitude(), location.getLatitude() );
+
+ Logger.i(TAG, "judgeStartStation() distance = " + distance);
+
+ if ( distance > SweepersConst.ARRIVE_AT_END_STATION_DISTANCE ) {
+ distance = CoordinateUtils.calculateLineDistance(startLon, startLat,
+ CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(),
+ CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat());
+ }
+
+ if ( distance <= SweepersConst.ARRIVE_AT_END_STATION_DISTANCE ) {
+ onArriveAt(null); //无自动驾驶到站信息传null
+ return;
+ }
+ }
+
+ /**
+ * 查询小巴路线
+ */
+ public void querySweepersRoutes() {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "查询小巴路线");
+ SweepersServiceManager.getInstance().queryBusRoutes(mContext, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersRoutesResponse data) {
+ if ( data == null
+ || data.getResult() == null
+ || data.getResult().getSites() == null
+ || data.getResult().getSites().isEmpty() ) {
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + data );
+ renderBusStationsStatus( data.getResult());
+ }
+ @Override
+ public void onFail(String failMsg) {
+ // 重复请求小巴路线,直至成功
+ queryBusStationDelay();
+ }
+ });
+
+ }
+
+ /**
+ * 测试、重置站点状态
+ */
+ public void debugResetStationStatus() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "测试、重置站点状态");
+ SweepersServiceManager.getInstance().resetStationStatus(mContext, currentLineId
+ , new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersRoutesResponse o) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "获取到小巴路线数据: " + o);
+ isGoingToNextStation = false;
+ if (o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty()) {
+ return;
+ }
+ renderBusStationsStatus(o.getResult());
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+ // 重复请求小巴路线,直至成功
+ queryBusStationDelay();
+ }
+ });
+
+ }
+
+ /**
+ * 离站上报
+ */
+ public void leaveStation(boolean isOneWayOver,boolean isRestart){
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"leaveStation-backgroundCurrentStationIndex = "+backgroundCurrentStationIndex);
+ SweepersServiceManager.getInstance().leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq()
+ , stationList.get(backgroundCurrentStationIndex).getSiteId(), new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersRoutesResponse o) {
+ if ( o.getResult() == null || o.getResult().getSites() == null || o.getResult().getSites().isEmpty() ) {
+ return;
+ }
+ isArrivedStation = false;
+ if (!isOneWayOver){
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "自动驾驶开启开往下一站====" );
+ //需要更改当前站和下一站的状态 然后渲染
+ leaveStationSuccess(o.getResult(),isRestart);
+ }else {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "单程真的结束了====" );
+ isGoingToNextStation = false;
+ backgroundCurrentStationIndex = 0;
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ querySweepersRoutes();
+ }
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ }else{
+ ToastUtils.showShort("离站上报失败:"+failMsg);
+ }
+ }
+ });
+ }
+
+ /**
+ * 离站上报成功后渲染站点
+ * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
+ * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染
+ */
+ @ChainLog(
+ linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT,
+ linkCode = CHAIN_LINK_ADAS,
+ endpoint = TracingConstants.Endpoint.PAD,
+ nodeAliasCode = CHAIN_ALIAS_CODE_OCH_BUS_START_AUTOPILOT,
+ paramIndexes = {0},
+ clientPkFileName = "sn"
+ )
+ private void leaveStationSuccess(SweepersRoutesResult result, boolean isRestart) {
+ renderBusStationsStatus(result);
+ if (slidePannelHideCallback != null) {
+ slidePannelHideCallback.hideSlidePanel();
+ }
+ //开启自动驾驶
+ startAutopilot(isRestart);
+ if (isGoingToNextStation) {
+ // 为了避免恢复自动驾驶时重复的接口请求
+ return;
+ }
+ isGoingToNextStation = true;
+ AIAssist.getInstance( mContext ).speakTTSVoice( "欢迎乘坐’蘑菇车联‘无人驾驶小巴车,请您坐好,注意乘车安全,行程即将开始" );
+ }
+
+ /**
+ * 开启自动驾驶
+ * @param isRestart
+ */
+ private void startAutopilot(boolean isRestart) {
+
+ triggerStartServiceEvent(isRestart, false);
+
+ isArrivedStation = false;
+ SweepersStationBean currentStation = stationList.get( backgroundCurrentStationIndex);
+ SweepersStationBean nextStation = stationList.get( backgroundCurrentStationIndex + 1);
+
+// if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE
+// == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) {
+// ToastUtils.showShort("自动驾驶状态为不可用!");
+// }
+ AutopilotControlParameters parameters = new AutopilotControlParameters();
+ parameters.isSpeakVoice = !isRestart;
+ parameters.routeID = sweepersRoutesResult.getLineId();
+ parameters.routeName = sweepersRoutesResult.getName();
+ parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName());
+ parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName());
+ parameters.startLatLon = new AutopilotControlParameters
+ .AutoPilotLonLat( currentStation.getLat(), currentStation.getLon() );
+ parameters.endLatLon = new AutopilotControlParameters
+ .AutoPilotLonLat( nextStation.getLat(), nextStation.getLon() );
+ parameters.vehicleType = VEHICLE_TYPE;
+ if (parameters.autoPilotLine == null) {
+ parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine(
+ sweepersRoutesResult.getLineId(),
+ sweepersRoutesResult.csvFileUrl, sweepersRoutesResult.csvFileMd5,
+ sweepersRoutesResult.txtFileUrl, sweepersRoutesResult.txtFileMd5,
+ sweepersRoutesResult.contrailSaveTime, sweepersRoutesResult.carModel,
+ sweepersRoutesResult.csvFileUrlDPQP, sweepersRoutesResult.csvFileMd5DPQP,
+ sweepersRoutesResult.txtFileUrlDPQP, sweepersRoutesResult.txtFileMd5DPQP,
+ sweepersRoutesResult.contrailSaveTimeDPQP);
+ }
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "开启自动驾驶====" + GsonUtil.jsonFromObject(parameters)
+ +" startLatLon="+currentStation.getName()+",endLatLon="+nextStation.getName());
+ CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters);
+
+ if (mControllerStatusCallback != null) {
+ mControllerStatusCallback.startOpenAutopilot();
+ }
+ }
+
+ /**
+ * 到站后重置站点状态
+ */
+ private void arriveSiteStation(boolean isRestart) {
+ if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) { //到站短时间内调用多次
+ CallerLogger.INSTANCE.e( M_BUS + TAG, "数组越界" );
+ return;
+ }
+ int arrivedStationIndex = 0;
+ if (!isRestart){
+ arrivedStationIndex = backgroundCurrentStationIndex + 1;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation-currentStationIndex = "+ arrivedStationIndex);
+
+ SweepersServiceManager.getInstance().arriveSiteStation(mContext
+ , stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId()
+ , new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG,"arriveSiteStation success");
+ if (!isRestart){
+ renderArriveBusStation();
+ }
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+// if (!NetworkUtils.isConnected(mContext)) {
+// ToastUtils.showShort("网络异常,请稍后重试");
+// }else {
+// ToastUtils.showShort("离站上报失败:"+failMsg);
+// }
+
+ }
+ });
+ }
+
+ private void renderArriveBusStation() {
+ List site = sweepersRoutesResult.getSites();
+ if (site != null && site.size() > 0){
+ backgroundCurrentStationIndex ++;
+ if (refreshBusStationsCallback != null){
+ refreshBusStationsCallback.refreshBusStations(sweepersRoutesResult.getName(),stationList, backgroundCurrentStationIndex
+ , getNextStopStation(),true);
+ }
+ }
+ }
+
+ /**
+ * 查询到站下车乘客
+ */
+ private void queryStationLeaveAwayPassengers() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "查询到站下车乘客");
+
+ SweepersServiceManager.getInstance().queryStationLeaveAwayPassengers(mContext
+ , stationList.get(backgroundCurrentStationIndex +1).getSeq(), stationList.get(backgroundCurrentStationIndex+1).getSiteId()
+ , new ISweepersServiceCallback() {
+ @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(){
+ SweepersServiceManager.getInstance().stopTakeOrder(mContext, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ mIsWorking = !mIsWorking;
+ closeBeautificationMode();
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ startOrStopOrderLoop(mIsWorking);
+ SweepersTrajectoryManager.getInstance().stopTrajReqLoop();
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ }else {
+ ToastUtils.showShort("收车失败:"+failMsg);
+ }
+ }
+ });
+ }
+
+ /**
+ * 关闭美化模式
+ */
+ private void closeBeautificationMode() {
+ if (FunctionBuildConfig.isDemoMode) {//收车结束美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+ CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false);
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(收车)");
+ }
+ }
+
+ /**
+ * 出车
+ */
+ public void startTakeOrder(){
+ SweepersServiceManager.getInstance().startTakeOrder(mContext, new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(BaseData o) {
+ mIsWorking = !mIsWorking;
+ startOrStopOrderLoop(mIsWorking);
+ if ( stationList != null && stationList.size() > 0 ) {
+ AIAssist.getInstance( mContext ).speakTTSVoice( "车辆已整备完毕,请前往"
+ + stationList.get( backgroundCurrentStationIndex ).getName() + "站点" );
+ }
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ querySweepersRoutes();
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ }else {
+ ToastUtils.showShort("出车失败:"+failMsg);
+ }
+ }
+ });
+ }
+
+ /**
+ * 查询运营状态
+ */
+ public void queryOperationStatus() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态");
+ SweepersServiceManager.getInstance().queryOperationStatus(mContext
+ , new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(SweepersOperationStatusResponse o) {
+ if ( o.data != null ) {
+ mIsWorking = o.data.serviceStatus == 1;
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "查询运营状态 result.status: " + o.data.serviceStatus);
+ startOrStopOrderLoop(mIsWorking);
+ }
+ carOperationStatusCallback.changeOperationStatus(isWorking());
+ }
+ @Override
+ public void onFail(String failMsg) {
+ if (!NetworkUtils.isConnected(mContext)) {
+ ToastUtils.showShort("网络异常,请稍后重试");
+ }else {
+ ToastUtils.showShort("出车收车状态查询:"+failMsg);
+ }
+// queryOperationStatus();
+ }
+ });
+ }
+
+ /**
+ * 开启自动驾驶到下一站
+ */
+ public void autoDriveToNextStation( boolean isRestart ) {
+ if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) {
+ // 当前站是最后一站,结束当前行程
+ travelOver();
+ return;
+ }
+ leaveStation(false,isRestart);
+ }
+
+ /**
+ * 渲染站点信息
+ * 服务端返回的OchBusRoutesResult逻辑, 离开站为当前站, 到达下一站后才会将下一站置为当前站,
+ * 车机端展示 离开站为当前站点,前往站为下一站, 下一站到站后在置为当前站
+ * @param result
+ */
+ private void renderBusStationsStatus(SweepersRoutesResult result) {
+ if (result == null) return;
+ sweepersRoutesResult = result;
+ List site = result.getSites();
+ currentLineId = result.getLineId();
+ stationList.clear();
+ stationList.addAll( site );
+ for ( int i = 0; i < stationList.size(); i++ ) {
+ SweepersStationBean s = stationList.get( i );
+
+ CallerLogger.INSTANCE.d( M_BUS + "renderBusStationsStatus--",
+ "Index="+ i+" ,name = "+s.getName()+" ,"+s.isLeaving()+","+s.getDrivingStatus());
+
+ // 是否正在开往下一站
+ if ( s.isLeaving()) {
+ isGoingToNextStation = true;
+ }
+ // 当前站点信息
+ if (s.getDrivingStatus() == STATION_STATUS_STOPPED ) {
+ backgroundCurrentStationIndex = i;
+ break;
+ }
+ }
+
+ SweepersStationBean currentStation = stationList.get(backgroundCurrentStationIndex);
+
+ CallerLogger.INSTANCE.d( M_BUS + TAG,
+ "渲染站点信息服务端currentStationIndex="+backgroundCurrentStationIndex
+ +" isLeaving()="+currentStation.isLeaving());
+
+ //当前站点是始发站,告诉服务端到达始发站。 如果没有这个节点, 服务器不知道始发站到达状态
+ // ,订单开始站下在始发站的状态流转有问题
+ if (backgroundCurrentStationIndex == 0 && !currentStation.isLeaving()){
+ arriveSiteStation(true);
+ }
+
+ // 美化是否开始
+ if (FunctionBuildConfig.isDemoMode && (backgroundCurrentStationIndex >= 0
+ && backgroundCurrentStationIndex <= stationList.size()-1)
+ && stationList.get(backgroundCurrentStationIndex).isLeaving()){//行驶过程中设置美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true;
+ CallerAutoPilotManager.INSTANCE.setIPCDemoMode(true);
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为true(每次滑动出发)");
+ }
+
+ if (refreshBusStationsCallback != null){
+ refreshBusStationsCallback.refreshBusStations(result.getName(),stationList
+ , backgroundCurrentStationIndex, getNextStopStation(),!currentStation.isLeaving());
+ }
+
+ if ( currentStation.isLeaving() && slidePannelHideCallback != null) {
+ slidePannelHideCallback.hideSlidePanel();
+ }
+
+ //需放在currentStationIndex赋值之后
+ SweepersTrajectoryManager.getInstance().syncTrajectoryInfo();
+ }
+
+ /**
+ * 根据订单状态、获取下一站靠站的的站点
+ *
+ * @return -1 当前已是最后一个站点
+ */
+ private int getNextStopStation() {
+ if ( backgroundCurrentStationIndex >= stationList.size() - 1 ) {
+ return -1;
+ }
+ int nextStationIndex = backgroundCurrentStationIndex + 1;
+ for ( ; nextStationIndex < stationList.size() - 1; nextStationIndex++ ) {
+ if ( stationList.get( nextStationIndex ).getIfStop() == 1 ) {
+ break;
+ }
+ break;
+ }
+ return nextStationIndex;
+ }
+
+ /**
+ * 延时查询站点信心
+ */
+ private void queryBusStationDelay() {
+ handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_STATION, QUERY_BUS_STATION_DELAY );
+ }
+
+ /**
+ * 在踩刹车、控制方向盘等操作后,会停止自动驾驶,重启自动驾驶的话相当于重新设置自动驾驶目的地
+ */
+ public void restartAutopilot() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "重启自动驾驶===" + isGoingToNextStation );
+ autoDriveToNextStation( true );
+ }
+
+ /**
+ * 播报下车乘客信息
+ *
+ * @param awayPassengersResponse
+ */
+ private void playLeavePassengersMsg( QueryLeaveAwayPassengersResponse awayPassengersResponse ) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息currentStationIndex="
+ + String.valueOf(backgroundCurrentStationIndex + 1));
+
+ if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) {
+ return;
+ }
+ String station = stationList.get( backgroundCurrentStationIndex+1 ).getName();
+ StringBuilder builder = new StringBuilder( "已到达" );
+ builder.append( station );
+ if ( !station.endsWith( "站" ) ) {
+ builder.append( "站" );
+ }
+ if ( awayPassengersResponse == null || awayPassengersResponse.data == null
+ || awayPassengersResponse.data.orders == null || awayPassengersResponse.data.orders.isEmpty() ) {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "播报下车乘客信息为null");
+ } else {
+ builder.append( ",请尾号为 " );
+ for ( QueryLeaveAwayPassengersResponse.LeaveAwayPassenger leaveAwayPassenger : awayPassengersResponse.data.orders ) {
+ if ( leaveAwayPassenger == null ) {
+ continue;
+ }
+ String tailNum = null;
+ try {
+ tailNum = leaveAwayPassenger.passengerPhone.substring(leaveAwayPassenger.passengerPhone.length() - 4);
+ } catch (Exception e) {
+ e.printStackTrace();
+ tailNum = leaveAwayPassenger.passengerPhone;
+ }
+ builder.append( tailNum ).append( "。" );
+ }
+ builder.append( "的乘客下车" );
+ }
+ builder.append(",带好随身物品,下车请注意安全");
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "TTS:" + builder.toString());
+ AIAssist.getInstance( mContext ).speakTTSVoice( builder.toString() );
+ }
+
+ /**
+ * 修改小巴运营状态
+ */
+ public void onChangeOperationStatus() {
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "修改小巴运营状态");
+ if (isWorking()){//收车
+ stopTakeOrder();
+ }else {//出车
+ startTakeOrder();
+ }
+ }
+
+ /**
+ * 行程结束
+ */
+ private void travelOver() {
+
+ if ( backgroundCurrentStationIndex >= stationList.size() ) {
+ CallerLogger.INSTANCE.e( M_BUS + TAG, "travel over index out of station list" );
+ return;
+ }
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "单程结束====" );
+ CallerAutoPilotManager.INSTANCE.cancelAutoPilot();
+ AIAssist.getInstance( mContext ).speakTTSVoice( "感谢您体验'蘑菇车联'无人驾驶小巴车,请您携带好随身物品,我们下次再见" );
+ leaveStation(true,true);
+ }
+
+ public boolean isWorking() {
+ return mIsWorking;
+ }
+
+ /**
+ * 到站
+ * @param data
+ */
+ public void onArriveAt( MessagePad.ArrivalNotification data){
+ if ( backgroundCurrentStationIndex +1 > stationList.size() - 1 ) {
+ CallerLogger.INSTANCE.e( M_BUS + TAG, "到站异常,取消后续操作结束" );
+ return;
+ }
+
+ if (isArrivedStation) return;
+ isArrivedStation = true;
+
+ if (FunctionBuildConfig.isDemoMode && backgroundCurrentStationIndex <= stationList.size() - 1) {//到达一站结束美化
+ FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false;
+ CallerAutoPilotManager.INSTANCE.setIPCDemoMode(false);
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "美化模式-ignore:置为false(到最后一站)");
+ }
+ CallerLogger.INSTANCE.d( M_BUS + TAG, "到站====currentStationIndex=" + backgroundCurrentStationIndex);
+ isGoingToNextStation = false;
+
+ queryStationLeaveAwayPassengers();
+ UiThreadHandler.postDelayed(new Runnable() {// 先查询下车乘客,再上报到站,便于后台筛查下车订单
+ @Override
+ public void run() {
+ if (!hadQueryLeaveAwayPassager){
+ arriveSiteStation(false);
+ }
+ hadQueryLeaveAwayPassager = false;
+ }
+ },1500);
+ }
+
+ public boolean isGoingToNextStation() {
+ return isGoingToNextStation;
+ }
+
+ // 车机端上传心跳数据(只在出车状态时上传)
+ public void runCarHeartbeat() {
+ SweepersServiceManager.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
+ new ISweepersServiceCallback() {
+ @Override
+ public void onSuccess(BaseData data) {
+
+ }
+
+ @Override
+ public void onFail(String failMsg) {
+
+ }
+ });
+ }
+
+ private void startOrStopOrderLoop(boolean start) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "startOrStopOrderLoop() " + start);
+ if (start) {
+ SweepersModelLoopManager.getInstance().startHeartbeatLoop();
+ } else {
+ SweepersModelLoopManager.getInstance().stopHeartbeatLoop();
+ }
+ }
+
+ public void triggerStartServiceEvent(boolean isRestart, boolean send) {
+ if (stationList == null || backgroundCurrentStationIndex >= stationList.size()-1) {
+ return;
+ }
+ SweepersStationBean currentStation = stationList.get( backgroundCurrentStationIndex);
+ SweepersStationBean nextStation = stationList.get( backgroundCurrentStationIndex +1);
+ SweepersAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send,
+ currentStation.getName(), nextStation.getName(), currentLineId);
+ }
+
+ public SweepersRoutesResult getBusRoutesResult() {
+ return sweepersRoutesResult;
+ }
+
+ public int getCurrentStationIndex() {
+ return backgroundCurrentStationIndex;
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/ISweepersApiService.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/ISweepersApiService.java
new file mode 100644
index 0000000000..fb603c5200
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/ISweepersApiService.java
@@ -0,0 +1,154 @@
+package com.mogo.och.sweepers.net;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.och.sweepers.bean.SweepersOperationStatusRequest;
+import com.mogo.och.sweepers.bean.SweepersOrdersResponse;
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+import com.mogo.och.sweepers.bean.SweepersRoutePlanningUpdateReqBean;
+import com.mogo.och.sweepers.bean.SweepersRoutesResponse;
+import com.mogo.och.sweepers.bean.CarHeartbeatReqBean;
+import com.mogo.och.sweepers.bean.SweepersQueryLineStationsRequest;
+import com.mogo.och.sweepers.bean.SweepersOperationStatusResponse;
+import com.mogo.och.sweepers.bean.QueryLeaveAwayPassengersRequest;
+import com.mogo.och.sweepers.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.sweepers.bean.SweepersResetDrivingLineRequest;
+import com.mogo.och.sweepers.bean.SweepersUpdateSiteStatusRequest;
+
+import io.reactivex.Observable;
+import retrofit2.http.Body;
+import retrofit2.http.GET;
+import retrofit2.http.Header;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+import retrofit2.http.Query;
+
+/**
+ * 小巴车相关接口
+ *
+ * @author tongchenfei
+ *
+ * wiki: http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=48970072
+ */
+public interface ISweepersApiService {
+ /**
+ * 根据车机坐标获取所在区域全部站点信息
+ *
+ * @param request 请求参数
+ * @return 接口返回数据
+ */
+ @Headers( {"Content-Type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" )
+ @POST( "/autopilot-car-hailing/line/v2/driver/bus/lineDataWithDriver/query" )
+// @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
+ Observable querySiteByCoordinate(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweepersQueryLineStationsRequest request);
+
+ /**
+ * 重置巴士路线: 点击小巴车tab 或者出车后会使用
+ *
+ * @param request 请求参数{"destLine":1,"sn":"F803EB2046PZD00229"} 这个接口是重置bus线路的, 不是重置线路中站点的
+ * @return 返回值是重置后的车站列表
+ */
+ @Headers( {"Content-Type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" )
+ @POST( "/autopilot-car-hailing/car/v2/driver/bus/drivingLine/reset" )
+// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" )
+ Observable resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweepersResetDrivingLineRequest request);
+
+ /**
+ * 离站,通知服务器
+ * @param request
+ * @return
+ */
+ @Headers({"Content-Type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/car/v2/bus/driving/away")
+ @POST("/autopilot-car-hailing/car/v2/driver/bus/driving/away")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away")
+ Observable leaveStation(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweepersUpdateSiteStatusRequest request);
+
+ /**
+ * 到站 更新到站信息
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/order/v2/bus/driving/attachSite")
+ @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/attachSite")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/attachSite")
+ Observable< BaseData > arriveSiteStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body SweepersUpdateSiteStatusRequest request);
+
+
+ /**
+ * 到站查询下车乘客
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/order/v2/bus/driving/siteArrivedOrders")
+ @POST("/autopilot-car-hailing/order/v2/driver/bus/driving/siteArrivedOrders")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
+ Observable< QueryLeaveAwayPassengersResponse > queryStationLeaveAwayPassengers(@Header ("appId") String appId,@Header("ticket") String ticket,@Body QueryLeaveAwayPassengersRequest request);
+
+ /**
+ * 出车
+ * @param request
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder")
+ @POST("/autopilot-car-hailing/car/v2/driver/bus/startTakeOrder")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder")
+ Observable startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body SweepersOperationStatusRequest request);
+
+ /**
+ * 收车
+ * @param request
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder")
+ @POST("/autopilot-car-hailing/car/v2/driver/bus/stopTakeOrder")
+// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder")
+ Observable stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body SweepersOperationStatusRequest request);
+
+ /**
+ * 查询小巴出车/收车状态
+ * @param sn
+ * @return
+ */
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query")
+ @GET("/autopilot-car-hailing/car/v2/driver/bus/takeOrderStatus/query")
+// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query")
+ Observable queryOperationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+
+ @Headers({"Content-type:application/json;charset=UTF-8"})
+// @GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query")
+ @GET("/autopilot-car-hailing/order/v2/driver/bus/servicingOrders/query")
+// @GET("/mock/268/autopilot-car-hailing/bus/api/servicingOrders/query")
+ Observable queryBusOrders(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param data
+ * @return
+ */
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+// @POST( "/autopilot-car-hailing/location/v2/driver/heartbeat" )
+ @POST( "/autopilot-car-hailing/location/v2/driver/bus/heartbeat" )
+ Observable runCarHeartbeat(@Header ("appId") String appId,@Header("ticket") String ticket,@Body CarHeartbeatReqBean data);
+
+ /**
+ * 查询车辆配置的所有路线
+ * @param appId
+ * @param ticket
+ * @param sn
+ * @return
+ */
+// @GET("/autopilot-car-hailing/line/v2/driver/bindLine/query")
+ @GET("/autopilot-car-hailing/line/v2/driver/bus/bindLine/query")
+ Observable queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
+
+ @Headers( {"Content-type:application/json;charset=UTF-8"} )
+ @POST( "/autopilot-car-hailing/location/v2/driver/bus/saveLineCoordinate" )
+ Observable updateOrderRoute(@Header ("appId") String appId, @Header("ticket") String ticket, @Body SweepersRoutePlanningUpdateReqBean data);
+}
+
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/ISweepersServiceCallback.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/ISweepersServiceCallback.java
new file mode 100644
index 0000000000..900fae43ae
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/ISweepersServiceCallback.java
@@ -0,0 +1,15 @@
+package com.mogo.och.sweepers.net;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/20
+ */
+public interface ISweepersServiceCallback< T >{
+ void onSuccess(T o);
+
+ void onFail(String failMsg);
+
+ default void onError() {
+
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/SweepersServiceManager.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/SweepersServiceManager.java
new file mode 100644
index 0000000000..f1fdc883a5
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/net/SweepersServiceManager.java
@@ -0,0 +1,256 @@
+package com.mogo.och.sweepers.net;
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.Context;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.eagle.core.data.BaseData;
+import com.mogo.eagle.core.network.MoGoRetrofitFactory;
+import com.mogo.eagle.core.network.RequestOptions;
+import com.mogo.eagle.core.network.SubscribeImpl;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+import com.mogo.och.sweepers.bean.SweepersRoutePlanningUpdateReqBean;
+import com.mogo.och.sweepers.bean.SweepersRoutesResponse;
+import com.mogo.och.sweepers.bean.CarHeartbeatReqBean;
+import com.mogo.och.sweepers.bean.SweepersOperationStatusRequest;
+import com.mogo.och.sweepers.bean.SweepersOperationStatusResponse;
+import com.mogo.och.sweepers.bean.SweepersOrdersResponse;
+import com.mogo.och.sweepers.bean.SweepersQueryLineStationsRequest;
+import com.mogo.och.sweepers.bean.SweepersResetDrivingLineRequest;
+import com.mogo.och.sweepers.bean.SweepersUpdateSiteStatusRequest;
+import com.mogo.och.sweepers.bean.QueryLeaveAwayPassengersRequest;
+import com.mogo.och.sweepers.bean.QueryLeaveAwayPassengersResponse;
+import com.mogo.och.sweepers.constant.SweepersConst;
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+
+import java.util.List;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author: wangmingjun
+ * @date: 2021/10/20
+ */
+public class SweepersServiceManager {
+
+ private static final String TAG = SweepersServiceManager.class.getSimpleName();
+
+ private final ISweepersApiService mService;
+
+ private static final class SingletonHolder {
+ private static final SweepersServiceManager INSTANCE = new SweepersServiceManager();
+ }
+
+ public static SweepersServiceManager getInstance(){
+ return SingletonHolder.INSTANCE;
+ }
+
+ private SweepersServiceManager(){
+ mService = MoGoRetrofitFactory.getInstance(SweepersConst.getBaseUrl()).create(ISweepersApiService.class);
+ }
+
+ /**
+ * 查询小巴车线路
+ * @param context
+ * @param callback
+ */
+ public void queryBusRoutes(Context context, ISweepersServiceCallback callback) {
+ //获取当前高德坐标
+
+ mService.querySiteByCoordinate(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ , new SweepersQueryLineStationsRequest(SweepersOrderModel.getInstance().mLongitude
+ , SweepersOrderModel.getInstance().mLatitude,true))
+ .subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
+ .subscribe( getSubscribeImpl(context,callback,"querySiteByCoordinate"));
+ }
+
+ /**
+ * 重置线路站点
+ * @param context
+ * @param lineId
+ * @param callback
+ */
+ public void resetStationStatus(Context context, int lineId, ISweepersServiceCallback callback){
+ mService.resetStationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),new SweepersResetDrivingLineRequest(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, ISweepersServiceCallback callback){
+ mService.leaveStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new SweepersUpdateSiteStatusRequest(seq,siteId, SweepersOrderModel.getInstance().mLongitude
+ , SweepersOrderModel.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, ISweepersServiceCallback callback){
+ mService.arriveSiteStation(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new SweepersUpdateSiteStatusRequest(seq,siteId
+ , SweepersOrderModel.getInstance().mLongitude, SweepersOrderModel.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
+ , ISweepersServiceCallback callback){
+ mService.queryStationLeaveAwayPassengers( MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),new QueryLeaveAwayPassengersRequest(seq,siteId))
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"queryStationLeaveAwayPassengers"));
+ }
+
+ /**
+ * 收车
+ * @param context
+ * @param callback
+ */
+ public void stopTakeOrder(Context context, ISweepersServiceCallback callback){
+ mService.stopTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new SweepersOperationStatusRequest(SweepersOrderModel.getInstance().mLongitude
+ , SweepersOrderModel.getInstance().mLatitude))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"stopTakeOrder"));
+ }
+
+ /**
+ * 出车
+ * @param context
+ * @param callback
+ */
+ public void startTakeOrder(Context context, ISweepersServiceCallback callback){
+ mService.startTakeOrder(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new SweepersOperationStatusRequest(SweepersOrderModel.getInstance().mLongitude
+ , SweepersOrderModel.getInstance().mLatitude))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"startTakeOrder"));
+ }
+
+ /**
+ * 查询出车/收车状态
+ * @param context
+ * @param callback
+ */
+ public void queryOperationStatus(Context context, ISweepersServiceCallback callback){
+ mService.queryOperationStatus(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn( Schedulers.io() )
+ .observeOn( AndroidSchedulers.mainThread() )
+ .subscribe(getSubscribeImpl(context,callback,"queryOperationStatus"));
+ }
+
+ /**
+ * 查询小巴车订单
+ * @param context
+ * @param callback
+ */
+ public void queryBusOrders(Context context, ISweepersServiceCallback callback){
+ mService.queryBusOrders(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"queryBusOrders"));
+ }
+
+ public void queryBusLines(Context context, ISweepersServiceCallback callback){
+ mService.queryBusLines(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),MoGoAiCloudClientConfig.getInstance().getSn())
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"queryBusLines"));
+ }
+
+ public void updateOrderRoute(Context context,int lineId, int startSiteId, int endSiteId
+ , List< SweepersRoutePlanningUpdateReqBean.Result > points
+ , ISweepersServiceCallback callback){
+ mService.updateOrderRoute(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken()
+ ,new SweepersRoutePlanningUpdateReqBean(MoGoAiCloudClientConfig.getInstance().getSn()
+ ,lineId,startSiteId,endSiteId, points))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context,callback,"updateOrderRoute"));
+ }
+
+ /**
+ * 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
+ * @param context
+ * @param lon
+ * @param lat
+ * @param callback
+ */
+ public void runCarHeartbeat(Context context, double lon, double lat,
+ ISweepersServiceCallback callback) {
+ mService.runCarHeartbeat(MoGoAiCloudClientConfig.getInstance().getServiceAppId()
+ ,MoGoAiCloudClientConfig.getInstance().getToken(),new CarHeartbeatReqBean(
+ MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
+ }
+
+ private SubscribeImpl getSubscribeImpl(Context context, ISweepersServiceCallback callback, String apiName){
+ return new SubscribeImpl(RequestOptions.create(context)){
+ @Override
+ public void onSuccess(T o) {
+ super.onSuccess(o);
+ CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onSuccess() " + o.msg);
+ if (callback != null) {
+ callback.onSuccess(o);
+ }
+ }
+
+ @Override
+ public void onError(String message, int code) {
+ super.onError(message, code);
+ CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +"msg="+ message+" code="+code);
+ if (callback != null) {
+ callback.onFail("msg="+ message+" code="+code);
+ }
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ super.onError(e);
+ CallerLogger.INSTANCE.e(M_BUS + TAG,apiName + ": onError() " +" e="+e.getMessage());
+ if (callback != null) {
+ callback.onFail(e.getMessage());
+ }
+ }
+ };
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersLinePresenter.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersLinePresenter.java
new file mode 100644
index 0000000000..378b5835bb
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersLinePresenter.java
@@ -0,0 +1,79 @@
+package com.mogo.och.sweepers.presenter;
+
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+import com.mogo.och.sweepers.callback.ISweepersLinesCallback;
+import com.mogo.och.sweepers.model.SweepersLineModel;
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+import com.mogo.och.sweepers.ui.SweepersSwitchLineView;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/9
+ */
+public class SweepersLinePresenter extends Presenter implements ISweepersLinesCallback {
+
+ public SweepersLinePresenter(SweepersSwitchLineView view) {
+ super(view);
+ SweepersLineModel.getInstance().init();
+ SweepersOrderModel.getInstance().init();
+ }
+
+ @Override
+ public void onCreate(@NonNull LifecycleOwner owner) {
+ super.onCreate(owner);
+ initListener();
+ }
+
+ private void initListener() {
+ SweepersLineModel.getInstance().setBusLinesCallback(this);
+ }
+
+ private void runOnUIThread( Runnable executor ) {
+ if ( executor == null ) {
+ return;
+ }
+ if ( Looper.myLooper() != Looper.getMainLooper() ) {
+ UiThreadHandler.post( executor );
+ } else {
+ executor.run();
+ }
+ }
+
+ @Override
+ public void onBusLinesChange(SweepersQueryLinesResponse lines) {
+ runOnUIThread(() -> mView.onBusLinesChange(lines));
+ }
+
+ @Override
+ public void onChangeLineIdSuccess() {
+ runOnUIThread(() -> mView.onChangeLineIdSuccess());
+ }
+
+ public void queryBusLines(){
+ SweepersLineModel.getInstance().queryBusLines();
+ }
+
+ public void commitSwitchLineId(int lineId){
+ SweepersLineModel.getInstance().commitSwitchLineId(lineId);
+ }
+
+ public void removeListener(){
+ SweepersLineModel.getInstance().setBusLinesCallback(null);
+ }
+
+ public void queryBusRoutes(){
+ SweepersOrderModel.getInstance().querySweepersRoutes();
+ }
+
+ @Override
+ public void onDestroy(@NonNull LifecycleOwner owner) {
+ super.onDestroy(owner);
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersModelLoopManager.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersModelLoopManager.java
new file mode 100644
index 0000000000..2d4740919f
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersModelLoopManager.java
@@ -0,0 +1,55 @@
+package com.mogo.och.sweepers.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.sweepers.constant.SweepersConst;
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+
+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 SweepersModelLoopManager {
+
+ private static final String TAG = SweepersModelLoopManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final SweepersModelLoopManager INSTANCE = new SweepersModelLoopManager();
+ }
+
+ public static SweepersModelLoopManager getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private Disposable mHeartbeatDisposable; //心跳轮询
+
+ public void startHeartbeatLoop() {
+ if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.i(M_BUS + TAG, "startHeartbeatLoop()");
+ mHeartbeatDisposable = Observable.interval(SweepersConst.LOOP_DELAY,
+ SweepersConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> SweepersOrderModel.getInstance().runCarHeartbeat());
+ }
+
+ public void stopHeartbeatLoop() {
+ if (mHeartbeatDisposable != null) {
+ CallerLogger.INSTANCE.i(M_BUS + TAG, "stopHeartbeatLoop()");
+ mHeartbeatDisposable.dispose();
+ mHeartbeatDisposable = null;
+ }
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersPresenter.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersPresenter.java
new file mode 100644
index 0000000000..83d0c932e2
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/presenter/SweepersPresenter.java
@@ -0,0 +1,288 @@
+package com.mogo.och.sweepers.presenter;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.location.Location;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.LifecycleOwner;
+
+import com.mogo.commons.mvp.Presenter;
+import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
+import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.sweepers.bean.SweepersStationBean;
+import com.mogo.och.sweepers.callback.ICarOperationStatusCallback;
+import com.mogo.och.sweepers.callback.ISweepersControllerStatusCallback;
+import com.mogo.och.sweepers.callback.IRefreshSweepersStationsCallback;
+import com.mogo.och.sweepers.callback.ISlidePannelHideCallback;
+import com.mogo.och.sweepers.fragment.SweepersFragment;
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+import com.mogo.och.sweepers.util.SweepersTrajectoryManager;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+import mogo_msg.MogoReportMsg;
+import system_master.SystemStatusInfo;
+
+/**
+ * 网约车小巴
+ *
+ * @author tongchenfei
+ */
+public class SweepersPresenter extends Presenter
+ implements ICarOperationStatusCallback, IRefreshSweepersStationsCallback, ISlidePannelHideCallback
+ , IMoGoAutopilotStatusListener, ISweepersControllerStatusCallback {
+
+ private static final String TAG = "BusPresenter";
+
+ private int currentAutopilotStatus = -1;
+ private List mStationList = new ArrayList<>();
+ private int mCurrentStation = 0;
+ private boolean isRestartAutopilot = false;
+
+ public SweepersPresenter(SweepersFragment view) {
+ super(view);
+ //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口
+ CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this);
+ SweepersOrderModel.getInstance().init();
+ }
+
+ @Override
+ public void onCreate(@NonNull LifecycleOwner owner) {
+ super.onCreate(owner);
+ SweepersOrderModel.getInstance().queryOperationStatus();
+ SweepersOrderModel.getInstance().querySweepersRoutes();
+ initModelListener();
+ }
+
+ @Override
+ public void onDestroy(@NonNull LifecycleOwner owner) {
+ super.onDestroy(owner);
+ SweepersOrderModel.getInstance().release();
+ releaseListener();
+ }
+
+ public void initModelListener() {
+ SweepersOrderModel.getInstance().setCarOperationStatusCallback(this);
+ SweepersOrderModel.getInstance().setRefreshBusStationsCallback(this);
+ SweepersOrderModel.getInstance().setSlidePannelHideCallback(this);
+ SweepersOrderModel.getInstance().setControllerStatusCallback(this);
+ }
+
+ public void releaseListener() {
+ SweepersOrderModel.getInstance().setCarOperationStatusCallback(null);
+ SweepersOrderModel.getInstance().setRefreshBusStationsCallback(null);
+ SweepersOrderModel.getInstance().setSlidePannelHideCallback(null);
+ SweepersOrderModel.getInstance().setControllerStatusCallback(null);
+ }
+
+ public void querySweepersRoutes() {
+ SweepersOrderModel.getInstance().querySweepersRoutes();
+ }
+
+ public void debugResetStationStatus() {
+ SweepersOrderModel.getInstance().debugResetStationStatus();
+ }
+
+ public void autoDriveToNextStation(boolean isRestart) {
+ currentAutopilotStatus = -1;
+ SweepersOrderModel.getInstance().autoDriveToNextStation(isRestart);
+ isRestartAutopilot = false;
+ }
+
+ public void restartAutopilot() {
+ if (SweepersOrderModel.getInstance().isGoingToNextStation()){
+ currentAutopilotStatus = -1;
+ SweepersOrderModel.getInstance().restartAutopilot();
+ isRestartAutopilot = true;
+ }
+ }
+
+ public void onChangeOperationStatus() {
+ SweepersOrderModel.getInstance().onChangeOperationStatus();
+ }
+
+ @Override
+ public void changeOperationStatus(boolean changeStatus) {
+ if (mView != null) {
+ runOnUIThread(() -> mView.changeOperationStatus(changeStatus));
+ }
+ }
+
+ @Override
+ public void refreshBusStations(String lineName,List stationList
+ , int currentStation, int nextStation, boolean isArrived) {
+ mStationList.clear();
+ mStationList.addAll(stationList);
+ mCurrentStation = currentStation;
+// functionDemoModeChange();
+ CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel =", " mCurrentStation =" + mCurrentStation);
+ if (mView != null) {
+ runOnUIThread(() -> mView.refreshSweepersStations(lineName,
+ stationList, currentStation, nextStation, isArrived));
+ }
+ }
+
+ private void functionDemoModeChange() {
+// CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel ="," functionDemoModeChange ="+mCurrentStation);
+ if (FunctionBuildConfig.isDemoMode
+ && ((mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
+ || ((mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
+ && SweepersOrderModel.getInstance().isGoingToNextStation()))) {
+ runOnUIThread(() -> mView.onAutopilotStatusChanged(
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING));
+ }
+ }
+
+ @Override
+ public void hideSlidePanel() {
+ if (mView != null) {
+ runOnUIThread(() -> mView.hideSlidePanel());
+ }
+ }
+
+ @Override
+ public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) {
+ SweepersOrderModel.getInstance().onArriveAt(arrivalNotification);
+ }
+
+ @Override
+ public void onAutopilotSNRequest() {
+
+ }
+
+ @Override
+ public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
+ if (autopilotStatusInfo == null) return;
+ int state = autopilotStatusInfo.getState();
+// CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChange: " + state + "currentAutopilotStatus = " + currentAutopilotStatus);
+ switch (state) {
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE:
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
+ if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->1语音提示
+// AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" );
+ }
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE;
+ // 设置UI【自动驾驶】按钮是否展示
+ runOnUIThread(() -> mView.onAutopilotEnableChange(true));
+ if (SweepersOrderModel.getInstance().isGoingToNextStation()) {
+ runOnUIThread(() -> mView.hideSlidePanel());
+ }
+ if (FunctionBuildConfig.isDemoMode
+ && (
+ (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1)
+ || (
+ (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1)
+ && SweepersOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ) {
+ CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能");
+ return;
+ }
+ // 改变UI自动驾驶状态
+ runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus));
+ }
+ break;
+ case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING:
+ if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
+ currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING;
+ // 改变UI自动驾驶状态
+ runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus));
+ SweepersOrderModel.getInstance().triggerStartServiceEvent(
+ isRestartAutopilot, true);
+ }
+ 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)
+ && SweepersOrderModel.getInstance().isGoingToNextStation()
+ )
+ )
+ ) {
+ CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能");
+ return;
+ }
+ runOnUIThread(() -> {
+ mView.onAutopilotStatusChanged(currentAutopilotStatus);
+ });
+ }
+ break;
+ default:
+ runOnUIThread(() -> mView.onAutopilotEnableChange(false));
+ break;
+ }
+ }
+
+ @Override
+ public void onVRModeChanged(boolean isVRMode) {
+ runOnUIThread(() -> mView.onVRModeChanged(isVRMode));
+ }
+
+ @Override
+ public void onCarLocationChanged(Location location) {
+ if (null != location) {
+ runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
+ }
+ }
+
+ @Override
+ public void startOpenAutopilot() {
+ //非美化模式下启动动画
+ runOnUIThread(() -> mView.startAutopilotAnimation());
+ }
+
+ private void runOnUIThread(Runnable executor) {
+ if (executor == null) {
+ return;
+ }
+ if (Looper.myLooper() != Looper.getMainLooper()) {
+ UiThreadHandler.post(executor);
+ } else {
+ executor.run();
+ }
+ }
+
+ /**
+ * 测试使用
+ *
+ * @param status
+ */
+ public void debugAutoPilotStatus(int status) {
+ AutopilotStatusInfo info = new AutopilotStatusInfo();
+ info.setState(status);
+ onAutopilotStatusResponse(info);
+ }
+
+ @Override
+ public void onAutopilotGuardian(MogoReportMsg.MogoReportMessage guardianInfo) {
+ SweepersTrajectoryManager.getInstance().onAutopilotGuardian(guardianInfo);
+ }
+
+ @Override
+ public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) {
+ }
+
+ @Override
+ public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) {
+
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/receiver/TestSweepersBroadcastReceiver.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/receiver/TestSweepersBroadcastReceiver.java
new file mode 100644
index 0000000000..0dead1c6f3
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/receiver/TestSweepersBroadcastReceiver.java
@@ -0,0 +1,42 @@
+package com.mogo.och.sweepers.receiver;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.och.sweepers.constant.SweepersConst;
+
+/**
+ * 测试小巴车的场景
+ *
+ * @author donghongyu
+ * @date 4/26/21 12:08 PM
+ */
+public class TestSweepersBroadcastReceiver extends BroadcastReceiver {
+ private static final String TAG = "TestBusBroadcastReceiver";
+
+ private Context mContext;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ try {
+ this.mContext = context;
+ int sceneType = intent.getIntExtra(SweepersConst.BROADCAST_TEST_SWEEPERS_CONTROL_TYPE_EXTRA_KEY, 0);
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "sceneType:" + sceneType);
+
+ // 分发场景
+ dispatchSceneTest(sceneType);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void dispatchSceneTest(int sceneType) {
+
+ }
+
+
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersSwitchLineActivity.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersSwitchLineActivity.java
new file mode 100644
index 0000000000..0a2824e445
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersSwitchLineActivity.java
@@ -0,0 +1,300 @@
+package com.mogo.och.sweepers.ui;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.text.TextUtils;
+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.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.mogo.commons.mvp.MvpActivity;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.och.sweepers.R;
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+import com.mogo.och.sweepers.presenter.SweepersLinePresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/8
+ */
+public class SweepersSwitchLineActivity extends MvpActivity
+ implements View.OnClickListener, SweepersSwitchLineView {
+
+ private ImageView mClose;
+ private ConstraintLayout mNoDatasView;
+ private RecyclerView mLinesListView;
+ private TextView mLineCommitBtn;
+ private SwitchLineAdapter mAdapter;
+ private List mData = new ArrayList<>();
+ private int mSelectLineId = -1;
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_sweepers_switch_line;
+ }
+
+ @NonNull
+ @Override
+ protected SweepersLinePresenter createPresenter() {
+ return new SweepersLinePresenter(this);
+ }
+
+ @Override
+ protected void initViews() {
+ initWH();
+ initView();
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ initDatas();
+ }
+
+ /**
+ * 初始化view
+ */
+ private void initView() {
+ mClose = findViewById(R.id.switch_line_close);
+ mClose.setOnClickListener(this);
+ mNoDatasView = findViewById(R.id.no_order_data_view);
+
+ mLineCommitBtn = findViewById(R.id.switch_line_btn_commit);
+ mLineCommitBtn.setOnClickListener(this);
+
+ mLinesListView = findViewById(R.id.switch_line_rv);
+ mLinesListView.setLayoutManager(new LinearLayoutManager(this));
+ mAdapter = new SwitchLineAdapter(getApplicationContext(),mData);
+ mLinesListView.setAdapter(mAdapter);
+ //设置item 点击事件
+ mAdapter.setOnLineItemClickListener(new LineItemClickListener() {
+ @Override
+ public void onItemClick(int position) {
+ if (mData.size() > position && !TextUtils.isEmpty(mData.get(position).startSiteName )
+ && !TextUtils.isEmpty(mData.get(position).endSiteName)){
+ mSelectLineId = mData.get(position).lineId;
+ }else {
+ mSelectLineId = -1;
+ }
+ }
+ });
+ }
+
+ /**
+ * 设置布局宽高
+ */
+ private void initWH() {
+
+ Window window = getWindow();
+
+ WindowManager.LayoutParams params = window.getAttributes();
+ WindowManager windowManager = (WindowManager)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.setGravity(Gravity.LEFT|Gravity.BOTTOM);
+ }
+
+ /**
+ * 初始化数据
+ */
+ private void initDatas() {
+ mPresenter.queryBusLines();
+ }
+
+ /**
+ * 查询返回绑定路线集合
+ * @param data
+ */
+ @Override
+ public void onBusLinesChange(SweepersQueryLinesResponse data){
+ if (null == data){
+ showNoData(true);
+ return;
+ }
+ if (data.data != null && data.data.size() > 0){
+ showNoData(false);
+ mData.clear();
+ mData.addAll(data.data);
+ mAdapter.notifyDataSetChanged();
+ changeCommitBtnBg();
+ }else {
+ showNoData(true);
+ }
+ }
+
+ /**
+ * 根据路线选中情况设置提交按钮样式
+ */
+ private void changeCommitBtnBg() {
+ for (int i=0; i -1){
+ mPresenter.commitSwitchLineId(mSelectLineId);
+ }else {
+ finish();
+ }
+ return;
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ }
+
+ /**
+ * 路线列表adapter
+ */
+ static class SwitchLineAdapter extends RecyclerView.Adapter{
+
+ private Context mContext;
+ private List mData;
+ // RecyclerView设置点击事件
+ private LineItemClickListener mItemClickListener ;
+ private int clickPos = -1;
+
+ public SwitchLineAdapter(Context context, List data){
+ mContext = context;
+ mData = data;
+ }
+
+ @NonNull
+ @Override
+ public SwitchLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(mContext).inflate(R.layout.sweepers_switch_line_list_item
+ ,parent,false);
+ SwitchLineViewHolder viewHolder = new SwitchLineViewHolder(view);
+ return viewHolder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull SwitchLineViewHolder holder, @SuppressLint("RecyclerView") int position) {
+ SweepersQueryLinesResponse.Result line = mData.get(position);
+ holder.lineName.setText(mContext.getString(R.string.sweepers_switch_line_name)+" "+line.name);
+ holder.lineStartName.setText(mContext.getString(R.string.sweepers_line_start)+" "+line.startSiteName);
+ holder.lineEndName.setText(mContext.getString(R.string.sweepers_line_end)+" "+line.endSiteName);
+
+ //设置item点击事件
+ holder.itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mItemClickListener != null){
+ mItemClickListener.onItemClick(position);
+ clickPos = position;
+ notifyDataSetChanged();
+ }
+ }
+ });
+ //选中绑定
+ if (clickPos > -1){
+ if (clickPos == position){
+ holder.selectIv.setImageResource(R.drawable.sweepers_selected_btn);
+ }else {
+ holder.selectIv.setImageResource(R.drawable.sweepers_unselect_btn);
+ }
+ }else {
+ if (line.choose == 1){//1:绑定 2:未绑定 默认绑定
+ if (mItemClickListener != null) {
+ mItemClickListener.onItemClick(position);
+ }
+ holder.selectIv.setImageResource(R.drawable.sweepers_selected_btn);
+ }else {
+ holder.selectIv.setImageResource(R.drawable.sweepers_unselect_btn);
+ }
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return mData.size();
+ }
+ public void setOnLineItemClickListener(LineItemClickListener itemClickListener){
+ this.mItemClickListener = itemClickListener ;
+
+ }
+ }
+
+ static class SwitchLineViewHolder extends RecyclerView.ViewHolder{
+
+ private ImageView selectIv;
+ private TextView lineName; //线路名称
+ private TextView lineStartName; //起点
+ private TextView lineEndName; //终点
+
+ public SwitchLineViewHolder(@NonNull View itemView) {
+ super(itemView);
+ selectIv = itemView.findViewById(R.id.switch_line_item_select_iv);
+ lineName = itemView.findViewById(R.id.switch_line_name);
+ lineStartName = itemView.findViewById(R.id.switch_line_start_station);
+ lineEndName = itemView.findViewById(R.id.switch_line_end_station);
+ }
+ }
+
+ public interface LineItemClickListener {
+ void onItemClick(int position) ;
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersSwitchLineView.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersSwitchLineView.java
new file mode 100644
index 0000000000..8721387680
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersSwitchLineView.java
@@ -0,0 +1,15 @@
+package com.mogo.och.sweepers.ui;
+
+import com.mogo.commons.mvp.IView;
+import com.mogo.och.sweepers.bean.SweepersQueryLinesResponse;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/2/10
+ */
+public interface SweepersSwitchLineView extends IView {
+
+ void onBusLinesChange(SweepersQueryLinesResponse data);
+ void onChangeLineIdSuccess();
+}
+
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersTrafficLightView.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersTrafficLightView.java
new file mode 100644
index 0000000000..811f652009
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/ui/SweepersTrafficLightView.java
@@ -0,0 +1,167 @@
+package com.mogo.och.sweepers.ui;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+
+import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.sweepers.R;
+import com.mogo.och.common.module.wigets.OCHGradientTextView;
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Bus司机端:红绿灯view
+ *
+ * Created on 2022/3/29
+ */
+public class SweepersTrafficLightView extends IViewTrafficLight {
+
+ private ImageView mLightIconIV;
+ private OCHGradientTextView mLightTimeTV;
+ private int mCurrentLightId;
+
+ public SweepersTrafficLightView(@Nullable Context context) {
+ this(context, null, 0);
+ }
+
+ public SweepersTrafficLightView(@Nullable Context context, @Nullable AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public SweepersTrafficLightView(@Nullable Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context);
+ }
+
+ private void init(Context context) {
+ LayoutInflater.from(context).inflate(R.layout.sweepers_traffic_light_view, this, true);
+ mLightIconIV = findViewById(R.id.sweepers_traffic_light_iv);
+ mLightTimeTV = findViewById(R.id.sweepers_traffic_light_time_tv);
+ }
+
+ /**
+ * 展示红绿灯预警
+ *
+ * @param checkLightId 0-都是默认,1-红,2-黄,3-绿
+ * @param lightSource 1:云端下发;2:自车感知
+ */
+ @Override
+ public void showWarningTrafficLight(int checkLightId,int lightSource) {
+ super.showWarningTrafficLight(checkLightId,lightSource);
+ mCurrentLightId = checkLightId;
+ updateTrafficLightIcon(checkLightId);
+ }
+
+ /**
+ * 关闭红绿灯预警展示,并重制灯态
+ */
+ @Override
+ public void disableWarningTrafficLight() {
+ super.disableWarningTrafficLight();
+ UiThreadHandler.post(() -> {
+ mCurrentLightId = 0;
+ SweepersTrafficLightView.this.setVisibility(GONE);
+ });
+ }
+
+ /**
+ * @param redNum 红灯倒计时
+ * @param yellowNum 黄灯倒计时
+ * @param greenNum 绿灯倒计时
+ */
+ @Override
+ public void changeCountdownTrafficLightNum(int redNum, int yellowNum, int greenNum) {
+ super.changeCountdownTrafficLightNum(redNum, yellowNum, greenNum);
+ switch (mCurrentLightId) {
+ case 1:
+ changeCountdownRed(redNum);
+ break;
+ case 2:
+ changeCountdownYellow(yellowNum);
+ break;
+ case 3:
+ changeCountdownGreen(greenNum);
+ break;
+ default:
+ UiThreadHandler.post(() -> {
+ mLightTimeTV.setText("");
+ });
+ break;
+ }
+ }
+
+ @Override
+ public void changeCountdownRed(int redNum) {
+ super.changeCountdownRed(redNum);
+ UiThreadHandler.post(() -> {
+ if (redNum > 0) {
+ mLightTimeTV.setVertrial(true);
+ mLightTimeTV.setmColorList(new int[]{getResources().getColor(R.color.sweepers_traffic_light_red_color_up),
+ getResources().getColor(R.color.sweepers_traffic_light_red_color_down)});
+ mLightTimeTV.setText(String.valueOf(redNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ @Override
+ public void changeCountdownGreen(int greenNum) {
+ super.changeCountdownGreen(greenNum);
+ UiThreadHandler.post(() -> {
+ if (greenNum > 0) {
+ mLightTimeTV.setVertrial(true);
+ mLightTimeTV.setmColorList(new int[]{getResources().getColor(R.color.sweepers_traffic_light_green_color_up),
+ getResources().getColor(R.color.sweepers_traffic_light_green_color_down)});
+ mLightTimeTV.setText(String.valueOf(greenNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ @Override
+ public void changeCountdownYellow(int yellowNum) {
+ super.changeCountdownYellow(yellowNum);
+ UiThreadHandler.post(() -> {
+ if (yellowNum > 0) {
+ mLightTimeTV.setVertrial(true);
+ mLightTimeTV.setmColorList(new int[]{getResources().getColor(R.color.sweepers_traffic_light_yellow_color_up),
+ getResources().getColor(R.color.sweepers_traffic_light_yellow_color_down)});
+ mLightTimeTV.setText(String.valueOf(yellowNum));
+ } else {
+ mLightTimeTV.setText("");
+ }
+ });
+ }
+
+ /**
+ * 更新红绿灯icon
+ *
+ * @param lightId 0-都是默认,1-红,2-黄,3-绿
+ */
+ private void updateTrafficLightIcon(int lightId) {
+ UiThreadHandler.post(() -> {
+ switch (lightId) {
+ case 1:
+ mLightIconIV.setBackgroundResource(R.drawable.sweepers_light_red_nor);
+ SweepersTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ case 2:
+ mLightIconIV.setBackgroundResource(R.drawable.sweepers_lightyellow_nor);
+ SweepersTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ case 3:
+ mLightIconIV.setBackgroundResource(R.drawable.sweepers_light_green_nor);
+ SweepersTrafficLightView.this.setVisibility(VISIBLE);
+ break;
+ default:
+ SweepersTrafficLightView.this.setVisibility(GONE);
+ break;
+ }
+ });
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/BDRouteDataTestUtils.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/BDRouteDataTestUtils.java
new file mode 100644
index 0000000000..65ea11c669
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/BDRouteDataTestUtils.java
@@ -0,0 +1,45 @@
+package com.mogo.och.sweepers.util;
+
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import mogo.telematics.pad.MessagePad;
+
+/**
+ * @author: wangmingjun
+ * @date: 2022/4/13
+ */
+public class BDRouteDataTestUtils {
+
+ static String jsonStr ="{\n" +
+ " \"models\": [\n" +
+ " {\n" +
+ " \"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927760268911,\"lon\":116.73512607061035,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927736555187,\"lon\":116.73498243020299,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927135941599,\"lon\":116.73482951462647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199260672670036,\"lon\":116.73468429259535,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199251260349946,\"lon\":116.73453933465,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924691997577,\"lon\":116.7343756435551,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199247953493625,\"lon\":116.73421240809087,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19924986849947,\"lon\":116.73400425509712,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199249431152175,\"lon\":116.73378579041055,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199248921305724,\"lon\":116.73357811807278,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925012387371,\"lon\":116.73337650020184,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252270195075,\"lon\":116.73318223781153,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992521615169,\"lon\":116.73298632625203,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19925202633083,\"lon\":116.73279582043983,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199261230205735,\"lon\":116.73263403473568,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199327991681926,\"lon\":116.73251962434813,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19944850496711,\"lon\":116.73249661840195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199582026896415,\"lon\":116.73251038561487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199743326352014,\"lon\":116.73253087453938,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199908347167394,\"lon\":116.73255070500186,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200065950595445,\"lon\":116.7325720694418,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20022747460407,\"lon\":116.73259461416663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384057310536,\"lon\":116.73261575018056,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20053849777916,\"lon\":116.73263451936387,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200696919444624,\"lon\":116.7326540541723,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2008524952796,\"lon\":116.7326743511824,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20101429705625,\"lon\":116.73269393580199,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118279997041,\"lon\":116.73271564378308,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201342388452076,\"lon\":116.73273653366076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201476063822355,\"lon\":116.73275292393079,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163479199852,\"lon\":116.73277440686762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181243476041,\"lon\":116.7328052766508,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201991767093304,\"lon\":116.7328453845644,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20215573733484,\"lon\":116.73287624009339,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202313648759784,\"lon\":116.73289887933315,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434745374454,\"lon\":116.7329182210956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253164952098,\"lon\":116.73297539811277,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258043275509,\"lon\":116.73312335324984,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20258233576585,\"lon\":116.73331077089557,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20257107560234,\"lon\":116.73351244039137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202561578580514,\"lon\":116.73370176209845,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20256256788661,\"lon\":116.73391325024126,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20255633158834,\"lon\":116.73413195000244,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202543311179575,\"lon\":116.73436614303907,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20253067346457,\"lon\":116.73458032609663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20251776111356,\"lon\":116.73477082198242,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202503997557805,\"lon\":116.73498624001282,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20249129260376,\"lon\":116.73518976336872,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247877796589,\"lon\":116.73537786253135,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246651610268,\"lon\":116.73559239130266,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245754388014,\"lon\":116.73574239922202,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20244749208,\"lon\":116.73589674090469,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243806550113,\"lon\":116.73607057284322,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243550556816,\"lon\":116.73628106525871,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243654127756,\"lon\":116.7364949950665,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243738221016,\"lon\":116.7367061649993,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243672476754,\"lon\":116.73691115930336,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243590788176,\"lon\":116.73710722104272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202436434375336,\"lon\":116.73730688607075,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243749821501,\"lon\":116.73750140347998,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243625962803,\"lon\":116.73771330926793,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202434515480725,\"lon\":116.73791895606205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024326561388,\"lon\":116.73815206945737,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20243092086137,\"lon\":116.73838655528765,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202430876006126,\"lon\":116.73861890759498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242914053177,\"lon\":116.73882029918758,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242843336561,\"lon\":116.73904465495175,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242661219026,\"lon\":116.73922453252953,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426462811076,\"lon\":116.7393708046956,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242687134937,\"lon\":116.73954685547025,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20242694967377,\"lon\":116.73975021183773,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202424630601236,\"lon\":116.73999740812975,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202422502184625,\"lon\":116.74028266774337,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202419634158936,\"lon\":116.7405942561498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241975959762,\"lon\":116.7409069557092,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241920524113,\"lon\":116.74120156191647,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241765540262,\"lon\":116.74149288504978,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241569149764,\"lon\":116.7418080096762,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202414529497084,\"lon\":116.74210262897205,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241419532155,\"lon\":116.74241767661879,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202413879360954,\"lon\":116.7427571218185,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241287045245,\"lon\":116.7431284691325,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241214965105,\"lon\":116.74343354359334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241141271715,\"lon\":116.7437220210538,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2024080520075,\"lon\":116.74399113498052,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202391714280026,\"lon\":116.74427625698272,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20238163805639,\"lon\":116.74452083315958,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379293010274,\"lon\":116.74475703837204,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202379007817086,\"lon\":116.7449961645494,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20237814181231,\"lon\":116.7452036063558,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202375477619896,\"lon\":116.74539567654291,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2023632396621,\"lon\":116.74555457589031,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20229396554444,\"lon\":116.7456716047369,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20217800547467,\"lon\":116.74574081942625,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202047498095304,\"lon\":116.74573659255675,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20188573786706,\"lon\":116.74571018281719,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201738240263026,\"lon\":116.74568463148606,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20157507049073,\"lon\":116.74565525041498,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20137985142042,\"lon\":116.745619970576,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201187335613575,\"lon\":116.74558631350607,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20098251429043,\"lon\":116.74555055587679,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2007748533628,\"lon\":116.74551426934663,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20057082986032,\"lon\":116.74547749663195,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20036944224329,\"lon\":116.74544156175533,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016365229035,\"lon\":116.74540577510051,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1999958572445,\"lon\":116.74537505807076,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19984100521566,\"lon\":116.7453433678602,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1996863960282,\"lon\":116.74529675648621,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19953919567943,\"lon\":116.74525916493474,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19940587189373,\"lon\":116.74523402869453,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19929047792381,\"lon\":116.74518617038383,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922141745155,\"lon\":116.74506912884067,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920798885308,\"lon\":116.744896716334,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920912644279,\"lon\":116.74467216715483,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199209186509314,\"lon\":116.74448257515108,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19920910709997,\"lon\":116.74430613406223,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992100786082,\"lon\":116.74410888316238,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921081961254,\"lon\":116.74391968819582,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921040855518,\"lon\":116.7437082083402,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921085053439,\"lon\":116.74346931155634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921197237373,\"lon\":116.74325149697013,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921248248983,\"lon\":116.74301103786591,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992139724646,\"lon\":116.74277237066539,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215818352386,\"lon\":116.74253219408898,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216175018876,\"lon\":116.74228853120842,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199215970354246,\"lon\":116.74204663206451,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199216627492966,\"lon\":116.74183871233049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19921789170398,\"lon\":116.74165788334192,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922000138535,\"lon\":116.74144512197054,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199221559127494,\"lon\":116.741249370491,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922287231889,\"lon\":116.7410525810756,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922229019589,\"lon\":116.74085266662037,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.1992216995901,\"lon\":116.74061957723823,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922263073874,\"lon\":116.74041638149129,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922478093337,\"lon\":116.7402123910757,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199227066091595,\"lon\":116.74003419421553,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199228634241756,\"lon\":116.73985841944678,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19922951636012,\"lon\":116.7397079274105,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199252095329484,\"lon\":116.73956265582487,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199346162997905,\"lon\":116.73944690416265,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199470799628024,\"lon\":116.73941941053417,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19962513314346,\"lon\":116.7394280706812,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199780626058924,\"lon\":116.73944255215424,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199961525343376,\"lon\":116.73945856750177,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20016196947193,\"lon\":116.73947572081121,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200384479551936,\"lon\":116.7394949225795,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200595083817475,\"lon\":116.73951027963179,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200792203321086,\"lon\":116.73952526850614,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200985930701684,\"lon\":116.73954125209579,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20115978977055,\"lon\":116.73955610094161,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201321019536124,\"lon\":116.7395695239138,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20147117943043,\"lon\":116.7395823299481,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20163699848565,\"lon\":116.73959633422596,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20178484338371,\"lon\":116.7396085776486,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201962185646316,\"lon\":116.73962351991214,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021018923927,\"lon\":116.7396354059821,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2022137620686,\"lon\":116.73964348380458,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20232600820075,\"lon\":116.73961190446633,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20241090270993,\"lon\":116.73951649703137,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20245777783807,\"lon\":116.73937664238166,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246906634823,\"lon\":116.73920146119093,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470916682884,\"lon\":116.73898763065634,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247034830421,\"lon\":116.73878158418357,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246978204673,\"lon\":116.73857680142473,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247082638905,\"lon\":116.73834517890637,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202471943178196,\"lon\":116.7381047689514,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247131648035,\"lon\":116.73787761484981,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202470799473765,\"lon\":116.73766230702478,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247013054322,\"lon\":116.73743619407796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246999515433,\"lon\":116.73724916823292,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247199652478,\"lon\":116.73704888970806,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202473960263525,\"lon\":116.73684083235807,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202474504753205,\"lon\":116.73665462440796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20247501354581,\"lon\":116.73650710371837,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20246541231906,\"lon\":116.73635807696789,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.202426768984274,\"lon\":116.73622283382787,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20236638788854,\"lon\":116.73610589402243,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20227106919894,\"lon\":116.73600895001849,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2021428343084,\"lon\":116.73596816020945,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20197815580698,\"lon\":116.73594623645097,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20181789535303,\"lon\":116.73593148707488,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201667906886954,\"lon\":116.73591743008926,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.201505897730755,\"lon\":116.7359002912543,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20135083580946,\"lon\":116.73588579696379,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20118617904595,\"lon\":116.73586970398149,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20102374028594,\"lon\":116.73585314703226,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20085554043743,\"lon\":116.73583763953049,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20069451888229,\"lon\":116.73582073901778,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.200530837344964,\"lon\":116.73580314359012,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.2003608457064,\"lon\":116.73578183888779,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20021770046798,\"lon\":116.73575292592922,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.20003454701824,\"lon\":116.7357174959358,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19986125116602,\"lon\":116.73569499961796,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19969408518737,\"lon\":116.73567725223492,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19955533048882,\"lon\":116.73566375985422,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19943174810538,\"lon\":116.73564927714162,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19933167546824,\"lon\":116.735595995086,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.199280357603875,\"lon\":116.73546293260645,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19927848361656,\"lon\":116.73531579486274,\"speed\":0.0},{\"altitude\":0.0,\"angle\":0.0,\"duration\":0,\"lat\":40.19928127892504,\"lon\":116.73505848474375,\"speed\": 0.0\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+ public static void converToRouteData(){
+ List list = new ArrayList<>();
+
+ try {
+ JSONObject jsonObject = new JSONObject(jsonStr);
+ JSONArray jsonElements = jsonObject.getJSONArray("models");
+ for (int i = 0; i < jsonElements.length(); i++) {
+ JSONObject s = jsonElements.getJSONObject(i);
+ MessagePad.Location.Builder builder = MessagePad.Location.newBuilder();
+ builder.setLatitude(s.getDouble("lat"));
+ builder.setLongitude(s.getDouble("lon"));
+ list.add(builder.build());
+ }
+ SweepersOrderModel.getInstance().debugUpdateOrderRoute(list);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/SweepersAnalyticsManager.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/SweepersAnalyticsManager.java
new file mode 100644
index 0000000000..73b7375c6b
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/SweepersAnalyticsManager.java
@@ -0,0 +1,81 @@
+package com.mogo.och.sweepers.util;
+
+import android.text.TextUtils;
+
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
+import com.mogo.commons.debug.DebugConfig;
+import com.mogo.eagle.core.data.app.AppConfigInfo;
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
+import com.mogo.eagle.core.function.call.analytics.AnalyticsManager;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
+import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
+import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
+import com.mogo.och.sweepers.constant.SweepersConst;
+
+import java.util.HashMap;
+
+/**
+ * OCH sweepers埋点工具
+ *
+ * Created on 2022/3/24
+ */
+public class SweepersAnalyticsManager {
+
+ private static final class SingletonHolder {
+ private static final SweepersAnalyticsManager INSTANCE = new SweepersAnalyticsManager();
+ }
+
+ public static SweepersAnalyticsManager getInstance() {
+ return SweepersAnalyticsManager.SingletonHolder.INSTANCE;
+ }
+
+
+
+ private String mStartAutopilotKey;
+ private HashMap mStartAutopilotParams = new HashMap<>();
+
+ private Runnable startAutopilotRunnable = () -> {
+ // 15s内未开启,上报失败埋点
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_START_RESULT
+ , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() ==
+ IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
+ AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
+ };
+
+ /**
+ * 触发'开启自动驾驶'埋点流程
+ * 开启自动驾驶,15s内成功则发送成功埋点,否则发送失败埋点
+ * @param restart false(点击'滑动出发'启动)/true(接管后点击'自动驾驶'按钮启动)
+ * @param send 是否直接发送埋点(15s内开启成功则直接发送成功埋点)
+ */
+ public void triggerStartAutopilotEvent(
+ boolean restart, boolean send, String startName, String endName, int lineId) {
+ mStartAutopilotKey = restart ?
+ SweepersConst.EVENT_KEY_RESTART_AUTOPILOT : SweepersConst.EVENT_KEY_START_SERVICE;
+ String sn = MoGoAiCloudClientConfig.getInstance().getSn();
+ String plateNum = AppConfigInfo.INSTANCE.getPlateNumber();
+ String dateTime = DateTimeUtils.getTimeText(
+ System.currentTimeMillis(), DateTimeUtils.yyyy_MM_dd_HH_mm_ss);
+
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_SN, sn);
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_PLATE_NUM, TextUtils.isEmpty(plateNum) ? "" : plateNum);
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_ENV_ONLINE,
+ DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE ? true : false);
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_TIME, dateTime);
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_START_NAME, startName);
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_END_NAME, endName);
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_LINE_ID, lineId);
+
+ if (send) {
+ // 开启成功,上报埋点
+ if (startAutopilotRunnable != null &&
+ UiThreadHandler.getsUiHandler().hasCallbacks(startAutopilotRunnable)) {
+ UiThreadHandler.removeCallbacks(startAutopilotRunnable);
+ }
+ mStartAutopilotParams.put(SweepersConst.EVENT_PARAM_START_RESULT, true);
+ AnalyticsManager.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams);
+ } else {
+ UiThreadHandler.postDelayed(startAutopilotRunnable, SweepersConst.LOOP_PERIOD_15S);
+ }
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/SweepersTrajectoryManager.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/SweepersTrajectoryManager.java
new file mode 100644
index 0000000000..77049df636
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/util/SweepersTrajectoryManager.java
@@ -0,0 +1,205 @@
+package com.mogo.och.sweepers.util;
+
+import androidx.annotation.Nullable;
+
+import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
+import com.mogo.eagle.core.utilcode.util.GsonUtils;
+import com.mogo.eagle.core.utilcode.util.ToastUtils;
+import com.mogo.och.sweepers.bean.SweepersRoutesResult;
+import com.mogo.och.sweepers.constant.SweepersConst;
+import com.mogo.och.sweepers.model.SweepersOrderModel;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import mogo_msg.MogoReportMsg;
+
+import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS;
+
+/**
+ * Bus轨迹管理:给MEC下发用于轨迹下载的信息
+ * Created on 2022/6/23
+ */
+public class SweepersTrajectoryManager {
+ private static final String TAG = SweepersTrajectoryManager.class.getSimpleName();
+
+ private static final class SingletonHolder {
+ private static final SweepersTrajectoryManager INSTANCE = new SweepersTrajectoryManager();
+ }
+
+ public static SweepersTrajectoryManager getInstance() {
+ return SweepersTrajectoryManager.SingletonHolder.INSTANCE;
+ }
+
+ private AutopilotControlParameters.AutoPilotLine mAutoPilotLine = null;
+ private Disposable mSendReqDisposable = null;
+
+ public SweepersTrajectoryManager() {
+ mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(-1,
+ "", "", "", "", 0, "",
+ "", "", "", "", 0);
+ }
+
+ /**
+ * 同步Bus路线信息
+ */
+ public void syncTrajectoryInfo() {
+ SweepersRoutesResult routesResult = SweepersOrderModel.getInstance().getBusRoutesResult();
+ if (SweepersOrderModel.getInstance().isWorking() && routesResult != null
+ && SweepersOrderModel.getInstance().getCurrentStationIndex() == 0
+ && !SweepersOrderModel.getInstance().isGoingToNextStation()) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() start.");
+ startTrajReqLoop();
+ } else {
+ // 无路线信息or当前未在始发站
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "syncTrajectoryInfo() stop.");
+ stopTrajReqLoop();
+ }
+ }
+
+ /**
+ * 接口MEC反馈的常规信息(MAP v2.5.0新增轨迹相关信息)
+ * @param guardianInfo
+ */
+ public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) {
+ if (guardianInfo == null || !guardianInfo.hasCode()) return;
+ if ("ISYS_INIT_TRAJECTORY_START".equals(guardianInfo.getCode())) {
+ // 1. 轨迹管理_轨迹开始下载(本地已有对应轨迹也触发)
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹开始下载");
+ // ToastUtils.showShort("轨迹开始下载");
+ stopTrajReqLoop();
+ } else if ("ISYS_INIT_TRAJECTORY_SUCCESS".equals(guardianInfo.getCode())) {
+ // 2. 轨迹管理_轨迹下载成功(本地已有对应轨迹也触发)
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹下载成功");
+ // ToastUtils.showShort("轨迹下载成功");
+ stopTrajReqLoop();
+ } else if ("ISYS_INIT_TRAJECTORY_FAILURE".equals(guardianInfo.getCode())) {
+ // 3. 轨迹管理_轨迹下载失败,本地无对应轨迹
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() " +
+ "轨迹下载失败,本地无对应轨迹");
+ // ToastUtils.showShort("轨迹下载失败,本地无对应轨迹");
+ } else if ("ISYS_INIT_TRAJECTORY_WARNING".equals(guardianInfo.getCode())) {
+ // 4. 轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() " +
+ "轨迹下载失败,本地有对应轨迹,认为成功");
+ // ToastUtils.showShort("轨迹下载失败,本地有对应轨迹,认为成功");
+ } else if ("ISYS_INIT_TRAJECTORY_TIMEOUT".equals(guardianInfo.getCode())) {
+ // 5. 轨迹管理_轨迹下载超时
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "onAutopilotGuardian() 轨迹下载超时");
+ // ToastUtils.showShort("轨迹下载超时");
+ }
+ }
+
+ private void setupAutoPilotLine() {
+ SweepersRoutesResult routesResult = SweepersOrderModel.getInstance().getBusRoutesResult();
+ if (routesResult == null) {
+ CallerLogger.INSTANCE.e(M_BUS + TAG,
+ "setupAutoPilotLine(): routesResult is null.");
+ return;
+ } else {
+ if (mAutoPilotLine == null) {
+ mAutoPilotLine = new AutopilotControlParameters.AutoPilotLine(routesResult.getLineId(),
+ routesResult.csvFileUrl, routesResult.csvFileMd5,
+ routesResult.txtFileUrl, routesResult.txtFileMd5,
+ routesResult.contrailSaveTime, routesResult.carModel,
+ routesResult.csvFileUrlDPQP, routesResult.csvFileMd5DPQP,
+ routesResult.txtFileUrlDPQP, routesResult.txtFileMd5DPQP,
+ routesResult.contrailSaveTimeDPQP);
+ } else {
+ mAutoPilotLine.setLineId(routesResult.getLineId());
+ mAutoPilotLine.setTrajUrl(routesResult.csvFileUrl);
+ mAutoPilotLine.setTrajMd5(routesResult.csvFileMd5);
+ mAutoPilotLine.setStopUrl(routesResult.txtFileUrl);
+ mAutoPilotLine.setStopMd5(routesResult.txtFileMd5);
+ mAutoPilotLine.setTimestamp(routesResult.contrailSaveTime);
+ mAutoPilotLine.setVehicleModel(routesResult.carModel);
+ mAutoPilotLine.setTrajUrl_dpqp(routesResult.csvFileUrlDPQP);
+ mAutoPilotLine.setTrajMd5_dpqp(routesResult.csvFileMd5DPQP);
+ mAutoPilotLine.setStopUrl_dpqp(routesResult.txtFileUrlDPQP);
+ mAutoPilotLine.setStopMd5_dpqp(routesResult.txtFileMd5DPQP);
+ mAutoPilotLine.setTimestamp_dpqp(routesResult.contrailSaveTimeDPQP);
+ }
+ }
+ }
+
+ private void clearAutoPilotLine() {
+ if (mAutoPilotLine == null) return;
+ mAutoPilotLine.setLineId(-1);
+ mAutoPilotLine.setTrajUrl("");
+ mAutoPilotLine.setTrajMd5("");
+ mAutoPilotLine.setStopUrl("");
+ mAutoPilotLine.setStopMd5("");
+ mAutoPilotLine.setTimestamp(0);
+ mAutoPilotLine.setVehicleModel("");
+ mAutoPilotLine.setTrajUrl_dpqp("");
+ mAutoPilotLine.setTrajMd5_dpqp("");
+ mAutoPilotLine.setStopUrl_dpqp("");
+ mAutoPilotLine.setStopMd5_dpqp("");
+ mAutoPilotLine.setTimestamp_dpqp(0);
+ }
+
+ private void startTrajReqLoop() {
+ if (mSendReqDisposable != null && !mSendReqDisposable.isDisposed()) {
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "startTrajReqLoop()");
+ setupAutoPilotLine();
+ mSendReqDisposable = Observable.interval(SweepersConst.LOOP_DELAY,
+ SweepersConst.LOOP_PERIOD_10S, TimeUnit.MILLISECONDS)
+ .map((aLong -> aLong + 1))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(aLong -> {
+ if (aLong > SweepersConst.LOOP_SEND_TRAJ_TIMES) {
+ stopTrajReqLoop();
+ return;
+ }
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "loop sendTrajectoryReq: " + aLong);
+ sendTrajectoryReq();
+ });
+ }
+
+ public void stopTrajReqLoop() {
+ if (mSendReqDisposable != null) {
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "stopTrajReqLoop()");
+ mSendReqDisposable.dispose();
+ mSendReqDisposable = null;
+ clearAutoPilotLine();
+ }
+ }
+
+ private void sendTrajectoryReq() {
+ if (mAutoPilotLine == null) {
+ CallerLogger.INSTANCE.e(M_BUS + TAG, "sendTrajectoryReq(): mAutoPilotLine is null!!!");
+ return;
+ }
+
+ // TODO: 2022/6/24
+ // test1
+// mAutoPilotLine.setLineId(148);
+// mAutoPilotLine.setTrajUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/e27c20c2da32481021d934c3ef084536/traj_148.csv");
+// mAutoPilotLine.setTrajMd5("e27c20c2da32481021d934c3ef084536");
+// mAutoPilotLine.setStopUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/6224c9dd2c0e2bd990c6482c0464de45/stop_148.txt");
+// mAutoPilotLine.setStopMd5("6224c9dd2c0e2bd990c6482c0464de45");
+// mAutoPilotLine.setTimestamp(1654596000000L); //20220607 18:00
+// mAutoPilotLine.setVehicleModel("红旗H9");
+
+ // test2
+// mAutoPilotLine.setLineId(148);
+// mAutoPilotLine.setTrajUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/8654497cf918be461a59c7ad8e22920d/traj_148.csv");
+// mAutoPilotLine.setTrajMd5("8654497cf918be461a59c7ad8e22920d");
+// mAutoPilotLine.setStopUrl("http://file-qa.zhidaozhixing.com/fileServer/upload/downloadFileStream?key=fileServer/online_car_hailing/1bb098b244922649bf3e7bada0d3950f/stop_148.txt");
+// mAutoPilotLine.setStopMd5("1bb098b244922649bf3e7bada0d3950f");
+// mAutoPilotLine.setTimestamp(1654761600000L); //20220609 16:00
+// mAutoPilotLine.setVehicleModel("红旗H9");
+
+ CallerAutoPilotManager.INSTANCE.sendTrajectoryDownloadReq(mAutoPilotLine);
+ CallerLogger.INSTANCE.d(M_BUS + TAG, "sendTrajectoryReq(): "
+ + GsonUtils.toJson(mAutoPilotLine));
+ }
+}
diff --git a/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/BusArcView.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/BusArcView.java
new file mode 100644
index 0000000000..70d1079e97
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/BusArcView.java
@@ -0,0 +1,190 @@
+package com.mogo.och.sweepers.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.sweepers.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.sweepers_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.sweepers_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.sweepers_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-sweepers/src/main/java/com/mogo/och/sweepers/view/NoTouchConstraintLayout.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/NoTouchConstraintLayout.java
new file mode 100644
index 0000000000..94ac357553
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/NoTouchConstraintLayout.java
@@ -0,0 +1,37 @@
+package com.mogo.och.sweepers.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-sweepers/src/main/java/com/mogo/och/sweepers/view/SlidePanelView.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/SlidePanelView.java
new file mode 100644
index 0000000000..abd7d82729
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/SlidePanelView.java
@@ -0,0 +1,270 @@
+package com.mogo.och.sweepers.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.sweepers.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() {
+ bgRectF = new RectF(0, 0, 0, 0);
+ 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.sweepers_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);
+ if (bgRectF != null){
+ bgRectF.left = 0;
+ bgRectF.top = 0;
+ bgRectF.right = w;
+ bgRectF.bottom = 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 blockBackanimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0);
+ blockBackanimator.setInterpolator(new DecelerateInterpolator());
+ blockBackanimator.setDuration(1000 * blockOffset / getWidth());
+ blockBackanimator.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-sweepers/src/main/java/com/mogo/och/sweepers/view/VerticalDashLineView.java b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/VerticalDashLineView.java
new file mode 100644
index 0000000000..650269f1a6
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/java/com/mogo/och/sweepers/view/VerticalDashLineView.java
@@ -0,0 +1,64 @@
+package com.mogo.och.sweepers.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-sweepers/src/main/res/color/sweepers_autopilot_text_color_selector.xml b/OCH/mogo-och-sweepers/src/main/res/color/sweepers_autopilot_text_color_selector.xml
new file mode 100644
index 0000000000..580585c733
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/color/sweepers_autopilot_text_color_selector.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/end_maker_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/end_maker_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_ai_normal.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_ai_normal.png
new file mode 100755
index 0000000000..e98738b192
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_ai_normal.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_ai_select.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_ai_select.png
new file mode 100755
index 0000000000..d3e0107c02
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_ai_select.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_bad_case_normal.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_bad_case_normal.png
new file mode 100755
index 0000000000..c0a978fc2b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_bad_case_normal.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_bad_case_select.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_bad_case_select.png
new file mode 100755
index 0000000000..ebacf3a11a
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_bad_case_select.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_station_start_end.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/press_start_status.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/press_start_status.png
new file mode 100755
index 0000000000..af32c20cb5
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/press_start_status.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_failure.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_failure.png
new file mode 100755
index 0000000000..5737f93ad8
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_failure.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_maker_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_maker_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_success.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_success.png
new file mode 100755
index 0000000000..84246fd323
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/start_success.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_base_icon_not_in_autopilot.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_base_slide_block.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_base_slide_block.png
new file mode 100644
index 0000000000..ed7b293b90
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_base_slide_block.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_disable_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_disable_autopilot_icon.png
new file mode 100644
index 0000000000..170f254cd1
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_disable_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_icon_arrived_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_icon_arriving_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_light_green_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_light_green_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_light_red_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_light_red_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_lightyellow_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_line_panel_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_line_panel_bg.png
new file mode 100755
index 0000000000..3166d20e37
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_line_panel_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_line_panel_bg_1.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_line_panel_bg_1.png
new file mode 100755
index 0000000000..09a9c252da
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_line_panel_bg_1.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_loading_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_loading_autopilot_icon.png
new file mode 100644
index 0000000000..f21a1081f1
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_loading_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_och_dot_line.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_och_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_och_dot_line.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_right_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_right_autopilot_icon.png
new file mode 100644
index 0000000000..cc2b18083d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_right_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_selected_btn.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_selected_btn.png
new file mode 100644
index 0000000000..3f05565483
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_selected_btn.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_setting_btn_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_setting_btn_bg.png
new file mode 100644
index 0000000000..ba41bf3a53
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_line_close.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_line_close.png
new file mode 100644
index 0000000000..370b61de38
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_line_close.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_map_long.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_map_long.png
new file mode 100755
index 0000000000..cf3e5a3778
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_map_long.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_map_medium.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_map_medium.png
new file mode 100755
index 0000000000..bdc2725468
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_switch_map_medium.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_unselect_btn.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_unselect_btn.png
new file mode 100644
index 0000000000..0114bb4f2b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_unselect_btn.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_wrong_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_wrong_autopilot_icon.png
new file mode 100644
index 0000000000..0c8988acb3
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1440/sweepers_wrong_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png b/OCH/mogo-och-sweepers/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-sweepers/src/main/res/drawable-xhdpi-2560x1600/end_maker_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_ai_normal.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_ai_normal.png
new file mode 100755
index 0000000000..e98738b192
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_ai_normal.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_ai_select.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_ai_select.png
new file mode 100755
index 0000000000..d3e0107c02
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_ai_select.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_bad_case_normal.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_bad_case_normal.png
new file mode 100755
index 0000000000..c0a978fc2b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_bad_case_normal.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_bad_case_select.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_bad_case_select.png
new file mode 100755
index 0000000000..ebacf3a11a
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_bad_case_select.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png b/OCH/mogo-och-sweepers/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-sweepers/src/main/res/drawable-xhdpi-2560x1600/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/press_start_status.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/press_start_status.png
new file mode 100755
index 0000000000..af32c20cb5
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/press_start_status.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_failure.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_failure.png
new file mode 100755
index 0000000000..5737f93ad8
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_failure.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png b/OCH/mogo-och-sweepers/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-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_maker_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_success.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_success.png
new file mode 100755
index 0000000000..84246fd323
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/start_success.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_base_icon_not_in_autopilot.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_base_slide_block.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_base_slide_block.png
new file mode 100644
index 0000000000..ed7b293b90
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_base_slide_block.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_disable_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_disable_autopilot_icon.png
new file mode 100644
index 0000000000..170f254cd1
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_disable_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_icon_arrived_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_icon_arriving_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_light_green_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_light_green_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_light_red_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_light_red_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_lightyellow_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_line_panel_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_line_panel_bg.png
new file mode 100755
index 0000000000..3166d20e37
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_line_panel_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_line_panel_bg_1.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_line_panel_bg_1.png
new file mode 100755
index 0000000000..09a9c252da
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_line_panel_bg_1.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_loading_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_loading_autopilot_icon.png
new file mode 100644
index 0000000000..f21a1081f1
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_loading_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_och_dot_line.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_och_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_och_dot_line.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_right_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_right_autopilot_icon.png
new file mode 100644
index 0000000000..cc2b18083d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_right_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_selected_btn.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_selected_btn.png
new file mode 100644
index 0000000000..3f05565483
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_selected_btn.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_setting_btn_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_setting_btn_bg.png
new file mode 100644
index 0000000000..ba41bf3a53
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_line_close.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_line_close.png
new file mode 100644
index 0000000000..370b61de38
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_line_close.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_map_long.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_map_long.png
new file mode 100755
index 0000000000..cf3e5a3778
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_map_long.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_map_medium.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_map_medium.png
new file mode 100755
index 0000000000..bdc2725468
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_switch_map_medium.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_unselect_btn.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_unselect_btn.png
new file mode 100644
index 0000000000..0114bb4f2b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_unselect_btn.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_wrong_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_wrong_autopilot_icon.png
new file mode 100644
index 0000000000..0c8988acb3
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi-2560x1600/sweepers_wrong_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/end_maker_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/end_maker_icon.png
new file mode 100755
index 0000000000..8acf113151
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/end_maker_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_ai_normal.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_ai_normal.png
new file mode 100755
index 0000000000..e98738b192
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_ai_normal.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_ai_select.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_ai_select.png
new file mode 100755
index 0000000000..d3e0107c02
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_ai_select.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_bad_case_normal.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_bad_case_normal.png
new file mode 100755
index 0000000000..c0a978fc2b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_bad_case_normal.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_bad_case_select.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_bad_case_select.png
new file mode 100755
index 0000000000..ebacf3a11a
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_bad_case_select.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_station_start_end.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_station_start_end.png
new file mode 100644
index 0000000000..04580a8f0d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/icon_station_start_end.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/img_sweepers_status_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/img_sweepers_status_bg.png
new file mode 100644
index 0000000000..27cb9285d3
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/img_sweepers_status_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/no_order_data.png b/OCH/mogo-och-sweepers/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-sweepers/src/main/res/drawable-xhdpi/no_order_data.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/press_start_status.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/press_start_status.png
new file mode 100755
index 0000000000..af32c20cb5
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/press_start_status.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_failure.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_failure.png
new file mode 100755
index 0000000000..5737f93ad8
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_failure.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_maker_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_maker_icon.png
new file mode 100644
index 0000000000..9eca61e199
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_maker_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_success.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_success.png
new file mode 100755
index 0000000000..84246fd323
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/start_success.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_icon_in_autopilot.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_icon_in_autopilot.png
new file mode 100644
index 0000000000..75c26c3d71
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_icon_in_autopilot.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_icon_not_in_autopilot.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_icon_not_in_autopilot.png
new file mode 100644
index 0000000000..927296d690
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_icon_not_in_autopilot.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_notice_box_bg.9.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_notice_box_bg.9.png
new file mode 100644
index 0000000000..8b4b579b56
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_notice_box_bg.9.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_slide_block.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_slide_block.png
new file mode 100644
index 0000000000..ed7b293b90
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_base_slide_block.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_disable_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_disable_autopilot_icon.png
new file mode 100644
index 0000000000..170f254cd1
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_disable_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_dot_line.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_dot_line.png
new file mode 100644
index 0000000000..186001352c
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_dot_line.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_ic_autopilot.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_ic_autopilot.png
new file mode 100644
index 0000000000..be978145dc
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_ic_autopilot.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_arrived_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_arrived_station.png
new file mode 100644
index 0000000000..8a065b66dd
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_arrived_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_arriving_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_arriving_station.png
new file mode 100644
index 0000000000..4ed57a0e30
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_arriving_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_not_arrive_station.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_not_arrive_station.png
new file mode 100644
index 0000000000..e0bb24c526
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_icon_not_arrive_station.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_light_green_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_light_green_nor.png
new file mode 100644
index 0000000000..bc9fed952d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_light_green_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_light_red_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_light_red_nor.png
new file mode 100644
index 0000000000..8732508ded
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_light_red_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_lightyellow_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_lightyellow_nor.png
new file mode 100644
index 0000000000..bae01408fd
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_lightyellow_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_line_panel_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_line_panel_bg.png
new file mode 100755
index 0000000000..3166d20e37
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_line_panel_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_line_panel_bg_1.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_line_panel_bg_1.png
new file mode 100755
index 0000000000..09a9c252da
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_line_panel_bg_1.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_loading_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_loading_autopilot_icon.png
new file mode 100644
index 0000000000..f21a1081f1
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_loading_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_och_dot_line.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_och_dot_line.png
new file mode 100644
index 0000000000..a720a532ea
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_och_dot_line.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_right_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_right_autopilot_icon.png
new file mode 100644
index 0000000000..cc2b18083d
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_right_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_selected_btn.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_selected_btn.png
new file mode 100644
index 0000000000..3f05565483
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_selected_btn.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_setting_btn_bg.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_setting_btn_bg.png
new file mode 100644
index 0000000000..ba41bf3a53
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_setting_btn_bg.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_line_close.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_line_close.png
new file mode 100644
index 0000000000..370b61de38
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_line_close.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_map_long.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_map_long.png
new file mode 100755
index 0000000000..cf3e5a3778
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_map_long.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_map_medium.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_map_medium.png
new file mode 100644
index 0000000000..bdc2725468
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_switch_map_medium.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_unselect_btn.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_unselect_btn.png
new file mode 100644
index 0000000000..0114bb4f2b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_unselect_btn.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_wrong_autopilot_icon.png b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_wrong_autopilot_icon.png
new file mode 100644
index 0000000000..0c8988acb3
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable-xhdpi/sweepers_wrong_autopilot_icon.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/ai_collect_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/ai_collect_selector.xml
new file mode 100755
index 0000000000..a1211f3c47
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/ai_collect_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/bad_case_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/bad_case_selector.xml
new file mode 100755
index 0000000000..bc47ce95d7
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/bad_case_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/bg_sweepers_traffic_light_background.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/bg_sweepers_traffic_light_background.xml
new file mode 100644
index 0000000000..b70919aa14
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/bg_sweepers_traffic_light_background.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/img_sweepers_status_bg.9.png b/OCH/mogo-och-sweepers/src/main/res/drawable/img_sweepers_status_bg.9.png
new file mode 100644
index 0000000000..0af2b9db73
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable/img_sweepers_status_bg.9.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg.xml
new file mode 100644
index 0000000000..ad57da1c3a
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg.xml
@@ -0,0 +1,17 @@
+
+
+ -
+
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+
+
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg_check.png b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg_check.png
new file mode 100644
index 0000000000..28857974b5
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg_check.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg_nor.png b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg_nor.png
new file mode 100644
index 0000000000..f7d4f92c4b
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_autopilot_status_bg_nor.png differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_base_autopilot_status_icon_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_base_autopilot_status_icon_selector.xml
new file mode 100644
index 0000000000..4853d04af7
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_base_autopilot_status_icon_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_checkbox_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_checkbox_selector.xml
new file mode 100644
index 0000000000..e6bdc7e101
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_checkbox_selector.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_line_dividing_line1_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_line_dividing_line1_selector.xml
new file mode 100644
index 0000000000..b00fbd8bd6
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_line_dividing_line1_selector.xml
@@ -0,0 +1,8 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_line_dividing_line2_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_line_dividing_line2_selector.xml
new file mode 100644
index 0000000000..ee555aae15
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_line_dividing_line2_selector.xml
@@ -0,0 +1,8 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_bg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_bg.xml
new file mode 100644
index 0000000000..753d85e3ec
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_bg.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_bg_selector.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_bg_selector.xml
new file mode 100755
index 0000000000..9e69b082e4
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_bg_selector.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_select_bg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_select_bg.xml
new file mode 100644
index 0000000000..835c1fbaff
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_operation_status_select_bg.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_panel_anchor_bkg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_panel_anchor_bkg.xml
new file mode 100644
index 0000000000..38fc28d893
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_panel_anchor_bkg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_panel_bkg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_panel_bkg.xml
new file mode 100644
index 0000000000..d7937835a0
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_panel_bkg.xml
@@ -0,0 +1,19 @@
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_setting_tip_red_cir_bg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_setting_tip_red_cir_bg.xml
new file mode 100644
index 0000000000..0f456d52c7
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_setting_tip_red_cir_bg.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_station_green_dash_line.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_station_green_dash_line.xml
new file mode 100644
index 0000000000..b63e8e58c3
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_station_green_dash_line.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_station_v_green_dash.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_station_v_green_dash.xml
new file mode 100644
index 0000000000..55d0559738
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_station_v_green_dash.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn.xml
new file mode 100644
index 0000000000..be0bd24850
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn_commit.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn_commit.xml
new file mode 100644
index 0000000000..324b9ece10
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn_commit.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn_un_commit.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn_un_commit.xml
new file mode 100644
index 0000000000..d0ea7fa041
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_line_btn_un_commit.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_map_bg.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_map_bg.xml
new file mode 100644
index 0000000000..2744ded87b
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_switch_map_bg.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_yi_biao_pan_bg_nor.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_yi_biao_pan_bg_nor.xml
new file mode 100644
index 0000000000..4bde0e73c1
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_yi_biao_pan_bg_nor.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_yi_biao_pan_bg_speeding.xml b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_yi_biao_pan_bg_speeding.xml
new file mode 100644
index 0000000000..dea7a88bb6
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/drawable/sweepers_yi_biao_pan_bg_speeding.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/activity_sweepers_switch_line.xml b/OCH/mogo-och-sweepers/src/main/res/layout/activity_sweepers_switch_line.xml
new file mode 100644
index 0000000000..9c450d0566
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/activity_sweepers_switch_line.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/fragment_och_sweepers.xml b/OCH/mogo-och-sweepers/src/main/res/layout/fragment_och_sweepers.xml
new file mode 100644
index 0000000000..4f3bba01d7
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/fragment_och_sweepers.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/item_och_sweepers_station.xml b/OCH/mogo-och-sweepers/src/main/res/layout/item_och_sweepers_station.xml
new file mode 100644
index 0000000000..d11497572e
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/item_och_sweepers_station.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_base_fragment.xml b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_base_fragment.xml
new file mode 100644
index 0000000000..1a3b6ac94b
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_base_fragment.xml
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_no_data_common_view.xml b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_no_data_common_view.xml
new file mode 100644
index 0000000000..e303e02e72
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_no_data_common_view.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_switch_line_list_item.xml b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_switch_line_list_item.xml
new file mode 100644
index 0000000000..4bddc9f263
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_switch_line_list_item.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_test_bar_view.xml b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_test_bar_view.xml
new file mode 100644
index 0000000000..34938872eb
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_test_bar_view.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_traffic_light_view.xml b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_traffic_light_view.xml
new file mode 100644
index 0000000000..37fb6b204d
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/layout/sweepers_traffic_light_view.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/raw/end_marker.nt3d b/OCH/mogo-och-sweepers/src/main/res/raw/end_marker.nt3d
new file mode 100644
index 0000000000..be6057c547
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/raw/end_marker.nt3d differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/raw/star_marker.nt3d b/OCH/mogo-och-sweepers/src/main/res/raw/star_marker.nt3d
new file mode 100644
index 0000000000..c6e546fc31
Binary files /dev/null and b/OCH/mogo-och-sweepers/src/main/res/raw/star_marker.nt3d differ
diff --git a/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_away_passengers.json b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_away_passengers.json
new file mode 100644
index 0000000000..e76436f2dc
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_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-sweepers/src/main/res/raw/sweepers_order_1.json b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_order_1.json
new file mode 100644
index 0000000000..050b67447d
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_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-sweepers/src/main/res/raw/sweepers_station_list1.json b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_station_list1.json
new file mode 100644
index 0000000000..c74daa1174
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_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-sweepers/src/main/res/raw/sweepers_station_list2.json b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_station_list2.json
new file mode 100644
index 0000000000..48d6782cc3
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/raw/sweepers_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-sweepers/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-sweepers/src/main/res/values-xhdpi-2560x1440/dimens.xml
new file mode 100644
index 0000000000..55047b8e26
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values-xhdpi-2560x1440/dimens.xml
@@ -0,0 +1,140 @@
+
+
+
+ 300px
+ 348px
+ 211px
+ 276px
+
+
+ 220px
+ 98px
+ 159px
+
+ 32px
+ 20px
+ 40px
+ 42px
+
+ 15px
+
+ 20px
+ 36px
+ 28px
+ 36px
+
+ 3px
+ 3px
+ 17px
+ 17px
+
+
+ 300px
+ 270px
+ 30px
+ 24px
+ 24px
+ 1px
+ 30px
+ 23px
+ 30px
+ 146px
+ 20px
+ 23px
+ 30px
+ 23px
+ 26px
+ 34px
+ 20px
+ 80px
+ 3px
+ 34px
+ 20px
+ 28px
+ 27px
+
+
+ 28px
+ 20px
+ 20px
+ 64px
+ 16px
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 530px
+ 492px
+
+ 20px
+ 20px
+ 70px
+ 130px
+ 93px
+ 150px
+ 70px
+
+ 24px
+ 616px
+ 180px
+
+ 112px
+ 112px
+
+ 92px
+
+ 30px
+ 616px
+ 754px
+
+
+ 40px
+ 13px
+ 12px
+ 350px
+
+ 460px
+ 30px
+
+ 110px
+ 40px
+ 320px
+ 20px
+ 40px
+ 320px
+ 320px
+ 70px
+ 616px
+ 130px
+ 30px
+ 279px
+ 112px
+ 22px
+ 36px
+ 50px
+ 60px
+
+
+ 46px
+ 700px
+ 120px
+ 560px
+ 116px
+
+ 20px
+
+ 225px
+ 154px
+ 60px
+ 40px
+ 23px
+ 210px
+ 120px
+ 15px
+ 17px
+ 154px
+ 130px
+ 60px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/values-xhdpi-2560x1600/dimens.xml b/OCH/mogo-och-sweepers/src/main/res/values-xhdpi-2560x1600/dimens.xml
new file mode 100644
index 0000000000..574bf7d3e1
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values-xhdpi-2560x1600/dimens.xml
@@ -0,0 +1,138 @@
+
+
+
+ 300px
+ 348px
+ 211px
+ 276px
+
+
+ 220px
+ 98px
+ 159px
+
+ 32px
+ 20px
+ 40px
+ 42px
+
+ 15px
+
+ 20px
+ 36px
+ 28px
+ 36px
+
+ 3px
+ 3px
+ 17px
+ 17px
+
+
+ 300px
+ 270px
+ 30px
+ 24px
+ 24px
+ 1px
+ 30px
+ 23px
+ 30px
+ 146px
+ 20px
+ 23px
+ 30px
+ 23px
+ 26px
+ 34px
+ 20px
+ 80px
+ 3px
+ 34px
+ 20px
+ 28px
+ 27px
+
+
+ 25.6px
+ 20px
+ 20px
+ 64px
+ 16px
+
+ 40px
+ 40px
+ 46px
+ 24px
+
+ 530px
+ 492px
+
+ 20px
+ 20px
+ 70px
+ 130px
+ 93px
+ 150px
+ 70px
+
+ 24px
+ 616px
+ 180px
+
+ 112px
+ 112px
+
+ 92px
+
+ 30px
+ 616px
+ 754px
+
+
+ 40px
+ 13px
+ 12px
+ 350px
+
+ 460px
+ 30px
+
+ 110px
+ 40px
+ 320px
+ 20px
+ 40px
+ 320px
+ 460px
+ 70px
+ 460px
+ 130px
+ 30px
+ 276px
+ 112px
+ 22px
+ 36px
+ 50px
+ 60px
+
+ 46px
+ 700px
+ 120px
+ 560px
+ 116px
+ 50px
+
+ 225px
+ 154px
+ 60px
+ 40px
+ 23px
+ 210px
+ 120px
+ 15px
+ 17px
+ 154px
+ 130px
+ 60px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/values/attrs.xml b/OCH/mogo-och-sweepers/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000..396db92f74
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values/attrs.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/values/colors.xml b/OCH/mogo-och-sweepers/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..10164ca28b
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values/colors.xml
@@ -0,0 +1,47 @@
+
+
+ #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
+
+ #2966EC
+ #F0151D41
+
+ #19FFFFFF
+ #FFFFFF
+
+ #FFFFA28B
+ #FFDA1100
+ #FF60FFD3
+ #FF006D43
+ #FFFFE198
+ #FFFF9B00
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/values/dimens.xml b/OCH/mogo-och-sweepers/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..1f68fc1165
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values/dimens.xml
@@ -0,0 +1,154 @@
+
+
+
+ 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
+
+ 30px
+ 450px
+ 72px
+ 280px
+ 58px
+ 20px
+
+ 225px
+ 154px
+ 60px
+ 40px
+ 23px
+ 210px
+ 120px
+ 15px
+ 17px
+ 154px
+ 130px
+ 60px
+
\ No newline at end of file
diff --git a/OCH/mogo-och-sweepers/src/main/res/values/strings.xml b/OCH/mogo-och-sweepers/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..35b9a13191
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values/strings.xml
@@ -0,0 +1,27 @@
+
+ 近距视角
+ 远距视角
+ 启动中…
+ 启动成功
+ 启动失败
+ 自动驾驶
+ 路线列表
+ 路线:
+ 起点:
+ 终点:
+ 确认
+ 切换路线
+ 自动驾驶中,不可切换路线
+ 当前行程未完成,不可切换路线
+ 当前车辆无路线\n请联系运营人员绑定
+ 起点:
+ 终点:
+ 更换路线成功
+ 更换路线失败
+
+ 起点:
+ 终点:
+ 当前站点:
+ 下一站:
+ 自动驾驶状态为0不可用
+
diff --git a/OCH/mogo-och-sweepers/src/main/res/values/style.xml b/OCH/mogo-och-sweepers/src/main/res/values/style.xml
new file mode 100644
index 0000000000..36d7ef0d93
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/main/res/values/style.xml
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/OCH/mogo-och-sweepers/src/test/java/com/mogo/och/sweepers/ExampleUnitTest.kt b/OCH/mogo-och-sweepers/src/test/java/com/mogo/och/sweepers/ExampleUnitTest.kt
new file mode 100644
index 0000000000..a0b7afb9d8
--- /dev/null
+++ b/OCH/mogo-och-sweepers/src/test/java/com/mogo/och/sweepers/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.mogo.och.sweepers
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/app/bugly/BuglySymtabLog.txt b/app/bugly/BuglySymtabLog.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/bugly/BuglyUploadLog.txt b/app/bugly/BuglyUploadLog.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/app/build.gradle b/app/build.gradle
index 4ca4d03f22..93e370dac2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -206,6 +206,7 @@ android {
apply from: "./productFlavors/fPadLenovoOchTaxi.gradle"
apply from: "./productFlavors/fPadLenovoOchBusPassenger.gradle"
apply from: "./productFlavors/fPadLenovoOchTaxiPassenger.gradle"
+ apply from: "./productFlavors/fPadLenovoOchSweepers.gradle"
packagingOptions {
exclude 'META-INF/io.netty.versions.properties'
diff --git a/app/functions/och.gradle b/app/functions/och.gradle
index fa05f78b8f..4d1d43e395 100644
--- a/app/functions/och.gradle
+++ b/app/functions/och.gradle
@@ -8,6 +8,15 @@ project.dependencies {
exclude group: 'com.mogo.eagle.core.function' //by group
}
+ // sweepers清扫车
+ fPadLenovoOchSweepersImplementation(rootProject.ext.dependencies.mogoochsweepers) {
+ 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司机端
fPadLenovoOchBusImplementation(rootProject.ext.dependencies.mogoochbus) {
exclude group: 'com.mogo.commons' //by group
@@ -50,6 +59,14 @@ project.dependencies {
exclude group: 'com.mogo.eagle.core' //by group
exclude group: 'com.mogo.eagle.core.function' //by group
}
+ // sweepers 清扫车
+ fPadLenovoOchSweepersImplementation (project(':OCH:mogo-och-sweepers')) {
+ 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司机端
fPadLenovoOchBusImplementation (project(':OCH:mogo-och-bus')) {
diff --git a/app/productFlavors/fPadLenovoOchSweepers.gradle b/app/productFlavors/fPadLenovoOchSweepers.gradle
new file mode 100644
index 0000000000..7fea1d9412
--- /dev/null
+++ b/app/productFlavors/fPadLenovoOchSweepers.gradle
@@ -0,0 +1,38 @@
+project.android.productFlavors {
+ // 衡阳-联想Pad-网约车-小巴车
+ fPadLenovoOchSweepers {
+ externalNativeBuild {
+ ndk {
+ // 设置支持的SO库架构
+ abiFilters "arm64-v8a"
+ }
+ }
+ 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"
+
+ // 车机类型,主要用于区分自研车机还是别人家的车机,自研车机类型为0
+ buildConfigField 'int', 'CAR_MACHINE_TYPE', '2'
+ //高德地图鉴权信息
+ manifestPlaceholders = [AMAP_API_VALUE: rootProject.ext.android.fLauncherAmapApiValue, CHANNEL_VALUE: "fPadLenovoOchSweepers",ACTIVITY_ROOT:true]
+
+ // 是否基于地图
+ buildConfigField 'boolean', 'IS_MAP_BASED', 'true'
+
+ // 是否需要实时上报坐标
+ buildConfigField 'boolean', 'IS_NEED_UPLOAD_COORDINATES_IN_TIME', 'true'
+ // GPS数据提供源: 0-Android系统,1-工控机,2-OBU
+ buildConfigField 'int', 'GPS_PROVIDER', "1"
+
+ // 构建的应用身份类型,出租车0|小巴A-司机|乘客
+ buildConfigField 'int', 'APP_IDENTITY_MODE', "0xA0"
+ // 连接的工控机IP地址
+ buildConfigField 'String', 'ADAS_CONNECT_IP', "\"192.168.8.102\""
+ // 构建的是否是演示(美化)模式
+ buildConfigField 'boolean', 'IS_DEMO_MODE', 'false'
+ }
+}
\ No newline at end of file
diff --git a/app/regroup.gradle b/app/regroup.gradle
index 6b249c3b08..2e75286609 100644
--- a/app/regroup.gradle
+++ b/app/regroup.gradle
@@ -1,7 +1,7 @@
// 将 install 和 assemble 任务按功能分组
afterEvaluate {
- def launcher = [ "fPadLenovo", "fPadLenovoOchTaxi", "fPadLenovoOchBus", "fPadLenovoOchBusPassenger", "fPadLenovoOchTaxiPassenger"]
+ def launcher = [ "fPadLenovo","fPadLenovoOchSweepers", "fPadLenovoOchTaxi", "fPadLenovoOchBus", "fPadLenovoOchBusPassenger", "fPadLenovoOchTaxiPassenger"]
it.getTasks().iterator().forEachRemaining {
def task = it
diff --git a/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
index 0f178d13cf..bf8a3bde79 100644
--- a/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
+++ b/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
@@ -68,7 +68,10 @@ class ConfigStartUp : AndroidStartup() {
// 配置BuglyAppID:MoGoEagleEye
CrashReportConstants.buglyAppID = "ac71228f85"
- if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxi" || DebugConfig.getProductFlavor() == "fPadLenovoOchBus" || DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger" || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger") {
+ if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxi" || DebugConfig.getProductFlavor() == "fPadLenovoOchBus"
+ || DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger"
+ || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger"
+ || DebugConfig.getProductFlavor() == "fPadLenovoOchSweepers") {
//控制HMI展示元素 将不用手动调用setXXXXXViewVisibility
HmiBuildConfig.isShowSpeedView = false
HmiBuildConfig.isShowAutopilotStatusView = false
@@ -80,7 +83,8 @@ class ConfigStartUp : AndroidStartup() {
if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxi" || DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger") {
HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche
- } else if (DebugConfig.getProductFlavor() == "fPadLenovoOchBus" || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger") {
+ } else if (DebugConfig.getProductFlavor() == "fPadLenovoOchBus" || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger"
+ || DebugConfig.getProductFlavor() == "fPadLenovoOchSweepers") {
HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache
HmiBuildConfig.isShowBrakeLightView = false
HmiBuildConfig.isShowTurnLightView = false
diff --git a/build.gradle b/build.gradle
index 90cb140cd4..05af3e4271 100644
--- a/build.gradle
+++ b/build.gradle
@@ -26,7 +26,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
- classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30'
+ classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'
classpath "com.alibaba:arouter-register:1.0.12-mogo"
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
classpath 'com.tencent.bugly:symtabfileuploader:2.2.1'
diff --git a/gradle.properties b/gradle.properties
index b5a4928f9d..55ea3ab5b9 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -89,9 +89,9 @@ WEBSOCKET_VERSION=1.1.7
## 产品库必备配置,产品库自动对versionCode和versionName版本进行升级
applicationId=com.mogo.launcer
applicationName=IntelligentPilot
-# RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0
-versionCode=2090000
-versionName=2.9.0
+# 清扫车版本号
+versionCode=1000000
+versionName=1.0.0
################# 新架构模块Maven版本管理 #################
MOGO_CORE_FUNCTION_AUTOPILOT_VERSION=0.0.58.10
diff --git a/settings.gradle b/settings.gradle
index f10ff3e33c..a4936a9efa 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -86,4 +86,4 @@ include ':OCH:mogo-och-taxi'
include ':OCH:mogo-och-taxi-passenger'
include ':OCH:mogo-och-noop'
include(':OCH:mogo-och-common-module')
-
+include ':OCH:mogo-och-sweepers'