[Taxi Passenger v1.1.0] taxi passenger 代码整理
@@ -111,6 +111,8 @@ public class OchBusProvider implements IMogoOCH {
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
//若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠
|
||||
if (activity == null) return;
|
||||
activity.finish();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ package com.mogo.och.bus.bean;
|
||||
public class OchBusOrder {
|
||||
|
||||
/**
|
||||
* orderId number
|
||||
* orderNo number
|
||||
* passengerPhone string 下单用户电话
|
||||
* startStationId integer 开始站点
|
||||
* startStationName string
|
||||
@@ -17,15 +17,15 @@ public class OchBusOrder {
|
||||
* endStationName string
|
||||
*/
|
||||
|
||||
private long orderId;
|
||||
private long orderNo;
|
||||
private String passengerPhone;
|
||||
private int startStationId;//乘客上车点
|
||||
private String startStationName;
|
||||
private String endStationName;
|
||||
private int endStationId;//乘客下车点
|
||||
|
||||
public void setOrderId(long orderId) {
|
||||
this.orderId = orderId;
|
||||
public void setOrderNo(long orderNo) {
|
||||
this.orderNo = orderNo;
|
||||
}
|
||||
|
||||
public void setPassengerPhone(String passengerPhone) {
|
||||
@@ -48,8 +48,8 @@ public class OchBusOrder {
|
||||
this.endStationId = endStationId;
|
||||
}
|
||||
|
||||
public long getOrderId() {
|
||||
return orderId;
|
||||
public long getOrderNo() {
|
||||
return orderNo;
|
||||
}
|
||||
|
||||
public String getPassengerPhone() {
|
||||
@@ -75,7 +75,7 @@ public class OchBusOrder {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "OchBusOrder{" +
|
||||
"orderId=" + orderId +
|
||||
"orderNo=" + orderNo +
|
||||
", passengerPhone='" + passengerPhone + '\'' +
|
||||
", startStationId=" + startStationId +
|
||||
", startStationName='" + startStationName + '\'' +
|
||||
|
||||
@@ -40,7 +40,7 @@ class QueryLeaveAwayPassengersResponse extends BaseData {
|
||||
* endSiteGcjPoint:
|
||||
*/
|
||||
//todo 目前是需要乘客电话来通知乘客下车 目前后台没有乘客信息userPhone
|
||||
public long orderId;
|
||||
public long orderNo;
|
||||
public int orderStatus;
|
||||
public int orderType;
|
||||
public long bookingTime;
|
||||
|
||||
@@ -35,7 +35,6 @@ public interface IOchBusApiService {
|
||||
* @return 接口返回数据
|
||||
*/
|
||||
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
|
||||
@POST( "/autopilot-car-hailing/line/v2/lineDataWithDriver/query" )
|
||||
// @POST( "/mock/268/autopilot-car-hailing/bus/api/lineDataWithDriver/query" )
|
||||
Observable< OchBusRoutesResponse > querySiteByCoordinate(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusQueryLineStationsRequest request);
|
||||
@@ -47,7 +46,6 @@ public interface IOchBusApiService {
|
||||
* @return 返回值是重置后的车站列表
|
||||
*/
|
||||
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/bus/api/drivingLine/reset" )
|
||||
@POST( "/autopilot-car-hailing/car/v2/bus/drivingLine/reset" )
|
||||
// @POST( "/mock/268/autopilot-car-hailing/bus/api/drivingLine/reset" )
|
||||
Observable< OchBusRoutesResponse > resetStationStatus(@Header ("appId") String appId, @Header("ticket") String ticket, @Body OchBusResetDrivingLineRequest request);
|
||||
@@ -58,7 +56,6 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers({"Content-Type:application/json;charset=UTF-8"})
|
||||
// @POST("/autopilot-car-hailing/bus/api/driving/away")
|
||||
@POST("/autopilot-car-hailing/car/v2/bus/driving/away")
|
||||
// @POST("/mock/268/autopilot-car-hailing/bus/api/driving/away")
|
||||
Observable< OchBusRoutesResponse > leaveStation(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusUpdateSiteStatusRequest request);
|
||||
@@ -69,7 +66,6 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers({"Content-type:application/json;charset=UTF-8"})
|
||||
// @POST("/autopilot-car-hailing/bus/api/driving/attachSite")
|
||||
@POST("/autopilot-car-hailing/order/v2/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 OchBusUpdateSiteStatusRequest request);
|
||||
@@ -81,7 +77,6 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers({"Content-type:application/json;charset=UTF-8"})
|
||||
// @POST("/autopilot-car-hailing/bus/api/driving/siteArrivedOrders")
|
||||
@POST("/autopilot-car-hailing/order/v2/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);
|
||||
@@ -92,7 +87,6 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST("/autopilot-car-hailing/bus/api/startTakeOrder")
|
||||
@POST("/autopilot-car-hailing/car/v2/bus/startTakeOrder")
|
||||
// @POST("/mock/268/autopilot-car-hailing/bus/api/startTakeOrder")
|
||||
Observable<BaseData> startTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusOperationStatusRequest request);
|
||||
@@ -103,7 +97,6 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers({"Content-type:application/json;charset=UTF-8"})
|
||||
// @POST("/autopilot-car-hailing/bus/api/stopTakeOrder")
|
||||
@POST("/autopilot-car-hailing/car/v2/bus/stopTakeOrder")
|
||||
// @POST("/mock/268/autopilot-car-hailing/bus/api/stopTakeOrder")
|
||||
Observable<BaseData> stopTakeOrder(@Header ("appId") String appId,@Header("ticket") String ticket,@Body OchBusOperationStatusRequest request);
|
||||
@@ -114,13 +107,11 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers({"Content-type:application/json;charset=UTF-8"})
|
||||
// @GET("/autopilot-car-hailing/bus/api/takeOrderStatus/query")
|
||||
@GET("/autopilot-car-hailing/car/v2/bus/takeOrderStatus/query")
|
||||
// @GET("/mock/268/autopilot-car-hailing/bus/api/takeOrderStatus/query")
|
||||
Observable<OchBusOperationStatusResponse> 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/bus/api/servicingOrders/query")
|
||||
@GET("/autopilot-car-hailing/order/v2/bus/servicingOrders/query")
|
||||
// @GET("/mock/268/autopilot-car-hailing/bus/api/servicingOrders/query")
|
||||
Observable<OchBusOrdersResponse> queryBusOrders(@Header ("appId") String appId,@Header("ticket") String ticket,@Query("sn") String sn);
|
||||
@@ -131,10 +122,16 @@ public interface IOchBusApiService {
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
// @POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
|
||||
@POST( "/autopilot-car-hailing/location/v2/driver/heartbeat" )
|
||||
Observable<BaseData> 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")
|
||||
Observable<BusQueryLinesResponse> queryBusLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn);
|
||||
}
|
||||
|
||||
@@ -221,7 +221,7 @@ public class OchBusOrderModel {
|
||||
OchBusOrder order = busOrders.get(i);
|
||||
if (order == null) return;
|
||||
if (TextUtils.isEmpty(order.getPassengerPhone())) return;
|
||||
if (prevBusOrderIds.contains(order.getOrderId())) continue;
|
||||
if (prevBusOrderIds.contains(order.getOrderNo())) continue;
|
||||
try {
|
||||
String tailNum = null;
|
||||
try {
|
||||
@@ -233,7 +233,7 @@ public class OchBusOrderModel {
|
||||
Logger.d(TAG, "TTS:" + tailNum);
|
||||
AIAssist.getInstance(mContext).speakTTSVoice("接到新订单,尾号 " + tailNum
|
||||
+ " 上车站点为 " + order.getStartStationName());
|
||||
prevBusOrderIds.add(order.getOrderId());
|
||||
prevBusOrderIds.add(order.getOrderNo());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@ import com.alibaba.android.arouter.facade.annotation.Route;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.module.common.MogoApisHandler;
|
||||
import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
|
||||
import com.mogo.och.taxi.passenger.ui.OCHTaxiFragment;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
|
||||
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment;
|
||||
import com.mogo.service.statusmanager.IMogoStatusChangedListener;
|
||||
import com.mogo.service.statusmanager.StatusDescriptor;
|
||||
|
||||
@@ -24,11 +24,11 @@ public
|
||||
* <p>
|
||||
* 网约车-出租车
|
||||
*/
|
||||
@Route( path = OCHTaxiConst.PATH )
|
||||
@Route( path = TaxiPassengerConst.PATH )
|
||||
class MogoOCHTaxi implements IMogoOCH, IMogoStatusChangedListener {
|
||||
|
||||
private static final String TAG = "MogoOCHTaxi";
|
||||
private OCHTaxiFragment ochTaxiFragment;
|
||||
private TaxiPassengerBaseFragment ochTaxiPassengerFragment;
|
||||
private FragmentActivity mActivity;
|
||||
private int mContainerId;
|
||||
@Override
|
||||
@@ -51,19 +51,19 @@ class MogoOCHTaxi implements IMogoOCH, IMogoStatusChangedListener {
|
||||
}
|
||||
|
||||
private void showFragment() {
|
||||
if (ochTaxiFragment == null) {
|
||||
if (ochTaxiPassengerFragment == null) {
|
||||
Logger.d(TAG, "准备add fragment======");
|
||||
ochTaxiFragment = new OCHTaxiFragment();
|
||||
mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, ochTaxiFragment).commitAllowingStateLoss();
|
||||
ochTaxiPassengerFragment = new TaxiPassengerBaseFragment();
|
||||
mActivity.getSupportFragmentManager().beginTransaction().add(mContainerId, ochTaxiPassengerFragment).commitAllowingStateLoss();
|
||||
return;
|
||||
}
|
||||
Logger.d(TAG, "准备show fragment");
|
||||
mActivity.getSupportFragmentManager().beginTransaction().show(ochTaxiFragment).commitAllowingStateLoss();
|
||||
mActivity.getSupportFragmentManager().beginTransaction().show(ochTaxiPassengerFragment).commitAllowingStateLoss();
|
||||
}
|
||||
|
||||
private void hideFragment(){
|
||||
if (ochTaxiFragment != null){
|
||||
mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiFragment).commitAllowingStateLoss();
|
||||
if (ochTaxiPassengerFragment != null){
|
||||
mActivity.getSupportFragmentManager().beginTransaction().hide(ochTaxiPassengerFragment).commitAllowingStateLoss();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +101,8 @@ class MogoOCHTaxi implements IMogoOCH, IMogoStatusChangedListener {
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
// 若不调用finish, 设置中打开关闭UITouch,会造成och fragment 重叠
|
||||
if (mActivity == null) return;
|
||||
mActivity.finish();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/17
|
||||
*
|
||||
* 司机运营数据返回数据结构
|
||||
*/
|
||||
public class DriverServiceDataRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
public Immediate immediate; //daily数据
|
||||
}
|
||||
|
||||
public static class Immediate {
|
||||
public long timeDuration; //当日在线时长,单位秒
|
||||
public long orderNum; //当日完成订单数
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 收车/出车状态查询返回数据结构
|
||||
*/
|
||||
public class DriverStatusQueryRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
public int serviceStatus; //0收车,1出车
|
||||
public long serviceOrderId;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 收车/出车状态更新请求数据结构
|
||||
*/
|
||||
public class DriverStatusUpdateReqBean {
|
||||
public String sn;
|
||||
public int status; //0收车,1出车
|
||||
|
||||
public DriverStatusUpdateReqBean(String sn, int status) {
|
||||
this.sn = sn;
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 司机取消订单请求的数据结构
|
||||
*/
|
||||
public class OrderCancelReqBean {
|
||||
public String sn;
|
||||
public long order_id; //订单号(必须)
|
||||
public int cancel_type; //取消类型(必须)
|
||||
public String cancel_reason; //取消原因(必须)
|
||||
|
||||
public OrderCancelReqBean(String sn, long order_id, int cancel_type, String cancel_reason) {
|
||||
this.sn = sn;
|
||||
this.order_id = order_id;
|
||||
this.cancel_type = cancel_type;
|
||||
this.cancel_reason = cancel_reason;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/7
|
||||
*
|
||||
* (预约单)抢单动作的请求数据结构
|
||||
*/
|
||||
public class OrderGrabReqBean {
|
||||
public String sn;
|
||||
public long orderId;
|
||||
|
||||
public OrderGrabReqBean(String sn, long orderId) {
|
||||
this.sn = sn;
|
||||
this.orderId = orderId;
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/7
|
||||
*
|
||||
* (预约单)抢单动作的返回数据结构
|
||||
*/
|
||||
public class OrderGrabRespBean extends BaseData {
|
||||
public long data; // 暂不使用
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/7
|
||||
*
|
||||
* (预约单)查询抢单结果的返回数据结构
|
||||
*/
|
||||
public class OrderGrabStatusQueryRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
public int grabStatus; //0:抢单中; 1:抢单结束,匹配; 2:抢单结束,匹配到其他司机;3:订单已取消;4:非法,不是选择的自己
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/7
|
||||
*
|
||||
* 查询订单路径信息(起始点里程、预估时间等)请求数据结构
|
||||
*/
|
||||
public class OrderQueryRouteInfoReqBean {
|
||||
public String sn;
|
||||
public long orderId;
|
||||
|
||||
public OrderQueryRouteInfoReqBean(String sn, long orderId) {
|
||||
this.sn = sn;
|
||||
this.orderId = orderId;
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/7
|
||||
*
|
||||
* 查询订单路径信息(起始点里程、预估时间等)返回数据结构
|
||||
*/
|
||||
public class OrderQueryRouteInfoRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
// 到上车点
|
||||
public long durationToStart; //司机绑定时的位置距离上车点时长,单位:秒
|
||||
public long distanceToStart; //司机绑定时的位置距离上车点距离,单位:米
|
||||
|
||||
// 起点至终点
|
||||
public long durationToEnd; //订单上车点到目的地的时长,单位:秒
|
||||
public long distanceToEnd; //订单上车点到目的地的距离,单位:米
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 订单状态更新请求数据结构
|
||||
*/
|
||||
public class OrderStatusUpdateReqBean {
|
||||
public String sn;
|
||||
public long orderId;
|
||||
public int orderStatus;
|
||||
|
||||
public OrderStatusUpdateReqBean(String sn, long orderId, int orderStatus) {
|
||||
this.sn = sn;
|
||||
this.orderId = orderId;
|
||||
this.orderStatus = orderStatus;
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 查询订单列表请求数据结构
|
||||
*/
|
||||
public class OrdersListQueryReqBean {
|
||||
|
||||
public String sn;
|
||||
public int page; //页码,从0开始
|
||||
public int size; //每页条数
|
||||
|
||||
public OrdersListQueryReqBean(String sn, int page, int size) {
|
||||
this.sn = sn;
|
||||
this.page = page;
|
||||
this.size = size;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*/
|
||||
public class OrdersListQueryRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
public List<OrderQueryRespBean.Result> orders;
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/8
|
||||
*
|
||||
* 查询新到的预约单的返回数据结构
|
||||
*/
|
||||
public class OrdersNewBookingQueryRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
public List<Long> orders;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.mogo.och.taxi.passenger.bean;
|
||||
|
||||
import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@@ -9,18 +9,18 @@ import java.util.UUID;
|
||||
*
|
||||
* 上传车机心跳信息请求数据
|
||||
*/
|
||||
public class CarHeartbeatReqBean {
|
||||
public class TaxiPassengerCarHeartbeatReqBean {
|
||||
public String sn;
|
||||
public double lon; //经度
|
||||
public double lat; //纬度
|
||||
public String msgId; //心跳信息唯一标识
|
||||
public int interval; //上报间隔,单位秒,非必传,默认60秒
|
||||
|
||||
public CarHeartbeatReqBean(String sn, double lon, double lat) {
|
||||
public TaxiPassengerCarHeartbeatReqBean(String sn, double lon, double lat) {
|
||||
this.sn = sn;
|
||||
this.lon = lon;
|
||||
this.lat = lat;
|
||||
this.msgId = UUID.randomUUID().toString();
|
||||
this.interval = (int) (OCHTaxiConst.LOOP_PERIOD_60S / 1000);
|
||||
this.interval = (int) (TaxiPassengerConst.LOOP_PERIOD_60S / 1000);
|
||||
}
|
||||
}
|
||||
@@ -5,13 +5,13 @@ package com.mogo.och.taxi.passenger.bean;
|
||||
*
|
||||
* 查询订单信息请求数据结构
|
||||
*/
|
||||
public class OrderQueryReqBean {
|
||||
public class TaxiPassengerOrderQueryReqBean {
|
||||
|
||||
public String sn;
|
||||
public long orderId;
|
||||
public long orderNo;
|
||||
|
||||
public OrderQueryReqBean(String sn, long orderId) {
|
||||
public TaxiPassengerOrderQueryReqBean(String sn, long orderNo) {
|
||||
this.sn = sn;
|
||||
this.orderId = orderId;
|
||||
this.orderNo = orderNo;
|
||||
}
|
||||
}
|
||||
@@ -10,12 +10,12 @@ import java.util.Objects;
|
||||
*
|
||||
* 查询订单返回数据结构
|
||||
*/
|
||||
public class OrderQueryRespBean extends BaseData {
|
||||
public class TaxiPassengerOrderQueryRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result implements Comparable<Result>{
|
||||
// 订单id
|
||||
public long orderId;
|
||||
public long orderNo;
|
||||
// 订单类型
|
||||
public int orderType; //1即时单 2预约单
|
||||
// 订单状态
|
||||
@@ -63,7 +63,7 @@ public class OrderQueryRespBean extends BaseData {
|
||||
|
||||
@Override
|
||||
public int compareTo(Result o) {
|
||||
long result = this.orderId - o.orderId;
|
||||
long result = this.orderNo - o.orderNo;
|
||||
return result == 0 ? 0 : (result > 0 ? 1 : -1);
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public class OrderQueryRespBean extends BaseData {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
Result result = (Result) o;
|
||||
return orderId == result.orderId &&
|
||||
return orderNo == result.orderNo &&
|
||||
orderType == result.orderType &&
|
||||
orderStatus == result.orderStatus &&
|
||||
businessType == result.businessType;
|
||||
@@ -80,7 +80,7 @@ public class OrderQueryRespBean extends BaseData {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(orderId, orderType, orderStatus, businessType, startSiteId,
|
||||
return Objects.hash(orderNo, orderType, orderStatus, businessType, startSiteId,
|
||||
startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
|
||||
endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
|
||||
}
|
||||
@@ -9,11 +9,11 @@ import java.util.List;
|
||||
*
|
||||
* 查询全部服务中/待服务订单的返回数据
|
||||
*/
|
||||
public class OrdersInServiceQueryRespBean extends BaseData {
|
||||
public class TaxiPassengerOrdersInServiceQueryRespBean extends BaseData {
|
||||
public Result data;
|
||||
|
||||
public static class Result {
|
||||
public List<OrderQueryRespBean.Result> servicing; //服务中订单
|
||||
public List<OrderQueryRespBean.Result> waitService; //待服务订单
|
||||
public List<TaxiPassengerOrderQueryRespBean.Result> servicing; //服务中订单
|
||||
public List<TaxiPassengerOrderQueryRespBean.Result> waitService; //待服务订单
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.callback;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/8
|
||||
*
|
||||
* Model->Presenter回调:出车/收车状态变更
|
||||
*/
|
||||
public interface IOCHTaxiCarStatusCallback {
|
||||
void onCarStatusChanged(boolean inOperation);
|
||||
|
||||
void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum);
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.callback;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/8
|
||||
*
|
||||
* Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
|
||||
*/
|
||||
public interface IOCHTaxiOrderStatusCallback {
|
||||
// 进行中单变更:暂未用到
|
||||
void onOrdersInServiceChanged(@NonNull List<OrderQueryRespBean.Result> inServiceList);
|
||||
// 待服务单变更
|
||||
void onOrdersWaitServiceChanged(@NonNull List<OrderQueryRespBean.Result> waitServiceList);
|
||||
|
||||
// 当前进行单状态变更:新到进行中订单、进行中单状态变更
|
||||
void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order);
|
||||
// 当前订单取消完成:用于司机主动取消订单的结果反馈
|
||||
void onCurrentOrderCancelDone();
|
||||
// 待服务单被取消
|
||||
void onOrderCancelDone(long orderId);
|
||||
// 当前订单route信息查询反馈
|
||||
void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo);
|
||||
// 当前位置距离上车点的距离(米)、预估时间(秒)
|
||||
void onCurrentOrderDistToStartChanged(long meters, long timeInSecond);
|
||||
// 当前位置距离上车点的距离(米)、预估时间(秒)
|
||||
void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
|
||||
|
||||
// 获取全部订单列表(含已完成、已取消)的反馈
|
||||
void onOrdersListPageRefresh(List<OrderQueryRespBean.Result> ordersList);
|
||||
|
||||
// 新到预约单
|
||||
void onNewBookingOrderGot(OrderQueryRespBean.Result order);
|
||||
|
||||
// 执行抢单动作完成:可进入抢单中状态
|
||||
void onGrabOrderExecuteDone();
|
||||
|
||||
// 抢到预约单
|
||||
void onGrabOrderSuccess(OrderQueryRespBean.Result order);
|
||||
|
||||
// 未抢到预约单
|
||||
void onGrabOrderFailed(OrderQueryRespBean.Result order);
|
||||
}
|
||||
@@ -5,7 +5,7 @@ package com.mogo.och.taxi.passenger.callback;
|
||||
*
|
||||
* Model->Presenter回调:ADAS相关(自动驾驶状态回调,到达终点等等)
|
||||
*/
|
||||
public interface IOCHTaxiADASStatusCallback {
|
||||
public interface IOCHTaxiPassengerADASStatusCallback {
|
||||
// 自动驾驶触发的已到达目的地:暂未用到
|
||||
void onAutopilotArriveEnd();
|
||||
|
||||
@@ -8,6 +8,6 @@ import java.util.List;
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/11/1
|
||||
*/
|
||||
public interface IOCHTaxiAutopilotPlanningCallback {
|
||||
public interface IOCHTaxiPassengerAutopilotPlanningCallback {
|
||||
void routeResult(List<AutopilotRouteInfo.RouteModels> models);
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import android.location.Location;
|
||||
*
|
||||
* Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等)
|
||||
*/
|
||||
public interface IOCHTaxiControllerStatusCallback {
|
||||
public interface IOCHTaxiPassengerControllerStatusCallback {
|
||||
// 是否vr map模式
|
||||
void onVRModeChanged(boolean isVRMode);
|
||||
// 自车定位
|
||||
@@ -4,7 +4,7 @@ package com.mogo.och.taxi.passenger.callback;
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/12/3
|
||||
*/
|
||||
public interface IOCHTaxiNaviChangedCallback {
|
||||
public interface IOCHTaxiPassengerNaviChangedCallback {
|
||||
// 当前位置距离上车点的距离(米)、预估时间(秒)
|
||||
void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond);
|
||||
void reInitNaviAmap(boolean isPlay,boolean isRestart);
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.mogo.och.taxi.passenger.callback;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/8
|
||||
*
|
||||
* Model->Presenter回调:订单相关(进行中/待服务单变更,当前进行单状态变更,新到预约单,抢单,抢单结果状态等等)
|
||||
*/
|
||||
public interface IOCHTaxiPassengerOrderStatusCallback {
|
||||
|
||||
// 当前进行单状态变更:新到进行中订单、进行中单状态变更
|
||||
void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order);
|
||||
|
||||
// 当前位置距离上车点的距离(米)、预估时间(秒)
|
||||
void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
|
||||
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.callback
|
||||
|
||||
import androidx.annotation.ColorRes
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2022/1/21
|
||||
*/
|
||||
interface Shadow {
|
||||
//设置阴影半径
|
||||
fun setShadowRadius(radius:Float): Shadow
|
||||
|
||||
//添加单位设置
|
||||
fun setShadowRadius(unit:Int,radius: Float): Shadow
|
||||
|
||||
//设置应用颜色
|
||||
fun setShadowColor(color:Int): Shadow
|
||||
|
||||
//设置阴影颜色资源文件id
|
||||
fun setShadowColorRes(@ColorRes color: Int): Shadow
|
||||
/**
|
||||
* 设置模糊半径
|
||||
* @param radius
|
||||
*/
|
||||
fun setBlurRadius(radius:Float): Shadow
|
||||
|
||||
/**
|
||||
*
|
||||
* @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
|
||||
* @param radius 模糊半径
|
||||
*/
|
||||
fun setBlurRadius(unit:Int,radius:Float): Shadow
|
||||
|
||||
/**
|
||||
* 设置水平方向的偏移量
|
||||
* @param offset x轴偏移
|
||||
*/
|
||||
fun setXOffset(offset:Float): Shadow
|
||||
|
||||
|
||||
/**
|
||||
* 设置x方向的偏移量,设置单位
|
||||
* @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
|
||||
* @param offset x轴偏移
|
||||
*/
|
||||
fun setXOffset(unit:Int,offset:Float): Shadow
|
||||
|
||||
/**
|
||||
* 设置竖直方向的偏移量
|
||||
* @param offset y轴偏移
|
||||
*/
|
||||
fun setYOffset(offset:Float): Shadow
|
||||
|
||||
/**
|
||||
* 设置竖直方向的偏移量,带单位
|
||||
* @param unit @{@link android.util.TypedValue#TYPE_DIMENSION}
|
||||
* @param offset y轴偏移
|
||||
*/
|
||||
fun setYOffset(unit:Int,offset:Float): Shadow
|
||||
|
||||
/**
|
||||
* 更新绘制
|
||||
*/
|
||||
fun commit();
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.constant
|
||||
|
||||
/**
|
||||
* 司机端取消订单的原因定义
|
||||
* Created on 2021/12/7
|
||||
*
|
||||
* * String int
|
||||
* 进行中订单:
|
||||
* 车况异常 0
|
||||
* 设备异常 1
|
||||
* 电量不足 2
|
||||
* 身体不适 3
|
||||
* 乘客未到 4
|
||||
* 乘客中途下车 5
|
||||
*
|
||||
* 待服务订单:
|
||||
* 2000 车辆故障
|
||||
* 2001 乘客联系取消
|
||||
* 2002 行程冲突
|
||||
* 2003 车电量不足
|
||||
* 2004 其他
|
||||
*/
|
||||
enum class OrderCancelReasons(val type: Int, val msg: String) {
|
||||
CarBroken(1000, "车况异常"),
|
||||
DeviceBroken(1001, "设备异常"),
|
||||
BatteryLow(1002, "电量不足"),
|
||||
DriverIsIll(1003, "身体不适"),
|
||||
PassengerNotArrive(1004, "乘客未到"),
|
||||
PassengerStopOver(1005, "乘客中途下车"),
|
||||
|
||||
BookCarBroken(2000, "车辆故障"),
|
||||
BookPassengerCancel(2001, "乘客联系取消"),
|
||||
BookJourneyConflict(2002, "行程冲突"),
|
||||
BookBatteryLow(2003, "车电量不足"),
|
||||
BookOther(2004, "其他");
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun getType(msg: String): Int {
|
||||
for (value in values()) {
|
||||
if (value.msg == msg) {
|
||||
return value.type
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.constant
|
||||
|
||||
/**
|
||||
* RoboTaxi订单类型声明
|
||||
*
|
||||
* Created on 2021/12/6
|
||||
*/
|
||||
enum class OrderTypeEnum(val type: Int) {
|
||||
Instant(1), // 即时单
|
||||
Reserved(2) // 预约单
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import com.mogo.commons.debug.DebugConfig
|
||||
/**
|
||||
* Created on 2021/12/6
|
||||
*/
|
||||
class OCHTaxiConst {
|
||||
class TaxiPassengerConst {
|
||||
companion object {
|
||||
|
||||
private const val BASE_URL_OCH_DEV = "http://tech-dev.zhidaohulian.com"
|
||||
@@ -25,9 +25,6 @@ class OCHTaxiConst {
|
||||
// OCH arouter 路由path
|
||||
const val PATH = "/och/api"
|
||||
|
||||
// 到达起始点围栏
|
||||
const val ARRIVE_AT_START_STATION_DISTANCE = 50 //围栏由20m改为50m
|
||||
|
||||
// 上报心跳轮询ms
|
||||
const val LOOP_PERIOD_60S = 60 * 1000L
|
||||
|
||||
@@ -23,7 +23,7 @@ package com.mogo.och.taxi.passenger.constant
|
||||
* 60 已完成,
|
||||
* 70 已取消
|
||||
*/
|
||||
enum class OrderStatusEnum(val code: Int) {
|
||||
enum class TaxiPassengerOrderStatusEnum(val code: Int) {
|
||||
None( 0 ),
|
||||
OnTheWayToStartStation( 10),
|
||||
ArriveAtStartStation( 20),
|
||||
@@ -35,7 +35,7 @@ enum class OrderStatusEnum(val code: Int) {
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun valueOf(code: Int): OrderStatusEnum? {
|
||||
fun valueOf(code: Int): TaxiPassengerOrderStatusEnum? {
|
||||
for (value in values()) {
|
||||
if (value.code == code) {
|
||||
return value
|
||||
@@ -1,118 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.model;
|
||||
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/10
|
||||
*
|
||||
* 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
|
||||
*/
|
||||
public class OCHTaxiModelLoopManager {
|
||||
|
||||
private static final String TAG = OCHTaxiModelLoopManager.class.getSimpleName();
|
||||
|
||||
private static final class SingletonHolder {
|
||||
private static final OCHTaxiModelLoopManager INSTANCE = new OCHTaxiModelLoopManager();
|
||||
}
|
||||
|
||||
public static OCHTaxiModelLoopManager getInstance() {
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
|
||||
private Disposable mNewBookingOrderDisposable; //新到待抢预约单轮询
|
||||
private Disposable mGrabResultDisposable; //抢单结果轮询
|
||||
private Disposable mHeartbeatDisposable; //心跳轮询
|
||||
|
||||
public void startInAndWaitOrdersLoop() {
|
||||
if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
Logger.i(TAG, "startInAndWaitOrdersLoop()");
|
||||
mInAndWaitServiceDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
|
||||
OCHTaxiConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryInAndWaitOrders());
|
||||
}
|
||||
|
||||
public void stopInAndWaitOrdersLoop() {
|
||||
if (mInAndWaitServiceDisposable != null) {
|
||||
Logger.i(TAG, "stopInAndWaitOrdersLoop()");
|
||||
mInAndWaitServiceDisposable.dispose();
|
||||
mInAndWaitServiceDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startNewBookingOrderLoop() {
|
||||
if (mNewBookingOrderDisposable != null && !mNewBookingOrderDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
Logger.i(TAG, "startNewBookingOrderLoop()");
|
||||
mNewBookingOrderDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
|
||||
OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryNewBookingOrder());
|
||||
}
|
||||
|
||||
public void stopNewBookingOrderLoop() {
|
||||
if (mNewBookingOrderDisposable != null) {
|
||||
Logger.i(TAG, "stopNewBookingOrderLoop()");
|
||||
mNewBookingOrderDisposable.dispose();
|
||||
mNewBookingOrderDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startGrabResultLoop() {
|
||||
if (mGrabResultDisposable != null && !mGrabResultDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
Logger.i(TAG, "startGrabResultLoop()");
|
||||
mGrabResultDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
|
||||
OCHTaxiConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().queryOrderGrabStatus());
|
||||
}
|
||||
|
||||
public void stopGrabResultLoop() {
|
||||
if (mGrabResultDisposable != null) {
|
||||
Logger.i(TAG, "stopGrabResultLoop()");
|
||||
mGrabResultDisposable.dispose();
|
||||
mGrabResultDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void startHeartbeatLoop() {
|
||||
if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
Logger.i(TAG, "startHeartbeatLoop()");
|
||||
mHeartbeatDisposable = Observable.interval(OCHTaxiConst.LOOP_DELAY,
|
||||
OCHTaxiConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> MogoOCHTaxiModelNew.getInstance().runCarHeartbeat());
|
||||
}
|
||||
|
||||
public void stopHeartbeatLoop() {
|
||||
if (mHeartbeatDisposable != null) {
|
||||
Logger.i(TAG, "stopHeartbeatLoop()");
|
||||
mHeartbeatDisposable.dispose();
|
||||
mHeartbeatDisposable = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.mogo.och.taxi.passenger.model;
|
||||
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Created on 2021/9/10
|
||||
*
|
||||
* 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
|
||||
*/
|
||||
public class TaxiPassengerModelLoopManager {
|
||||
|
||||
private static final String TAG = TaxiPassengerModelLoopManager.class.getSimpleName();
|
||||
|
||||
private static final class SingletonHolder {
|
||||
private static final TaxiPassengerModelLoopManager INSTANCE = new TaxiPassengerModelLoopManager();
|
||||
}
|
||||
|
||||
public static TaxiPassengerModelLoopManager getInstance() {
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询
|
||||
private Disposable mHeartbeatDisposable; //心跳轮询
|
||||
|
||||
public void startInAndWaitOrdersLoop() {
|
||||
if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
Logger.i(TAG, "startInAndWaitOrdersLoop()");
|
||||
mInAndWaitServiceDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
|
||||
TaxiPassengerConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> TaxiPassengerModelNew.getInstance().queryInAndWaitOrders());
|
||||
}
|
||||
|
||||
public void stopInAndWaitOrdersLoop() {
|
||||
if (mInAndWaitServiceDisposable != null) {
|
||||
Logger.i(TAG, "stopInAndWaitOrdersLoop()");
|
||||
mInAndWaitServiceDisposable.dispose();
|
||||
mInAndWaitServiceDisposable = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void startHeartbeatLoop() {
|
||||
if (mHeartbeatDisposable != null && !mHeartbeatDisposable.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
Logger.i(TAG, "startHeartbeatLoop()");
|
||||
mHeartbeatDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
|
||||
TaxiPassengerConst.LOOP_PERIOD_60S, TimeUnit.MILLISECONDS)
|
||||
.map((aLong -> aLong + 1))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(aLong -> TaxiPassengerModelNew.getInstance().runCarHeartbeat());
|
||||
}
|
||||
|
||||
public void stopHeartbeatLoop() {
|
||||
if (mHeartbeatDisposable != null) {
|
||||
Logger.i(TAG, "stopHeartbeatLoop()");
|
||||
mHeartbeatDisposable.dispose();
|
||||
mHeartbeatDisposable = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,505 @@
|
||||
package com.mogo.och.taxi.passenger.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.location.Location;
|
||||
import android.net.ConnectivityManager;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.elegant.network.utils.GsonUtil;
|
||||
import com.mogo.cloud.commons.utils.CoordinateUtils;
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo;
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
|
||||
import com.mogo.eagle.core.data.map.MogoLocation;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
|
||||
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
|
||||
import com.mogo.map.navi.IMogoCarLocationChangedListener2;
|
||||
import com.mogo.module.common.MogoApisHandler;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceCallback;
|
||||
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManagerNew;
|
||||
import com.mogo.service.IMogoServiceApis;
|
||||
import com.mogo.service.cloud.socket.IMogoLifecycleListener;
|
||||
import com.mogo.service.intent.IMogoIntentListener;
|
||||
import com.mogo.service.statusmanager.IMogoStatusChangedListener;
|
||||
import com.mogo.service.statusmanager.StatusDescriptor;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 网约车 - 出租车业务逻辑处理
|
||||
*/
|
||||
public class TaxiPassengerModelNew {
|
||||
|
||||
private static final String TAG = TaxiPassengerModelNew.class.getSimpleName();
|
||||
|
||||
private static final class SingletonHolder {
|
||||
private static final TaxiPassengerModelNew INSTANCE = new TaxiPassengerModelNew();
|
||||
}
|
||||
|
||||
public static TaxiPassengerModelNew getInstance() {
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private Context mContext;
|
||||
private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值
|
||||
private volatile int mOCHCarStatus = -1; //出车/收车状态:1 出车;0 收车
|
||||
private volatile long mPrevOrderId = -1; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出)
|
||||
private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentOCHOrder; //当前订单
|
||||
private volatile List<TaxiPassengerOrderQueryRespBean.Result> mInServiceList = Collections.emptyList(); //进行中订单
|
||||
private volatile List<TaxiPassengerOrderQueryRespBean.Result> mWaitServiceList = Collections.emptyList(); //待服务订单
|
||||
|
||||
private IOCHTaxiPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关
|
||||
private IOCHTaxiPassengerControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等
|
||||
private IOCHTaxiPassengerOrderStatusCallback mOrderStatusCallback; //Model->Presenter:订单变更
|
||||
|
||||
private IOCHTaxiPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划
|
||||
|
||||
private double mLongitude, mLatitude;
|
||||
|
||||
private TaxiPassengerModelNew() {
|
||||
}
|
||||
public void setMoGoAutopilotPlanningListener(IOCHTaxiPassengerAutopilotPlanningCallback
|
||||
moGoAutopilotPlanningCallback) {
|
||||
this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback;
|
||||
}
|
||||
public void setADASStatusCallback(IOCHTaxiPassengerADASStatusCallback callback) {
|
||||
this.mADASStatusCallback = callback;
|
||||
}
|
||||
public void setControllerStatusCallback(IOCHTaxiPassengerControllerStatusCallback callback) {
|
||||
this.mControllerStatusCallback = callback;
|
||||
}
|
||||
|
||||
public void setOrderStatusCallback(IOCHTaxiPassengerOrderStatusCallback callback) {
|
||||
this.mOrderStatusCallback = callback;
|
||||
}
|
||||
|
||||
public void init( Context context ) {
|
||||
mContext = context.getApplicationContext();
|
||||
initListeners();
|
||||
|
||||
IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
|
||||
apis.getSocketManagerApi(mContext).init(mContext, DebugConfig.getSocketAppId());
|
||||
// TODO: 2021/8/27 因需要通过此回调的location进行坐标上传,暂改为全程监听,退出后再反注册,
|
||||
// 待后续整体调整location获取来源
|
||||
if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) {
|
||||
apis.getLocationInfoApi().start();
|
||||
}
|
||||
}
|
||||
|
||||
public void startOrStopOrderLoop(){
|
||||
startOrStopOrderLoop(mOCHCarStatus == 1);
|
||||
}
|
||||
|
||||
public void release() {
|
||||
startOrStopOrderLoop(false);
|
||||
releaseListeners();
|
||||
}
|
||||
|
||||
private void initListeners() {
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getSocketManagerApi(mContext)
|
||||
.registerLifecycleListener(10010,mSocketLifeCycleLisnter);
|
||||
|
||||
// 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口
|
||||
CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener);
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getIntentManagerApi()
|
||||
.registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener );
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getStatusManagerApi()
|
||||
.registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener );
|
||||
// 达到起始站围栏监听
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getRegisterCenterApi()
|
||||
.registerCarLocationChangedListener( TAG, mCarLocationChangedListener2);
|
||||
|
||||
//2021.11.1 自动驾驶路线规划接口
|
||||
CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener);
|
||||
}
|
||||
|
||||
private void releaseListeners() {
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getStatusManagerApi()
|
||||
.unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener);
|
||||
|
||||
// 注销到达起始站围栏监听
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getRegisterCenterApi()
|
||||
.unregisterCarLocationChangedListener(TAG, mCarLocationChangedListener2);
|
||||
|
||||
MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getSocketManagerApi(mContext)
|
||||
.unregisterLifecycleListener(10010);
|
||||
|
||||
CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener);
|
||||
CallerAutopilotPlanningListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener);
|
||||
}
|
||||
|
||||
private void startOrStopOrderLoop(boolean start) {
|
||||
Logger.d(TAG, "startOrStopOrderLoop() " + start);
|
||||
if (start) {
|
||||
TaxiPassengerModelLoopManager.getInstance().startInAndWaitOrdersLoop();
|
||||
TaxiPassengerModelLoopManager.getInstance().startHeartbeatLoop();
|
||||
} else {
|
||||
TaxiPassengerModelLoopManager.getInstance().stopInAndWaitOrdersLoop();
|
||||
TaxiPassengerModelLoopManager.getInstance().stopHeartbeatLoop();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等)
|
||||
*
|
||||
* 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时,
|
||||
* 才更新最新进行中单到本地
|
||||
*/
|
||||
public void queryInAndWaitOrders() {
|
||||
TaxiPassengerServiceManagerNew.getInstance().queryOrdersInAndWaitService(mContext,
|
||||
new TaxiPassengerServiceCallback<TaxiPassengerOrdersInServiceQueryRespBean>() {
|
||||
@Override
|
||||
public void onSuccess(TaxiPassengerOrdersInServiceQueryRespBean data) {
|
||||
if (data == null || data.data == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//1. 处理进行中订单
|
||||
mInServiceList = data.data.servicing;
|
||||
if (data.data.servicing != null && !data.data.servicing.isEmpty()) {
|
||||
// 1.1. 当存在进行中单时:对本地currentOrder进行更新
|
||||
if (mCurrentOCHOrder == null) {
|
||||
//1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新
|
||||
updateNativeCurrentOrder(data.data.servicing.get(0));
|
||||
if (mOrderStatusCallback != null) {
|
||||
mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
|
||||
}
|
||||
} else {
|
||||
//1.1.2. 当本地有currentOrder:
|
||||
//orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新
|
||||
//orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新
|
||||
if (mCurrentOCHOrder.orderNo != data.data.servicing.get(0).orderNo) {
|
||||
queryCurOrderStatus();
|
||||
} else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
|
||||
updateNativeCurrentOrder(data.data.servicing.get(0));
|
||||
if (mOrderStatusCallback != null) {
|
||||
mOrderStatusCallback.onCurrentOrderStatusChanged(mCurrentOCHOrder);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更新
|
||||
if (mCurrentOCHOrder != null) {
|
||||
queryCurOrderStatus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(int code, String msg) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
|
||||
private void queryCurOrderStatus() {
|
||||
if (mCurrentOCHOrder == null) {
|
||||
return;
|
||||
}
|
||||
final long orderId = mCurrentOCHOrder.orderNo;
|
||||
TaxiPassengerServiceManagerNew.getInstance().queryOrderById(mContext, orderId,
|
||||
new TaxiPassengerServiceCallback<TaxiPassengerOrderQueryRespBean>() {
|
||||
@Override
|
||||
public void onSuccess(TaxiPassengerOrderQueryRespBean data) {
|
||||
if (data != null && data.data != null
|
||||
&& mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo == data.data.orderNo) {
|
||||
if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.getCode()
|
||||
|| data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode()
|
||||
|| data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.getCode()) {
|
||||
clearCurrentOCHOrder();
|
||||
} else {
|
||||
updateNativeCurrentOrder(data.data);
|
||||
}
|
||||
if (mOrderStatusCallback != null) {
|
||||
mOrderStatusCallback.onCurrentOrderStatusChanged(data.data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(int code, String msg) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 车机端上传心跳数据(只在出车状态时上传)
|
||||
public void runCarHeartbeat() {
|
||||
TaxiPassengerServiceManagerNew.getInstance().runCarHeartbeat(mContext, mLongitude, mLatitude,
|
||||
new TaxiPassengerServiceCallback<BaseData>() {
|
||||
@Override
|
||||
public void onSuccess(BaseData data) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(int code, String msg) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 获取当前订单
|
||||
public TaxiPassengerOrderQueryRespBean.Result getCurrentOCHOrder() {
|
||||
return mCurrentOCHOrder;
|
||||
}
|
||||
|
||||
// 获取当前订单状态
|
||||
public TaxiPassengerOrderStatusEnum getCurOrderStatus() {
|
||||
TaxiPassengerOrderQueryRespBean.Result order = TaxiPassengerModelNew.getInstance().getCurrentOCHOrder();
|
||||
if (order == null) {
|
||||
return TaxiPassengerOrderStatusEnum.None;
|
||||
}
|
||||
return TaxiPassengerOrderStatusEnum.valueOf(order.orderStatus);
|
||||
}
|
||||
|
||||
//更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据
|
||||
private void updateNativeCurrentOrder(TaxiPassengerOrderQueryRespBean.Result data) {
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
mCurrentOCHOrder = data;
|
||||
SharedPrefsMgr.getInstance(mContext).putString(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER,
|
||||
GsonUtil.jsonFromObject(data));
|
||||
}
|
||||
|
||||
//清除订单信息
|
||||
public void clearCurrentOCHOrder() {
|
||||
mCurrentOCHOrder = null;
|
||||
SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER);
|
||||
}
|
||||
|
||||
//检测当前订单
|
||||
public boolean checkCurrentOCHOrder() {
|
||||
if ( mCurrentOCHOrder != null
|
||||
&& mCurrentOCHOrder.startSiteGcjPoint != null
|
||||
&& mCurrentOCHOrder.endSiteGcjPoint != null) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// TODO: 2021/9/12
|
||||
public void calculateTravelDistance(Location carLocation){
|
||||
if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) {
|
||||
double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0);
|
||||
double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1);
|
||||
double distance = CoordinateUtils.calculateLineDistance(
|
||||
endLon, endLat,
|
||||
carLocation.getLongitude(), carLocation.getLatitude());
|
||||
mCurrentOCHOrder.decreaseTravelDistance(distance);
|
||||
if (mOrderStatusCallback != null && distance >= 0) {
|
||||
mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) distance, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//监听网络变化,避免启动机器时无网导致无法更新订单信息
|
||||
private IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() {
|
||||
@Override
|
||||
public void onIntentReceived( String intentStr, Intent intent ) {
|
||||
Logger.d( TAG, "onIntentReceived = %s", intentStr );
|
||||
if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) {
|
||||
if ( NetworkUtils.isConnected( mContext ) ) {
|
||||
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
|
||||
startOrStopOrderLoop(mOCHCarStatus == 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() {
|
||||
// VR mode变更回调
|
||||
@Override
|
||||
public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) {
|
||||
if (StatusDescriptor.VR_MODE == descriptor) {
|
||||
if (mControllerStatusCallback != null) {
|
||||
mControllerStatusCallback.onVRModeChanged(isTrue);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() {
|
||||
@Override
|
||||
public void onConnectFailure() { Logger.e(TAG,"socket onConnectFailure"); }
|
||||
|
||||
@Override
|
||||
public void onConnectSuccess() { Logger.e(TAG,"socket onConnectSuccess"); }
|
||||
|
||||
@Override
|
||||
public void onConnectLost() { Logger.e(TAG,"socket onConnectLost"); }
|
||||
};
|
||||
|
||||
// 自车定位
|
||||
private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() {
|
||||
|
||||
@Override
|
||||
public void onCarLocationChanged2( Location location ) {
|
||||
IMogoServiceApis apis = MogoApisHandler.getInstance().getApis();
|
||||
MogoLocation mogoLocation = new MogoLocation();
|
||||
mogoLocation.setAccuracy(location.getAccuracy());
|
||||
mogoLocation.setProvider(location.getProvider());
|
||||
mogoLocation.setLongitude(location.getLongitude());
|
||||
mogoLocation.setLatitude(location.getLatitude());
|
||||
mogoLocation.setSpeed(location.getSpeed());
|
||||
mogoLocation.setBearing(location.getBearing());
|
||||
// TODO: 2021/9/2 因0830新版server后台只能过滤locType=1&&satellites>=4的定位数据,暂固话值,后续优化
|
||||
mogoLocation.setLocType(1);
|
||||
mogoLocation.setSatellite(4);
|
||||
|
||||
apis.getLocationInfoApi().provideLocation(mogoLocation);
|
||||
//位置变化时,通过围栏判断是否到达x点
|
||||
if (location != null && checkCurrentOCHOrder()) {
|
||||
// if (getCurOrderStatus() == OrderStatusEnum.OnTheWayToStartStation) {
|
||||
// judgeStartStation(location);
|
||||
// } else
|
||||
if (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.OnTheWayToEndStation) {
|
||||
calculateTravelDistance(location);
|
||||
}
|
||||
}
|
||||
mLongitude = location.getLongitude();
|
||||
mLatitude = location.getLatitude();
|
||||
if (mControllerStatusCallback != null) {
|
||||
mControllerStatusCallback.onCarLocationChanged(location);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){
|
||||
|
||||
private boolean arriveAtEnd = false; //乘客app专用字段
|
||||
|
||||
@Override
|
||||
public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) {
|
||||
if (autopilotStatusInfo == null) return;
|
||||
int state = autopilotStatusInfo.getState();
|
||||
Logger.d( TAG, "state = %s", state );
|
||||
if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
|
||||
if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning();
|
||||
if (mCurrentOCHOrder != null
|
||||
&& getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtStartStation
|
||||
&& state != mPrevAPStatus) {
|
||||
// 当高频返回autopilot 2时,不重复调用订单状态变更
|
||||
mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态
|
||||
// updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
|
||||
}
|
||||
} else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
|
||||
mPrevAPStatus = state;
|
||||
|
||||
if (FunctionBuildConfig.isDemoMode
|
||||
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
|
||||
// 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
|
||||
if (!arriveAtEnd) {
|
||||
return;
|
||||
} else {
|
||||
arriveAtEnd = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable();
|
||||
} else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
|
||||
mPrevAPStatus = state;
|
||||
|
||||
if (FunctionBuildConfig.isDemoMode
|
||||
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
|
||||
// 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态
|
||||
if (!arriveAtEnd) {
|
||||
return;
|
||||
} else {
|
||||
arriveAtEnd = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotSNRequest() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo data) {
|
||||
if (FunctionBuildConfig.isDemoMode
|
||||
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
|
||||
arriveAtEnd = true;
|
||||
}
|
||||
|
||||
if (data == null || !checkCurrentOCHOrder()
|
||||
|| (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtEndStation)) {
|
||||
return;
|
||||
}
|
||||
if (DebugConfig.isDebug()) {
|
||||
// TipToast.shortTip("到达目的地");
|
||||
}
|
||||
// updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation);
|
||||
}
|
||||
};
|
||||
private IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){
|
||||
|
||||
@Override
|
||||
public void onAutopilotTrajectory(ArrayList<ADASTrajectoryInfo> trajectoryInfos) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotRotting(AutopilotRouteInfo routeList) {
|
||||
if (null != routeList && routeList.getModels() != null){
|
||||
mAutopilotPlanningCallback.routeResult(routeList.getModels());
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* END
|
||||
*/
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import com.amap.api.navi.model.NaviLatLng;
|
||||
import com.autonavi.tbt.TrafficFacilityInfo;
|
||||
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
|
||||
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback;
|
||||
import com.mogo.och.taxi.passenger.utils.PermissionUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -36,24 +36,24 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/12/6
|
||||
*/
|
||||
public class NaviToDestinationModel implements AMapNaviListener {
|
||||
public class TaxiPassengerNaviToDestinationModel implements AMapNaviListener {
|
||||
private static Context mContext;
|
||||
private AMapNavi mAMapNavi = null;
|
||||
protected final List<NaviLatLng> sList = new ArrayList<NaviLatLng>();
|
||||
protected final List<NaviLatLng> eList = new ArrayList<NaviLatLng>();
|
||||
protected List<NaviLatLng> mWayPointList = new ArrayList<NaviLatLng>();
|
||||
private IOCHTaxiNaviChangedCallback mNaviChangedCallback;
|
||||
private IOCHTaxiPassengerNaviChangedCallback mNaviChangedCallback;
|
||||
private AtomicInteger errorCount = new AtomicInteger(0);
|
||||
private boolean isPlay;
|
||||
public static NaviToDestinationModel getInstance(Context context) {
|
||||
public static TaxiPassengerNaviToDestinationModel getInstance(Context context) {
|
||||
mContext = context;
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private static final class SingletonHolder {
|
||||
private static final NaviToDestinationModel INSTANCE = new NaviToDestinationModel();
|
||||
private static final TaxiPassengerNaviToDestinationModel INSTANCE = new TaxiPassengerNaviToDestinationModel();
|
||||
}
|
||||
private NaviToDestinationModel(){
|
||||
private TaxiPassengerNaviToDestinationModel(){
|
||||
}
|
||||
public void initAMapNavi(NaviLatLng startLatLng,NaviLatLng endLatLng) {
|
||||
try {
|
||||
@@ -90,7 +90,7 @@ public class NaviToDestinationModel implements AMapNaviListener {
|
||||
}
|
||||
}
|
||||
|
||||
public void setOCHTaciNaviChangedCallback(IOCHTaxiNaviChangedCallback callback){
|
||||
public void setOCHTaciNaviChangedCallback(IOCHTaxiPassengerNaviChangedCallback callback){
|
||||
this.mNaviChangedCallback = callback;
|
||||
}
|
||||
@Override
|
||||
@@ -1,161 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.network;
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
import com.mogo.och.taxi.passenger.bean.CarHeartbeatReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.DriverStatusUpdateReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderCancelReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderGrabReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderStatusUpdateReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersListQueryReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import retrofit2.http.Body;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Headers;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 网约车-出租车接口定义
|
||||
*/
|
||||
interface OCHTaxiServiceApiNew {
|
||||
|
||||
/**
|
||||
* 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
|
||||
Observable<OrdersInServiceQueryRespBean> queryOrdersInAndWaitService(@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 查询新到的预约单
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET( "/autopilot-car-hailing/api/v1/driver/newBookingOrder/query" )
|
||||
Observable<OrdersNewBookingQueryRespBean> queryNewBookingOrder(@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* (预约单)执行抢单动作
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/grabOrder" )
|
||||
Observable<OrderGrabRespBean> grabOrder(@Body OrderGrabReqBean data);
|
||||
|
||||
/**
|
||||
* (预约单)查询抢单结果
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/grabStatus/query" )
|
||||
Observable<OrderGrabStatusQueryRespBean> queryOrderGrabStatus(@Body OrderGrabReqBean data);
|
||||
|
||||
/**
|
||||
* 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/routeInfo/query" )
|
||||
Observable<OrderQueryRouteInfoRespBean> queryOrderRouteInfo(@Body OrderQueryRouteInfoReqBean data);
|
||||
|
||||
/**
|
||||
* 通过orderId查询订单信息(用于本地已经有orderId时)
|
||||
* @param data
|
||||
* @return
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
|
||||
Observable<OrderQueryRespBean> queryOrderById(@Body OrderQueryReqBean data);
|
||||
|
||||
/**
|
||||
* 查询服务中订单信息(用于本地无orderId时)
|
||||
* 如果有多条,只会返回时间最近的一条
|
||||
* @param sn
|
||||
* @return
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
|
||||
Observable<OrderQueryRespBean> queryOrderInService(@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 取消订单
|
||||
*/
|
||||
@Headers({"Content-type:application/json;charset=UTF-8"})
|
||||
@POST("/autopilot-car-hailing/api/v1/driver/cancelOrder")
|
||||
Observable<BaseData> cancelOrder(@Body OrderCancelReqBean data);
|
||||
|
||||
/**
|
||||
* 订单列表获取
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/queryOrders" )
|
||||
Observable<OrdersListQueryRespBean> queryOrdersList(@Body OrdersListQueryReqBean data);
|
||||
|
||||
/**
|
||||
* 订单状态更新
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/order/updateStatus" )
|
||||
Observable<BaseData> updateOrderStatus(@Body OrderStatusUpdateReqBean data);
|
||||
|
||||
/**
|
||||
* 收车/出车状态更新
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/serviceStatus/update" )
|
||||
Observable<BaseData> updateDriverServiceStatus(@Body DriverStatusUpdateReqBean data);
|
||||
|
||||
/**
|
||||
* 收车/出车状态查询
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET( "/autopilot-car-hailing/api/v1/driver/serviceStatus/query" )
|
||||
Observable<DriverStatusQueryRespBean> queryDriverServiceStatus(@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
|
||||
Observable<BaseData> runCarHeartbeat(@Body CarHeartbeatReqBean data);
|
||||
|
||||
/**
|
||||
* 查询司机服务数据
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET( "/autopilot-car-hailing/api/v1/driver/serviceData/query" )
|
||||
Observable<DriverServiceDataRespBean> queryServiceData(@Query("sn") String sn);
|
||||
}
|
||||
@@ -1,352 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.network;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
import com.mogo.eagle.core.network.RequestOptions;
|
||||
import com.mogo.eagle.core.network.SubscribeImpl;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.module.common.MogoApisHandler;
|
||||
import com.mogo.och.taxi.passenger.bean.CarHeartbeatReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.DriverServiceDataRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.DriverStatusQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.DriverStatusUpdateReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderCancelReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderGrabReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderGrabRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderGrabStatusQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderStatusUpdateReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersInServiceQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersListQueryReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersListQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrdersNewBookingQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.constant.OCHTaxiConst;
|
||||
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*/
|
||||
public class OCHTaxiServiceManagerNew {
|
||||
private static final String TAG = OCHTaxiServiceManagerNew.class.getSimpleName();
|
||||
|
||||
private static final class SingletonHolder {
|
||||
private static final OCHTaxiServiceManagerNew INSTANCE = new OCHTaxiServiceManagerNew();
|
||||
}
|
||||
|
||||
public static OCHTaxiServiceManagerNew getInstance() {
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private String baseUrl = OCHTaxiConst.getBaseUrl();
|
||||
private OCHTaxiServiceApiNew mOCHTaxiServiceApi;
|
||||
|
||||
private OCHTaxiServiceManagerNew() {
|
||||
if (mOCHTaxiServiceApi == null){
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询全部服务中/待服务订单列表
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
public void queryOrdersInAndWaitService(Context context,
|
||||
OCHTaxiServiceCallback<OrdersInServiceQueryRespBean> callback) {
|
||||
if (mOCHTaxiServiceApi == null) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrdersInAndWaitService(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询新到的预约单
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
public void queryNewBookingOrder(Context context,
|
||||
OCHTaxiServiceCallback<OrdersNewBookingQueryRespBean> callback) {
|
||||
if (mOCHTaxiServiceApi == null) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryNewBookingOrder(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryNewBookingOrder"));
|
||||
}
|
||||
|
||||
/**
|
||||
* (预约单)执行抢单动作
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param callback
|
||||
*/
|
||||
public void grabOrder(Context context, long orderId,
|
||||
OCHTaxiServiceCallback<OrderGrabRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.grabOrder(new OrderGrabReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "grabOrder"));
|
||||
}
|
||||
|
||||
/**
|
||||
* (预约单)查询抢单结果
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param callback
|
||||
*/
|
||||
public void queryOrderGrabStatus(Context context, long orderId,
|
||||
OCHTaxiServiceCallback<OrderGrabStatusQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrderGrabStatus(new OrderGrabReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrderGrabStatus"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询订单路径规划信息(到上车点、起始点间的距离和预估时间)
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param callback
|
||||
*/
|
||||
public void queryOrderRouteInfo(Context context, long orderId,
|
||||
OCHTaxiServiceCallback<OrderQueryRouteInfoRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrderRouteInfo(new OrderQueryRouteInfoReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrderRouteInfo"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过orderId查询订单信息(用于本地已经有orderId时)
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param callback
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
public void queryOrderById(Context context, long orderId,
|
||||
OCHTaxiServiceCallback<OrderQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrderById(new OrderQueryReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrderById"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询未完成态订单信息(用于本地无orderId时)
|
||||
* 如果有多条,只会返回时间最近的一条
|
||||
* @param context
|
||||
* @param callback
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
public void queryOrderInService(Context context,
|
||||
OCHTaxiServiceCallback<OrderQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrderInService(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrderInService"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 司机取消订单
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param cancelType
|
||||
* @param cancelReason
|
||||
* @param callback
|
||||
*/
|
||||
public void cancelOrder(Context context, long orderId, int cancelType, String cancelReason,
|
||||
OCHTaxiServiceCallback<BaseData> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.cancelOrder(new OrderCancelReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId, cancelType, cancelReason))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "cancelOrder"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单列表获取
|
||||
* @param context
|
||||
* @param page
|
||||
* @param size
|
||||
* @param callback
|
||||
*/
|
||||
public void queryOrdersList(Context context, int page, int size,
|
||||
OCHTaxiServiceCallback<OrdersListQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrdersList(new OrdersListQueryReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), page, size))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrdersList"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单状态更新
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param orderStatus
|
||||
* @param callback
|
||||
*/
|
||||
public void updateOrderStatus(Context context, long orderId, int orderStatus,
|
||||
OCHTaxiServiceCallback<BaseData> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.updateOrderStatus(new OrderStatusUpdateReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId, orderStatus))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "updateOrderStatus"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 收车/出车状态更新
|
||||
* @param context
|
||||
* @param status
|
||||
* @param callback
|
||||
*/
|
||||
public void updateDriverServiceStatus(Context context, int status,
|
||||
OCHTaxiServiceCallback<BaseData> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.updateDriverServiceStatus(new DriverStatusUpdateReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), status))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "updateDriverServiceStatus"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 收车/出车状态查询
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
public void queryDriverServiceStatus(Context context,
|
||||
OCHTaxiServiceCallback<DriverStatusQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryDriverServiceStatus(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryDriverServiceStatus"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
|
||||
* @param context
|
||||
* @param lon
|
||||
* @param lat
|
||||
* @param callback
|
||||
*/
|
||||
public void runCarHeartbeat(Context context, double lon, double lat,
|
||||
OCHTaxiServiceCallback<BaseData> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.runCarHeartbeat(new CarHeartbeatReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询司机服务数据
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
public void queryDriverServiceData(Context context,
|
||||
OCHTaxiServiceCallback<DriverServiceDataRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(OCHTaxiServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryServiceData(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryDriverServiceData"));
|
||||
}
|
||||
|
||||
private <T extends BaseData> SubscribeImpl getSubscribeImpl(
|
||||
Context context, OCHTaxiServiceCallback<T> callback, String apiName) {
|
||||
return new SubscribeImpl<T>(RequestOptions.create(context)) {
|
||||
@Override
|
||||
public void onSuccess(T o) {
|
||||
super.onSuccess(o);
|
||||
Logger.e(TAG,apiName + ": onSuccess() " + o.msg);
|
||||
if (callback != null) {
|
||||
callback.onSuccess(o);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
super.onError(e);
|
||||
Logger.e(TAG,apiName + ": onError() " + e.getMessage());
|
||||
if (callback != null) {
|
||||
callback.onError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String message, int code) {
|
||||
super.onError(message, code);
|
||||
Logger.e(TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message));
|
||||
if (callback != null) {
|
||||
callback.onFail(code, message);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.mogo.och.taxi.passenger.network;
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerCarHeartbeatReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import retrofit2.http.Body;
|
||||
import retrofit2.http.GET;
|
||||
import retrofit2.http.Headers;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*
|
||||
* 网约车-出租车接口定义
|
||||
*/
|
||||
interface TaxiPassengerServiceApiNew {
|
||||
|
||||
/**
|
||||
* 查询全部服务中/待服务订单(没有的时候返回code 0,空列表)
|
||||
* @param sn
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET("/autopilot-car-hailing/api/v1/driver/orderInService/query")
|
||||
Observable<TaxiPassengerOrdersInServiceQueryRespBean> queryOrdersInAndWaitService(@Query("sn") String sn);
|
||||
|
||||
|
||||
/**
|
||||
* 通过orderId查询订单信息(用于本地已经有orderId时)
|
||||
* @param data
|
||||
* @return
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/queryOrderById" )
|
||||
Observable<TaxiPassengerOrderQueryRespBean> queryOrderById(@Body TaxiPassengerOrderQueryReqBean data);
|
||||
|
||||
/**
|
||||
* 查询服务中订单信息(用于本地无orderId时)
|
||||
* 如果有多条,只会返回时间最近的一条
|
||||
* @param sn
|
||||
* @return
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@GET( "/autopilot-car-hailing/api/v1/driver/queryOrderInService" )
|
||||
Observable<TaxiPassengerOrderQueryRespBean> queryOrderInService(@Query("sn") String sn);
|
||||
|
||||
/**
|
||||
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
@Headers( {"Content-type:application/json;charset=UTF-8"} )
|
||||
@POST( "/autopilot-car-hailing/api/v1/driver/heartbeat" )
|
||||
Observable<BaseData> runCarHeartbeat(@Body TaxiPassengerCarHeartbeatReqBean data);
|
||||
}
|
||||
@@ -6,7 +6,7 @@ package com.mogo.och.taxi.passenger.network;
|
||||
*
|
||||
* 修改订单状态回调接口
|
||||
*/
|
||||
public interface OCHTaxiServiceCallback< T > {
|
||||
public interface TaxiPassengerServiceCallback< T > {
|
||||
|
||||
void onSuccess(T data);
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
package com.mogo.och.taxi.passenger.network;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
|
||||
import com.mogo.eagle.core.data.BaseData;
|
||||
import com.mogo.eagle.core.network.RequestOptions;
|
||||
import com.mogo.eagle.core.network.SubscribeImpl;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.module.common.MogoApisHandler;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerCarHeartbeatReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryReqBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
|
||||
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Created by pangfan on 2021/8/19
|
||||
*/
|
||||
public class TaxiPassengerServiceManagerNew {
|
||||
private static final String TAG = TaxiPassengerServiceManagerNew.class.getSimpleName();
|
||||
|
||||
private static final class SingletonHolder {
|
||||
private static final TaxiPassengerServiceManagerNew INSTANCE = new TaxiPassengerServiceManagerNew();
|
||||
}
|
||||
|
||||
public static TaxiPassengerServiceManagerNew getInstance() {
|
||||
return SingletonHolder.INSTANCE;
|
||||
}
|
||||
|
||||
private String baseUrl = TaxiPassengerConst.getBaseUrl();
|
||||
private TaxiPassengerServiceApiNew mOCHTaxiServiceApi;
|
||||
|
||||
private TaxiPassengerServiceManagerNew() {
|
||||
if (mOCHTaxiServiceApi == null){
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(TaxiPassengerServiceApiNew.class, baseUrl);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询全部服务中/待服务订单列表
|
||||
* @param context
|
||||
* @param callback
|
||||
*/
|
||||
public void queryOrdersInAndWaitService(Context context,
|
||||
TaxiPassengerServiceCallback<TaxiPassengerOrdersInServiceQueryRespBean> callback) {
|
||||
if (mOCHTaxiServiceApi == null) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(TaxiPassengerServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrdersInAndWaitService(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrdersInAndWaitService"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过orderId查询订单信息(用于本地已经有orderId时)
|
||||
* @param context
|
||||
* @param orderId
|
||||
* @param callback
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
public void queryOrderById(Context context, long orderId,
|
||||
TaxiPassengerServiceCallback<TaxiPassengerOrderQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(TaxiPassengerServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrderById(new TaxiPassengerOrderQueryReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), orderId))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrderById"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询未完成态订单信息(用于本地无orderId时)
|
||||
* 如果有多条,只会返回时间最近的一条
|
||||
* @param context
|
||||
* @param callback
|
||||
* @deprecated v2.1_0930需求中暂不再使用此接口
|
||||
*/
|
||||
public void queryOrderInService(Context context,
|
||||
TaxiPassengerServiceCallback<TaxiPassengerOrderQueryRespBean> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(TaxiPassengerServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.queryOrderInService(MoGoAiCloudClientConfig.getInstance().getSn())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "queryOrderInService"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 车机端上传心跳数据(只在出车状态时上传):包含高德坐标系经纬度
|
||||
* @param context
|
||||
* @param lon
|
||||
* @param lat
|
||||
* @param callback
|
||||
*/
|
||||
public void runCarHeartbeat(Context context, double lon, double lat,
|
||||
TaxiPassengerServiceCallback<BaseData> callback) {
|
||||
if ( mOCHTaxiServiceApi == null ) {
|
||||
mOCHTaxiServiceApi = MogoApisHandler.getInstance().getApis().getNetworkApi()
|
||||
.create(TaxiPassengerServiceApiNew.class, baseUrl);
|
||||
}
|
||||
mOCHTaxiServiceApi.runCarHeartbeat(new TaxiPassengerCarHeartbeatReqBean(
|
||||
MoGoAiCloudClientConfig.getInstance().getSn(), lon, lat))
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(getSubscribeImpl(context, callback, "runCarHeartbeat"));
|
||||
}
|
||||
|
||||
private <T extends BaseData> SubscribeImpl getSubscribeImpl(
|
||||
Context context, TaxiPassengerServiceCallback<T> callback, String apiName) {
|
||||
return new SubscribeImpl<T>(RequestOptions.create(context)) {
|
||||
@Override
|
||||
public void onSuccess(T o) {
|
||||
super.onSuccess(o);
|
||||
Logger.e(TAG,apiName + ": onSuccess() " + o.msg);
|
||||
if (callback != null) {
|
||||
callback.onSuccess(o);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
super.onError(e);
|
||||
Logger.e(TAG,apiName + ": onError() " + e.getMessage());
|
||||
if (callback != null) {
|
||||
callback.onError();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(String message, int code) {
|
||||
super.onError(message, code);
|
||||
Logger.e(TAG,String.format(apiName + ": onError() code = %d; message = %s;", code, message));
|
||||
if (callback != null) {
|
||||
callback.onFail(code, message);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
package com.mogo.och.taxi.passenger.presenter;
|
||||
|
||||
import android.location.Location;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
|
||||
import com.mogo.commons.AbsMogoApplication;
|
||||
import com.mogo.commons.mvp.Presenter;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.model.TaxiPassengerModelNew;
|
||||
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2022/3/4
|
||||
*/
|
||||
public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragment> implements IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerControllerStatusCallback , IOCHTaxiPassengerOrderStatusCallback, IOCHTaxiPassengerAutopilotPlanningCallback {
|
||||
|
||||
private static final String TAG = BaseTaxiPassengerPresenter.class.getSimpleName();
|
||||
|
||||
public BaseTaxiPassengerPresenter(TaxiPassengerBaseFragment view) {
|
||||
super(view);
|
||||
TaxiPassengerModelNew.getInstance().init(AbsMogoApplication.getApp());
|
||||
initListeners();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate( @NonNull LifecycleOwner owner ) {
|
||||
super.onCreate( owner );
|
||||
Logger.d( TAG, "网约车-出租车拿到订单" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy( @NonNull LifecycleOwner owner ) {
|
||||
super.onDestroy( owner );
|
||||
|
||||
releaseListeners();
|
||||
TaxiPassengerModelNew.getInstance().release();
|
||||
}
|
||||
|
||||
private void initListeners() {
|
||||
TaxiPassengerModelNew.getInstance().setADASStatusCallback(this);
|
||||
TaxiPassengerModelNew.getInstance().setMoGoAutopilotPlanningListener(this);
|
||||
TaxiPassengerModelNew.getInstance().setOrderStatusCallback(this);
|
||||
TaxiPassengerModelNew.getInstance().setControllerStatusCallback(this);
|
||||
}
|
||||
|
||||
private void releaseListeners() {
|
||||
TaxiPassengerModelNew.getInstance().setADASStatusCallback(null);
|
||||
TaxiPassengerModelNew.getInstance().setMoGoAutopilotPlanningListener(null);
|
||||
TaxiPassengerModelNew.getInstance().setOrderStatusCallback(null);
|
||||
TaxiPassengerModelNew.getInstance().setControllerStatusCallback(null);
|
||||
}
|
||||
|
||||
private void runOnUIThread( Runnable executor ) {
|
||||
if ( executor == null ) {
|
||||
return;
|
||||
}
|
||||
if ( Looper.myLooper() != Looper.getMainLooper() ) {
|
||||
UiThreadHandler.post( executor );
|
||||
} else {
|
||||
executor.run();
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前订单状态
|
||||
public TaxiPassengerOrderStatusEnum getCurOrderStatus() {
|
||||
return TaxiPassengerModelNew.getInstance().getCurOrderStatus();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotArriveEnd() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotEnable() {
|
||||
mView.onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotDisable() {
|
||||
mView.onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotRunning() {
|
||||
mView.onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVRModeChanged(boolean isVRMode) {
|
||||
runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCarLocationChanged(Location location) {
|
||||
if (null != location){
|
||||
runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
|
||||
mView.updateLocation(location.getLatitude(),location.getLongitude());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void routeResult(List<AutopilotRouteInfo.RouteModels> models) {
|
||||
mView.routeResult(models);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) {
|
||||
Log.d(TAG,"order = "+order.toString());
|
||||
mView.updateCurrentOrderStatusChanged(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,259 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.presenter;
|
||||
|
||||
import android.location.Location;
|
||||
import android.os.Build;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
|
||||
import com.mogo.commons.AbsMogoApplication;
|
||||
import com.mogo.commons.mvp.Presenter;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiAutopilotPlanningCallback;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiADASStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiCarStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiControllerStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiOrderStatusCallback;
|
||||
import com.mogo.och.taxi.passenger.model.MogoOCHTaxiModelNew;
|
||||
import com.mogo.och.taxi.passenger.ui.OCHTaxiFragment;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2021/1/18
|
||||
*
|
||||
* 描述
|
||||
*/
|
||||
public class OCHTaxiPresenter extends Presenter<OCHTaxiFragment> implements IOCHTaxiADASStatusCallback,
|
||||
IOCHTaxiCarStatusCallback, IOCHTaxiOrderStatusCallback, IOCHTaxiControllerStatusCallback, IOCHTaxiAutopilotPlanningCallback {
|
||||
|
||||
private static final String TAG = OCHTaxiPresenter.class.getSimpleName();
|
||||
|
||||
public OCHTaxiPresenter(OCHTaxiFragment view) {
|
||||
super(view);
|
||||
MogoOCHTaxiModelNew.getInstance().init(AbsMogoApplication.getApp());
|
||||
initListeners();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate( @NonNull LifecycleOwner owner ) {
|
||||
super.onCreate( owner );
|
||||
Logger.d( TAG, "网约车-出租车拿到订单" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy( @NonNull LifecycleOwner owner ) {
|
||||
super.onDestroy( owner );
|
||||
|
||||
releaseListeners();
|
||||
MogoOCHTaxiModelNew.getInstance().release();
|
||||
}
|
||||
|
||||
private void initListeners() {
|
||||
MogoOCHTaxiModelNew.getInstance().setADASStatusCallback(this);
|
||||
MogoOCHTaxiModelNew.getInstance().setCarStatusCallback(this);
|
||||
MogoOCHTaxiModelNew.getInstance().setControllerStatusCallback(this);
|
||||
MogoOCHTaxiModelNew.getInstance().setOrderStatusCallback(this);
|
||||
MogoOCHTaxiModelNew.getInstance().setMoGoAutopilotPlanningListener(this);
|
||||
}
|
||||
|
||||
private void releaseListeners() {
|
||||
MogoOCHTaxiModelNew.getInstance().setADASStatusCallback(null);
|
||||
MogoOCHTaxiModelNew.getInstance().setCarStatusCallback(null);
|
||||
MogoOCHTaxiModelNew.getInstance().setControllerStatusCallback(null);
|
||||
MogoOCHTaxiModelNew.getInstance().setOrderStatusCallback(null);
|
||||
MogoOCHTaxiModelNew.getInstance().setMoGoAutopilotPlanningListener(null);
|
||||
}
|
||||
|
||||
private void runOnUIThread( Runnable executor ) {
|
||||
if ( executor == null ) {
|
||||
return;
|
||||
}
|
||||
if ( Looper.myLooper() != Looper.getMainLooper() ) {
|
||||
UiThreadHandler.post( executor );
|
||||
} else {
|
||||
executor.run();
|
||||
}
|
||||
}
|
||||
|
||||
// 开启自动驾驶
|
||||
public void startAutoPilot() {
|
||||
MogoOCHTaxiModelNew.getInstance().startAutoPilot();
|
||||
}
|
||||
|
||||
// 更新出车/收车状态
|
||||
public void updateCarStatus() {
|
||||
MogoOCHTaxiModelNew.getInstance().updateCarStatus();
|
||||
}
|
||||
|
||||
// 更新当前订单状态(当前订单状态流转)
|
||||
public void updateCurOrderStatus(OrderStatusEnum status) {
|
||||
MogoOCHTaxiModelNew.getInstance().updateOCHOrderStatus(status);
|
||||
}
|
||||
|
||||
// 获取当前订单状态
|
||||
public OrderStatusEnum getCurOrderStatus() {
|
||||
return MogoOCHTaxiModelNew.getInstance().getCurOrderStatus();
|
||||
}
|
||||
|
||||
// 取消当前订单
|
||||
public void cancelCurOrder(int reasonType, String reason) {
|
||||
MogoOCHTaxiModelNew.getInstance().cancelCurrentOrder(reasonType, reason);
|
||||
}
|
||||
|
||||
// 取消待服务中订单
|
||||
public void cancelOrderById(long orderId, int reasonType, String reason) {
|
||||
MogoOCHTaxiModelNew.getInstance().cancelOrderById(orderId, reasonType, reason);
|
||||
}
|
||||
|
||||
// 查询当前订单route信息:预估时间、里程等
|
||||
public void queryCurOrderRouteInfo() {
|
||||
MogoOCHTaxiModelNew.getInstance().queryCurOrderRouteInfo();
|
||||
}
|
||||
|
||||
// 获取全部订单列表
|
||||
public void queryOrdersList(int page, int size) {
|
||||
MogoOCHTaxiModelNew.getInstance().queryOrdersList(page, size);
|
||||
}
|
||||
|
||||
// 执行抢单动作
|
||||
public void grabOrder() {
|
||||
MogoOCHTaxiModelNew.getInstance().grabOrder();
|
||||
}
|
||||
|
||||
// 关闭新到预约单
|
||||
public void cancelNewBookingOrder() {
|
||||
MogoOCHTaxiModelNew.getInstance().cancelNewBookingOrder();
|
||||
}
|
||||
|
||||
// 查询司机服务数据
|
||||
public void queryDriverServiceData() {
|
||||
MogoOCHTaxiModelNew.getInstance().queryDriverServiceData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotArriveEnd() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotEnable() {
|
||||
mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotDisable() {
|
||||
mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotRunning() {
|
||||
mView.updateAutopilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCarStatusChanged(boolean inOperation) {
|
||||
mView.updateOperationStatus(inOperation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum) {
|
||||
mView.onServiceDataUpdate(dailyTimeDuration,dailyOrderNum);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrdersInServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> inServiceList) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrdersWaitServiceChanged(@NonNull @NotNull List<OrderQueryRespBean.Result> waitServiceList) {
|
||||
mView.onOrdersWaitServiceChanged(waitServiceList);
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
@Override
|
||||
public void onCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
|
||||
Log.d(TAG,"order = "+order.toString());
|
||||
mView.updateCurrentOrderStatusChanged(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderCancelDone() {
|
||||
mView.onCurrentOrderCancelDone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrderCancelDone(long orderId) {
|
||||
mView.onOrderCancelDone(orderId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
|
||||
mView.onCurrentOrderRouteInfoGot(routeInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond) {
|
||||
mView.onCurrentOrderDistToStartChanged(meters,timeInSecond);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond) {
|
||||
mView.onCurrentOrderDistToEndChanged(meters,timeInSecond);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOrdersListPageRefresh(List<OrderQueryRespBean.Result> ordersList) {
|
||||
mView.onOrdersListPageRefresh(ordersList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewBookingOrderGot(OrderQueryRespBean.Result order) {
|
||||
mView.onNewBookingOrderGot(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabOrderExecuteDone() {
|
||||
mView.onGrabOrderExecuteDone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabOrderSuccess(OrderQueryRespBean.Result order) {
|
||||
mView.onGrabOrderSuccess(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGrabOrderFailed(OrderQueryRespBean.Result order) {
|
||||
mView.onGrabOrderFailed(order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVRModeChanged(boolean isVRMode) {
|
||||
runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCarLocationChanged(Location location) {
|
||||
if (null != location){
|
||||
runOnUIThread(() -> mView.updateSpeedView(location.getSpeed()));
|
||||
mView.updateLocation(location.getLatitude(),location.getLongitude());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void routeResult(List<AutopilotRouteInfo.RouteModels> models) {
|
||||
if (models != null && models.size() > 0) mView.routeResult(models);
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/9/9
|
||||
*/
|
||||
public abstract class BaseTaxiUIFragment extends Fragment {
|
||||
private View mRootView;
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
if (mRootView == null) {
|
||||
mRootView = inflater.inflate(getLayoutId(), container, false);
|
||||
} else {
|
||||
ViewGroup viewGroup = (ViewGroup) mRootView.getParent();
|
||||
if (viewGroup != null) {
|
||||
viewGroup.removeView(mRootView);
|
||||
}
|
||||
}
|
||||
initViews(mRootView);
|
||||
initViews(savedInstanceState);
|
||||
return mRootView;
|
||||
}
|
||||
/**
|
||||
* 布局资源
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
protected abstract void initViews(View view);
|
||||
|
||||
protected void initViews(Bundle savedInstanceState) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
mRootView = null;
|
||||
}
|
||||
}
|
||||
@@ -1,360 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.BlurMaskFilter;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.RectF;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.TypedValue;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.callback.Shadow;
|
||||
import com.mogo.och.taxi.passenger.utils.DimenUtil;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2022/1/21
|
||||
* 边框阴影
|
||||
*/
|
||||
public class BorderShadowLayout extends LinearLayout {
|
||||
|
||||
|
||||
private static final String TAG = "ShadowLayout";
|
||||
|
||||
//默认阴影半径
|
||||
public static final float SHADOW_DEFAULT_RADIUS = DimenUtil.INSTANCE.dp2px(5);
|
||||
|
||||
//阴影最大偏移量
|
||||
public static final float SHADOW_MAX_OFFSET = DimenUtil.INSTANCE.dp2px(20);
|
||||
|
||||
//阴影最大模糊半径
|
||||
public static final float SHADOW_MAX_BLUR = DimenUtil.INSTANCE.dp2px(20);
|
||||
|
||||
|
||||
|
||||
//默认模糊半径
|
||||
public static final float SHADOW_DEFAULT_BLUR_RADIUS = DimenUtil.INSTANCE.dp2px(5);
|
||||
|
||||
|
||||
//阴影颜色
|
||||
private int shadowColor = Color.parseColor("#333333");
|
||||
|
||||
//阴影类型,0:默认为单边 1:单边 2:邻边 3:四边所有
|
||||
private int shadowType;
|
||||
|
||||
//阴影半径
|
||||
private float shadowRadius = 0f;
|
||||
|
||||
//模糊度半径
|
||||
private float blurRadius = SHADOW_DEFAULT_BLUR_RADIUS ;
|
||||
|
||||
//水平位移
|
||||
private float xOffset = DimenUtil.INSTANCE.dp2px(10);
|
||||
|
||||
|
||||
//竖直方向位移
|
||||
private float yOffset = DimenUtil.INSTANCE.dp2px(10);
|
||||
|
||||
//背景色
|
||||
private int bgColor = Color.WHITE;
|
||||
|
||||
//是否有点击效果
|
||||
private boolean hasEffect = false ;
|
||||
|
||||
|
||||
int left =0 ,right =0,top = 0,bottom = 0 ;
|
||||
|
||||
//代理方式
|
||||
private Shadow shadow = new BorderShadowLayout.ShadowConfig(this);
|
||||
|
||||
private float mWidthMode;
|
||||
private float mHeightMode;
|
||||
private Paint mPaint = new Paint();
|
||||
private Paint locationPaint = new Paint();
|
||||
|
||||
public BorderShadowLayout(Context context) {
|
||||
super(context,null);
|
||||
}
|
||||
|
||||
public BorderShadowLayout(Context context, AttributeSet attrs) {
|
||||
this(context, attrs,0);
|
||||
}
|
||||
|
||||
public BorderShadowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速
|
||||
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ShadowLayout);
|
||||
shadowColor = typedArray.getColor(R.styleable.ShadowLayout_shadowColor, Color.BLUE);
|
||||
blurRadius = typedArray.getDimension(R.styleable.ShadowLayout_blurRadius, SHADOW_DEFAULT_BLUR_RADIUS);
|
||||
shadowRadius = typedArray.getDimension(R.styleable.ShadowLayout_shadowRadius,0);
|
||||
hasEffect = typedArray.getBoolean(R.styleable.ShadowLayout_hasEffect, false);
|
||||
xOffset = typedArray.getDimension(R.styleable.ShadowLayout_xOffset,DimenUtil.INSTANCE.dp2px(10));
|
||||
yOffset = typedArray.getDimension(R.styleable.ShadowLayout_yOffset,DimenUtil.INSTANCE.dp2px(10));
|
||||
bgColor = typedArray.getColor(R.styleable.ShadowLayout_bgColor,Color.WHITE);
|
||||
typedArray.recycle();
|
||||
|
||||
if (shadowRadius<0){
|
||||
shadowRadius = -shadowRadius;
|
||||
}
|
||||
if (blurRadius < 0) {
|
||||
blurRadius = -blurRadius;
|
||||
}
|
||||
|
||||
blurRadius = Math.min(SHADOW_MAX_BLUR,blurRadius);
|
||||
|
||||
if (Math.abs(xOffset)> SHADOW_MAX_OFFSET){
|
||||
xOffset = xOffset/Math.abs(xOffset) * SHADOW_MAX_OFFSET;
|
||||
}
|
||||
|
||||
if (Math.abs(yOffset) > SHADOW_MAX_OFFSET){
|
||||
yOffset = yOffset/Math.abs(yOffset) * SHADOW_MAX_OFFSET;
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
private void init(){
|
||||
setBackgroundColor(Color.parseColor("#00ffffff"));
|
||||
if (xOffset>0){
|
||||
//水平偏移量为正数,右侧有阴影,阴影长度为blurRadius+|xOffset|
|
||||
right = (int)(blurRadius + Math.abs(xOffset));
|
||||
}else if (xOffset==0){
|
||||
//水平偏移为0,水平间距为blurRadius
|
||||
left = (int)blurRadius;
|
||||
right = (int)blurRadius;
|
||||
}else {
|
||||
//水平偏移为负数,左侧有阴影,阴影长度为blurRadius+|xOffset|
|
||||
left = (int)(blurRadius + Math.abs(xOffset));
|
||||
}
|
||||
if (yOffset>0){
|
||||
//竖直偏移量为正数,底部有阴影,阴影长度为blurRadius+|yOffset|
|
||||
bottom = (int)(blurRadius + Math.abs(yOffset));
|
||||
}else if (yOffset==0){
|
||||
//竖直偏移量为0,竖直间距为blurRadius
|
||||
top = (int)blurRadius;
|
||||
bottom = (int)blurRadius;
|
||||
}else {
|
||||
//竖直偏移量为负数,顶部有阴影,阴影长度为blurRadius+|yOffset|
|
||||
top = (int)(blurRadius + Math.abs(yOffset));
|
||||
}
|
||||
setPadding(left,top,right,bottom);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获取阴影设置
|
||||
* @return 返回阴影设置配置
|
||||
*/
|
||||
public Shadow getShadowConfig(){
|
||||
return shadow;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
super.onLayout(changed,l,t,r,b);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void dispatchDraw(Canvas canvas) {
|
||||
super.dispatchDraw(canvas);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
drawBackground(canvas);//放在super前是后景,相反是前景,前景会覆盖子布局
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//绘制背景色(在子view底部)
|
||||
private void drawBackground(Canvas canvas){
|
||||
|
||||
mWidthMode = getMeasuredWidth();
|
||||
mHeightMode = getMeasuredHeight();
|
||||
float startX = 0;
|
||||
float startY = 0;
|
||||
float endX = 0;
|
||||
float endY = 0;
|
||||
|
||||
if (xOffset==0){
|
||||
startX = right;
|
||||
endX = mWidthMode-blurRadius;
|
||||
}else {
|
||||
startX = right+blurRadius;
|
||||
endX = mWidthMode-left-blurRadius;
|
||||
}
|
||||
|
||||
if (yOffset==0){
|
||||
startY = bottom;
|
||||
endY = mHeightMode-blurRadius;
|
||||
}else {
|
||||
startY = bottom+blurRadius;
|
||||
endY = mHeightMode-top-blurRadius;
|
||||
}
|
||||
// mPaint.setShadowLayer(blurRadius,0,0,shadowColor);
|
||||
if (blurRadius>0){
|
||||
mPaint.setMaskFilter(new BlurMaskFilter(blurRadius,BlurMaskFilter.Blur.NORMAL));
|
||||
}
|
||||
mPaint.setColor(shadowColor);
|
||||
mPaint.setAntiAlias(true);
|
||||
|
||||
RectF shadowRect = new RectF(startX,startY,endX,endY);
|
||||
|
||||
RectF locationRectF = new RectF(left,top,mWidthMode-right,mHeightMode-bottom);
|
||||
if (shadowRadius==0){
|
||||
//不是圆角
|
||||
canvas.drawRect(shadowRect,mPaint);
|
||||
}else {
|
||||
//圆角,角度为shadowRadius
|
||||
canvas.drawRoundRect(shadowRect,shadowRadius,shadowRadius,mPaint);
|
||||
}
|
||||
|
||||
locationPaint.setColor(bgColor);
|
||||
locationPaint.setAntiAlias(true);
|
||||
|
||||
if (shadowRadius==0){
|
||||
//不是圆角
|
||||
canvas.drawRect(locationRectF,locationPaint);
|
||||
}else {
|
||||
//圆角,角度为shadowRadius
|
||||
canvas.drawRoundRect(locationRectF,shadowRadius,shadowRadius,locationPaint);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 阴影配置
|
||||
*/
|
||||
class ShadowConfig implements Shadow{
|
||||
|
||||
//代理
|
||||
private BorderShadowLayout shadow;
|
||||
|
||||
private ShadowConfig(BorderShadowLayout shadow) {
|
||||
this.shadow = shadow;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setShadowRadius(float radius) {
|
||||
return setShadowRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setShadowRadius(int unit, float radius) {
|
||||
Context c = getContext();
|
||||
Resources r;
|
||||
|
||||
if (c == null) {
|
||||
r = Resources.getSystem();
|
||||
} else {
|
||||
r = c.getResources();
|
||||
}
|
||||
shadow.shadowRadius = Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics()));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setShadowColor(int color) {
|
||||
shadow.shadowColor = color;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setShadowColorRes(int colorRes) {
|
||||
shadow.shadowColor = shadow.getResources().getColor(colorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setBlurRadius(float radius) {
|
||||
return setBlurRadius(TypedValue.COMPLEX_UNIT_DIP,radius);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setBlurRadius(int unit, float radius) {
|
||||
Context c = getContext();
|
||||
Resources r;
|
||||
if (c == null) {
|
||||
r = Resources.getSystem();
|
||||
} else {
|
||||
r = c.getResources();
|
||||
}
|
||||
shadow.blurRadius = Math.min(SHADOW_MAX_BLUR,Math.abs(TypedValue.applyDimension(unit,radius,r.getDisplayMetrics())));
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setXOffset(float offset) {
|
||||
return setXOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setXOffset(int unit, float offset) {
|
||||
Context c = getContext();
|
||||
Resources r;
|
||||
if (c == null) {
|
||||
r = Resources.getSystem();
|
||||
} else {
|
||||
r = c.getResources();
|
||||
}
|
||||
|
||||
float x = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
|
||||
if (Math.abs(x)> SHADOW_MAX_OFFSET){
|
||||
x = x/Math.abs(x) * SHADOW_MAX_OFFSET;
|
||||
}
|
||||
shadow.xOffset = x;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setYOffset(float offset) {
|
||||
return setYOffset(TypedValue.COMPLEX_UNIT_DIP,offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shadow setYOffset(int unit, float offset) {
|
||||
Context c = getContext();
|
||||
Resources r;
|
||||
if (c == null) {
|
||||
r = Resources.getSystem();
|
||||
} else {
|
||||
r = c.getResources();
|
||||
}
|
||||
|
||||
float y = TypedValue.applyDimension(unit,offset,r.getDisplayMetrics());
|
||||
if (Math.abs(y)> SHADOW_MAX_OFFSET){
|
||||
y = y/Math.abs(y) * SHADOW_MAX_OFFSET;
|
||||
}
|
||||
shadow.yOffset = y;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commit() {
|
||||
shadow.init();
|
||||
shadow.requestLayout();
|
||||
shadow.postInvalidate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,304 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import com.amap.api.maps.AMap;
|
||||
import com.amap.api.maps.model.CustomMapStyleOptions;
|
||||
import com.amap.api.navi.AMapNaviView;
|
||||
import com.amap.api.navi.AMapNaviViewListener;
|
||||
import com.amap.api.navi.AMapNaviViewOptions;
|
||||
import com.amap.api.navi.model.RouteOverlayOptions;
|
||||
import com.mogo.eagle.core.function.smp.utils.MapAssetStyleUtils;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
|
||||
import com.mogo.och.taxi.passenger.model.NaviToDestinationModel;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/11/30
|
||||
*/
|
||||
public class OCHNaviFragment extends BaseTaxiUIFragment implements AMapNaviViewListener, View.OnClickListener {
|
||||
|
||||
private AMapNaviView mAMapNaviView;
|
||||
// private OverviewButtonView mOverviewButtonView;
|
||||
// private NextTurnTipView mNextTurnTipView;
|
||||
private AMap aMap;
|
||||
private IOCHTaxiNaviChangedCallback mNaviToStartInfoCallback; // 前往乘客上车点
|
||||
public static OCHNaviFragment newInstance() {
|
||||
|
||||
Bundle args = new Bundle();
|
||||
|
||||
OCHNaviFragment fragment = new OCHNaviFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_navi_view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(View view) {
|
||||
view.bringToFront();
|
||||
initMapView(view);
|
||||
}
|
||||
|
||||
private void initMapView(View view) {
|
||||
// mOverviewButtonView = view.findViewById(R.id.navi_overviewbuttonview);
|
||||
// mAMapNaviView.setLazyOverviewButtonView(mOverviewButtonView);
|
||||
// mOverviewButtonView.setOnClickListener(this);
|
||||
// DriveWayView mDriveWayView = view.findViewById(R.id.navi_drivewayview);
|
||||
// mAMapNaviView.setLazyDriveWayView(mDriveWayView);
|
||||
// mNextTurnTipView = view.findViewById(R.id.navi_nextturntipview);
|
||||
// mAMapNaviView.setLazyNextTurnTipView(mNextTurnTipView);
|
||||
mAMapNaviView = view.findViewById(R.id.navi_view);
|
||||
mAMapNaviView.setAMapNaviViewListener(this);
|
||||
//车头向上模式
|
||||
mAMapNaviView.setNaviMode(AMapNaviView.CAR_UP_MODE);
|
||||
aMap = mAMapNaviView.getMap();
|
||||
//关闭地图文字显示
|
||||
aMap.showMapText(false);
|
||||
// 设置导航地图模式,aMap是地图控制器对象。
|
||||
aMap.setMapType(AMap.MAP_TYPE_NIGHT);
|
||||
// 关闭显示实时路况图层,aMap是地图控制器对象。
|
||||
aMap.setTrafficEnabled(false);
|
||||
setMapViewOptions();
|
||||
new Thread(() -> {
|
||||
try {
|
||||
Thread.sleep(1000L);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (null == getContext()){
|
||||
return;
|
||||
}
|
||||
aMap.setCustomMapStyle(
|
||||
new CustomMapStyleOptions()
|
||||
.setEnable(true)
|
||||
.setStyleData(MapAssetStyleUtils.getAssetsStyle(getContext()))
|
||||
.setStyleExtraData(MapAssetStyleUtils.getAssetsExtraStyle(getContext()))
|
||||
);
|
||||
|
||||
//设置希望展示的地图缩放级别
|
||||
}).start();
|
||||
}
|
||||
|
||||
private void setMapViewOptions() {
|
||||
AMapNaviViewOptions options = new AMapNaviViewOptions();
|
||||
options.setTilt(0);//设置 2D 模式
|
||||
options.setLayoutVisible(false);//设置导航界面UI是否显示。
|
||||
options.setTrafficBarEnabled(false);//设置路况光柱条是否显示(只适用于驾车导航,需要联网)。
|
||||
options.setAutoLockCar(true);//设置6秒后是否自动锁车
|
||||
options.setAutoDisplayOverview(true);//设置是否自动全览模式,即在算路成功后自动进入全览模式
|
||||
options.setTrafficLine(false);
|
||||
options.setModeCrossDisplayShow(true);//设置是否显示路口放大图(路口模型图)
|
||||
options.setAutoChangeZoom(true);//自动缩放级别
|
||||
options.setCarBitmap(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.taxi_navi_arrow_icon));
|
||||
options.setFourCornersBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.taxi_navi_direction_icon));
|
||||
options.setAutoChangeZoom(true);//设置是否开启动态比例尺 (锁车态下自动进行地图缩放变化)
|
||||
// options.setZoom(18);//14-18
|
||||
// options.setTrafficInfoUpdateEnabled(false);
|
||||
// options.setTrafficLayerEnabled(false);//设置[实时交通图层开关按钮]是否显示(只适用于驾车导航,需要联网)。
|
||||
// options.setCameraInfoUpdateEnabled(false);
|
||||
// options.setCompassEnabled(false);//设置指南针图标否在导航界面显示,默认显示。
|
||||
// options.setLaneInfoShow(false);// 设置是否显示道路信息view
|
||||
// options.setNaviArrowVisible(false);//设置路线转向箭头隐藏和显示
|
||||
// options.setRealCrossDisplayShow(false);//设置是否显示路口放大图(实景图)
|
||||
// options.setRouteListButtonShow(true);//设置导航界面是否显示路线全览按钮。
|
||||
// options.setSettingMenuEnabled(false);//设置菜单按钮是否在导航界面显示。
|
||||
|
||||
RouteOverlayOptions routeOverlayOptions = new RouteOverlayOptions();
|
||||
|
||||
// routeOverlayOptions.setArrowOnTrafficRoute(BitmapFactory.decodeResource(getResources(),R.drawable.custtexture_aolr));
|
||||
routeOverlayOptions.setNormalRoute(BitmapFactory.decodeResource(getResources(), R.drawable.taxi_navi_line_icon));
|
||||
options.setRouteOverlayOptions(routeOverlayOptions);
|
||||
|
||||
mAMapNaviView.setViewOptions(options);
|
||||
}
|
||||
public void goToOverview(){
|
||||
if (mAMapNaviView.isRouteOverviewNow()){
|
||||
mAMapNaviView.recoverLockMode();
|
||||
}else {
|
||||
mAMapNaviView.displayOverview();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
// if (v.getId() == R.id.navi_overviewbuttonview){
|
||||
// goToOverview();
|
||||
// }
|
||||
}
|
||||
@Override
|
||||
protected void initViews(Bundle savedInstanceState) {
|
||||
super.initViews(savedInstanceState);
|
||||
mAMapNaviView.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
mAMapNaviView.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
mAMapNaviView.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(false);
|
||||
mAMapNaviView.onDestroy();
|
||||
if (mNaviToStartInfoCallback != null){
|
||||
mNaviToStartInfoCallback = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNaviSetting() {
|
||||
//底部导航设置点击回调
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNaviCancel() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNaviMapMode(int naviMode) {
|
||||
//导航态车头模式,0:车头朝上状态;1:正北朝上模式。
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNaviTurnClick() {
|
||||
//转弯view的点击回调
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNextRoadClick() {
|
||||
//下一个道路View点击回调
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onScanViewButtonClick() {
|
||||
//全览按钮点击回调
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onLockMap(boolean isLock) {
|
||||
//锁地图状态发生变化时回调
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNaviViewLoaded() {
|
||||
Log.d("wlx", "导航页面加载成功");
|
||||
Log.d("wlx", "请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMapTypeChanged(int i) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNaviViewShowMode(int i) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onNaviBackClick() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 车道信息说明:
|
||||
* <p>
|
||||
* 0xFF, 无对应车道
|
||||
* 0, 直行
|
||||
* 1, 左转
|
||||
* 2, 直行+左转
|
||||
* 3, 右转
|
||||
* 4, 直行+右转
|
||||
* 5, 左掉头
|
||||
* 6, 左转+右转
|
||||
* 7, 直行+左转+右转
|
||||
* 8, 右掉头
|
||||
* 9, 直行+左掉头
|
||||
* 10, 直行+右掉头
|
||||
* 11, 左转+左掉头
|
||||
* 12, 右转+右掉头
|
||||
* 13, 直行+扩展
|
||||
* 14, 左转+左掉头+扩展
|
||||
* 15, 保留
|
||||
* 16, 直行+左转+左掉头
|
||||
* 17, 右转+左掉头
|
||||
* 18, 左转+右转+左掉头
|
||||
* 19, 直行+右转+左掉头
|
||||
* 20, 左转+右掉头
|
||||
* 21, 公交车道
|
||||
* 22, 空车道
|
||||
* 23 可变车道
|
||||
*/
|
||||
|
||||
String[] array = {
|
||||
"直行车道"
|
||||
, "左转车道"
|
||||
, "左转或直行车道"
|
||||
, "右转车道"
|
||||
, "右转或直行车道"
|
||||
, "左掉头车道"
|
||||
, "左转或者右转车道"
|
||||
, " 左转或右转或直行车道"
|
||||
, "右转掉头车道"
|
||||
, "直行或左转掉头车道"
|
||||
, "直行或右转掉头车道"
|
||||
, "左转或左掉头车道"
|
||||
, "右转或右掉头车道"
|
||||
, "直行并且车道扩展"
|
||||
, "左转+左掉头+扩展"
|
||||
, "不可以选择该车道"
|
||||
, "直行+左转+左掉头车道"
|
||||
, "右转+左掉头"
|
||||
, "左转+右转+左掉头"
|
||||
, "直行+右转+左掉头"
|
||||
, "左转+右掉头"
|
||||
, "公交车道"
|
||||
, "空车道"
|
||||
, "可变车道"
|
||||
};
|
||||
|
||||
String[] actions = {
|
||||
"直行"
|
||||
, "左转"
|
||||
, "左转或直行"
|
||||
, "右转"
|
||||
, "右转或这行"
|
||||
, "左掉头"
|
||||
, "左转或者右转"
|
||||
, " 左转或右转或直行"
|
||||
, "右转掉头"
|
||||
, "直行或左转掉头"
|
||||
, "直行或右转掉头"
|
||||
, "左转或左掉头"
|
||||
, "右转或右掉头"
|
||||
, "直行并且车道扩展"
|
||||
, "左转+左掉头+扩展"
|
||||
, "不可以选择"
|
||||
, "直行+左转+左掉头"
|
||||
, "右转+左掉头"
|
||||
, "左转+右转+左掉头"
|
||||
, "直行+右转+左掉头"
|
||||
, "左转+右掉头"
|
||||
, "公交车道"
|
||||
, "空车道"
|
||||
, "可变车道"
|
||||
};
|
||||
}
|
||||
@@ -1,498 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.Html;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
|
||||
import com.amap.api.navi.model.NaviLatLng;
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.commons.voice.AIAssist;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
|
||||
import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.och.taxi.passenger.callback.IOCHTaxiNaviChangedCallback;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.passenger.model.MogoOCHTaxiModelNew;
|
||||
import com.mogo.och.taxi.passenger.model.NaviToDestinationModel;
|
||||
import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2021/1/18
|
||||
* 正在进行中订单
|
||||
*/
|
||||
public class OCHTaxiBeingServerdOrdersFragment extends BaseTaxiUIFragment implements View.OnClickListener, IOCHTaxiNaviChangedCallback {
|
||||
|
||||
public static final String TAG = "OCHTaxiBeingServerd";
|
||||
private static Activity mActivity;
|
||||
private static OCHTaxiFragment mTaxiFragment;
|
||||
private long mOrderId;
|
||||
private double mOrderStartStationLat = 0;
|
||||
private double mOrderStartStationLng = 0;
|
||||
|
||||
public static OCHTaxiBeingServerdOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment) {
|
||||
mActivity = activity;
|
||||
mTaxiFragment = taxiFragment;
|
||||
Bundle args = new Bundle();
|
||||
|
||||
OCHTaxiBeingServerdOrdersFragment fragment = new OCHTaxiBeingServerdOrdersFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
private TextView mOrderStatus;
|
||||
private ImageView mOrderCancel;
|
||||
private TextView mOrderServerStatus;
|
||||
private ConstraintLayout mBeingOrderLayout;
|
||||
private ConstraintLayout mContentModule3;
|
||||
private ConstraintLayout mContentModule2;
|
||||
private TextView mDistanceAndTime3;
|
||||
private TextView mDistanceAndTime2;
|
||||
private TextView mStationTv2;
|
||||
private TextView mOrderOtherContent3;
|
||||
private TextView mArrivedStartTimeTv32;
|
||||
private TextView mTitleTV2;
|
||||
|
||||
private LinearLayout mContentModule31;
|
||||
private TextView mStationTv31;
|
||||
private LinearLayout mContentModule32;
|
||||
private TextView mStationTv32;
|
||||
private TextView mArrivedStationTitleTv32;
|
||||
private TextView mGoAheadStationTitleTv31;
|
||||
private TextView mCatchStationTitleTv31;
|
||||
private ImageView mNaviIcon;
|
||||
|
||||
private TextView mNoDatasTv;
|
||||
|
||||
private ConstraintLayout mNoDataView;
|
||||
|
||||
private volatile int saveOrderState = -1;
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_being_order;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(View view) {
|
||||
mOrderStatus = view.findViewById(R.id.module_och_taxi_order_status);
|
||||
mOrderCancel = view.findViewById(R.id.module_och_taxi_order_cancel_iv);
|
||||
mOrderServerStatus = view.findViewById(R.id.module_och_taxi_order_server_status_tv);
|
||||
mBeingOrderLayout = view.findViewById(R.id.module_och_taxi_being_order_content);
|
||||
mContentModule2 = view.findViewById(R.id.module_och_taxi_order_status_station_2);
|
||||
mContentModule3 = view.findViewById(R.id.module_och_taxi_order_status_station_3);
|
||||
mDistanceAndTime2 = view.findViewById(R.id.module_och_taxi_order_distance_anchor_2);
|
||||
mContentModule31 = view.findViewById(R.id.module_och_taxi_order_go_ahead_station_31);
|
||||
mContentModule32 = view.findViewById(R.id.module_och_taxi_order_arrive_station_32);
|
||||
mStationTv2 = view.findViewById(R.id.module_och_taxi_order_station_2);
|
||||
mStationTv31 = view.findViewById(R.id.module_och_taxi_order_start_station_31);
|
||||
mStationTv32 = view.findViewById(R.id.module_och_taxi_order_end_station_32);
|
||||
mOrderOtherContent3 = view.findViewById(R.id.module_och_taxi_order_other_content_3);
|
||||
mDistanceAndTime3 = view.findViewById(R.id.module_och_taxi_order_distance_anchor_3);
|
||||
mArrivedStartTimeTv32 = view.findViewById(R.id.module_och_taxi_order_had_arrived_time_32);
|
||||
mTitleTV2 = view.findViewById(R.id.module_och_taxi_order_station_title_2);
|
||||
mCatchStationTitleTv31 = view.findViewById(R.id.go_ahead_station_catch_31);
|
||||
mGoAheadStationTitleTv31 = view.findViewById(R.id.go_ahead_station_31);
|
||||
mArrivedStationTitleTv32 = view.findViewById(R.id.arrive_station_32);
|
||||
mNoDatasTv = view.findViewById(R.id.no_order_data_tv);
|
||||
mNoDataView = view.findViewById(R.id.being_no_data_view);
|
||||
mOrderCancel.setOnClickListener(this);
|
||||
mOrderServerStatus.setOnClickListener(this);
|
||||
|
||||
initNaviView(view);
|
||||
|
||||
isHaveBeingOrder(false);
|
||||
|
||||
if (DebugConfig.isDebug()) {
|
||||
initOrderTestBar(view);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
MogoOCHTaxiModelNew.getInstance().startOrStopOrderLoop();
|
||||
}
|
||||
|
||||
private void initNaviView(View view) {
|
||||
mNaviIcon = view.findViewById(R.id.module_och_taxi_navi_iv);
|
||||
mNaviIcon.setOnClickListener(this);
|
||||
}
|
||||
|
||||
private boolean isSpeakedEndingNotice = false;
|
||||
|
||||
/**
|
||||
* 初始化订单信息
|
||||
*/
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order) {
|
||||
if (order == null) return;
|
||||
if (order.orderStatus == OrderStatusEnum.JourneyCompleted.getCode()) {
|
||||
isHaveBeingOrder(false);
|
||||
return;
|
||||
}
|
||||
mOrderId = order.orderId;
|
||||
onOrderStatusChanged(order.orderStatus);
|
||||
if (OrderStatusEnum.ArriveAtEndStation.getCode() == order.orderStatus) {
|
||||
mTaxiFragment.queryCurOrderRouteInfo();
|
||||
mContentModule3.setVisibility(View.GONE);
|
||||
mContentModule2.setVisibility(View.VISIBLE);
|
||||
Logger.d(TAG, "已经达到终点");
|
||||
mOrderStatus.setText(R.string.module_och_taxi_arrive_at_end_station2);
|
||||
mOrderServerStatus.setText(R.string.module_och_taxi_order_server_end);
|
||||
mOrderServerStatus.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
|
||||
background.setColor(Color.parseColor("#FF1D5EF3"));
|
||||
mOrderServerStatus.setClickable(true);
|
||||
// String strHtml3 = "<font color=\"#CAD6FF\">送乘客至</font><br>"
|
||||
// + "<b><font color=\"#FFFFFF\"><big>" + order.endSiteAddr + "<big></font></b>";
|
||||
mTitleTV2.setText("送乘客至");
|
||||
mStationTv2.setText(order.endSiteAddr);
|
||||
// String strHtml2 = "<font color=\"#CAD6FF\">距离 </font>" + "<b><font color=\"#FFFFFF\">- -</font></b>" + "<font color=\"#CAD6FF\"> 公里,</font>"
|
||||
// + "<font color=\"#CAD6FF\">用时 </font>" + "<b><font color=\"#FFFFFF\">- -</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
|
||||
// mDistanceAndTime.setText(Html.fromHtml(strHtml2));
|
||||
} else if (OrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus) {
|
||||
Logger.d(TAG, "已经去往终点");
|
||||
mContentModule3.setVisibility(View.GONE);
|
||||
mContentModule2.setVisibility(View.VISIBLE);
|
||||
mOrderStatus.setText(R.string.module_och_taxi_on_the_way_2_end_station);
|
||||
mOrderServerStatus.setText(R.string.module_och_taxi_order_server_end);
|
||||
mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF"));
|
||||
GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
|
||||
background.setColor(Color.parseColor("#4D1D5EF3"));
|
||||
mOrderServerStatus.setClickable(false);
|
||||
// String strHtml3 = "<font color=\"#CAD6FF\">送乘客至</font><br>"
|
||||
// + "<b><font color=\"#FFFFFF\"><big>" + order.endSiteAddr + "<big></font></b>";
|
||||
mTitleTV2.setText("送乘客至");
|
||||
// mStationTv2.setText(order.endSiteAddr);
|
||||
mStationTv2.setText(order.endSiteAddr);
|
||||
// String strHtml4 = "<font color=\"#CAD6FF\">距离 </font>" + "<b><font color=\"#FFFFFF\">- -</font></b>" + "<font color=\"#CAD6FF\"> 公里,</font>"
|
||||
// + "<font color=\"#CAD6FF\">用时 </font>" + "<b><font color=\"#FFFFFF\">- -</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
|
||||
// mDistanceAndTime.setText(Html.fromHtml(strHtml4));
|
||||
} else if (OrderStatusEnum.ArriveAtStartStation.getCode() == order.orderStatus) {
|
||||
Logger.d(TAG, "已经达到起点");
|
||||
mContentModule2.setVisibility(View.GONE);
|
||||
mContentModule3.setVisibility(View.VISIBLE);
|
||||
mArrivedStartTimeTv32.setVisibility(View.VISIBLE);
|
||||
mContentModule32.setVisibility(View.VISIBLE);
|
||||
mContentModule31.setVisibility(View.GONE);
|
||||
mOrderOtherContent3.setVisibility(View.GONE);
|
||||
mOrderStatus.setText(R.string.module_och_taxi_waiting);
|
||||
mOrderServerStatus.setText(R.string.module_och_taxi_order_server_start);
|
||||
GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
|
||||
background.setColor(Color.parseColor("#FF1D5EF3"));
|
||||
mOrderServerStatus.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
mOrderServerStatus.setClickable(true);
|
||||
Calendar currentCale = DateTimeUtils.getCurrentDateTime();
|
||||
String currentHM = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_HH_mm);
|
||||
String currentDay = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
|
||||
String strHtml11 = "<font color=\"#CAD6FF\">已于</font><br>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big><big>" + currentHM + "</big></big></font></b>"
|
||||
+ "<font color=\"#CAD6FF\">" + " " + "到达乘客上车地点</font>";
|
||||
mArrivedStartTimeTv32.setLineHeight(60);
|
||||
mArrivedStartTimeTv32.setText(Html.fromHtml(strHtml11));
|
||||
// String strHtml12 = "<font color=\"#CAD6FF\">送乘客至</font><br>"
|
||||
// + "<b><font color=\"#FFFFFF\"><big>" + order.endSiteAddr + "</big</font></b>";
|
||||
mArrivedStationTitleTv32.setText("送乘客至");
|
||||
mStationTv32.setText(order.endSiteAddr);
|
||||
currentCale.add(Calendar.MINUTE, 10);
|
||||
String strHtml13 = "";
|
||||
if (currentDay.equals(OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd))) {
|
||||
strHtml13 = "<font color=\"#CAD6FF\">免费等待至 </font>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big>" + OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_HH_mm) + "</big></b></font>";
|
||||
|
||||
} else {
|
||||
strHtml13 = "<font color=\"#CAD6FF\">免费等待至</font>"
|
||||
+ "<font color=\"#FFFFFF\"><big>" + OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_MM_dd_HH_mm) + "</big></font>";
|
||||
}
|
||||
mDistanceAndTime3.setText(Html.fromHtml(strHtml13));
|
||||
} else if (MogoOCHTaxiModelNew.getInstance().checkCurrentOCHOrder()) {
|
||||
Logger.d(TAG, "前往乘客上车地点");
|
||||
mContentModule2.setVisibility(View.GONE);
|
||||
mContentModule3.setVisibility(View.VISIBLE);
|
||||
mContentModule31.setVisibility(View.VISIBLE);
|
||||
mArrivedStartTimeTv32.setVisibility(View.GONE);
|
||||
mContentModule32.setVisibility(View.GONE);
|
||||
mOrderOtherContent3.setVisibility(View.VISIBLE);
|
||||
mDistanceAndTime3.setVisibility(View.VISIBLE);
|
||||
mOrderStatus.setText(R.string.module_och_taxi_new_order);
|
||||
mOrderServerStatus.setText(R.string.module_och_taxi_order_server_start);
|
||||
mOrderServerStatus.setTextColor(Color.parseColor("#4DFFFFFF"));
|
||||
GradientDrawable background = (GradientDrawable) mOrderServerStatus.getBackground();//GradientDrawable是Drawable的子类
|
||||
background.setColor(Color.parseColor("#4D1D5EF3"));
|
||||
mOrderServerStatus.setClickable(false);
|
||||
mGoAheadStationTitleTv31.setText("前往");
|
||||
mCatchStationTitleTv31.setText("接乘客");
|
||||
// String strHtml0 = "<font color=\"#CAD6FF\">前往</font><br>"
|
||||
// + "<b><font color=\"#FFFFFF\"><big>" + order.startSiteAddr + "</big></font></b><br>"
|
||||
// + "<font color=\"#CAD6FF\">接乘客</font>";
|
||||
mStationTv31.setText(order.startSiteAddr);
|
||||
Calendar currentCale = DateTimeUtils.getCurrentDateTime();
|
||||
Calendar startCale = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
|
||||
String currentDay = OchTaxiUtils.formatCalendarToString(currentCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
|
||||
String startDay = OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_yyyy_MM_dd);
|
||||
String strHtml1 = "";
|
||||
if (currentDay.equals(startDay)) {
|
||||
strHtml1 = "<font color=\"#CAD6FF\">乘客将于</font><br>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big><big>" + OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_HH_mm) + "</big></big></font></b>"
|
||||
+ "<font color=\"#CAD6FF\"> 用车</font>";
|
||||
} else {
|
||||
strHtml1 = "<font color=\"#CAD6FF\">乘客将于</font><br>"
|
||||
+ "<b><font color=\"#FFFFFF\"><big><big>" + OchTaxiUtils.formatCalendarToString(startCale, OchTaxiUtils.TAXI_MM_dd_HH_mm) + "</big></big></font></b>"
|
||||
+ "<font color=\"#CAD6FF\"> 用车</font>";
|
||||
}
|
||||
mOrderOtherContent3.setText(Html.fromHtml(strHtml1));
|
||||
// String strHtml2 = "<font color=\"#CAD6FF\">距离 </font>" + "<b><font color=\"#FFFFFF\">- -</font></b>" + "<font color=\"#CAD6FF\"> 公里,</font>"
|
||||
// + "<font color=\"#CAD6FF\">用时 </font>" + "<b><font color=\"#FFFFFF\">- -</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
|
||||
// mDistanceAndTime.setText(Html.fromHtml(strHtml2));
|
||||
mOrderStartStationLat = order.startSiteGcjPoint.get(1);
|
||||
mOrderStartStationLng = order.startSiteGcjPoint.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
private void startNaviToStartStation(boolean isShow, double orderStartStationLat, double orderStartStationLng) {
|
||||
NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
|
||||
Log.d(TAG, "currentLatLng=" + mTaxiFragment.mCurLatitude + " " + mTaxiFragment.mCurLongitude);
|
||||
NaviLatLng startNaviLatLng = new NaviLatLng(mTaxiFragment.mCurLatitude, mTaxiFragment.mCurLongitude);
|
||||
NaviLatLng endNaviLatLng = new NaviLatLng(orderStartStationLat, orderStartStationLng);
|
||||
NaviToDestinationModel.getInstance(getContext()).initAMapNavi(startNaviLatLng, endNaviLatLng);
|
||||
NaviToDestinationModel.getInstance(getContext()).setVoiceIsMute(isShow);
|
||||
NaviToDestinationModel.getInstance(getContext()).setOCHTaciNaviChangedCallback(this);
|
||||
}
|
||||
|
||||
private void showOrHideNavi(boolean isShow) {
|
||||
if (!isShow) {
|
||||
mNaviIcon.setVisibility(View.GONE);
|
||||
NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
|
||||
mTaxiFragment.showNaviToStartStationFragment(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateDistanceAndTime(long meters, long timeInSecond) {
|
||||
// Log.d(TAG,"meters = "+meters);
|
||||
if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) {
|
||||
DecimalFormat fnum = new DecimalFormat("##0.0");
|
||||
String dis = fnum.format((float) meters / 1000);
|
||||
String strHtml2 = "<font color=\"#CAD6FF\">里程 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> 公里</font>"
|
||||
+ "<font color=\"#CAD6FF\">,剩余 </font>" + "<b><font color=\"#FFFFFF\">" + (int) timeInSecond / 60 + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
|
||||
mDistanceAndTime3.setText(Html.fromHtml(strHtml2));
|
||||
mNaviIcon.setVisibility(View.VISIBLE);
|
||||
} else if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) {
|
||||
DecimalFormat fnum = new DecimalFormat("##0.0");
|
||||
String dis = fnum.format((float) meters / 1000);
|
||||
String strHtml2 = "<font color=\"#CAD6FF\">距离 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> 公里</font>";
|
||||
// + "<font color=\"#CAD6FF\">,用时 </font>" + "<b><font color=\"#FFFFFF\">"+(int)timeInSecond/60+"</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
|
||||
mDistanceAndTime2.setText(Html.fromHtml(strHtml2));
|
||||
}
|
||||
}
|
||||
|
||||
public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo) {
|
||||
Log.d(TAG, "meters = " + routeInfo.durationToEnd);
|
||||
DecimalFormat fnum = new DecimalFormat("##0.0");
|
||||
String dis = fnum.format((float) routeInfo.distanceToEnd / 1000);
|
||||
String strHtml2 = "<font color=\"#CAD6FF\">距离 </font>" + "<b><font color=\"#FFFFFF\">" + dis + "</font></b>" + "<font color=\"#CAD6FF\"> 公里</font>"
|
||||
+ "<font color=\"#CAD6FF\">,用时 </font>" + "<b><font color=\"#FFFFFF\">" + (int) routeInfo.durationToEnd / 60 + "</font></b>" + "<font color=\"#CAD6FF\"> 分钟</font>";
|
||||
if (mContentModule2 != null && mContentModule2.getVisibility() == View.VISIBLE) {
|
||||
mDistanceAndTime2.setText(Html.fromHtml(strHtml2));
|
||||
} else if (mContentModule3 != null && mContentModule3.getVisibility() == View.VISIBLE) {
|
||||
mDistanceAndTime3.setText(Html.fromHtml(strHtml2));
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void SpeakNoticeOnce() {
|
||||
if (!isSpeakedEndingNotice) {
|
||||
isSpeakedEndingNotice = true;
|
||||
showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
NaviToDestinationModel.getInstance(getContext()).destroyAmaNavi();
|
||||
}
|
||||
|
||||
private void startOrEndService(String step) {
|
||||
if (step.equals("服务完成")) {//点击了完成服务,结束订单并更新订单信息
|
||||
// isHaveBeingOrder(false);
|
||||
mTaxiFragment.completeOrderService(OrderStatusEnum.JourneyCompleted);
|
||||
showNotice("车辆已停稳,请携带好随身物品,下车请注意安全");
|
||||
return;
|
||||
} else if (step.equals("开始服务")) {//点击服务,开启自动驾驶
|
||||
mTaxiFragment.startAutoPilot();
|
||||
showNotice("自动驾驶已启动,请系好安全带");
|
||||
}
|
||||
}
|
||||
|
||||
public void onOrderStatusChanged(int status) {
|
||||
Log.d(TAG, "status==" + status);
|
||||
mActivity.runOnUiThread(() -> {
|
||||
if (status == OrderStatusEnum.None.getCode() || status == OrderStatusEnum.Cancel.getCode() || status == OrderStatusEnum.JourneyCompleted.getCode()) {
|
||||
isSpeakedEndingNotice = false;
|
||||
isHaveBeingOrder(false);
|
||||
} else {
|
||||
isHaveBeingOrder(true);
|
||||
}
|
||||
if (status != saveOrderState) {
|
||||
OrderStatusEnum ochStatus = OrderStatusEnum.valueOf(status);
|
||||
switch (ochStatus) {
|
||||
case OnTheWayToStartStation:
|
||||
showNotice(mActivity.getString(R.string.module_och_taxi_new_order));
|
||||
startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng);
|
||||
showOrHideNavi(true);
|
||||
break;
|
||||
case Cancel:
|
||||
showNotice(mActivity.getString(R.string.module_och_taxi_order_cancel));
|
||||
showOrHideNavi(false);
|
||||
break;
|
||||
case ArriveAtStartStation:
|
||||
showNotice(mActivity.getString(R.string.module_och_taxi_order_status_ph_text));
|
||||
showOrHideNavi(false);
|
||||
break;
|
||||
case OnTheWayToEndStation:
|
||||
// showNotice("欢迎使用蘑菇智行");
|
||||
showOrHideNavi(false);
|
||||
break;
|
||||
case ArriveAtEndStation:
|
||||
showNotice(mActivity.getString(R.string.module_och_taxi_order_complete_1));
|
||||
showOrHideNavi(false);
|
||||
break;
|
||||
case JourneyCompleted:
|
||||
showNotice("感谢您使用蘑菇智行,再见~");
|
||||
showOrHideNavi(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
saveOrderState = status;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有正在进行的订单,进行UI显示
|
||||
*
|
||||
* @param being
|
||||
*/
|
||||
public void isHaveBeingOrder(boolean being) {
|
||||
Log.d(TAG, "isHaveBeingOrder = " + being);
|
||||
if (being) {
|
||||
mNoDataView.setVisibility(View.GONE);
|
||||
mBeingOrderLayout.setVisibility(View.VISIBLE);
|
||||
mTaxiFragment.changeOperationViewVisible(View.GONE);
|
||||
} else {
|
||||
mNoDataView.setVisibility(View.VISIBLE);
|
||||
mNoDatasTv.setText("暂无进行中订单");
|
||||
mBeingOrderLayout.setVisibility(View.GONE);
|
||||
mTaxiFragment.changeOperationViewVisible(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v.getId() == R.id.module_och_taxi_order_server_status_tv) {
|
||||
switch (mOrderServerStatus.getText().toString().trim()) {
|
||||
case "开始服务":
|
||||
case "服务完成":
|
||||
Log.d(TAG, mOrderServerStatus.getText().toString());
|
||||
startOrEndService(mOrderServerStatus.getText().toString().trim());
|
||||
break;
|
||||
}
|
||||
} else if (v.getId() == R.id.module_och_taxi_order_cancel_iv) {
|
||||
new OCHTaxiOrderCancelDialog(mTaxiFragment, mActivity, mOrderId, saveOrderState).show();
|
||||
} else if (v.getId() == R.id.module_och_taxi_navi_iv) {
|
||||
// TODO: 2021/11/30 打开去往乘客上车点的导航页面
|
||||
if (mTaxiFragment != null) {
|
||||
showNaviToStartStationFragment(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示/隐藏 前往乘客上车点的导航
|
||||
*
|
||||
* @param isShow
|
||||
*/
|
||||
private void showNaviToStartStationFragment(boolean isShow) {
|
||||
mTaxiFragment.showNaviToStartStationFragment(isShow);
|
||||
startNaviToStartStation(isShow, mOrderStartStationLat, mOrderStartStationLng);
|
||||
}
|
||||
|
||||
|
||||
public void onCurrentOrderCancelDone() {
|
||||
//提交取消订单后的回调
|
||||
TipToast.tip("订单取消成功");
|
||||
//更新界面
|
||||
isHaveBeingOrder(false);
|
||||
showOrHideNavi(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单流转debug START
|
||||
*/
|
||||
private void initOrderTestBar(View view) {
|
||||
mOrderStatus.setOnLongClickListener(v -> {
|
||||
mTaxiFragment.clickTestBar();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
public void showNotice(String notice) {
|
||||
mActivity.runOnUiThread(() -> {
|
||||
AIAssist.getInstance(getContext()).speakTTSVoice(notice);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCurrentNaviDistAndTimeChanged(int meters, int timeInSecond) {
|
||||
updateDistanceAndTime(meters, timeInSecond);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reInitNaviAmap(boolean isPlay, boolean isRestart) {
|
||||
Log.d(TAG, "isPlay = " + isPlay + ", isRestart=" + isRestart);
|
||||
if (!isRestart) {
|
||||
mTaxiFragment.showNaviToStartStationFragment(false);
|
||||
return;
|
||||
}
|
||||
mTaxiFragment.showNaviToStartStationFragment(false);
|
||||
UiThreadHandler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (saveOrderState == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
|
||||
startNaviToStartStation(false, mOrderStartStationLat, mOrderStartStationLng);
|
||||
}
|
||||
}
|
||||
}, 2000);
|
||||
UiThreadHandler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (saveOrderState == OrderStatusEnum.OnTheWayToStartStation.getCode()) {
|
||||
if (mNaviIcon.getVisibility() == View.GONE) {
|
||||
mNaviIcon.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}, 3000);
|
||||
}
|
||||
/**
|
||||
* END
|
||||
*/
|
||||
}
|
||||
@@ -1,339 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.module.common.MogoApisHandler;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
import com.mogo.och.taxi.passenger.model.MogoOCHTaxiModelNew;
|
||||
import com.mogo.och.taxi.passenger.presenter.OCHTaxiPresenter;
|
||||
import com.mogo.och.taxi.passenger.utils.PinYinUtil;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2021/1/18
|
||||
*
|
||||
* 网约车-出租车UI
|
||||
*/
|
||||
public class OCHTaxiFragment extends BaseOchTaxiTabFragment<OCHTaxiFragment, OCHTaxiPresenter> implements OCHTaxiView{
|
||||
|
||||
public static final String TAG = "OCHTaxiFragment";
|
||||
|
||||
public static OCHTaxiFragment newInstance() {
|
||||
|
||||
Bundle args = new Bundle();
|
||||
|
||||
OCHTaxiFragment fragment = new OCHTaxiFragment();
|
||||
fragment.setArguments( args );
|
||||
return fragment;
|
||||
}
|
||||
private OCHTaxiGrabOrderFragment grabOrderFragment;
|
||||
private OCHTaxiServerOrdersFragment serverOrdersFragment;
|
||||
private WeakReference<OCHTaxiPersonalDialogFragment> personalDialogFragment = null;
|
||||
protected double mCurLatitude = 0.0;
|
||||
protected double mCurLongitude = 0.0;
|
||||
|
||||
@Override
|
||||
public int getStationPanelViewId() {
|
||||
return R.layout.taxi_panel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restartAutopilot() {
|
||||
// 在自动驾驶中,才会有重新开启自动驾驶的操作
|
||||
if (mPresenter.getCurOrderStatus() == OrderStatusEnum.OnTheWayToEndStation) {
|
||||
Logger.d( TAG, "restartAutopilot" );
|
||||
mPresenter.startAutoPilot();
|
||||
startOrStopLoadingAnim(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTagName() {
|
||||
return "OCHTaxiFragment";
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
protected void initViews() {
|
||||
super.initViews();
|
||||
mPersonalBtn.setVisibility(View.GONE);
|
||||
initFragment();
|
||||
hidPanel();
|
||||
if ( MogoApisHandler.getInstance()
|
||||
.getApis()
|
||||
.getStatusManagerApi()
|
||||
.isVrMode() ) {
|
||||
switchVRFlatMode(true);
|
||||
} else {
|
||||
switchVRFlatMode(false);
|
||||
}
|
||||
|
||||
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
|
||||
tvOperationStatus.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
tvOperationStatus.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (DebugConfig.isDebug()) {
|
||||
initOrderTestBar();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void initFragment() {
|
||||
serverOrdersFragment = OCHTaxiServerOrdersFragment.newInstance();
|
||||
grabOrderFragment = OCHTaxiGrabOrderFragment.newInstance();
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
//默认显示OCHTaxiServerOrdersFragment
|
||||
transaction.add(R.id.fragment_container,serverOrdersFragment).show(serverOrdersFragment);
|
||||
transaction.add(R.id.fragment_container,grabOrderFragment).hide(grabOrderFragment);
|
||||
transaction.commitAllowingStateLoss();
|
||||
}
|
||||
|
||||
private void showGrabFragmentAndUpdate() {
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
if (grabOrderFragment == null){
|
||||
grabOrderFragment = OCHTaxiGrabOrderFragment.newInstance();
|
||||
transaction.add(R.id.fragment_container,grabOrderFragment).show(grabOrderFragment).commitAllowingStateLoss();
|
||||
}else {
|
||||
transaction.show(grabOrderFragment).hide(serverOrdersFragment).commitAllowingStateLoss();
|
||||
}
|
||||
}
|
||||
|
||||
public void showServerFragmentAndUpdate() {
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
if (serverOrdersFragment == null){
|
||||
serverOrdersFragment = OCHTaxiServerOrdersFragment.newInstance();
|
||||
transaction.add(R.id.fragment_container,serverOrdersFragment).show(serverOrdersFragment);
|
||||
}else {
|
||||
transaction.show(serverOrdersFragment).hide(grabOrderFragment).commitAllowingStateLoss();
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected OCHTaxiPresenter createPresenter() {
|
||||
return new OCHTaxiPresenter( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onChangeOperationStatus() {
|
||||
super.onChangeOperationStatus();
|
||||
mPresenter.updateCarStatus();
|
||||
}
|
||||
|
||||
public void switchVRFlatMode(boolean isVRMode) {
|
||||
if (mRootView != null) {
|
||||
mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
}
|
||||
|
||||
public void updateOperationStatus(boolean inOperation) {
|
||||
Logger.e(TAG,"onOperationChanged:"+ inOperation);
|
||||
isOperationStatus = inOperation;
|
||||
if ( inOperation ) {
|
||||
tvOperationStatus.setText( "收车" );
|
||||
mPersonalBtn.setVisibility(View.VISIBLE);
|
||||
tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.taxi_back_btn),null,null,null);
|
||||
showPanel();
|
||||
} else {
|
||||
// AIAssist.getInstance(getContext()).speakTTSVoice("已收车");
|
||||
tvOperationStatus.setText("出车");
|
||||
tvOperationStatus.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.taxi_out_btn),null,null,null);
|
||||
mPersonalBtn.setVisibility(View.GONE);
|
||||
hidPanel();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onGoToTaxiOrders() {
|
||||
personalDialogFragment = new WeakReference<>(new OCHTaxiPersonalDialogFragment(this));
|
||||
personalDialogFragment.get().show(getActivity().getSupportFragmentManager(),"service_data");
|
||||
}
|
||||
|
||||
public void routeResult(List<AutopilotRouteInfo.RouteModels> routeList) {
|
||||
if (routeList == null ) return;
|
||||
// double distance = calculateTravelDistance(mogoLocation,routeList);
|
||||
// if ( MogoOCHTaxiModel.getInstance().checkCurrentOCHOrder() ) {
|
||||
// MogoOCHTaxiModel.getInstance().getCurrentOCHOrder().decreaseTravelDistance( distance );
|
||||
// updateOrderBaseStatusInfo();
|
||||
// }
|
||||
// Logger.d("lianglihui","routeResult 剩余导航距离:"+distance);
|
||||
// if (routeList != null && routeList.size() >0){
|
||||
// Logger.d("lianglihui","routeResult:"+routeList.size());
|
||||
// //adas回调导航路径 绘制引导线
|
||||
// if ( ochTaxiOverlayManager == null){
|
||||
// ochTaxiOverlayManager = new OCHTaxiOverlayManager(this.getContext());
|
||||
// }
|
||||
// ochTaxiOverlayManager.draw(mogoLocation,routeList);
|
||||
// }
|
||||
}
|
||||
@Override
|
||||
public void onMapLoaded() {
|
||||
}
|
||||
|
||||
public void updateAutopilotStatus(int status) {
|
||||
onAutopilotStatusChanged(status);
|
||||
}
|
||||
/**
|
||||
* 收到自动驾驶通知的成功状态之后,设置本地状态及服务端状态
|
||||
*/
|
||||
private void resetOCHTaxiOrderAutopilotStatus() {
|
||||
mPresenter.updateCurOrderStatus(OrderStatusEnum.OnTheWayToEndStation);
|
||||
}
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order){
|
||||
if (serverOrdersFragment != null){
|
||||
serverOrdersFragment.updateCurrentOrderStatusChanged(order);
|
||||
}
|
||||
}
|
||||
public void startAutoPilot(){
|
||||
mPresenter.startAutoPilot();
|
||||
startOrStopLoadingAnim(true);
|
||||
}
|
||||
public void completeOrderService(OrderStatusEnum status){
|
||||
mPresenter.updateCurOrderStatus(status);
|
||||
}
|
||||
public void cancelCurOrder(int reasonType, String reaso){
|
||||
mPresenter.cancelCurOrder(reasonType,reaso);
|
||||
}
|
||||
|
||||
public void cancelOrderById(long orderId, int reasonType, String reason){
|
||||
mPresenter.cancelOrderById(orderId,reasonType,reason);
|
||||
}
|
||||
public void onCurrentOrderCancelDone(){
|
||||
if (null == serverOrdersFragment) return;
|
||||
serverOrdersFragment.onCurrentOrderCancelDone();
|
||||
}
|
||||
public void onOrderCancelDone(long orderId){
|
||||
if (null == serverOrdersFragment) return;
|
||||
serverOrdersFragment.onOrderCancelDone(orderId);
|
||||
}
|
||||
public void onNewBookingOrderGot(OrderQueryRespBean.Result order){
|
||||
if (null == order) return;
|
||||
showGrabFragmentAndUpdate();
|
||||
grabOrderFragment.updateGrabOrder(order);
|
||||
}
|
||||
public void grabOrder(){
|
||||
mPresenter.grabOrder();
|
||||
}
|
||||
public void cancelNewBookingOrder(){
|
||||
mPresenter.cancelNewBookingOrder();
|
||||
showServerFragmentAndUpdate();
|
||||
}
|
||||
public void onGrabOrderExecuteDone(){
|
||||
if (null == grabOrderFragment) return;
|
||||
grabOrderFragment.onGrabOrderExecuteDone();
|
||||
}
|
||||
public void onGrabOrderSuccess(OrderQueryRespBean.Result order){
|
||||
if (null == grabOrderFragment) return;
|
||||
if (null == order){
|
||||
showServerFragmentAndUpdate();
|
||||
return;
|
||||
}
|
||||
showGrabFragmentAndUpdate();
|
||||
grabOrderFragment.onGrabOrderSuccess();
|
||||
}
|
||||
public void onGrabOrderFailed(OrderQueryRespBean.Result order){
|
||||
if (order == null){
|
||||
showServerFragmentAndUpdate();
|
||||
return;
|
||||
}
|
||||
if (null == grabOrderFragment) return;
|
||||
showGrabFragmentAndUpdate();
|
||||
grabOrderFragment.onGrabOrderFailed();
|
||||
}
|
||||
public void onOrdersWaitServiceChanged(List<OrderQueryRespBean.Result> waitServiceList){
|
||||
if (null == waitServiceList) return;
|
||||
if (null == serverOrdersFragment) return;
|
||||
serverOrdersFragment.onOrdersWaitServiceChanged(waitServiceList);
|
||||
}
|
||||
public void queryOrdersList(int page, int size){
|
||||
mPresenter.queryOrdersList(page,size);
|
||||
}
|
||||
public void onOrdersListPageRefresh(List<OrderQueryRespBean.Result> ordersList){
|
||||
if (null == personalDialogFragment) personalDialogFragment = new WeakReference<>(new OCHTaxiPersonalDialogFragment(this));
|
||||
personalDialogFragment.get().onOrdersListPageRefresh(ordersList);
|
||||
}
|
||||
public void queryDriverServiceData(){
|
||||
mPresenter.queryDriverServiceData();
|
||||
}
|
||||
public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum){
|
||||
if (null == personalDialogFragment) return;
|
||||
personalDialogFragment.get().onServiceDataUpdate(dailyTimeDuration,dailyOrderNum);
|
||||
}
|
||||
public void queryCurOrderRouteInfo(){
|
||||
mPresenter.queryCurOrderRouteInfo();
|
||||
}
|
||||
public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo){
|
||||
if (null == serverOrdersFragment) return;
|
||||
serverOrdersFragment.onCurrentOrderRouteInfoGot(routeInfo);
|
||||
}
|
||||
public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond){
|
||||
// if (null == serverOrdersFragment) return;
|
||||
// serverOrdersFragment.onCurrentOrderDistToStartChanged(meters,timeInSecond);
|
||||
}
|
||||
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond){
|
||||
if (null == serverOrdersFragment) return;
|
||||
serverOrdersFragment.onCurrentOrderDistToEndChanged(meters,timeInSecond);
|
||||
}
|
||||
public void updateLocation(double latitude,double longitude){
|
||||
this.mCurLatitude = latitude;
|
||||
this.mCurLongitude = longitude;
|
||||
}
|
||||
/**
|
||||
* 订单流转debug START
|
||||
*/
|
||||
public void initOrderTestBar() {
|
||||
findViewById(R.id.test_bar_to_start).setOnClickListener(v -> {
|
||||
MogoOCHTaxiModelNew.getInstance().setArriveAtStartStation();
|
||||
});
|
||||
findViewById(R.id.test_bar_to_end).setOnClickListener(v -> {
|
||||
MogoOCHTaxiModelNew.getInstance().setArriveAtEndStation();
|
||||
});
|
||||
findViewById(R.id.test_bar_on_the_way_to_end).setOnClickListener(v ->{
|
||||
showNotice("自动驾驶已启动,请系好安全带");
|
||||
MogoOCHTaxiModelNew.getInstance().setOnTheWayToEndStation();
|
||||
});
|
||||
}
|
||||
public void clickTestBar(){
|
||||
View testBar = findViewById(R.id.module_och_taxi_order_status_change_test_bar);
|
||||
if (testBar.getVisibility() == View.VISIBLE) {
|
||||
testBar.setVisibility(View.GONE);
|
||||
} else {
|
||||
TextView testCurOrderId = findViewById(R.id.test_bar_current_order_id);
|
||||
TextView testCurStartName = findViewById(R.id.test_bar_current_start_name);
|
||||
TextView testCurEndName = findViewById(R.id.test_bar_current_end_name);
|
||||
OrderQueryRespBean.Result order = MogoOCHTaxiModelNew.getInstance().getCurrentOCHOrder();
|
||||
|
||||
testCurOrderId.setText(order == null ? "" : String.valueOf(order.orderId));
|
||||
testCurStartName.setText(order == null ? "" : PinYinUtil.getPinYinHeadChar(order.startSiteAddr));
|
||||
testCurEndName.setText(order == null ? "" : PinYinUtil.getPinYinHeadChar(order.endSiteAddr));
|
||||
|
||||
testBar.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,193 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.AnimationDrawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.CountDownTimer;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/9/9
|
||||
*/
|
||||
public class OCHTaxiGrabOrderFragment extends BaseTaxiUIFragment implements View.OnClickListener {
|
||||
|
||||
private TextView mOrderReserverTime;
|
||||
private TextView mOrderGrabBt;
|
||||
private TextView mOrderStartStation;
|
||||
private TextView mOrderEndStation;
|
||||
private TextView mOrderStartTitle;
|
||||
private TextView mOrderEndTitle;
|
||||
private ImageView mOrderCancelIv;
|
||||
private ImageView mGrabResultAnimView;
|
||||
private AnimationDrawable mGrabSuccessAnim;
|
||||
private AnimationDrawable mGrabFailureAnim;
|
||||
private CountDownTimer countDownTimer = null;
|
||||
|
||||
public static OCHTaxiGrabOrderFragment newInstance() {
|
||||
|
||||
Bundle args = new Bundle();
|
||||
|
||||
OCHTaxiGrabOrderFragment fragment = new OCHTaxiGrabOrderFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_order_grab_view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(View view) {
|
||||
mOrderReserverTime = view.findViewById(R.id.grab_order_reserver_time);
|
||||
mOrderCancelIv = view.findViewById(R.id.grab_order_cancel_iv);
|
||||
mOrderGrabBt = view.findViewById(R.id.grab_order_tv);
|
||||
mOrderStartStation = view.findViewById(R.id.grab_order_start_station);
|
||||
mOrderEndStation = view.findViewById(R.id.grab_order_end_station);
|
||||
mOrderEndTitle = view.findViewById(R.id.grab_order_end_station_title);
|
||||
mOrderStartTitle = view.findViewById(R.id.grab_order_start_station_title);
|
||||
mGrabResultAnimView = view.findViewById(R.id.grab_result_anim);
|
||||
mGrabResultAnimView.setVisibility(View.GONE);
|
||||
mOrderEndTitle.setVisibility(View.VISIBLE);
|
||||
mOrderStartTitle.setVisibility(View.VISIBLE);
|
||||
|
||||
mOrderCancelIv.setOnClickListener(this);
|
||||
mOrderGrabBt.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v.getId() == R.id.grab_order_cancel_iv){//关闭抢单,如果是在抢单中,则只关闭界面,还继续抢单
|
||||
if (mOrderGrabBt.getText().toString().equals("抢单中...")){
|
||||
getOchTaxiFragment().showServerFragmentAndUpdate();
|
||||
return;
|
||||
}
|
||||
if (null != countDownTimer){
|
||||
countDownTimer.cancel();
|
||||
}
|
||||
getOchTaxiFragment().cancelNewBookingOrder();
|
||||
}else if (v.getId() == R.id.grab_order_tv){
|
||||
if (!mOrderGrabBt.getText().toString().equals("抢单中...")){
|
||||
getOchTaxiFragment().grabOrder();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
private OCHTaxiFragment getOchTaxiFragment(){
|
||||
return (OCHTaxiFragment)getParentFragment();
|
||||
}
|
||||
public void updateGrabOrder(OrderQueryRespBean.Result order){
|
||||
mGrabResultAnimView.setVisibility(View.GONE);
|
||||
Calendar calendar = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
|
||||
if (OchTaxiUtils.compareDateIsCurrentDay(calendar)){
|
||||
mOrderReserverTime.setText("用车时间:今天 "+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
|
||||
getOchTaxiFragment().showNotice("预约单,今天"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm)+"从"
|
||||
+order.startSiteAddr+"到"+order.endSiteAddr);
|
||||
}else {
|
||||
mOrderReserverTime.setText("用车时间:"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd_HH_mm));
|
||||
getOchTaxiFragment().showNotice("预约单,"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd)+"从"
|
||||
+order.startSiteAddr+"到"+order.endSiteAddr);
|
||||
}
|
||||
mOrderStartStation.setText(order.startSiteAddr);
|
||||
mOrderEndStation.setText(order.endSiteAddr);
|
||||
mOrderGrabBt.setClickable(true);
|
||||
mOrderGrabBt.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)mOrderGrabBt.getLayoutParams();
|
||||
lp.bottomMargin = 3;
|
||||
mOrderGrabBt.setLayoutParams(lp);
|
||||
mOrderGrabBt.setBackground(getResources().getDrawable(R.drawable.taxi_driver_grab_order_bt));
|
||||
mOrderGrabBt.setText("抢单(10S)"); //开始倒计时任务
|
||||
countDownTimer = new CountDownTimer(11000,1000){
|
||||
|
||||
@Override
|
||||
public void onTick(long millisUntilFinished) {
|
||||
mOrderGrabBt.setText("抢单"+"("+millisUntilFinished/1000+")");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {//结束倒计时,不抢单
|
||||
cancel();
|
||||
getOchTaxiFragment().cancelNewBookingOrder();
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
public void onGrabOrderExecuteDone(){//进入抢单状态,btn样式改变,并不可点击
|
||||
if (null != countDownTimer){
|
||||
countDownTimer.cancel();
|
||||
}
|
||||
mOrderGrabBt.setTextSize(21);
|
||||
mOrderGrabBt.setText("抢单中...");
|
||||
ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)mOrderGrabBt.getLayoutParams();
|
||||
lp.bottomMargin = 40;
|
||||
mOrderGrabBt.setLayoutParams(lp);
|
||||
mOrderGrabBt.setTextColor(Color.parseColor("#181D6D"));
|
||||
mOrderGrabBt.setBackground(getResources().getDrawable(R.drawable.taxi_grabing_order_btn_bg));
|
||||
mOrderGrabBt.setClickable(false);
|
||||
}
|
||||
// 接单成功,语音播报“抢单成功,请合理安排后续行程接送乘客”
|
||||
// 接单未成功,语音播报“接单失败,请继续接单”
|
||||
public void onGrabOrderSuccess(){//抢单成功,更新btn 和 动画 语音
|
||||
getOchTaxiFragment().showNotice("抢单成功,请合理安排后续行程接送乘客");
|
||||
mGrabResultAnimView.setVisibility(View.VISIBLE);
|
||||
mGrabResultAnimView.setImageDrawable(getResources().getDrawable(R.drawable.grab_success_anmi_flow));
|
||||
mOrderGrabBt.setClickable(false);
|
||||
mOrderGrabBt.setText("抢单成功!");
|
||||
mGrabSuccessAnim = (AnimationDrawable)mGrabResultAnimView.getDrawable();
|
||||
if (mGrabSuccessAnim.isOneShot()){
|
||||
return;
|
||||
}
|
||||
mGrabSuccessAnim.start();
|
||||
//开启动画结束的监听
|
||||
long delayMillis = mGrabSuccessAnim.getDuration(0) * mGrabSuccessAnim.getNumberOfFrames();
|
||||
UiThreadHandler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (null != mGrabSuccessAnim && mGrabSuccessAnim.isRunning()){
|
||||
mGrabSuccessAnim.stop();
|
||||
}
|
||||
// if (mGrabSuccessAnim.getFrame(mGrabSuccessAnim.getNumberOfFrames()-1) == mGrabSuccessAnim.getCurrent()){
|
||||
getOchTaxiFragment().showServerFragmentAndUpdate();
|
||||
// }
|
||||
}
|
||||
},delayMillis);
|
||||
//开启动画结束的监听
|
||||
}
|
||||
public void onGrabOrderFailed(){//抢单失败,更新btn 和 动画 语音
|
||||
getOchTaxiFragment().showNotice("接单失败,请继续接单");
|
||||
mGrabResultAnimView.setVisibility(View.VISIBLE);
|
||||
mGrabResultAnimView.setImageDrawable(getResources().getDrawable(R.drawable.grab_failure_anmi_flow));
|
||||
mOrderGrabBt.setClickable(false);
|
||||
mOrderGrabBt.setText("抢单失败!");
|
||||
mGrabFailureAnim = (AnimationDrawable)mGrabResultAnimView.getDrawable();
|
||||
mGrabFailureAnim.start();
|
||||
//开启动画结束的监听
|
||||
long delayMillis = mGrabFailureAnim.getDuration(0) * mGrabFailureAnim.getNumberOfFrames();
|
||||
UiThreadHandler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (null != mGrabFailureAnim && mGrabFailureAnim.isRunning()){
|
||||
mGrabFailureAnim.stop();
|
||||
}
|
||||
getOchTaxiFragment().showServerFragmentAndUpdate();
|
||||
}
|
||||
},delayMillis);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (countDownTimer != null) countDownTimer.cancel();
|
||||
}
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.text.Html;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/9/10
|
||||
*/
|
||||
public class OCHTaxiOperationDatasFragment extends BaseTaxiUIFragment {
|
||||
|
||||
private RecyclerView mRecyclerView;
|
||||
private static Context mContext;
|
||||
private List<Long> mDurationData = new ArrayList<>();
|
||||
private List<Long> mOrderNumData = new ArrayList<>();
|
||||
private List<Long> mData = new ArrayList<>();
|
||||
private static int mType = 0;//0: 运营时长 1:运营单数
|
||||
private OperationDataAdapter mAdapter;
|
||||
|
||||
public static OCHTaxiOperationDatasFragment newInstance(Context context, int type) {
|
||||
mContext = context;
|
||||
mType = type;
|
||||
Bundle args = new Bundle();
|
||||
OCHTaxiOperationDatasFragment fragment = new OCHTaxiOperationDatasFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_operation_data_view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(View view) {
|
||||
mRecyclerView = view.findViewById(R.id.operation_data_recycler_view);
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
|
||||
mAdapter = new OperationDataAdapter(mContext, mData);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
public void setmType(int type) {
|
||||
mType = type;
|
||||
mData.clear();
|
||||
if (mType == 0){
|
||||
mData.addAll(mDurationData);
|
||||
}else if (mType == 1){
|
||||
mData.addAll(mOrderNumData);
|
||||
}
|
||||
if (mAdapter != null) mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void updateData(long dailyTimeDuration, long dailyOrderNum) {
|
||||
mDurationData.clear();
|
||||
mOrderNumData.clear();
|
||||
mData.clear();
|
||||
mDurationData.add(dailyTimeDuration);
|
||||
mOrderNumData.add(dailyOrderNum);
|
||||
mData.addAll(mDurationData);
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
class OperationDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
private List<Long> datas;
|
||||
private Context context;
|
||||
|
||||
public OperationDataAdapter(Context context, List<Long> datas) {
|
||||
this.datas = datas;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(context).inflate(R.layout.taxi_operation_data_item_view, parent, false);
|
||||
OperationDataViewHolder viewHolder = new OperationDataViewHolder(view);
|
||||
return viewHolder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
if (holder instanceof OperationDataViewHolder) {
|
||||
OperationDataViewHolder viewHolder = (OperationDataViewHolder) holder;
|
||||
if (0 == mType){
|
||||
String hourData = TextUtils.isEmpty(OchTaxiUtils.secondsToHourStr(datas.get(position))) ? "0": OchTaxiUtils.secondsToHourStr(datas.get(position));
|
||||
String minuteData = OchTaxiUtils.secondsToMinuteStr(datas.get(position));
|
||||
String data = "<font><b><big><big><big>" + hourData + "</big></big></big></b> 时 </font>" + "<font><b><big><big><big>" + minuteData + "</big></big></big></b> 分</font>";
|
||||
viewHolder.operationDataTv.setText(Html.fromHtml(data));
|
||||
viewHolder.operationDataTitle.setText("今日在线时长");
|
||||
}else if (1 == mType){
|
||||
String data = "<font><b><big><big><big>" + String.valueOf(datas.get(position)) + "</big></big></big></b>" + " 单" + "</font>";
|
||||
viewHolder.operationDataTv.setText(Html.fromHtml(data));
|
||||
viewHolder.operationDataTitle.setText("今日订单完成数");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return datas.size();
|
||||
}
|
||||
}
|
||||
|
||||
class OperationDataViewHolder extends RecyclerView.ViewHolder {
|
||||
private TextView operationDataTv;
|
||||
private TextView operationDataTitle;
|
||||
|
||||
public OperationDataViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
operationDataTv = itemView.findViewById(R.id.operation_data_tv);
|
||||
operationDataTitle = itemView.findViewById(R.id.operation_data_title_tv);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,210 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.GridView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderCancelReasons;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/8/18
|
||||
*/
|
||||
public class OCHTaxiOrderCancelDialog extends AlertDialog implements View.OnClickListener,AdapterView.OnItemClickListener {
|
||||
|
||||
private static final String TAG = "OCHTaxiOrderCancelDial";
|
||||
protected WeakReference<Context> contextWeakReference;
|
||||
private GridView mContentView;
|
||||
private TextView mCancelCommitTv;
|
||||
private TextView mDialogCancelTv;
|
||||
private String mCurrentReason = "";
|
||||
private ContentAdapter mContentAdapter;
|
||||
private int mOrderStatus;//1:预约单,其他为即时单的状态, 主要是控制乘客上车 乘客下车这几个选项的显示
|
||||
private String[] mContentArrays;
|
||||
private WeakReference<OCHTaxiFragment> mOchTaxiFragmentWeak;
|
||||
private long mOrderId;
|
||||
|
||||
protected OCHTaxiOrderCancelDialog(OCHTaxiFragment fragment, Context context, long orderId, int orderStatus) {
|
||||
super(context,R.style.OrderCancelDialog);
|
||||
mOrderId = orderId;
|
||||
mOchTaxiFragmentWeak = new WeakReference<>(fragment);
|
||||
this.mOrderStatus = orderStatus;
|
||||
contextWeakReference = new WeakReference<>(context);
|
||||
initReasonArray();
|
||||
}
|
||||
|
||||
private void initReasonArray() {
|
||||
if (1 == mOrderStatus) {
|
||||
mContentArrays = new String[]{OrderCancelReasons.BookPassengerCancel.getMsg(), OrderCancelReasons.CarBroken.getMsg(),
|
||||
OrderCancelReasons.BookJourneyConflict.getMsg(), OrderCancelReasons.BatteryLow.getMsg(),
|
||||
OrderCancelReasons.BookOther.getMsg()};
|
||||
return;
|
||||
}
|
||||
OrderStatusEnum ochStatus = OrderStatusEnum.valueOf(mOrderStatus);
|
||||
switch (ochStatus) {
|
||||
case OnTheWayToStartStation:
|
||||
mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
|
||||
OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg()};
|
||||
break;
|
||||
case ArriveAtStartStation:
|
||||
mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
|
||||
OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(),
|
||||
OrderCancelReasons.PassengerNotArrive.getMsg()};
|
||||
break;
|
||||
case OnTheWayToEndStation:
|
||||
case ArriveAtEndStation:
|
||||
mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
|
||||
OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(), OrderCancelReasons.PassengerStopOver.getMsg()};
|
||||
break;
|
||||
default:
|
||||
mContentArrays = new String[]{OrderCancelReasons.CarBroken.getMsg(), OrderCancelReasons.DeviceBroken.getMsg(),
|
||||
OrderCancelReasons.BatteryLow.getMsg(), OrderCancelReasons.DriverIsIll.getMsg(),
|
||||
OrderCancelReasons.PassengerNotArrive.getMsg(), OrderCancelReasons.PassengerStopOver.getMsg()};
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected OCHTaxiOrderCancelDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
|
||||
super(context, cancelable, cancelListener);
|
||||
}
|
||||
|
||||
protected OCHTaxiOrderCancelDialog(Context context, int themeResId) {
|
||||
super(context, themeResId);
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
getWindow().setBackgroundDrawableResource(R.drawable.taxi_order_cancel_dialog_bg);
|
||||
setContentView(R.layout.taxi_order_cancel_view);
|
||||
initView();
|
||||
setCancelable(false);
|
||||
setCanceledOnTouchOutside(false);
|
||||
|
||||
Window window = getWindow();
|
||||
//dialog padding 去掉
|
||||
window.getDecorView().setPadding(0,0,0,0);
|
||||
window.setDimAmount(0.5f);
|
||||
window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));//设置背景, 不然显示不全
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
private void initView() {
|
||||
mContentView = findViewById(R.id.module_och_taxi_order_cancel_content_gv);
|
||||
mCancelCommitTv = findViewById(R.id.order_cancel_commit_tv);
|
||||
mDialogCancelTv = findViewById(R.id.order_dialog_cancel_tv);
|
||||
mContentAdapter = new ContentAdapter(contextWeakReference.get(), mContentArrays);
|
||||
mContentView.setAdapter(mContentAdapter);
|
||||
mContentView.setSelector(new ColorDrawable(Color.TRANSPARENT));
|
||||
mContentView.setOnItemClickListener(this);
|
||||
mCancelCommitTv.setOnClickListener(this);
|
||||
mDialogCancelTv.setOnClickListener(this);
|
||||
mContentView.setOnItemClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v.getId() == R.id.order_cancel_commit_tv) {//bt commit
|
||||
if (!TextUtils.isEmpty(mCurrentReason) && OrderCancelReasons.getType(mCurrentReason) != 0) {
|
||||
if (1 == mOrderStatus){//预约单
|
||||
mOchTaxiFragmentWeak.get().cancelOrderById(mOrderId,OrderCancelReasons.getType(mCurrentReason),mCurrentReason);
|
||||
}else {//即时单
|
||||
mOchTaxiFragmentWeak.get().cancelCurOrder(OrderCancelReasons.getType(mCurrentReason),mCurrentReason);
|
||||
}
|
||||
dismiss();
|
||||
}else {
|
||||
TipToast.longTip("取消原因不能为空");
|
||||
}
|
||||
}else if (v.getId() == R.id.order_dialog_cancel_tv){//close icon
|
||||
mCurrentReason = "";
|
||||
dismiss();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
Log.d(TAG,"mCurrentReason ="+ mContentArrays[position]);
|
||||
mCurrentReason = mContentArrays[position];
|
||||
// GradientDrawable background = (GradientDrawable) mCancelBt.getBackground();//GradientDrawable是Drawable的子类
|
||||
// background.setColor(Color.parseColor("#2B6EFF"));
|
||||
// mCancelBt.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
// mCancelBt.setClickable(true);
|
||||
mContentAdapter.notifyCurrentReasons(mCurrentReason);
|
||||
}
|
||||
|
||||
class ContentAdapter extends BaseAdapter{
|
||||
|
||||
private Context context;
|
||||
private String[] datas;
|
||||
private LayoutInflater layoutInflater;
|
||||
private String currentReasons = "";
|
||||
|
||||
public ContentAdapter(Context context, String[] array){
|
||||
this.context = context;
|
||||
datas = array;
|
||||
layoutInflater = LayoutInflater.from(context);
|
||||
}
|
||||
@Override
|
||||
public int getCount() {
|
||||
return datas.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return datas[position];
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
ViewHolder viewHolder = null;
|
||||
if (convertView == null){
|
||||
convertView = layoutInflater.inflate(R.layout.taxi_order_checkbox_item,null);
|
||||
viewHolder = new ViewHolder();
|
||||
viewHolder.checkBoxTv = convertView.findViewById(R.id.item_checkbox);
|
||||
convertView.setTag(viewHolder);
|
||||
}else {
|
||||
viewHolder = (ViewHolder) convertView.getTag();
|
||||
}
|
||||
viewHolder.checkBoxTv.setText(datas[position]);
|
||||
if(viewHolder.checkBoxTv.getText().toString().equals(currentReasons)){
|
||||
viewHolder.checkBoxTv.setCompoundDrawablesWithIntrinsicBounds(context.getResources().getDrawable(R.drawable.taxi_selected_btn),null,null,null);
|
||||
}else {
|
||||
viewHolder.checkBoxTv.setCompoundDrawablesWithIntrinsicBounds(context.getResources().getDrawable(R.drawable.taxi_unselect_btn),null,null,null);
|
||||
}
|
||||
return convertView;
|
||||
}
|
||||
public void notifyCurrentReasons(String reason){
|
||||
currentReasons = reason;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
class ViewHolder {
|
||||
TextView checkBoxTv;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,533 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderStatusEnum;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.constant.OrderTypeEnum;
|
||||
import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/8/18
|
||||
*/
|
||||
public class OCHTaxiPersonalDialogFragment extends DialogFragment implements View.OnClickListener {
|
||||
|
||||
private final static String TAG = "OCHTaxiOrdersDialog";
|
||||
|
||||
private RelativeLayout mOperationDataRl;
|
||||
private ImageView mCloseIv;
|
||||
private RecyclerView mOrdersRv;
|
||||
private Button mShowOrdersBt;
|
||||
private TabLayout mOperationTab;
|
||||
private ViewPager mOperationViewPager;
|
||||
private OrderAdapter mAdapter;
|
||||
private ConstraintLayout mNoDatas;
|
||||
private List<OrderQueryRespBean.Result> orders = new ArrayList<>();
|
||||
private String[] mTabTitles = {"在线时长","订单完成数"};
|
||||
private List<OCHTaxiOperationDatasFragment> fragments = new ArrayList<>();
|
||||
private int mNextPage = 0;
|
||||
private int mPerPageSize = 10;
|
||||
private static OCHTaxiFragment mTaxiFragment;
|
||||
private static boolean serverHadNoData = false;
|
||||
|
||||
public OCHTaxiPersonalDialogFragment(){
|
||||
}
|
||||
|
||||
public OCHTaxiPersonalDialogFragment(OCHTaxiFragment taxiFragment){
|
||||
mTaxiFragment = taxiFragment;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
// getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
View view = inflater.inflate(R.layout.taxi_orders_list_view, container, false);
|
||||
initView(view);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
setCancelable(false);
|
||||
getDialog().setCanceledOnTouchOutside(true);
|
||||
Window window = getDialog().getWindow();
|
||||
//dialog padding 去掉
|
||||
window.getDecorView().setPadding(0,0,0,0);
|
||||
window.setDimAmount(0f);
|
||||
WindowManager.LayoutParams params = window.getAttributes();
|
||||
params.x = 0;
|
||||
params.y = 0;
|
||||
WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
|
||||
Point point = new Point();
|
||||
windowManager.getDefaultDisplay().getSize(point);
|
||||
params.width = (int)(point.x * 0.375);
|
||||
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
window.setAttributes(params);
|
||||
//设置背景, 不然显示不全
|
||||
window.getDecorView().setBackgroundColor(Color.parseColor("#00FFFFFF"));
|
||||
window.setGravity(Gravity.LEFT|Gravity.BOTTOM);
|
||||
}
|
||||
|
||||
private void initView(View view) {
|
||||
initOperationTabDatas(view);
|
||||
mCloseIv = view.findViewById(R.id.module_och_taxi_order_list_close_iv);
|
||||
mOperationDataRl = view.findViewById(R.id.module_och_taxi_operation_data_rl);
|
||||
mShowOrdersBt = view.findViewById(R.id.module_och_taxi_order_list_show_bt);
|
||||
mOrdersRv = view.findViewById(R.id.module_och_taxi_order_list);
|
||||
|
||||
mNoDatas = view.findViewById(R.id.no_order_data_view);
|
||||
ImageView imageView = view.findViewById(R.id.no_order_data_iv);
|
||||
imageView.setImageResource(R.drawable.no_order_data);
|
||||
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams)imageView.getLayoutParams();
|
||||
params.width = 480;
|
||||
params.height = 480;
|
||||
imageView.setLayoutParams(params);
|
||||
|
||||
mOrdersRv.setVisibility(View.GONE);
|
||||
mNoDatas.setVisibility(View.GONE);
|
||||
|
||||
mShowOrdersBt.setOnClickListener(this);
|
||||
|
||||
mCloseIv.setOnClickListener(this);
|
||||
|
||||
}
|
||||
|
||||
private void initOperationTabDatas(View view) {
|
||||
mOperationTab = view.findViewById(R.id.operation_data_tablayout);
|
||||
mOperationViewPager = view.findViewById(R.id.operation_data_viewpager);
|
||||
for (int i= 0;i < mTabTitles.length; i++){
|
||||
TabLayout.Tab tab = mOperationTab.newTab();
|
||||
tab.view.setBackgroundColor(Color.parseColor("#00000000"));
|
||||
View tabView = View.inflate(getContext(),R.layout.taxi_operation_tab_item_custom,null);
|
||||
TextView tv = tabView.findViewById(R.id.operation_tab_title);
|
||||
tv.setText(mTabTitles[i]);
|
||||
tab.setCustomView(tabView);
|
||||
if (0 == i){
|
||||
mOperationTab.addTab(tab,true);
|
||||
changeOperationTabLayoutTabUI(tab,true);
|
||||
fragments.add(OCHTaxiOperationDatasFragment.newInstance(getActivity(),0));
|
||||
}else if (1 == i){
|
||||
mOperationTab.addTab(tab);
|
||||
changeOperationTabLayoutTabUI(tab,false);
|
||||
fragments.add(OCHTaxiOperationDatasFragment.newInstance(getActivity(),1));
|
||||
}
|
||||
}
|
||||
mOperationTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onTabSelected(TabLayout.Tab tab) {
|
||||
mOperationViewPager.setCurrentItem(tab.getPosition());
|
||||
changeOperationTabLayoutTabUI(tab,true);
|
||||
fragments.get(tab.getPosition()).setmType(tab.getPosition());
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onTabUnselected(TabLayout.Tab tab) {
|
||||
changeOperationTabLayoutTabUI(tab,false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabReselected(TabLayout.Tab tab) {
|
||||
|
||||
}
|
||||
});
|
||||
mOperationViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
mOperationTab.getTabAt(position).select();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
}
|
||||
});
|
||||
mOperationViewPager.setAdapter(new OrdersOperationFragmentAdapter(getChildFragmentManager()
|
||||
, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT));
|
||||
fragments.get(0).setmType(0);
|
||||
|
||||
if (mTaxiFragment == null){
|
||||
dismiss();
|
||||
}else {
|
||||
mTaxiFragment.queryDriverServiceData();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新运营数据 时间和订单数
|
||||
* @param dailyTimeDuration
|
||||
* @param dailyOrderNum
|
||||
*/
|
||||
public void onServiceDataUpdate(long dailyTimeDuration, long dailyOrderNum){
|
||||
for (int i=0; i< fragments.size();i++){
|
||||
fragments.get(i).updateData(dailyTimeDuration,dailyOrderNum);
|
||||
}
|
||||
}
|
||||
|
||||
private void changeOperationTabLayoutTabUI(TabLayout.Tab tab, boolean isSelected) {
|
||||
TextView textView = (TextView) tab.getCustomView().findViewById(R.id.operation_tab_title);
|
||||
ImageView imageView = (ImageView) tab.getCustomView().findViewById(R.id.operation_tab_line_iv);
|
||||
if (isSelected){
|
||||
textView.setTextSize(23);
|
||||
Log.d(TAG,"SelectTv = "+ textView.getText());
|
||||
textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
|
||||
textView.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
imageView.setImageDrawable(getResources().getDrawable(R.drawable.taxi_driver_operation_tab_line));
|
||||
}else {
|
||||
textView.setTextSize(20);
|
||||
Log.d(TAG,"unSelectTv = "+ textView.getText());
|
||||
textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
|
||||
textView.setTextColor(Color.parseColor("#A7B6F0"));
|
||||
imageView.setImageDrawable(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v.getId() == R.id.module_och_taxi_order_list_close_iv){
|
||||
dismiss();
|
||||
}else {
|
||||
mOrdersRv.setVisibility(View.VISIBLE);
|
||||
mOperationDataRl.setVisibility(View.GONE);
|
||||
mNoDatas.setVisibility(View.GONE);
|
||||
initOrdersView();
|
||||
requestOrdersList(mNextPage, mPerPageSize);
|
||||
}
|
||||
}
|
||||
|
||||
private void initOrdersView() {
|
||||
mAdapter = new OrderAdapter(getContext(),orders);
|
||||
LinearLayoutManager manager = new LinearLayoutManager(getContext());
|
||||
mOrdersRv.setLayoutManager(manager);
|
||||
mOrdersRv.addOnScrollListener(new OnTaxiOrderRvOnScrollListener() {
|
||||
@Override
|
||||
public void onLoadMore() {
|
||||
if (!serverHadNoData){
|
||||
requestOrdersList(mNextPage, mPerPageSize);
|
||||
}
|
||||
}
|
||||
});
|
||||
mOrdersRv.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求订单数据
|
||||
* @param page
|
||||
* @param size
|
||||
*/
|
||||
private void requestOrdersList(int page, int size){
|
||||
mTaxiFragment.queryOrdersList(page,size);
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单数据结果返回
|
||||
* @param ordersList
|
||||
*/
|
||||
public void onOrdersListPageRefresh(List<OrderQueryRespBean.Result> ordersList){
|
||||
if (null == ordersList && mNextPage == 0){//无数据
|
||||
mOrdersRv.setVisibility(View.GONE);
|
||||
mNoDatas.setVisibility(View.VISIBLE);
|
||||
return;
|
||||
}
|
||||
mOrdersRv.setVisibility(View.VISIBLE);
|
||||
mNoDatas.setVisibility(View.GONE);
|
||||
if ((null == ordersList) || (ordersList.size() < mPerPageSize && mNextPage > 0)){//已经没有更多数据,提示无数据
|
||||
//已经没有更多数据
|
||||
serverHadNoData = true;
|
||||
orders.addAll(ordersList);
|
||||
mAdapter.notifyDataSetChanged();
|
||||
mNextPage = mNextPage +1;
|
||||
return;
|
||||
}
|
||||
serverHadNoData = false;
|
||||
orders.addAll(ordersList);
|
||||
mAdapter.notifyDataSetChanged();
|
||||
mNextPage = mNextPage +1;
|
||||
}
|
||||
|
||||
class OrderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
|
||||
private static final int ORDER_DETAIL_ITEM = 0;
|
||||
private static final int DAY_GROUP_ITEM = 1;
|
||||
private Context context;
|
||||
List<OrderQueryRespBean.Result> orders;
|
||||
public OrderAdapter(Context context,List<OrderQueryRespBean.Result> datas){
|
||||
this.context = context;
|
||||
this.orders = datas;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if (viewType == ORDER_DETAIL_ITEM){
|
||||
View view = LayoutInflater.from(context).inflate(R.layout.taxi_orders_list_item,parent
|
||||
,false);
|
||||
OrderDetailViewHolder viewHolder = new OrderDetailViewHolder(view);
|
||||
return viewHolder;
|
||||
}else if (viewType == DAY_GROUP_ITEM){
|
||||
View view = LayoutInflater.from(context).inflate(R.layout.taxi_orders_list_day_item,parent
|
||||
,false);
|
||||
DayGroupViewHolder viewHolder = new DayGroupViewHolder(view);
|
||||
return viewHolder;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
OrderQueryRespBean.Result queryRespBean = orders.get(position);
|
||||
if (null == queryRespBean) return;
|
||||
if (holder instanceof DayGroupViewHolder){
|
||||
DayGroupViewHolder groupViewHolder = (DayGroupViewHolder)holder;
|
||||
groupViewHolder.dayGroupTv.setText(OchTaxiUtils.getYMDTime(queryRespBean.createTime));
|
||||
bindOrderDetailData(queryRespBean,groupViewHolder.orderTimeTv,groupViewHolder.startStationTv
|
||||
, groupViewHolder.endStationTv, groupViewHolder.orderStatusBt,groupViewHolder.orderTypeBt
|
||||
,groupViewHolder.orderNumTv);
|
||||
if (isNoLineItem(position)){
|
||||
groupViewHolder.dividerLine.setVisibility(View.VISIBLE);
|
||||
}else {
|
||||
groupViewHolder.dividerLine.setVisibility(View.GONE);
|
||||
}
|
||||
if (position == orders.size()-1 && serverHadNoData){
|
||||
groupViewHolder.mBootNoDataView.setVisibility(View.VISIBLE);
|
||||
}else {
|
||||
groupViewHolder.mBootNoDataView.setVisibility(View.GONE);
|
||||
}
|
||||
}else if (holder instanceof OrderDetailViewHolder){
|
||||
OrderDetailViewHolder detailViewHolder = (OrderDetailViewHolder)holder;
|
||||
bindOrderDetailData(queryRespBean,detailViewHolder.orderTimeTv,
|
||||
detailViewHolder.startStationTv,detailViewHolder.endStationTv,
|
||||
detailViewHolder.orderStatusBt,detailViewHolder.orderTypeBt,detailViewHolder.orderNumTv);
|
||||
if (isNoLineItem(position)){
|
||||
detailViewHolder.dividerLine.setVisibility(View.VISIBLE);
|
||||
}else {
|
||||
detailViewHolder.dividerLine.setVisibility(View.GONE);
|
||||
}
|
||||
if (position == orders.size()-1 && serverHadNoData){
|
||||
detailViewHolder.mBootNoDataView.setVisibility(View.VISIBLE);
|
||||
}else {
|
||||
detailViewHolder.mBootNoDataView.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
//第一个要显示时间
|
||||
if (position == 0){
|
||||
return DAY_GROUP_ITEM;
|
||||
}
|
||||
String currentDate = OchTaxiUtils.getYMDTime(orders.get(position).createTime);//获取当前订单时间
|
||||
int prevIndex = position - 1;
|
||||
String preDate = OchTaxiUtils.getYMDTime(orders.get(prevIndex).createTime);
|
||||
boolean isDifferent = !preDate.equals(currentDate);//前一个订单的日期跟第二个订单的日期是否一致
|
||||
return isDifferent ? DAY_GROUP_ITEM : ORDER_DETAIL_ITEM;//一样订单详情, 不一样新添加分组
|
||||
}
|
||||
|
||||
private boolean isNoLineItem(int position){
|
||||
if (position == orders.size() -1){
|
||||
return false;
|
||||
}else {
|
||||
String currentDate = OchTaxiUtils.getYMDTime(orders.get(position).createTime);//获取当前订单时间
|
||||
int nextIndex = position + 1;
|
||||
String preDate = OchTaxiUtils.getYMDTime(orders.get(nextIndex).createTime);
|
||||
boolean isDifferent = preDate.equals(currentDate);//订单跟后一个订单是否是同一天
|
||||
return isDifferent;//一样有划分线, 不一样没有划分线
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return orders.size();
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private void bindOrderDetailData(OrderQueryRespBean.Result queryRespBean, TextView orderTimeTv,
|
||||
TextView startStationTv, TextView endStationTv,
|
||||
Button orderStatusBt, Button orderTypeBt, TextView orderNumTv){
|
||||
Calendar calendar= Calendar.getInstance();
|
||||
calendar.setTimeInMillis(queryRespBean.createTime);
|
||||
orderTimeTv.setText(OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
|
||||
startStationTv.setText(queryRespBean.startSiteAddr);
|
||||
endStationTv.setText(queryRespBean.endSiteAddr);
|
||||
orderStatusBt.setText(getOrderStatus(queryRespBean.orderStatus,orderStatusBt));
|
||||
orderTypeBt.setText(getOrderType(queryRespBean.orderType,orderTypeBt));
|
||||
orderNumTv.setText("订单编号:"+String.valueOf(queryRespBean.orderId));
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private String getOrderStatus(int status, Button button){
|
||||
OrderStatusEnum orderStatus = OrderStatusEnum.valueOf(status);
|
||||
switch (orderStatus){
|
||||
case JourneyCompleted:
|
||||
button.setBackground(context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg));
|
||||
return "已完成";
|
||||
case Cancel:
|
||||
button.setBackground(context.getDrawable(R.drawable.taxi_order_button_status_canceled_bg));
|
||||
return "已取消";
|
||||
default:
|
||||
button.setBackground(context.getDrawable(R.drawable.taxi_order_button_status_bg));
|
||||
return "服务中";
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private String getOrderType(int type, Button button){
|
||||
if (type == OrderTypeEnum.Reserved.getType()){
|
||||
button.setBackground(context.getDrawable(R.drawable.taxi_order_button_type_reserver_bg));
|
||||
return "预约单";
|
||||
}else{
|
||||
button.setBackground(context.getDrawable(R.drawable.taxi_order_button_type_bg));
|
||||
return "即时单";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class OrderDetailViewHolder extends RecyclerView.ViewHolder{
|
||||
|
||||
protected TextView orderTimeTv;
|
||||
protected Button orderStatusBt;
|
||||
protected TextView startStationTv;
|
||||
protected TextView endStationTv;
|
||||
protected TextView orderNumTv;
|
||||
protected Button orderTypeBt;
|
||||
protected View dividerLine;
|
||||
protected View mBootNoDataView;
|
||||
|
||||
public OrderDetailViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
orderTimeTv = itemView.findViewById(R.id.order_time_hm_tv);
|
||||
orderStatusBt = itemView.findViewById(R.id.order_status_bt);
|
||||
startStationTv = itemView.findViewById(R.id.grab_order_start_station);
|
||||
endStationTv = itemView.findViewById(R.id.grab_order_end_station);
|
||||
orderNumTv = itemView.findViewById(R.id.order_num);
|
||||
orderTypeBt = itemView.findViewById(R.id.order_type_bt);
|
||||
dividerLine = itemView.findViewById(R.id.module_och_taxi_order_divider);
|
||||
mBootNoDataView = itemView.findViewById(R.id.boot_refresh_no_data_view);
|
||||
if (DebugConfig.isDebug()){
|
||||
// TODO: 2021/11/23 因当前上线版本均打开了debug,所以此处隐藏orderId
|
||||
orderNumTv.setVisibility(View.GONE);
|
||||
}else {
|
||||
orderNumTv.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DayGroupViewHolder extends OrderDetailViewHolder{
|
||||
|
||||
private TextView dayGroupTv;
|
||||
public DayGroupViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
dayGroupTv = itemView.findViewById(R.id.order_day_tv);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class OnTaxiOrderRvOnScrollListener extends RecyclerView.OnScrollListener{
|
||||
|
||||
private boolean isUpwardSliding = false;
|
||||
|
||||
@Override
|
||||
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
|
||||
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
|
||||
//不滑动
|
||||
if (manager instanceof LinearLayoutManager && newState == SCROLL_STATE_IDLE){
|
||||
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager;
|
||||
int lastItemPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
|
||||
int itemCount = linearLayoutManager.getItemCount();
|
||||
Log.d(TAG,"lastItemPosition=="+lastItemPosition+",itemCount=="+itemCount);
|
||||
//向上滑动到最后一个
|
||||
if ((lastItemPosition == itemCount-1) && isUpwardSliding){
|
||||
onLoadMore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
||||
super.onScrolled(recyclerView, dx, dy);
|
||||
isUpwardSliding = dy > 0;
|
||||
}
|
||||
public abstract void onLoadMore();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dismiss() {
|
||||
super.dismiss();
|
||||
mNextPage = 0;
|
||||
orders.clear();
|
||||
}
|
||||
|
||||
private class OrdersOperationFragmentAdapter extends FragmentPagerAdapter{
|
||||
|
||||
public OrdersOperationFragmentAdapter(@NonNull FragmentManager fm, int behavior) {
|
||||
super(fm, behavior);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
return fragments.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return fragments.size();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
return mTabTitles[position];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Path;
|
||||
import android.os.Build;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.appcompat.widget.AppCompatImageView;
|
||||
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/9/29
|
||||
*/
|
||||
public class OCHTaxiRadiuImageView extends AppCompatImageView {
|
||||
private float width, height;
|
||||
private int defaultRadius = 0;
|
||||
private int radius;
|
||||
private int leftTopRadius;
|
||||
private int rightTopRadius;
|
||||
private int rightBottomRadius;
|
||||
private int leftBottomRadius;
|
||||
|
||||
|
||||
public OCHTaxiRadiuImageView(Context context) {
|
||||
this(context, null);
|
||||
init(context, null);
|
||||
}
|
||||
|
||||
public OCHTaxiRadiuImageView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
public OCHTaxiRadiuImageView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
private void init(Context context, AttributeSet attrs) {
|
||||
if (Build.VERSION.SDK_INT < 18) {
|
||||
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
||||
}
|
||||
// 读取配置
|
||||
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RoundCornerImageView);
|
||||
radius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_radius, defaultRadius);
|
||||
leftTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_left_top_radius, defaultRadius);
|
||||
rightTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_right_top_radius, defaultRadius);
|
||||
rightBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_right_bottom_radius, defaultRadius);
|
||||
leftBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_taxi_left_bottom_radius, defaultRadius);
|
||||
|
||||
|
||||
if (defaultRadius == leftTopRadius) {
|
||||
leftTopRadius = radius;
|
||||
}
|
||||
if (defaultRadius == rightTopRadius) {
|
||||
rightTopRadius = radius;
|
||||
}
|
||||
if (defaultRadius == rightBottomRadius) {
|
||||
rightBottomRadius = radius;
|
||||
}
|
||||
if (defaultRadius == leftBottomRadius) {
|
||||
leftBottomRadius = radius;
|
||||
}
|
||||
array.recycle();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
width = getWidth();
|
||||
height = getHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
//这里做下判断,只有图片的宽高大于设置的圆角距离的时候才进行裁剪
|
||||
int maxLeft = Math.max(leftTopRadius, leftBottomRadius);
|
||||
int maxRight = Math.max(rightTopRadius, rightBottomRadius);
|
||||
int minWidth = maxLeft + maxRight;
|
||||
int maxTop = Math.max(leftTopRadius, rightTopRadius);
|
||||
int maxBottom = Math.max(leftBottomRadius, rightBottomRadius);
|
||||
int minHeight = maxTop + maxBottom;
|
||||
if (width >= minWidth && height > minHeight) {
|
||||
Path path = new Path();
|
||||
//右上,右下,左下,左上
|
||||
path.moveTo(leftTopRadius, 0);
|
||||
path.lineTo(width - rightTopRadius, 0);
|
||||
path.quadTo(width, 0, width, rightTopRadius);
|
||||
|
||||
path.lineTo(width, height - rightBottomRadius);
|
||||
path.quadTo(width, height, width - rightBottomRadius, height);
|
||||
|
||||
path.lineTo(leftBottomRadius, height);
|
||||
path.quadTo(0, height, 0, height - leftBottomRadius);
|
||||
|
||||
path.lineTo(0, leftTopRadius);
|
||||
path.quadTo(0, 0, leftTopRadius, 0);
|
||||
|
||||
canvas.clipPath(path);
|
||||
}
|
||||
super.onDraw(canvas);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,183 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.utils.OchTaxiUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2021/9/2
|
||||
* 待服务订单列表
|
||||
*/
|
||||
public class OCHTaxiReserveOrdersFragment extends BaseTaxiUIFragment {
|
||||
|
||||
private RecyclerView mRecyclerView;
|
||||
private TextView mNodataTv;
|
||||
private ConstraintLayout mNoDataView;
|
||||
private View mBootRefreshNoDataView;
|
||||
private List<OrderQueryRespBean.Result> mDatas = new ArrayList<>();
|
||||
private ToBeServedOrdersAdapter mAdapter;
|
||||
private static OCHTaxiFragment mTaxiFragment;
|
||||
private static Activity mActivity;
|
||||
private boolean isUpwardSliding = false;
|
||||
|
||||
public static OCHTaxiReserveOrdersFragment newInstance(Activity activity, OCHTaxiFragment taxiFragment){
|
||||
mActivity = activity;
|
||||
mTaxiFragment = taxiFragment;
|
||||
Bundle args = new Bundle();
|
||||
OCHTaxiReserveOrdersFragment fragment = new OCHTaxiReserveOrdersFragment();
|
||||
fragment.setArguments( args );
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_reserve_orders;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews(View view) {
|
||||
mRecyclerView = view.findViewById(R.id.order_to_be_served_rv);
|
||||
mNodataTv = view.findViewById(R.id.no_order_data_tv);
|
||||
mNoDataView = view.findViewById(R.id.no_order_data_view);
|
||||
mNodataTv.setText("暂无待服务订单");
|
||||
mBootRefreshNoDataView = view.findViewById(R.id.list_boot_refresh_no_data_view);
|
||||
mBootRefreshNoDataView.setVisibility(View.GONE);
|
||||
mAdapter = new ToBeServedOrdersAdapter(getActivity(),mDatas);
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(getParentFragment().getActivity()));
|
||||
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||
@Override
|
||||
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
|
||||
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
|
||||
//不滑动
|
||||
if (manager instanceof LinearLayoutManager && newState == SCROLL_STATE_IDLE){
|
||||
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager;
|
||||
int lastItemPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
|
||||
int itemCount = manager.getItemCount();
|
||||
if ((lastItemPosition == itemCount-1) && !isUpwardSliding){
|
||||
//显示没有更多数据
|
||||
mBootRefreshNoDataView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
||||
super.onScrolled(recyclerView, dx, dy);
|
||||
isUpwardSliding = dy > 0;
|
||||
}
|
||||
});
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
}
|
||||
public void onOrdersWaitServiceChanged(List<OrderQueryRespBean.Result> waitServiceList){//待服务订单展示
|
||||
if (waitServiceList.size() == 0){
|
||||
showNoDataTip();
|
||||
return;
|
||||
}
|
||||
mNoDataView.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mDatas.clear();
|
||||
mDatas.addAll(waitServiceList);
|
||||
mAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void showNoDataTip() {
|
||||
mBootRefreshNoDataView.setVisibility(View.GONE);
|
||||
mNoDataView.setVisibility(View.VISIBLE);
|
||||
mRecyclerView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
class ToBeServedOrdersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
|
||||
private List<OrderQueryRespBean.Result> datas;
|
||||
private Context context;
|
||||
public ToBeServedOrdersAdapter(Context context, List<OrderQueryRespBean.Result> datas){
|
||||
this.datas = datas;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(context).inflate(R.layout.taxi_order_reserve_item,parent,false);
|
||||
ToBeServedOrdersViewHolder viewHolder = new ToBeServedOrdersViewHolder(view);
|
||||
return viewHolder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
if (datas != null && datas.size() >0 ){
|
||||
ToBeServedOrdersViewHolder viewHolder = (ToBeServedOrdersViewHolder)holder;
|
||||
OrderQueryRespBean.Result order = datas.get(position);
|
||||
Calendar calendar = OchTaxiUtils.formatLongToCalendar(order.bookingTime);
|
||||
if (OchTaxiUtils.compareDateIsCurrentDay(calendar)){
|
||||
viewHolder.orderTime.setText("用车时间:今天"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_HH_mm));
|
||||
}else {
|
||||
viewHolder.orderTime.setText("用车时间:"+OchTaxiUtils.formatCalendarToString(calendar,OchTaxiUtils.TAXI_MM_dd_HH_mm));
|
||||
}
|
||||
viewHolder.orderCancel.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
new OCHTaxiOrderCancelDialog(mTaxiFragment,context,order.orderId,1).show();
|
||||
}
|
||||
});
|
||||
viewHolder.startStation.setText(order.startSiteAddr);
|
||||
viewHolder.endStation.setText(order.endSiteAddr);
|
||||
if (position == mDatas.size() -1){
|
||||
viewHolder.deliverLine.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return datas.size();
|
||||
}
|
||||
}
|
||||
class ToBeServedOrdersViewHolder extends RecyclerView.ViewHolder{
|
||||
TextView orderTime;
|
||||
ImageView orderCancel;
|
||||
TextView startStation;
|
||||
TextView endStation;
|
||||
View deliverLine;
|
||||
public ToBeServedOrdersViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
orderTime = itemView.findViewById(R.id.to_be_order_time);
|
||||
orderCancel = itemView.findViewById(R.id.to_be_order_cancel_iv);
|
||||
startStation = itemView.findViewById(R.id.base_start_station);
|
||||
endStation = itemView.findViewById(R.id.base_end_station);
|
||||
deliverLine = itemView.findViewById(R.id.to_be_order_divider);
|
||||
}
|
||||
}
|
||||
public void onOrderCancelDone(long orderId){
|
||||
TipToast.tip("订单取消成功");
|
||||
for (int i=0; i< mDatas.size();i++){
|
||||
OrderQueryRespBean.Result result = mDatas.get(i);
|
||||
if (orderId == result.orderId){
|
||||
mDatas.remove(i);
|
||||
mAdapter.notifyDataSetChanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,214 +0,0 @@
|
||||
package com.mogo.och.taxi.passenger.ui;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRouteInfoRespBean;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2021/1/18
|
||||
*
|
||||
* 网约车-出租车UI
|
||||
*/
|
||||
public class OCHTaxiServerOrdersFragment extends BaseTaxiUIFragment {
|
||||
|
||||
public static final String TAG = "OCHTaxiFragment";
|
||||
|
||||
public static OCHTaxiServerOrdersFragment newInstance() {
|
||||
|
||||
Bundle args = new Bundle();
|
||||
|
||||
OCHTaxiServerOrdersFragment fragment = new OCHTaxiServerOrdersFragment();
|
||||
fragment.setArguments( args );
|
||||
return fragment;
|
||||
}
|
||||
private FragmentTransaction mFragmentTransaction;
|
||||
private TabLayout mTaxiOrderTab;
|
||||
private TextView mWaitOrderSum;
|
||||
private ViewPager mTaxiOrderPager;
|
||||
private String[] mTabTitles = {"进行中","待服务"};
|
||||
private List<Fragment> fragments = new ArrayList<>();
|
||||
private OCHTaxiBeingServerdOrdersFragment beingServerdOrdersFragment = null;
|
||||
private OCHTaxiReserveOrdersFragment reserveOrdersFragment = null;
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_server_orders_panel;
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
protected void initViews(View view) {
|
||||
initOrderTab(view);
|
||||
}
|
||||
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private void initOrderTab(View view) {
|
||||
mWaitOrderSum = view.findViewById(R.id.wait_order_num);
|
||||
mTaxiOrderTab = view.findViewById(R.id.module_och_taxi_tab);
|
||||
mTaxiOrderPager = view.findViewById(R.id.module_och_taxi_view_pager);
|
||||
for (int i= 0;i < mTabTitles.length; i++){
|
||||
TabLayout.Tab tab = mTaxiOrderTab.newTab();
|
||||
tab.view.setBackgroundColor(Color.parseColor("#00000000"));
|
||||
View tabView = View.inflate(getActivity(),R.layout.taxi_tab_item_custom,null);
|
||||
TextView tv = tabView.findViewById(R.id.tab_title);
|
||||
tv.setText(mTabTitles[i]);
|
||||
tab.setCustomView(tabView);
|
||||
if (0 == i){
|
||||
mTaxiOrderTab.addTab(tab,true);
|
||||
changeTabLayoutTabUI(tab,true);
|
||||
beingServerdOrdersFragment = OCHTaxiBeingServerdOrdersFragment.newInstance(getActivity(),(OCHTaxiFragment) getParentFragment());
|
||||
fragments.add(beingServerdOrdersFragment);
|
||||
}else if (1 == i){
|
||||
mTaxiOrderTab.addTab(tab);
|
||||
changeTabLayoutTabUI(tab,false);
|
||||
reserveOrdersFragment = OCHTaxiReserveOrdersFragment.newInstance(getActivity(),(OCHTaxiFragment) getParentFragment());
|
||||
fragments.add(reserveOrdersFragment);
|
||||
}
|
||||
|
||||
}
|
||||
Log.d(TAG,"activity="+getActivity());
|
||||
mTaxiOrderTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onTabSelected(TabLayout.Tab tab) {
|
||||
mTaxiOrderPager.setCurrentItem(tab.getPosition());
|
||||
changeTabLayoutTabUI(tab,true);
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onTabUnselected(TabLayout.Tab tab) {
|
||||
changeTabLayoutTabUI(tab,false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTabReselected(TabLayout.Tab tab) {
|
||||
|
||||
}
|
||||
});
|
||||
mTaxiOrderPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
mTaxiOrderTab.getTabAt(position).select();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
}
|
||||
});
|
||||
mTaxiOrderPager.setAdapter(new OrdersFragmentAdapter(getChildFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT));
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private void changeTabLayoutTabUI(TabLayout.Tab tab, boolean isSelected){
|
||||
TextView textView = (TextView) tab.getCustomView().findViewById(R.id.tab_title);
|
||||
if (isSelected){
|
||||
textView.setBackground(getActivity().getDrawable(R.drawable.taxi_driver_tab_item_bg));
|
||||
textView.setTextSize(20);
|
||||
Log.d(TAG,"SelectTv = "+ textView.getText());
|
||||
textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
|
||||
textView.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
}else {
|
||||
textView.setBackground(null);
|
||||
textView.setTextSize(18);
|
||||
Log.d(TAG,"unSelectTv = "+ textView.getText());
|
||||
textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
|
||||
textView.setTextColor(Color.parseColor("#CCD4F5"));
|
||||
}
|
||||
}
|
||||
|
||||
class OrdersFragmentAdapter extends FragmentPagerAdapter{
|
||||
|
||||
private FragmentManager fragmentManager;
|
||||
|
||||
public OrdersFragmentAdapter(@NonNull FragmentManager fm, int behavior) {
|
||||
super(fm, behavior);
|
||||
this.fragmentManager = fm;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
Logger.d( TAG, "getItem="+position);
|
||||
return fragments.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return fragments.size();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
Logger.d( TAG, "getPageTitle="+position);
|
||||
return mTabTitles[position];
|
||||
}
|
||||
}
|
||||
@RequiresApi(api = Build.VERSION_CODES.P)
|
||||
public void updateCurrentOrderStatusChanged(OrderQueryRespBean.Result order){
|
||||
if (beingServerdOrdersFragment != null){
|
||||
mTaxiOrderTab.getTabAt(0).select();
|
||||
beingServerdOrdersFragment.updateCurrentOrderStatusChanged(order);
|
||||
}
|
||||
}
|
||||
public void onOrdersWaitServiceChanged(List<OrderQueryRespBean.Result> waitServiceList){
|
||||
if (waitServiceList.size() == 0){
|
||||
mWaitOrderSum.setVisibility(View.GONE);
|
||||
}else {
|
||||
mWaitOrderSum.setText(String.valueOf(waitServiceList.size()));
|
||||
mWaitOrderSum.setVisibility(View.VISIBLE);
|
||||
}
|
||||
if (null == reserveOrdersFragment) return;
|
||||
reserveOrdersFragment.onOrdersWaitServiceChanged(waitServiceList);
|
||||
}
|
||||
public void onOrderCancelDone(long orderId){
|
||||
if (null == reserveOrdersFragment) return;
|
||||
reserveOrdersFragment.onOrderCancelDone(orderId);
|
||||
}
|
||||
public void onCurrentOrderCancelDone(){
|
||||
if (null == beingServerdOrdersFragment) return;
|
||||
beingServerdOrdersFragment.onCurrentOrderCancelDone();
|
||||
}
|
||||
public void onCurrentOrderDistToStartChanged(long meters, long timeInSecond){
|
||||
if (null == beingServerdOrdersFragment) return;
|
||||
beingServerdOrdersFragment.updateDistanceAndTime(meters,timeInSecond);
|
||||
}
|
||||
public void onCurrentOrderDistToEndChanged(long meters, long timeInSecond){
|
||||
if (null == beingServerdOrdersFragment) return;
|
||||
beingServerdOrdersFragment.updateDistanceAndTime(meters,timeInSecond);
|
||||
}
|
||||
public void onCurrentOrderRouteInfoGot(OrderQueryRouteInfoRespBean.Result routeInfo){
|
||||
if (null == beingServerdOrdersFragment) return;
|
||||
beingServerdOrdersFragment.onCurrentOrderRouteInfoGot(routeInfo);
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,6 @@ import android.graphics.drawable.AnimationDrawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.animation.LinearInterpolator;
|
||||
import android.widget.FrameLayout;
|
||||
@@ -14,30 +13,29 @@ import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.Group;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import com.mogo.commons.AbsMogoApplication;
|
||||
import com.mogo.commons.debug.DebugConfig;
|
||||
import com.mogo.commons.mvp.IView;
|
||||
import com.mogo.commons.mvp.MvpFragment;
|
||||
import com.mogo.commons.mvp.Presenter;
|
||||
import com.mogo.commons.voice.AIAssist;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
|
||||
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
|
||||
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
|
||||
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
|
||||
import com.mogo.eagle.core.function.call.map.CallerSmpManager;
|
||||
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
|
||||
import com.mogo.map.listener.IMogoMapListener;
|
||||
import com.mogo.map.uicontroller.VisualAngleMode;
|
||||
import com.mogo.module.common.MogoApisHandler;
|
||||
import com.mogo.module.common.constants.DataTypes;
|
||||
import com.mogo.module.common.view.OnPreventFastClickListener;
|
||||
import com.mogo.och.taxi.passenger.R;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.presenter.BaseTaxiPassengerPresenter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
@@ -47,51 +45,48 @@ import com.mogo.och.taxi.passenger.R;
|
||||
*
|
||||
* @author tongchenfei
|
||||
*/
|
||||
public abstract class BaseOchTaxiTabFragment<V extends IView, P extends Presenter<V>> extends MvpFragment<V, P> implements IMogoMapListener {
|
||||
public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFragment, BaseTaxiPassengerPresenter> implements IMogoMapListener, TaxiPassengerTaxiView {
|
||||
|
||||
private static final String TAG = "BaseOchFragment";
|
||||
static final String TAG = "BaseOchFragment";
|
||||
private LinearLayout ctvAutopilotStatus;
|
||||
protected TextView tvOperationStatus;
|
||||
public boolean isOperationStatus;//false-收车,true-出车
|
||||
protected FrameLayout flStationPanelContainer;
|
||||
private FrameLayout flNaviPanelContainer;
|
||||
private Group groupTestPanel;
|
||||
private TextView mSpeedView;
|
||||
private ImageView mAutopilotImage;
|
||||
private TextView mAutopilotTv;
|
||||
private LinearLayout mMapswitchBtn;
|
||||
private ImageView mCloseNaviIcon;
|
||||
protected LinearLayout mPersonalBtn;
|
||||
protected LinearLayout mSettingBtn;
|
||||
protected OCHNaviFragment ochNaviFragment = null;
|
||||
protected TaxiPassengerServingOrderFragment ochServingOrderFragment = null;
|
||||
|
||||
private Handler mHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
protected double mCurLatitude = 0.0;
|
||||
protected double mCurLongitude = 0.0;
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.taxi_base_fragment;
|
||||
return R.layout.taxi_p_base_fragment;
|
||||
}
|
||||
|
||||
private View panelView;
|
||||
@Override
|
||||
public String getTagName() {
|
||||
return "BaseOchTaxiPassengerFragment";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initViews() {
|
||||
//隐藏小地图
|
||||
CallerSmpManager.hidePanel();
|
||||
|
||||
groupTestPanel = findViewById(R.id.groupTestPanel);
|
||||
ctvAutopilotStatus = findViewById(R.id.module_mogo_och_autopilot_status);
|
||||
ctvAutopilotStatus.setBackground(getResources().getDrawable(R.drawable.taxi_autopilot_bg_selector));
|
||||
mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
|
||||
mAutopilotTv = findViewById(R.id.module_och_autopilot_tv);
|
||||
flStationPanelContainer = findViewById(R.id.module_mogo_och_station_panel_container);
|
||||
mPersonalBtn = findViewById(R.id.module_och_taxi_personal_layout);
|
||||
mSpeedView = findViewById(R.id.module_mogo_och_speed_tv);
|
||||
mCloseNaviIcon = findViewById(R.id.taxi_close_navi_icon);
|
||||
flNaviPanelContainer = findViewById(R.id.module_mogo_och_navi_panel_container);
|
||||
|
||||
if (DebugConfig.isDebug()) {
|
||||
mSpeedView.setLongClickable(true);
|
||||
// TODO: 2021/11/27 暂去除此调试功能
|
||||
// mSpeedView.setOnClickListener(v -> {
|
||||
// onAutopilotStatusChanged(false);
|
||||
// });
|
||||
mSpeedView.setOnLongClickListener(v -> {
|
||||
Log.d(TAG,"长按显示状态工具栏");
|
||||
Intent intent = new Intent();
|
||||
@@ -100,7 +95,7 @@ public abstract class BaseOchTaxiTabFragment<V extends IView, P extends Presente
|
||||
return true;
|
||||
});
|
||||
}
|
||||
tvOperationStatus = findViewById(R.id.module_mogo_och_operation_status);
|
||||
|
||||
mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_layout);
|
||||
mMapswitchBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
@@ -117,86 +112,9 @@ public abstract class BaseOchTaxiTabFragment<V extends IView, P extends Presente
|
||||
}
|
||||
}
|
||||
});
|
||||
mPersonalBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
onGoToTaxiOrders();
|
||||
}
|
||||
});
|
||||
|
||||
mSettingBtn = findViewById(R.id.module_och_taxi_setting_layout);
|
||||
mSettingBtn.setOnClickListener(v -> {
|
||||
// TODO: 2021/12/9
|
||||
CallerHmiManager.INSTANCE.showToolsView();
|
||||
});
|
||||
panelView = LayoutInflater.from(getContext()).inflate(getStationPanelViewId(), flStationPanelContainer);
|
||||
ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() {
|
||||
@Override
|
||||
public void onClickImpl(View v) {
|
||||
// 如果能自动驾驶,就自动驾驶,不能就提示
|
||||
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
|
||||
restartAutopilot();
|
||||
}
|
||||
// TODO: 2021/11/27 通过开启结果更新ui
|
||||
// onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING);
|
||||
}
|
||||
});
|
||||
|
||||
// debug下调用测试面板
|
||||
// if (DebugConfig.isDebug()) {
|
||||
// ctvAutopilotStatus.setOnLongClickListener(v -> {
|
||||
// if (groupTestPanel.getVisibility() == View.VISIBLE) {
|
||||
groupTestPanel.setVisibility(View.GONE);
|
||||
// } else {
|
||||
// groupTestPanel.setVisibility(View.VISIBLE);
|
||||
// }
|
||||
// return false;
|
||||
// });
|
||||
// }
|
||||
|
||||
onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState());
|
||||
|
||||
// 模拟 不可自动驾驶,目前场景是刚开机,adas还未和工控机连接
|
||||
// findViewById(R.id.btnAutopilotDisable).setOnClickListener(view ->
|
||||
// {
|
||||
// MogoApisHandler.getInstance().getApis()
|
||||
// .getAdasControllerApi()
|
||||
// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用");
|
||||
//// Logger.d("lianglihui","模拟 不可自动驾驶");
|
||||
// }
|
||||
// );
|
||||
|
||||
// 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态
|
||||
// findViewById(R.id.btnAutopilotEnable).setOnClickListener(view ->
|
||||
// {
|
||||
// MogoApisHandler.getInstance().getApis()
|
||||
// .getAdasControllerApi()
|
||||
// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, "能使用");
|
||||
//
|
||||
//// Logger.d("lianglihui","模拟 可自动驾驶");
|
||||
// }
|
||||
// );
|
||||
|
||||
// 模拟 自动驾驶能力,自动驾驶中,可能是停车,可能是行进,但是是机器在处理车的前进后退,不是人
|
||||
// findViewById(R.id.btnAutopilotRunning).setOnClickListener(view ->
|
||||
// {
|
||||
// MogoApisHandler.getInstance().getApis()
|
||||
// .getAdasControllerApi()
|
||||
// .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, "Running");
|
||||
//// Logger.d("lianglihui","模拟 自动驾驶能力");
|
||||
// }
|
||||
// );
|
||||
|
||||
// 模拟 自动驾驶站
|
||||
// findViewById(R.id.btnAutopilotArrive).setOnClickListener(view ->
|
||||
// {
|
||||
// MogoApisHandler.getInstance().getApis()
|
||||
// .getAdasControllerApi().mockOchStatus(-1, "Arrived");
|
||||
//
|
||||
//// Logger.d("lianglihui","模拟 自动驾驶站");
|
||||
// }
|
||||
// );
|
||||
|
||||
// 模拟 站点下发工控
|
||||
findViewById(R.id.btnAutopilotControl).setOnClickListener(view ->
|
||||
{
|
||||
@@ -214,30 +132,21 @@ public abstract class BaseOchTaxiTabFragment<V extends IView, P extends Presente
|
||||
}
|
||||
);
|
||||
|
||||
tvOperationStatus.setOnClickListener(view -> {
|
||||
onChangeOperationStatus();
|
||||
});
|
||||
mCloseNaviIcon.setOnClickListener(v -> {
|
||||
showNaviToStartStationFragment(false);
|
||||
});
|
||||
|
||||
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
|
||||
flStationPanelContainer.setVisibility(View.GONE);
|
||||
tvOperationStatus.setVisibility(View.GONE);
|
||||
mSettingBtn.setVisibility(View.GONE);
|
||||
if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()){
|
||||
switchVRFlatMode(true);
|
||||
}else {
|
||||
switchVRFlatMode(false);
|
||||
}
|
||||
}
|
||||
protected void onChangeOperationStatus() {
|
||||
|
||||
}
|
||||
|
||||
protected void onGoToTaxiOrders(){
|
||||
|
||||
}
|
||||
public void showNotice(String notice) {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
AIAssist.getInstance(getContext()).speakTTSVoice(notice);
|
||||
});
|
||||
/**
|
||||
* VR mode 转换
|
||||
* @param isVRMode
|
||||
*/
|
||||
public void switchVRFlatMode(boolean isVRMode){
|
||||
if (mRootView != null) {
|
||||
mRootView.setVisibility(isVRMode ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -368,39 +277,10 @@ public abstract class BaseOchTaxiTabFragment<V extends IView, P extends Presente
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏【自动驾驶】按钮
|
||||
*/
|
||||
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;
|
||||
@NonNull
|
||||
@Override
|
||||
protected BaseTaxiPassengerPresenter createPresenter() {
|
||||
return new BaseTaxiPassengerPresenter(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -409,70 +289,66 @@ public abstract class BaseOchTaxiTabFragment<V extends IView, P extends Presente
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取站点面板view,在{@link #initViews()}时候添加到container中
|
||||
*
|
||||
* @return 站点面板view
|
||||
* 更新时速
|
||||
* @param newSpeed
|
||||
*/
|
||||
public abstract int getStationPanelViewId();
|
||||
|
||||
/**
|
||||
* 重新开启自动驾驶
|
||||
*/
|
||||
public abstract void restartAutopilot();
|
||||
|
||||
|
||||
public void changeOperationViewVisible(int visible){
|
||||
getActivity().runOnUiThread(() -> {
|
||||
if (tvOperationStatus == null) return;
|
||||
tvOperationStatus.setVisibility(visible);
|
||||
});
|
||||
}
|
||||
|
||||
public void updateSpeedView(float newSpeed){
|
||||
int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值
|
||||
mSpeedView.setText(String.valueOf(speed));
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新当前定位信息
|
||||
* @param latitude
|
||||
* @param longitude
|
||||
*/
|
||||
public void updateLocation(double latitude,double longitude){
|
||||
this.mCurLatitude = latitude;
|
||||
this.mCurLongitude = longitude;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMapVisualAngleChanged(VisualAngleMode visualAngleMode) {
|
||||
//todo ui 切换
|
||||
}
|
||||
// private void hideHMI() {
|
||||
// // 控制 脉速表 显示状态
|
||||
// CallerHmiManager.INSTANCE.setSpeedChartViewVisibility(View.GONE);
|
||||
// // 控制 自动驾驶按钮 显示状态
|
||||
// CallerHmiManager.INSTANCE.setAutopilotStatusViewVisibility(View.GONE);
|
||||
// // 控制 切换视角按钮 显示状态
|
||||
// CallerHmiManager.INSTANCE.setPerspectiveSwitchViewVisibility(View.GONE);
|
||||
// // 控制 车辆检检测按钮 示状态
|
||||
// CallerHmiManager.INSTANCE.setCheckStatusViewVisibility(View.GONE);
|
||||
// }
|
||||
|
||||
protected void showNaviToStartStationFragment(boolean isShow){
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
if (isShow){
|
||||
// if (ochNaviFragment == null){
|
||||
ochNaviFragment = OCHNaviFragment.newInstance();
|
||||
// }
|
||||
if (ochNaviFragment.isAdded()){
|
||||
return;
|
||||
}
|
||||
transaction.add(R.id.module_mogo_och_navi_panel_container,ochNaviFragment).show(ochNaviFragment);
|
||||
transaction.commitAllowingStateLoss();
|
||||
mCloseNaviIcon.setVisibility(View.VISIBLE);
|
||||
flNaviPanelContainer.setVisibility(View.VISIBLE);
|
||||
CallerSmpManager.hidePanel();//隐藏小地图
|
||||
}else {
|
||||
if (ochNaviFragment != null){
|
||||
ochNaviFragment.onDestroy();
|
||||
transaction.remove(ochNaviFragment);
|
||||
transaction.commitAllowingStateLoss();
|
||||
ochNaviFragment = null;
|
||||
}
|
||||
mCloseNaviIcon.setVisibility(View.GONE);
|
||||
flNaviPanelContainer.setVisibility(View.GONE);
|
||||
CallerSmpManager.showPanel();//显示小地图
|
||||
}
|
||||
/**
|
||||
* 工控机全局路径数据更新
|
||||
* @param models
|
||||
*/
|
||||
public void routeResult(List<AutopilotRouteInfo.RouteModels> models){
|
||||
//todo 绘制路径规划
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新订单信息
|
||||
* @param order
|
||||
*/
|
||||
public void updateCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order){
|
||||
//todo 当到达乘客上车点时,展示信息
|
||||
|
||||
}
|
||||
|
||||
private void showServingOrderFragment(){
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
|
||||
ochServingOrderFragment = new TaxiPassengerServingOrderFragment().newInstance();
|
||||
if (ochServingOrderFragment.isAdded()){
|
||||
return;
|
||||
}
|
||||
transaction.add(R.id.module_mogo_och_navi_panel_container, ochServingOrderFragment).show(ochServingOrderFragment);
|
||||
transaction.commitAllowingStateLoss();
|
||||
flNaviPanelContainer.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private void hideServingOrderFragment(){
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
if (ochServingOrderFragment != null){
|
||||
ochServingOrderFragment.onDestroy();
|
||||
transaction.remove(ochServingOrderFragment);
|
||||
transaction.commitAllowingStateLoss();
|
||||
ochServingOrderFragment = null;
|
||||
}
|
||||
flNaviPanelContainer.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.mogo.och.taxi.passenger.ui
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import com.mogo.commons.mvp.BaseFragment
|
||||
import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo
|
||||
import com.mogo.eagle.core.data.map.MogoLatLng
|
||||
import com.mogo.module.common.MogoApisHandler
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
* @date: 2022/3/3
|
||||
*/
|
||||
class TaxiPassengerServingOrderFragment : BaseFragment() {
|
||||
|
||||
private val TAG = "TaxiPassengerServingOrderFragment"
|
||||
|
||||
fun newInstance(): TaxiPassengerServingOrderFragment{
|
||||
val args = Bundle()
|
||||
|
||||
val fragment = TaxiPassengerServingOrderFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
|
||||
init {
|
||||
// TODO: 2022/3/3
|
||||
}
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
if (MogoApisHandler.getInstance()
|
||||
.apis
|
||||
.statusManagerApi
|
||||
.isVrMode) {
|
||||
switchVRFlatMode(true)
|
||||
} else {
|
||||
switchVRFlatMode(false)
|
||||
}
|
||||
}
|
||||
|
||||
fun switchVRFlatMode(isVRMode: Boolean) {
|
||||
if (mRootView != null) {
|
||||
mRootView.visibility = if (isVRMode) View.VISIBLE else View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 工控机返回的全局路径数据
|
||||
*/
|
||||
fun routeResult(models: List<AutopilotRouteInfo.RouteModels>?) {
|
||||
if (models == null) return
|
||||
val latLngList: MutableList<MogoLatLng> = ArrayList()
|
||||
for (routeModel in models) {
|
||||
latLngList.add(MogoLatLng(routeModel.lat, routeModel.lon))
|
||||
}
|
||||
Log.e(TAG, "routeResult:" + latLngList.size)
|
||||
// if (latLngList.size() > 0) {
|
||||
// drawablePolyline(latLngList);
|
||||
// } else {
|
||||
// clearPolyline();
|
||||
// }
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
}
|
||||
}
|
||||
@@ -9,5 +9,5 @@ public
|
||||
*
|
||||
* 描述
|
||||
*/
|
||||
interface OCHTaxiView extends IView {
|
||||
interface TaxiPassengerTaxiView extends IView {
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.mogo.och.taxi.passenger.utils;
|
||||
|
||||
import com.mogo.och.taxi.passenger.bean.OrderQueryRespBean;
|
||||
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -11,10 +11,10 @@ import java.util.List;
|
||||
public class OrderUtil {
|
||||
|
||||
// 判断两个list中的订单是否相同:依据orderId
|
||||
public static boolean haveSameOrders(List<OrderQueryRespBean.Result> list1,
|
||||
List<OrderQueryRespBean.Result> list2) {
|
||||
OrderQueryRespBean.Result[] arr1 = list1.toArray(new OrderQueryRespBean.Result[]{});
|
||||
OrderQueryRespBean.Result[] arr2 = list2.toArray(new OrderQueryRespBean.Result[]{});
|
||||
public static boolean haveSameOrders(List<TaxiPassengerOrderQueryRespBean.Result> list1,
|
||||
List<TaxiPassengerOrderQueryRespBean.Result> list2) {
|
||||
TaxiPassengerOrderQueryRespBean.Result[] arr1 = list1.toArray(new TaxiPassengerOrderQueryRespBean.Result[]{});
|
||||
TaxiPassengerOrderQueryRespBean.Result[] arr2 = list2.toArray(new TaxiPassengerOrderQueryRespBean.Result[]{});
|
||||
Arrays.sort(arr1);
|
||||
Arrays.sort(arr1);
|
||||
return Arrays.equals(arr1,arr2);
|
||||
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1004 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 542 B |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 52 KiB |