Merge branch 'dev_robotaxi-d_230612_3.4.0' into dev_robotaxi-d_230711_3.4.0

# Conflicts:
#	OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java
#	OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OverviewFragment.kt
This commit is contained in:
yangyakun
2023-07-12 09:54:52 +08:00
34 changed files with 1399 additions and 1667 deletions

View File

@@ -30,7 +30,7 @@ import com.mogo.och.common.module.manager.loopmanager.LoopInfo
import com.mogo.och.bus.passenger.bean.response.*
import com.mogo.och.bus.passenger.callback.*
import com.mogo.och.bus.passenger.constant.CharterPassengerConst
import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.bus.passenger.net.BusPassengerServiceManager
import com.mogo.och.bus.passenger.utils.ToastCharterUtils
import com.mogo.och.bus.passenger.utils.VoiceFocusManager
@@ -186,12 +186,12 @@ object CharterPassengerModel {
// 2 、打开空调暖风机灯设置页面
// 3、车控页面、
// 4、打开选择线路页面
BusPassengerModelLoopManager.removeLoopFunction(TAGLOGIN)
BizLoopManager.removeLoopFunction(TAGLOGIN)
CallerLogger.d(M_BUS_P + TAG, "结束登录状态轮询")
// 启动订单轮
startOrderLoop()
} else {
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGLOGIN,
LoopInfo(3, ::queryLoginStatus)
)
@@ -337,7 +337,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun startOrderLoop() {
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGORDER,
LoopInfo(3, ::queryOrder)
)
@@ -348,7 +348,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun endOrderLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGORDER)
BizLoopManager.removeLoopFunction(TAGORDER)
CallerLogger.d(M_BUS_P + TAG, "结束订单轮询")
}
@@ -489,7 +489,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun startCarStatusLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus))
BizLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus))
CallerLogger.d(M_BUS_P + TAG, "启动车态轮询")
}
@@ -497,7 +497,7 @@ object CharterPassengerModel {
* 启动订单轮训
*/
private fun endCarStatusLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGCARSTATUS)
BizLoopManager.removeLoopFunction(TAGCARSTATUS)
CallerLogger.d(M_BUS_P + TAG, "结束车态轮询")
}
@@ -548,7 +548,7 @@ object CharterPassengerModel {
* 启动时间校准轮训
*/
private fun startCalibrationLoop() {
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGCALIBRATION,
LoopInfo(120, ::queryBusinessTime, immediately = true)
)
@@ -559,7 +559,7 @@ object CharterPassengerModel {
* 停止时间校准轮训
*/
private fun endCalibrationLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGCALIBRATION)
BizLoopManager.removeLoopFunction(TAGCALIBRATION)
CallerLogger.d(M_BUS_P + TAG, "结束时间校准轮询")
}
@@ -656,7 +656,7 @@ object CharterPassengerModel {
* 启动路距计算
*/
private fun startCalculateDistanceLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
CallerLogger.d(M_BUS_P + TAG, "开始路距计算")
}
@@ -667,7 +667,7 @@ object CharterPassengerModel {
* ③ 到站成功后
*/
private fun endCalculateDistanceLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE)
BizLoopManager.removeLoopFunction(TAGDISTANCE)
CallerLogger.d(M_BUS_P + TAG, "结束路距计算")
}

View File

@@ -20,7 +20,7 @@ import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse
import com.mogo.och.bus.passenger.model.CharterPassengerModel
import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener
import com.mogo.och.bus.passenger.model.OrderStatusEnum
import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.bus.passenger.net.BusPassengerServiceManager
import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1OrderLineFragment
import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg
@@ -187,7 +187,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
CallerLogger.d(M_BUS_P + TAG, "onDestroy")
RxUtils.disposeSubscribe(subscribeSelectLine)
RxUtils.disposeSubscribe(subscribeSelectSite)
BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
CharterPassengerModel.setStatusChangeListener(TAG,null)
CallerTelematicListenerManager.removeListener(TAG)
}
@@ -230,7 +230,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
mView?.hideDataDriverRefuse()
}
RxUtils.disposeSubscribe(subscribeSelectSite)
BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
}
}
}
@@ -270,7 +270,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
}
mView?.hideDataWaitDriverMsg()
// 启动查看和司机端链接
BusPassengerModelLoopManager.setLoopFunction(
BizLoopManager.setLoopFunction(
TAGLINELOOP,
LoopInfo(3, ::checkServerStatus)
)
@@ -284,7 +284,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) :
private fun checkServerStatus() {
if (!CallerTelematicManager.getClientConnStatus()) {
ToastCharterUtils.showShort("断开和司机端连接、请联系安全员")
BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP)
BizLoopManager.removeLoopFunction(TAGLINELOOP)
mView?.hideDataDriverRefuse()
CallerLogger.d(M_BUS_P + TAG, "endAni666")
}

View File

@@ -12,10 +12,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON
import com.mogo.eagle.core.utilcode.util.CoordinateUtils
import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.common.module.manager.loopmanager.LoopInfo
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil
import com.zhjt.service.chain.ChainLog
import io.reactivex.schedulers.Schedulers
import mogo.telematics.pad.MessagePad
import java.util.concurrent.ConcurrentHashMap
@@ -214,7 +215,9 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
* 启动路距计算
*/
private fun startCalculateDistanceLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance,
scheduler = Schedulers.computation()
))
d(SceneConstant.M_BUS_P + TAG, "开始路距计算")
}
@@ -222,7 +225,7 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{
* 结束启动路距计算
*/
private fun endCalculateDistanceLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE)
BizLoopManager.removeLoopFunction(TAGDISTANCE)
d(SceneConstant.M_BUS_P + TAG, "结束路距计算")
}

View File

@@ -4,6 +4,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.ConcurrentHashMap
@@ -14,7 +15,7 @@ import java.util.concurrent.TimeUnit
*
* 管理轮询逻辑订单轮询新单轮询新单抢单结果轮询等等
*/
object BusPassengerModelLoopManager {
object BizLoopManager {
private val TAG = "BusPassengerModelLoopManager"
@@ -66,8 +67,21 @@ object BusPassengerModelLoopManager {
aLong?.let {
if (it % loopInfo.interval == 0L) {
try {
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}对象${loopInfo}正在执行方法${tag}")
if(loopInfo.scheduler!=null) {
Observable.just(tag).observeOn(loopInfo.scheduler)
.subscribe(object :Observer<String>{
override fun onSubscribe(d: Disposable) {}
override fun onError(e: Throwable) {}
override fun onComplete() {
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}正在执行方法${tag}_${Thread.currentThread().name}")
}
override fun onNext(t: String) {}
})
}else{
loopInfo.function.invoke()
CallerLogger.d(TAG, "${aLong}正在执行方法${tag}_${Thread.currentThread().name}")
}
}catch (e:Throwable){
e.printStackTrace()
CallerLogger.e(TAG,"$tag:--$e")

View File

@@ -1,3 +1,11 @@
package com.mogo.och.common.module.manager.loopmanager
data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false)
import io.reactivex.Scheduler
/**
* interval 轮训间隔
* function 轮询执行的方法
* immediately 是否立刻执行
* scheduler 轮训执行的线程
*/
data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false,var scheduler: Scheduler? = null)

View File

@@ -63,19 +63,6 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData {
public String txtFileMd5DPQP = ""; //轨迹文件md5默认“”
public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
// !!!接口中暂无此字段仅用于本地实现逻辑使用起始站目的站距离km
public double travelDistance;
/**
* @param distance
*/
public void decreaseTravelDistance( double distance ) {
travelDistance = ( ( float ) distance / 1000f );
if ( travelDistance < 0 ) {
travelDistance = 0;
}
}
@Override
public int compareTo(Result o) {
boolean isEqual = this.orderNo.equals(o.orderNo);
@@ -97,7 +84,7 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData {
public int hashCode() {
return Objects.hash(orderNo, orderType, orderStatus, businessType, startSiteId,
startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr,
endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance);
endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime);
}
}
}

View File

@@ -1,15 +0,0 @@
package com.mogo.och.taxi.passenger.callback;
import com.mogo.eagle.core.data.map.MogoLocation;
/**
* Created on 2021/9/10
*
* Model->Presenter回调状态控制器监听accOn、adas ui show、voice ui show、push ui show、v2x ui show等等
*/
public interface IOCHTaxiPassengerControllerStatusCallback {
// 是否vr map模式
void onVRModeChanged(boolean isVRMode);
// 自车定位
void onCarLocationChanged(MogoLocation location);
}

View File

@@ -15,9 +15,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback {
// 当前位置距离上车点的距离(米)、预估时间(秒)
void onCurrentOrderDistToEndChanged(long meters, long timeInSecond);
//当前路名字
void onCurrentRoadName(String currentRoadName);
// 司机已确认开启自动驾驶环境
void onDriverHasCheckedPilotCondition(boolean isBoarded);
}

View File

@@ -35,7 +35,7 @@ enum class TaxiPassengerOrderStatusEnum(val code: Int) {
companion object {
@JvmStatic
fun valueOf(code: Int): TaxiPassengerOrderStatusEnum? {
fun valueOf(code: Int): TaxiPassengerOrderStatusEnum {
for (value in values()) {
if (value.code == code) {
return value

View File

@@ -1,125 +0,0 @@
package com.mogo.och.taxi.passenger.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import android.content.Context;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.geocoder.RegeocodeRoad;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author: wangmingjun
* @date: 2021/12/6
*/
public class TaxiPassengerGeocodeSearchModel implements GeocodeSearch.OnGeocodeSearchListener {
private final String TAG = TaxiPassengerGeocodeSearchModel.class.getSimpleName();
private static Context mContext;
private IOCHTaxiPassengerNaviChangedCallback mNaviChangedCallback;
GeocodeSearch mGeocodeSearch = null;
private String roadName = "";
private Timer timer ;
TimerTask timerTask;
public static TaxiPassengerGeocodeSearchModel getInstance(Context context) {
mContext = context;
return SingletonHolder.INSTANCE;
}
private static final class SingletonHolder {
private static final TaxiPassengerGeocodeSearchModel INSTANCE = new TaxiPassengerGeocodeSearchModel();
}
private TaxiPassengerGeocodeSearchModel(){
}
public void initGeocodeSearch(){
//通过经纬度逆地理编码得到位置
try {
mGeocodeSearch = new GeocodeSearch(mContext);
mGeocodeSearch.setOnGeocodeSearchListener(this);
} catch (AMapException e) {
e.printStackTrace();
}
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
if (mNaviChangedCallback != null){
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "roadName道路名称: " + roadName);
mNaviChangedCallback.onCurrentRoadName(roadName);
}
}
};
try{
timer.schedule(timerTask,500,2000);
}catch (Exception e){
e.printStackTrace();
}
}
public void searchLocationInfo(double lat, double lon){
if (null != mGeocodeSearch){
LatLonPoint latLng = new LatLonPoint(lat, lon);
//第一个参数表示一个Latlng第二参数表示范围多少米第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(latLng, 200, GeocodeSearch.AMAP);
mGeocodeSearch.getFromLocationAsyn(query);
}
}
public void destroyGeocodeSearch(){
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "destroyGeocodeSearch");
if (mGeocodeSearch != null){
mGeocodeSearch = null;
}
if (mNaviChangedCallback != null){
mNaviChangedCallback = null;
}
if (null != timer){
timer.cancel();
}
if (null != timerTask){
timerTask = null;
}
roadName = "";
}
public void setOCHTaciNaviChangedCallback(IOCHTaxiPassengerNaviChangedCallback callback){
this.mNaviChangedCallback = callback;
}
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {//更新频率几十 ms, 暂定更新UI为2s一次
if (regeocodeResult != null) {
List<RegeocodeRoad> roads = regeocodeResult.getRegeocodeAddress().getRoads();
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "位置roads" + GsonUtil.jsonFromObject(roads));
if (roads != null && roads.size() > 0){
roadName = roads.get(0).getName();//当前路的名字
// mNaviChangedCallback.onCurrentRoadName(roads.get(0).getName());
}
}
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
}
}

View File

@@ -0,0 +1,837 @@
package com.mogo.och.taxi.passenger.model
import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import com.amap.api.maps.model.LatLng
import com.amap.api.navi.model.NaviLatLng
import com.elegant.network.utils.GsonUtil
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.commons.module.intent.IMogoIntentListener
import com.mogo.commons.module.intent.IntentManager
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.callback.OchAdasStartFailureCallback
import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.startLoopAbnormalFactors
import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.stopLoopAbnormalFactors
import com.mogo.och.common.module.manager.OCHAdasAbilityManager
import com.mogo.och.common.module.manager.distancemamager.IDistanceListener
import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addDistanceListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addTrajectoryListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.removeListener
import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint
import com.mogo.och.common.module.manager.loopmanager.BizLoopManager
import com.mogo.och.common.module.manager.loopmanager.LoopInfo
import com.mogo.och.common.module.map.AmapNaviToDestinationModel
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.calculateRouteSumLength
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon
import com.mogo.och.common.module.utils.PinYinUtil
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean
import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum.Companion.valueOf
import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils
import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils.transmissionIndexGet
import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager
import io.reactivex.disposables.Disposable
import io.reactivex.exceptions.UndeliverableException
import io.reactivex.functions.Consumer
import io.reactivex.plugins.RxJavaPlugins
import mogo.telematics.pad.MessagePad.ArrivalNotification
import mogo.telematics.pad.MessagePad.GlobalPathResp
import java.io.IOException
import java.util.concurrent.ConcurrentHashMap
/**
* Created by pangfan on 2021/8/19
*
* 网约车 - 出租车业务逻辑处理
*/
@SuppressLint("StaticFieldLeak")
object TaxiPassengerModel {
private var mContext: Context? = null
private val TAG = TaxiPassengerModel::class.java.simpleName
private val STARTREADYTOAUTOPILOT = "startReadyToAutopilot"
private val MINANDWAITSERVICE = "mInAndWaitService"
private val MQUERYORDERREMAINING = "mQueryOrderRemaining"
// 获取当前订单
@Volatile
var currentOCHOrder: TaxiPassengerOrderQueryRespBean.Result? = null//当前订单
@Volatile
private var mInServiceList = emptyList<TaxiPassengerOrderQueryRespBean.Result>() //进行中订单
private var mADASStatusCallback: IOCHTaxiPassengerADASStatusCallback? = null//Model->Presenter自动驾驶状态相关
private var mAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback? = null//Model->Presenter自动驾驶线路规划
private val mOrderStatusCallbackMap: MutableMap<String, IOCHTaxiPassengerOrderStatusCallback> = ConcurrentHashMap()
private var subscribe: Disposable? = null
fun setMoGoAutopilotPlanningListener(moGoAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback?) {
mAutopilotPlanningCallback = moGoAutopilotPlanningCallback
}
fun setADASStatusCallback(callback: IOCHTaxiPassengerADASStatusCallback?) {
mADASStatusCallback = callback
}
fun setOrderStatusCallback(tag: String?, callback: IOCHTaxiPassengerOrderStatusCallback?) {
if (tag == null || "" == tag) return
if (callback == null) {
mOrderStatusCallbackMap.remove(tag)
return
}
mOrderStatusCallbackMap[tag] = callback
}
fun init(context: Context) {
mContext = context.applicationContext
initListeners()
// 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃
// The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with
RxJavaPlugins.setErrorHandler(Consumer { e ->
if (e is UndeliverableException) {
d(M_TAXI_P + TAG, "UndeliverableException")
return@Consumer
}
if (e is IOException) { //
// fine, irrelevant network problem or API that throws on cancellation
d(M_TAXI_P + TAG, "IOException")
return@Consumer
}
if (e is InterruptedException) {
// fine, some blocking code was interrupted by a dispose call
d(M_TAXI_P + TAG, "InterruptedException")
return@Consumer
}
if (e is NullPointerException || e is IllegalArgumentException) {
// that's likely a bug in the application
d(M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException")
Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e)
return@Consumer
}
if (e is IllegalStateException) {
// that's a bug in RxJava or in a custom operator
d(M_TAXI_P + TAG, "IllegalStateException")
Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e)
return@Consumer
}
d(M_TAXI_P + TAG, "Undeliverable exception")
})
startOrStopOrderLoop()
}
/**
* 订单轮询 初始化主Fragment的Presenter init 调用
*/
fun startOrStopOrderLoop() {
if (NetworkUtils.isConnected(mContext)) {
startOrStopOrderLoop(true)
}
}
/**
* 关闭订单轮训 页面摧毁时
*/
fun release() {
startOrStopOrderLoop(false)
startOrStopQueryOrderRemaining(false)
releaseListeners()
RxUtils.disposeSubscribe(subscribe)
}
private fun initListeners() {
// 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口
CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener)
IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener)
//2021.11.1 自动驾驶路线规划接口
CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener)
startLoopAbnormalFactors(mContext!!)
//开启自驾后 异常信息返回
OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener)
CallerMsgBoxEventListenerManager.addListener(TAG, iMsgBoxEventListener)
addDistanceListener(TAG, distanceListener)
addTrajectoryListener(TAG, trajectoryListener)
}
private fun releaseListeners() {
MogoAiCloudSocketManager.getInstance(mContext)
.unregisterLifecycleListener(10010)
CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener)
CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener)
stopLoopAbnormalFactors()
OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null)
CallerMsgBoxEventListenerManager.removeListener(iMsgBoxEventListener)
removeListener(TAG)
}
/**
* 订单轮训
* @param start true 开启订单轮训
* false 关闭订单轮训
*/
private fun startOrStopOrderLoop(start: Boolean) {
d(M_TAXI_P + TAG, "startOrStopOrderLoop() $start")
if (start) {
BizLoopManager.setLoopFunction(MINANDWAITSERVICE,LoopInfo(2, TaxiPassengerModel::queryInAndWaitOrders))
} else {
BizLoopManager.removeLoopFunction(MINANDWAITSERVICE)
}
}
/**
* 查询订单状态:进行中/待服务轮询防止因crash导致应用重启、断网没收到推送等
*
* 注只有在本地缓存mCurrentOCHOrder为null时已完成or已取消有明确结果或id相同且status不同时
* 才更新最新进行中单到本地
*/
fun queryInAndWaitOrders() {
TaxiPassengerServiceManager.queryOrdersInAndWaitService(
mContext!!,
object : OchCommonServiceCallback<TaxiPassengerOrdersInServiceQueryRespBean> {
override fun onSuccess(data: TaxiPassengerOrdersInServiceQueryRespBean) {
if (data.data == null) {
return
}
//1. 处理进行中订单
mInServiceList = data.data.servicing
if (data.data.servicing != null && data.data.servicing.isNotEmpty()) {
// 1.1. 当存在进行中单时对本地currentOrder进行更新
if (currentOCHOrder == null) {
//1.1.1. 当本地无currentOrder已经完成or取消则更新currentOrder并通知ui更新
updateNativeCurrentOrder(data.data.servicing[0])
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderStatusChanged(currentOCHOrder)
}
}
} else {
//1.1.2. 当本地有currentOrder
//orderId不一致时通过currentOrder.orderId查询订单状态并通知ui更新
//orderId一致且orderStatus不一致时则更新currentOrder并通知ui更新
if (currentOCHOrder!!.orderNo != data.data.servicing[0].orderNo) {
queryCurOrderStatus()
// } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) {
} else { //todo 订单拦截放到各自实现去做
updateNativeCurrentOrder(data.data.servicing[0])
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderStatusChanged(currentOCHOrder)
}
}
}
}
} else {
// 1.2. 当无进行中订单时如果本地也无则跳过如果本地仍存在currentOrder查询此单完成or取消并通知ui更
if (currentOCHOrder != null) {
queryCurOrderStatus()
}
recoverNaviInfo()
}
}
override fun onError() {}
override fun onFail(code: Int, msg: String) {
e(M_TAXI_P + TAG, "queryInAndWaitOrders$code$msg")
}
})
}
//仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder
private fun queryCurOrderStatus() {
if (currentOCHOrder == null) {
return
}
val orderNo = currentOCHOrder!!.orderNo
TaxiPassengerServiceManager.queryOrderById(
mContext!!, orderNo,
object : OchCommonServiceCallback<TaxiPassengerOrderQueryRespBean> {
override fun onSuccess(data: TaxiPassengerOrderQueryRespBean) {
if (data.data != null && currentOCHOrder != null && currentOCHOrder!!.orderNo == data.data.orderNo) {
if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.code) {
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderStatusChanged(data.data)
}
}
clearCurrentOCHOrder()
} else {
updateNativeCurrentOrder(data.data)
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderStatusChanged(currentOCHOrder)
}
}
}
}
}
override fun onFail(code: Int, msg: String) {}
})
}
// 获取当前订单状态
val curOrderStatus: TaxiPassengerOrderStatusEnum
get() {
val order: TaxiPassengerOrderQueryRespBean.Result =
currentOCHOrder
?: return TaxiPassengerOrderStatusEnum.None
return valueOf(order.orderStatus)
}
//更新本地currentOrder信息并保存订单到本地避免车机重启丢失数据
private fun updateNativeCurrentOrder(data: TaxiPassengerOrderQueryRespBean.Result?) {
if (data == null) {
return
}
currentOCHOrder = data
SharedPrefsMgr.getInstance(mContext!!).putString(
TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER,
GsonUtil.jsonFromObject(data)
)
}
//清除订单信息
fun clearCurrentOCHOrder() {
currentOCHOrder = null
clearAutopilotControlParameters()
SharedPrefsMgr.getInstance(mContext!!).remove(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER)
}
//检测当前订单
fun checkCurrentOCHOrder(): Boolean {
return currentOCHOrder != null && currentOCHOrder!!.startSiteGcjPoint != null && currentOCHOrder!!.endSiteGcjPoint != null
}
//监听网络变化,避免启动机器时无网导致无法更新订单信息
private val distanceListener: IDistanceListener = object : IDistanceListener {
override fun distanceCallback(distance: Float) {
}
}
private val trajectoryListener: ITrajectoryListener =
object : ITrajectoryListener {
override fun trajectoryCallback(
routeArrivied: MutableList<MogoLocation>,
routeArriving: MutableList<MogoLocation>,
location: MogoLocation
) {
val routeArriviedTemp: MutableList<LatLng> = ArrayList()
val routeArrivingTemp: MutableList<LatLng> = ArrayList()
var temp: LatLng
for (mogoLocation in routeArrivied) {
temp = LatLng(mogoLocation.latitude, mogoLocation.longitude)
routeArriviedTemp.add(temp)
}
for (mogoLocation in routeArriving) {
temp = LatLng(mogoLocation.latitude, mogoLocation.longitude)
routeArrivingTemp.add(temp)
}
mAutopilotPlanningCallback!!.routeResultByServer(
routeArriviedTemp,
routeArrivingTemp,
location
)
setRouteLineMarker()
}
}
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent ->
d(M_TAXI_P + TAG, "onIntentReceived = %s", intentStr)
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
startOrStopOrderLoop(true)
}
}
}
private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener =
object : IMoGoAutopilotStatusListener {
private var arriveAtEnd = false //乘客app专用字段
override fun onAutopilotStatusResponse(state: Int) {
if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {
if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning()
if (currentOCHOrder != null
&& curOrderStatus === TaxiPassengerOrderStatusEnum.UserArriveAtStart
) {
TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(
false,
true,
currentOCHOrder!!.startSiteAddr,
currentOCHOrder!!.endSiteAddr,
currentOCHOrder!!.orderNo
)
startServicePilotDone()
}
} else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) {
if (FunctionBuildConfig.isDemoMode
&& isPassenger(FunctionBuildConfig.appIdentityMode)
) {
// 当美化模式演示模式开启时且是乘客app、且未到终点时维持自动驾驶icon开启状态
arriveAtEnd = if (!arriveAtEnd) {
return
} else {
false
}
}
if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotEnable()
} else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) {
if (FunctionBuildConfig.isDemoMode
&& isPassenger(FunctionBuildConfig.appIdentityMode)
) {
// 当美化模式演示模式开启时且是乘客app、且未到终点时维持自动驾驶icon开启状态
arriveAtEnd = if (!arriveAtEnd) {
return
} else {
false
}
}
if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotDisable()
}
}
override fun onAutopilotArriveAtStation(arrivalNotification: ArrivalNotification?) {
if (FunctionBuildConfig.isDemoMode
&& isPassenger(FunctionBuildConfig.appIdentityMode)
) {
arriveAtEnd = true
}
if (arrivalNotification == null || !checkCurrentOCHOrder() || curOrderStatus === TaxiPassengerOrderStatusEnum.ArriveAtEnd) {
return
}
}
}
private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener =
object : IMoGoPlanningRottingListener {
override fun onAutopilotRotting(globalPathResp: GlobalPathResp?) {
if (null != globalPathResp && globalPathResp.wayPointsList.size > 0) {
calculateRouteLineSum(
coordinateConverterWgsToGcjListCommon(mContext, globalPathResp.wayPointsList)
)
startToRouteAndWipe()
}
}
}
private val mAdasStartFailureListener: OchAdasStartFailureCallback = object : OchAdasStartFailureCallback {
override fun onStartAutopilotFailure(startFailedCode: String, startFailedMessage: String) {
TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage)
}
}
private val iMsgBoxEventListener: IMsgBoxEventListener = object : IMsgBoxEventListener {
override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) {}
override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) {}
override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) {}
override fun onUpdateTipEvent(isShow: Boolean) {}
override fun onSummaryClickEvent() {
if (currentOCHOrder == null) {
ToastUtils.showLong("行程已结束")
} else {
transmissionIndexGet(OverlayLeftViewUtils.OVERVIEW)
}
}
}
fun startToRouteAndWipe() {
showRottingMapView()
}
private fun showRottingMapView() {
AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi()
if (mAutopilotPlanningCallback != null) {
mAutopilotPlanningCallback!!.showRottingMapView()
}
}
fun startNaviByAmap() {
if (currentOCHOrder != null &&
currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.OnTheWayToEnd.code
) {
AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi()
val orderEndStationLat = currentOCHOrder!!.endSiteGcjPoint[1]
val orderEndStationLng = currentOCHOrder!!.endSiteGcjPoint[0]
val currentLocation = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()
val startNaviLatLng = NaviLatLng(currentLocation.latitude, currentLocation.longitude)
val endNaviLatLng = NaviLatLng(orderEndStationLat, orderEndStationLng)
AmapNaviToDestinationModel.getInstance(mContext)
.initAMapNavi(startNaviLatLng, endNaviLatLng)
AmapNaviToDestinationModel.getInstance(mContext).setVoiceIsMute(false)
}
}
/**
* 设置小地图路径的起终点marker
*/
fun setRouteLineMarker() {
if (currentOCHOrder!!.startSiteGcjPoint == null || currentOCHOrder!!.startSiteGcjPoint.isEmpty() || currentOCHOrder!!.startSiteGcjPoint.size < 2 || currentOCHOrder!!.endSiteGcjPoint == null || currentOCHOrder!!.endSiteGcjPoint.isEmpty() || currentOCHOrder!!.endSiteGcjPoint.size < 2) {
setMarker(null, null)
return
}
val startStation = LatLng(
currentOCHOrder!!.startSiteGcjPoint[1], currentOCHOrder!!.startSiteGcjPoint[0]
)
val endStation = LatLng(
currentOCHOrder!!.endSiteGcjPoint[1], currentOCHOrder!!.endSiteGcjPoint[0]
)
setMarker(startStation, endStation)
}
private fun setMarker(startStation: LatLng?, endStation: LatLng?) {
if (mAutopilotPlanningCallback != null) {
mAutopilotPlanningCallback!!.setLineMarker(startStation, endStation)
}
}
fun startOrStopQueryOrderRemaining(isStart: Boolean) {
if (isStart) {
BizLoopManager.setLoopFunction(MQUERYORDERREMAINING,LoopInfo(2, TaxiPassengerModel::queryOrderRemaining))
} else {
BizLoopManager.removeLoopFunction(MQUERYORDERREMAINING)
}
}
/**
* 查询订单剩余里程和时间
*/
fun queryOrderRemaining() {
if (currentOCHOrder == null) return
TaxiPassengerServiceManager.queryOrderRemaining(
mContext!!,
currentOCHOrder!!.orderNo,
object : OchCommonServiceCallback<TaxiPassengerOrderQueryRemainingResp> {
override fun onSuccess(data: TaxiPassengerOrderQueryRemainingResp) {
if (data.data != null) {
e(M_TAXI_P + TAG, "distance = " + data.data.distance + " ,duration = " + data.data.duration)
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderDistToEndChanged(
data.data.distance,
data.data.duration
)
}
}
}
override fun onFail(code: Int, msg: String) {}
})
}
fun queryOrderRouteList() {
if (currentOCHOrder == null) return
d(M_TAXI_P + TAG, "--route--- queryOrderRouteList")
TaxiPassengerServiceManager.queryOrderRouteList(
mContext!!,
currentOCHOrder!!.orderNo,
object : OchCommonServiceCallback<TaxiPassengerQueryOrderRouteResp> {
override fun onSuccess(data: TaxiPassengerQueryOrderRouteResp) {
d(M_TAXI_P + TAG, "--route---" + GsonUtil.jsonFromObject(data))
if (data.data != null && data.data != null && data.data.size > 0) {
if (mAutopilotPlanningCallback != null) {
calculateRouteLineSum(data.data)
}
} else {
RxUtils.disposeSubscribe(subscribe)
subscribe = RxUtils.createSubscribe {
queryOrderRouteList()
}
}
}
override fun onFail(code: Int, msg: String) {
RxUtils.disposeSubscribe(subscribe)
subscribe = RxUtils.createSubscribe {
queryOrderRouteList()
}
}
})
}
/**
* 订单结束或者取消的时候, 刷新导航标识位以及缓存的数据
*/
fun recoverNaviInfo() {
SharedPrefsMgr.getInstance(mContext!!).remove(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS)
}
fun calculateRouteLineSum(points: List<LatLng>?) {
val sumLength = calculateRouteSumLength(points)
SharedPrefsMgr.getInstance(mContext!!)
.putInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, sumLength.toInt())
}
fun checkPhoneAndUpdateStatus(
phoneTail: String?,
commonCallback: ITaxiPassengerCommonCallback?
) {
if (currentOCHOrder == null) return
TaxiPassengerServiceManager.checkPhoneAndUpdateOrderStatus(
mContext!!, currentOCHOrder!!.orderNo,
phoneTail, object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
if (data.code == 0 && currentOCHOrder != null) {
//乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询
currentOCHOrder!!.orderStatus =
TaxiPassengerOrderStatusEnum.UserArriveAtStart.code
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onCurrentOrderStatusChanged(currentOCHOrder)
}
}
}
commonCallback?.onCommonCallback()
}
override fun onError() {
ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!")
}
override fun onFail(code: Int, msg: String) {
ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!")
e(
M_TAXI_P + TAG,
"提交用户输入的手机后4位、并进行状态扭转 后台结果错误$code$msg"
)
}
})
}
fun arrivedAndScore(
taxiPassengerScoreUpdateOrderReqBean: TaxiPassengerScoreUpdateOrderReqBean,
commonCallback: ITaxiPassengerCommonValueCallback<Boolean?>?
) {
if (taxiPassengerScoreUpdateOrderReqBean.orderNo == null) return
TaxiPassengerServiceManager.arrivedAndScore(
mContext!!, taxiPassengerScoreUpdateOrderReqBean,
object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
commonCallback?.onCommonCallback(true)
}
override fun onError() {
ToastUtils.showLong("网络错误请稍后再试")
e(M_TAXI_P + TAG, "对订单进行打分 1-5分 网络错误")
commonCallback?.onCommonCallback(false)
}
override fun onFail(code: Int, msg: String) {
e(M_TAXI_P + TAG, "对订单进行打分 1-5分 后台结果错误$code$msg")
commonCallback?.onCommonCallback(false)
}
})
}
fun loopQueryPilotStatus() {
if (currentOCHOrder == null) return
TaxiPassengerServiceManager.queryPilotStatus(
mContext!!, currentOCHOrder!!.orderNo,
object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
if (data.code == 0 && data.data == true) {
updateAutopilotStatus(true)
startOrStopReadyToAutopilotLoop(false)
}
}
override fun onFail(code: Int, msg: String) {
updateAutopilotStatus(false)
}
})
}
fun updateAutopilotStatus(isBoarded: Boolean) {
if (mOrderStatusCallbackMap.isNotEmpty()) {
for (callback in mOrderStatusCallbackMap.values) {
callback.onDriverHasCheckedPilotCondition(isBoarded)
}
}
}
fun startDriverReadyToAutopilotLoop() {
if (NetworkUtils.isConnected(mContext)) {
startOrStopReadyToAutopilotLoop(true)
}
}
fun startOrStopReadyToAutopilotLoop(isStart: Boolean) {
if (isStart) {
BizLoopManager.setLoopFunction(STARTREADYTOAUTOPILOT, LoopInfo(1, TaxiPassengerModel::loopQueryPilotStatus))
CallerLogger.i(M_TAXI_P + TAG, "startReadyToAutopilot()")
} else {
BizLoopManager.removeLoopFunction(STARTREADYTOAUTOPILOT)
CallerLogger.i(M_TAXI_P + TAG, "stopReadyToAutopilot()")
}
}
fun startServicePilotDone() {
if (currentOCHOrder == null) return
val result = TaxiPassengerStartReqBean.Result()
val currentLocation = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()
result.lat = currentLocation.latitude
result.lon = currentLocation.longitude
TaxiPassengerServiceManager.startServicePilotDone(
mContext!!,
currentOCHOrder!!.orderNo, result,
object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {}
override fun onFail(code: Int, msg: String) {
// ToastUtils.showShort(msg);
}
})
}
fun startAutopilot() {
if (!checkCurrentOCHOrder()) {
e(M_TAXI_P + TAG, "no order or order is empty.")
ToastUtils.showShort("当前订单不存在或异常!")
return
}
if (currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code) {
startServicePilotDone()
}
if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) {
ToastUtils.showLong(
OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason +
", 请稍候重试"
)
TaxiPassengerAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent(
currentOCHOrder!!.startSiteAddr,
currentOCHOrder!!.endSiteAddr,
currentOCHOrder!!.orderNo,
OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason
)
return
}
val parameters = initAutopilotControlParameters()
if (parameters == null) {
d(M_TAXI_P + TAG, "AutopilotControlParameters is empty.")
return
}
startAutoPilot(parameters)
d(
M_TAXI_P + TAG,
"start autopilot with parameter: %s",
GsonUtil.jsonFromObject(parameters)
+ " ,startSiteName=" + currentOCHOrder!!.startSiteAddr
+ " ,endSiteName=" + currentOCHOrder!!.endSiteAddr
)
TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(
false,
false,
currentOCHOrder!!.startSiteAddr,
currentOCHOrder!!.endSiteAddr,
currentOCHOrder!!.orderNo
)
}
private fun initAutopilotControlParameters(): AutopilotControlParameters? {
if (!checkCurrentOCHOrder()) {
e(M_TAXI_P + TAG, "no order or order is empty.")
ToastUtils.showShort("当前订单不存在或异常!")
return null
}
val parameters = AutopilotControlParameters()
val startWgsLon = currentOCHOrder!!.startSitePoint[0]
val startWgsLat = currentOCHOrder!!.startSitePoint[1]
val endWgsLon = currentOCHOrder!!.endSitePoint[0]
val endWgsLat = currentOCHOrder!!.endSitePoint[1]
parameters.vehicleType = currentOCHOrder!!.businessType
parameters.startName =
PinYinUtil.getPinYinHeadChar(currentOCHOrder!!.startSiteAddr) // 起点名称拼音首字母大写科学城B区2号门KXCBQ2HM
parameters.endName =
PinYinUtil.getPinYinHeadChar(currentOCHOrder!!.endSiteAddr) // 终点名称拼音首字母大写科学城C区三号门KXCCQSHM
parameters.startLatLon = AutoPilotLonLat(startWgsLat, startWgsLon)
parameters.endLatLon = AutoPilotLonLat(endWgsLat, endWgsLon)
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutoPilotLine(
currentOCHOrder!!.lineId,
currentOCHOrder!!.csvFileUrl, currentOCHOrder!!.csvFileMd5,
currentOCHOrder!!.txtFileUrl, currentOCHOrder!!.txtFileMd5,
currentOCHOrder!!.contrailSaveTime, currentOCHOrder!!.carModel,
currentOCHOrder!!.csvFileUrlDPQP, currentOCHOrder!!.csvFileMd5DPQP,
currentOCHOrder!!.txtFileUrlDPQP, currentOCHOrder!!.txtFileMd5DPQP,
currentOCHOrder!!.contrailSaveTimeDPQP
)
}
return parameters
}
/**
* 将业务订单信息保存,鹰眼可取用
*/
fun updateAutopilotControlParameters() {
val parameters = initAutopilotControlParameters()
if (null == parameters) {
e(M_TAXI_P + TAG, "AutopilotControlParameters is empty.")
return
}
d(M_TAXI_P + TAG, "AutopilotControlParameters is update.")
updateAutopilotControlParameters(parameters)
}
fun clearAutopilotControlParameters() {
d(M_TAXI_P + TAG, "AutopilotControlParameters is clear.")
updateAutopilotControlParameters(null)
}
fun setStation() {
if (currentOCHOrder != null) {
val startStation = MogoLocation()
startStation.longitude = currentOCHOrder!!.startSiteGcjPoint[0]
startStation.latitude = currentOCHOrder!!.startSiteGcjPoint[1]
val endStation = MogoLocation()
endStation.longitude = currentOCHOrder!!.endSiteGcjPoint[0]
endStation.latitude = currentOCHOrder!!.endSiteGcjPoint[1]
setStationPoint(startStation, endStation, currentOCHOrder!!.lineId)
}
}
fun cleanStation() {
setStationPoint(null, null, -1L)
}
}

View File

@@ -1,114 +0,0 @@
package com.mogo.och.taxi.passenger.model;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
* Created on 2021/9/10
*
* 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等)
*/
public class 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 mQueryOrderRemainingDisposable; //心跳轮询
private CompositeDisposable mRouteWipeDisposable; //轨迹擦除
private Disposable mReadyToAutopilotDisposable; //轮询是否可开启自动驾驶
public void startReadyToAutopilot() {
if (mReadyToAutopilotDisposable != null && !mReadyToAutopilotDisposable.isDisposed()) {
return;
}
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startReadyToAutopilot()");
mReadyToAutopilotDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS)
.map((aLong -> aLong + 1))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> TaxiPassengerModel.getInstance().loopQueryPilotStatus());
}
public void stopReadyToAutopilot() {
if (mReadyToAutopilotDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopReadyToAutopilot()");
mReadyToAutopilotDisposable.dispose();
mReadyToAutopilotDisposable = null;
}
}
public void stopRouteAndWipe() {
if (mRouteWipeDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()");
mRouteWipeDisposable.dispose();
mRouteWipeDisposable = null;
}
}
public void startInAndWaitOrdersLoop() {
if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) {
return;
}
CallerLogger.INSTANCE.i(M_TAXI_P + 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 -> TaxiPassengerModel.getInstance().queryInAndWaitOrders());
}
public void stopInAndWaitOrdersLoop() {
if (mInAndWaitServiceDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopInAndWaitOrdersLoop()");
mInAndWaitServiceDisposable.dispose();
mInAndWaitServiceDisposable = null;
}
}
/**
* 轮训查下 查询订单剩余里程和时间
*/
public void startQueryOrderRemainingLoop() {
if (mQueryOrderRemainingDisposable != null && !mQueryOrderRemainingDisposable.isDisposed()) {
return;
}
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startQueryOrderRemainingLoop()");
mQueryOrderRemainingDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY,
TaxiPassengerConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS)
.map((aLong -> aLong + 1))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(aLong -> TaxiPassengerModel.getInstance().queryOrderRemaining());
}
public void stopQueryOrderRemainingLoop() {
if (mQueryOrderRemainingDisposable != null) {
CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopQueryOrderRemainingLoop()");
mQueryOrderRemainingDisposable.dispose();
mQueryOrderRemainingDisposable = null;
}
}
}

View File

@@ -18,11 +18,9 @@ import com.mogo.och.common.module.manager.OCHAdasAbilityManager;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback;
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback;
import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel;
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel;
import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment;
import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen;
@@ -32,7 +30,7 @@ import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen;
* @date: 2022/3/4
*/
public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragment> implements
IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerControllerStatusCallback,
IOCHTaxiPassengerADASStatusCallback,
IOCHTaxiPassengerOrderStatusCallback {
private static final String TAG = BaseTaxiPassengerPresenter.class.getSimpleName();
@@ -41,7 +39,7 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
public BaseTaxiPassengerPresenter(TaxiPassengerBaseFragment view) {
super(view);
TaxiPassengerModel.getInstance().init(AbsMogoApplication.getApp());
TaxiPassengerModel.INSTANCE.init(AbsMogoApplication.getApp());
OCHAdasAbilityManager.getInstance().init(AbsMogoApplication.getApp());
initListeners();
}
@@ -57,20 +55,18 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
super.onDestroy( owner );
releaseListeners();
TaxiPassengerModel.getInstance().release();
TaxiPassengerModel.INSTANCE.release();
OCHAdasAbilityManager.getInstance().release();
}
private void initListeners() {
TaxiPassengerModel.getInstance().setADASStatusCallback(this);
TaxiPassengerModel.getInstance().setOrderStatusCallback("BaseTaxiPassengerPresenter",this);
TaxiPassengerModel.getInstance().setControllerStatusCallback("BaseTaxiPassengerPresenter",this);
TaxiPassengerModel.INSTANCE.setADASStatusCallback(this);
TaxiPassengerModel.INSTANCE.setOrderStatusCallback("BaseTaxiPassengerPresenter",this);
}
private void releaseListeners() {
TaxiPassengerModel.getInstance().setADASStatusCallback(null);
TaxiPassengerModel.getInstance().setOrderStatusCallback("BaseTaxiPassengerPresenter",null);
TaxiPassengerModel.getInstance().setControllerStatusCallback("BaseTaxiPassengerPresenter",null);
TaxiPassengerModel.INSTANCE.setADASStatusCallback(null);
TaxiPassengerModel.INSTANCE.setOrderStatusCallback("BaseTaxiPassengerPresenter",null);
}
private void runOnUIThread( Runnable executor ) {
@@ -86,11 +82,11 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
// 获取当前订单状态
public TaxiPassengerOrderStatusEnum getCurOrderStatus() {
return TaxiPassengerModel.getInstance().getCurOrderStatus();
return TaxiPassengerModel.INSTANCE.getCurOrderStatus();
}
public void startOrStopOrderLoop(){
TaxiPassengerModel.getInstance().startOrStopOrderLoop();
TaxiPassengerModel.INSTANCE.startOrStopOrderLoop();
}
@Override
@@ -116,17 +112,6 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING));
}
@Override
public void onVRModeChanged(boolean isVRMode) {
runOnUIThread(() -> mView.switchVRFlatMode(isVRMode));
}
@Override
public void onCarLocationChanged(MogoLocation location) {
// 速度不用展示
// LeftMenuOpen.INSTANCE.callCallBack(-1,-1,location.getSpeed());
}
@Override
public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) {
// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, GsonUtil.jsonFromObject(order));
@@ -144,11 +129,6 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
LeftMenuOpen.INSTANCE.callCallBack(meters,timeInSecond,-1);
}
@Override
public void onCurrentRoadName(String currentRoadName) {
}
@Override
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
CallerLogger.INSTANCE.d(M_TAXI_P+TAG,"isBoarded = "+isBoarded);
@@ -169,10 +149,10 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
"", "", "", "");
mView.showOrHideArrivedEndLayout(false,"","");
});
TaxiPassengerModel.getInstance().recoverNaviInfo();
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotLoop(false);
TaxiPassengerModel.getInstance().cleanStation();
TaxiPassengerModel.INSTANCE.recoverNaviInfo();
TaxiPassengerModel.INSTANCE.startOrStopReadyToAutopilotLoop(false);
clearV2XMarkers();
TaxiPassengerModel.INSTANCE.cleanStation();
return;
}
// 20 司机到达上车点
@@ -193,16 +173,16 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
mView.showOrHideStartAutopilotView(true,false);
});
//开启轮询司机是否已准备好开启自动驾驶的环境
TaxiPassengerModel.getInstance().startDriverReadyToAutopilotLoop();
TaxiPassengerModel.getInstance().setStation();
TaxiPassengerModel.INSTANCE.startDriverReadyToAutopilotLoop();
TaxiPassengerModel.INSTANCE.setStation();
}
if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
runOnUIThread(() ->{
mView.showOrHideStartAutopilotView(false,false);
mView.showOrHideServingOrderFragment(true,true);
});
TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotLoop(false);
TaxiPassengerModel.getInstance().setStation();
TaxiPassengerModel.INSTANCE.startOrStopReadyToAutopilotLoop(false);
TaxiPassengerModel.INSTANCE.setStation();
}
// 30 用户到达上车点 并通过了手机号后四位验证
// 40 服务中
@@ -221,29 +201,26 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
// 50 到达终点 乘客可以评价
if (TaxiPassengerOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus){
TaxiPassengerModel.getInstance().recoverNaviInfo();
TaxiPassengerModel.getInstance().startOrStopRouteAndWipe(false);
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
TaxiPassengerModel.INSTANCE.recoverNaviInfo();
mView.showOrHideOverMapViewFragment(false);
runOnUIThread(() -> {
mView.showOrHideServingOrderFragment(false,true);
mView.showOrHideArrivedEndLayout(true, order.endSiteAddr,order.orderNo);
CallerOrderListenerManager.INSTANCE.invokeOrderStatus(false);
});
TaxiPassengerModel.getInstance().cleanStation();
TaxiPassengerModel.INSTANCE.cleanStation();
return;
}
// 60 服务完成 页面
if (TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).destroyGeocodeSearch();
mCurrentPassengerOrder = null;
TaxiPassengerModel.getInstance().cleanStation();
TaxiPassengerModel.INSTANCE.cleanStation();
return;
}
}
public void checkAndUpdateStatus(String phone){
TaxiPassengerModel.getInstance().checkPhoneAndUpdateStatus(phone, new ITaxiPassengerCommonCallback() {
TaxiPassengerModel.INSTANCE.checkPhoneAndUpdateStatus(phone, new ITaxiPassengerCommonCallback() {
@Override
public void onCommonCallback() {
mView.showOrHidePressengerCheckPager(false,"","","","","");
@@ -255,14 +232,14 @@ public class BaseTaxiPassengerPresenter extends Presenter<TaxiPassengerBaseFragm
* 封装请求
*/
public void arrivedAndScore(TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean){
TaxiPassengerModel.getInstance().arrivedAndScore(taxiPassengerScoreUpdateOrderReqBean,aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean));
TaxiPassengerModel.INSTANCE.arrivedAndScore(taxiPassengerScoreUpdateOrderReqBean,aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean));
}
/**
* 开启自动驾驶
*/
public void startAutopilot(){
TaxiPassengerModel.getInstance().startAutopilot();
TaxiPassengerModel.INSTANCE.startAutopilot();
}
}

View File

@@ -18,25 +18,19 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean;
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.callback.ITaxiPassengerVeloctityCallback;
import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum;
import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel;
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel;
import com.mogo.och.taxi.passenger.ui.TaxiPassengerServingOrderFragment;
import java.util.List;
import mogo.telematics.pad.MessagePad;
/**
* @author: wangmingjun
* @date: 2022/3/14
*/
public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerServingOrderFragment>
implements IOCHTaxiPassengerAutopilotPlanningCallback, IOCHTaxiPassengerOrderStatusCallback
, IOCHTaxiPassengerControllerStatusCallback, ITaxiPassengerVeloctityCallback {
implements IOCHTaxiPassengerAutopilotPlanningCallback, IOCHTaxiPassengerOrderStatusCallback{
private static final String TAG = TaxiPassengerServingOrderPresenter.class.getSimpleName();
@@ -54,18 +48,13 @@ public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerS
private void initListener() {
// 设置起点和终点marker和实时车辆位置
TaxiPassengerModel.getInstance().setMoGoAutopilotPlanningListener(this);
TaxiPassengerModel.getInstance().setOrderStatusCallback("TaxiPassengerServingOrderPresenter",this);
TaxiPassengerModel.getInstance().setControllerStatusCallback("TaxiPassengerServingOrderPresenter",this);
// 获取道路限速
TaxiPassengerModel.getInstance().setVeloctityCallback(this);
TaxiPassengerModel.INSTANCE.setMoGoAutopilotPlanningListener(this);
TaxiPassengerModel.INSTANCE.setOrderStatusCallback("TaxiPassengerServingOrderPresenter",this);
}
public void releaseListener(){
TaxiPassengerModel.getInstance().setMoGoAutopilotPlanningListener(null);
TaxiPassengerModel.getInstance().setOrderStatusCallback("TaxiPassengerServingOrderPresenter",null);
TaxiPassengerModel.getInstance().setControllerStatusCallback("TaxiPassengerServingOrderPresenter",null);
TaxiPassengerModel.getInstance().setVeloctityCallback(null);
TaxiPassengerModel.INSTANCE.setMoGoAutopilotPlanningListener(null);
TaxiPassengerModel.INSTANCE.setOrderStatusCallback("TaxiPassengerServingOrderPresenter",null);
}
@@ -92,11 +81,11 @@ public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerS
if (mCurrentPassengerOrder == null || mCurrentPassengerOrder.orderStatus != order.orderStatus){
if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){
TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(true);
TaxiPassengerModel.INSTANCE.startOrStopQueryOrderRemaining(true);
if (mCurrentPassengerOrder == null){
TaxiPassengerModel.getInstance().queryOrderRouteList();
TaxiPassengerModel.INSTANCE.queryOrderRouteList();
}
TaxiPassengerModel.getInstance().updateAutopilotControlParameters();
TaxiPassengerModel.INSTANCE.updateAutopilotControlParameters();
CallerFuncBizManager.getBizProvider().queryV2XEvents();//全览模式的V2X事件轮询开始
CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "OnTheWayToEnd");
}
@@ -104,8 +93,8 @@ public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerS
if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == order.orderStatus
|| TaxiPassengerOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus
|| TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){
TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(false);
TaxiPassengerModel.getInstance().clearAutopilotControlParameters();
TaxiPassengerModel.INSTANCE.startOrStopQueryOrderRemaining(false);
TaxiPassengerModel.INSTANCE.clearAutopilotControlParameters();
CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "Cancel or ArriveAtEnd or JourneyCompleted");
}
@@ -120,43 +109,11 @@ public class TaxiPassengerServingOrderPresenter extends Presenter<TaxiPassengerS
runOnUIThread(() -> mView.onCurrentOrderDistToEndChanged(meters, timeInSecond));
}
@Override
public void onCurrentRoadName(String currentRoadName) {
runOnUIThread(() -> mView.onCurrentRoadName(currentRoadName));
}
@Override
public void onDriverHasCheckedPilotCondition(boolean isBoarded) {
}
@Override
public void onVRModeChanged(boolean isVRMode) {
}
private long startTime = 0;
private static final long TIMEINTERVAL = 4000;
@Override
public void onCarLocationChanged(MogoLocation location) {
if (location != null){
runOnUIThread(() -> mView.onCarLocationChanged(location));
long currentTimeMillis = System.currentTimeMillis();
if(currentTimeMillis-startTime<TIMEINTERVAL){
return;
}
CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"onCarLocationChanged 获取当前路的信息");
startTime = currentTimeMillis;
TaxiPassengerGeocodeSearchModel.getInstance(getContext()).searchLocationInfo(location.getLatitude(),location.getLongitude());
}
}
@Override
public void onLimitingVelocityChange(int limitingVelocity) {
mView.onLimitingVelocityChange(limitingVelocity);
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
super.onDestroy(owner);

View File

@@ -57,7 +57,7 @@ class OverviewFragment : BaseFragment() {
if(!finalVisable2User){
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"正在展示")
finalVisable2User = true
statusChange(TaxiPassengerModel.getInstance().curOrderStatus)
statusChange(TaxiPassengerModel.curOrderStatus)
}
}else{//没有展示
@@ -117,7 +117,7 @@ class OverviewFragment : BaseFragment() {
overmapview?.onCreateView(savedInstanceState)
CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onCreateView")
statusChange(TaxiPassengerModel.getInstance().curOrderStatus)
statusChange(TaxiPassengerModel.curOrderStatus)
}
companion object{

View File

@@ -58,8 +58,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
public static final String TAG = "TaxiPassengerBaseFragment";
private MapBizView mapBizView;
private ImageView mAutopilotImage;
private ImageView mMapswitchBtn;
private RomaPassengerView romaPView;
private WeakReference<TaxiPassengerArrivedView> mArrivedEndView;
@@ -68,12 +66,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
protected TaxiPassengerServingOrderFragment ochServingOrderFragment = null;
protected OverviewFragment overviewFragment = null;
//消息盒子
private PassengerMsgBoxButtonView viewPassengerMsgBoxButton;
private PassengerMsgBoxBubbleView viewPassengerMsgBoxBubble;
private PassengerMsgBoxListView viewPassengerMsgBoxList;
private final Handler mHandler = new Handler(Looper.getMainLooper());
@Nullable
@Override
@@ -95,8 +87,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
@Override
protected void initViews() {
mapBizView = findViewById(R.id.mapBizView);
mAutopilotImage = findViewById(R.id.module_och_autopilot_iv);
mMapswitchBtn = findViewById(R.id.module_och_taxi_swich_map_iv);
romaPView = findViewById(R.id.romaPView);
if(DeviceUtils.isLenovoModel() || DeviceUtils.isEB5Model()){
romaPView.setVisibility(View.VISIBLE);
@@ -104,7 +94,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
romaPView.setVisibility(View.GONE);
}
updateSwitchMapIcon();
initListener();
onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState());
@@ -112,22 +101,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
switchVRFlatMode(MogoStatusManager.getInstance().isVrMode());
//预加载视频进程
EmptyService.Companion.startService(getContext());
//消息盒子
viewPassengerMsgBoxButton = findViewById(R.id.viewPassengerMsgBoxButton);
viewPassengerMsgBoxBubble = findViewById(R.id.viewPassengerMsgBoxBubble);
viewPassengerMsgBoxList = findViewById(R.id.viewPassengerMsgBoxList);
viewPassengerMsgBoxButton.setClickListener(show -> {
if (show) {
viewPassengerMsgBoxList.setVisibility(View.VISIBLE);
viewPassengerMsgBoxBubble.setVisibility(View.GONE);
viewPassengerMsgBoxBubble.isShowData(false);
} else {
viewPassengerMsgBoxList.setVisibility(View.GONE);
viewPassengerMsgBoxBubble.setVisibility(View.VISIBLE);
viewPassengerMsgBoxBubble.isShowData(true);
}
});
}
@Override
@@ -136,45 +109,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
mapBizView.onCreate(savedInstanceState);
}
private void updateSwitchMapIcon() {
IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
if (controller != null) {
if (controller.getCurrentMapVisualAngle().isLongSight()) {
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_long);
} else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
} else {
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
}
}
}
private void initListener() {
mMapswitchBtn.setOnClickListener(v -> {
IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController();
if (controller != null) {
//切换地图的远近视图
if (controller.getCurrentMapVisualAngle().isLongSight()) {
Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(true);
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
} else if (controller.getCurrentMapVisualAngle().isMediumSight()) {
Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(false);
controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null);
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_long);
} else {
controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null);
mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium);
}
}
//OverlayLeftViewUtils.INSTANCE.dismissOverlayView();
});
findViewById(R.id.iv_temp).setOnClickListener(view -> {
OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(), 0, true, -1, true);
//showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728");
//showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480");
//OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext());
});
}
private void initArrivedView() {
@@ -191,9 +126,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
public void onResume() {
super.onResume();
mapBizView.onResume();
// mPresenter.startOrStopOrderLoop();
// showOrHideServingOrderFragment(true,false);
// showOrHideStartAutopilotView(true,true);
}
/**
@@ -225,30 +157,10 @@ public class TaxiPassengerBaseFragment extends MvpFragment<TaxiPassengerBaseFrag
// 2. 主动开启自动驾驶中为2则停止loading并isStarting = false
onAutopilotStatusSuccessDone();
}
// 3. 其他过程直接更新
if (mPrevAPStatus != status) {
autopilotStatusAnimchanged(status);
}
mPrevAPStatus = status;
});
}
public void autopilotStatusAnimchanged(int status) {
// mAutopilotTv.setText(isInAutopilot?"自动驾驶":"开启自动驾驶");
if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING == status) {
mAutopilotImage.setImageResource(R.drawable.taxi_p_auto_nor);
} else if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE == status) {
mAutopilotImage.setImageResource(R.drawable.taxi_p_un_auto_nor);
} else {
mAutopilotImage.setImageResource(R.drawable.taxi_p_un_auto_nor);
}
}
private void startAutopilotDone(boolean success) {
mHandler.postDelayed(() -> onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState()), 1000L);
}
@NonNull
@Override
protected BaseTaxiPassengerPresenter createPresenter() {

View File

@@ -61,8 +61,6 @@ class TaxiPassengerServingOrderFragment :
private var mProgressSeekBar: AppCompatSeekBar? = null
private var mProgessDes: TextView? = null
private var mSpeedLayoutBg: OCHRadiusImageView? = null
@Volatile
private var mLimitingVelocity = 0 // 返回的道路限速值
override fun getLayoutId(): Int {
return R.layout.taxi_p_activity_serving_order_view
}
@@ -110,7 +108,7 @@ class TaxiPassengerServingOrderFragment :
private fun initAmapNaviView(savedInstanceState: Bundle?) {
mAmapNaviVIew = findViewById(R.id.taxi_p_order_amap_navi_view)
mAmapNaviVIew?.onCreate(savedInstanceState)
TaxiPassengerModel.getInstance().startNaviByAmap()
TaxiPassengerModel.startNaviByAmap()
}
private fun initRouteNaviView(savedInstanceState: Bundle?) {
@@ -146,25 +144,18 @@ class TaxiPassengerServingOrderFragment :
mProgressSeekBar?.jumpDrawablesToCurrentState()
}
private fun updateDriveRoadName(currentRoadName: String) {
mProgessDes?.text = currentRoadName
}
override fun onResume() {
super.onResume()
mMapRottingView?.onResume()
mAmapNaviVIew?.onResume()
TaxiPassengerModel.getInstance().initGeocodeSearch()
}
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (hidden) { //fragment 隐藏, 导航取消c
clearPolyline()
TaxiPassengerModel.getInstance().destoryGeocodeSearch()
} else { //fragment 显示, 导航开始
e(SceneConstant.M_TAXI_P + "TaxiPassengerNaviTo", "initGeocodeSearch")
TaxiPassengerModel.getInstance().initGeocodeSearch()
}
}
@@ -179,7 +170,6 @@ class TaxiPassengerServingOrderFragment :
mMapRottingView?.onDestroy()
mAmapNaviVIew?.onDestroy()
AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi()
TaxiPassengerModel.getInstance().destoryGeocodeSearch()
}
fun showRottingMapView() {
@@ -266,10 +256,6 @@ class TaxiPassengerServingOrderFragment :
updateDriveProcessLoading(meters.toInt())
}
fun onCurrentRoadName(roadName: String) {
updateDriveRoadName(roadName)
}
private fun updateOrderDisAndTimeView(
remainDis: String,
remainDisUnit: String,
@@ -286,10 +272,6 @@ class TaxiPassengerServingOrderFragment :
updateSpeedView(location.gnssSpeed)
}
fun onLimitingVelocityChange(limitingVelocity: Int) {
mLimitingVelocity = limitingVelocity
}
/**
* 更新速度
*
@@ -297,7 +279,6 @@ class TaxiPassengerServingOrderFragment :
*/
private fun updateSpeedView(newSpeed: Float) {
val speed = (Math.abs(newSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值
d(SceneConstant.M_TAXI_P + TAG, "mLimitingVelocity = $mLimitingVelocity")
mTPSpeedTv?.setmColorList(
intArrayOf(
resources.getColor(R.color.taxi_p_speed_normal_color1), resources.getColor(

View File

@@ -0,0 +1,96 @@
package com.mogo.och.taxi.passenger.ui.bottom
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_overmapview
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_roma
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_setting
import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_video
class BottomBar @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
private var checkIndex = SelectView.None
private var overMapViewApply:ApplyClickLintener?=null
private var videoApply:ApplyClickLintener?=null
private var romaApply:ApplyClickLintener?=null
private var settingApply:ApplyClickLintener?=null
init {
isClickable = true
LayoutInflater.from(context).inflate(R.layout.taxi_p_bottom_bar, this, true)
setBackgroundResource(R.drawable.taxi_p_bottom_bar_bg)
actv_overmapview.setOnClickListener {
setCheckIndex(SelectView.OVERMAPVIEW)
overMapViewApply?.onApplyClick()
}
actv_video.setOnClickListener {
setCheckIndex(SelectView.VIDEO)
videoApply?.onApplyClick()
}
actv_roma.setOnClickListener {
setCheckIndex(SelectView.ROMA)
romaApply?.onApplyClick()
}
actv_setting.setOnClickListener {
setCheckIndex(SelectView.SETTING)
settingApply?.onApplyClick()
}
}
fun setOverMapApplyClick(overMapViewApply:ApplyClickLintener){
this.overMapViewApply = overMapViewApply
}
fun setVideoApplyClick(overMapViewApply:ApplyClickLintener){
this.videoApply = overMapViewApply
}
fun setRomaApplyClick(overMapViewApply:ApplyClickLintener){
this.romaApply = overMapViewApply
}
fun setSettingApplyClick(overMapViewApply:ApplyClickLintener){
this.settingApply = overMapViewApply
}
fun setCheckIndex(index: SelectView){
if(checkIndex==index){
checkIndex = SelectView.None
}else{
checkIndex = index
}
if(checkIndex == SelectView.OVERMAPVIEW){
actv_overmapview.setCheckItem(true)
}else{
actv_overmapview.setCheckItem(false)
}
if(checkIndex == SelectView.VIDEO){
actv_video.setCheckItem(true)
}else{
actv_video.setCheckItem(false)
}
if(checkIndex == SelectView.ROMA){
actv_roma.setCheckItem(true)
}else{
actv_roma.setCheckItem(false)
}
if(checkIndex == SelectView.SETTING){
actv_setting.setCheckItem(true)
}else{
actv_setting.setCheckItem(false)
}
}
enum class SelectView{
None,OVERMAPVIEW,VIDEO,ROMA,SETTING
}
interface ApplyClickLintener{
fun onApplyClick()
}
}

View File

@@ -0,0 +1,92 @@
package com.mogo.och.bus.passenger.ui.view.bottom
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.och.taxi.passenger.R
import kotlinx.android.synthetic.main.m1_bottom_check.view.aciv_center_image
import kotlinx.android.synthetic.main.m1_bottom_check.view.actv_title
open class BottomCheckView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
companion object {
private const val TAG = "StopSiteView"
}
private var backageViewId: Int = -1
private var bottomTitle: String = ""
private var selectedDrawable: Int = -1
private var normalDrawable: Int = -1
private var bottomTitleNormalColor:Int = -1
private var bottomTitleCheckedColor:Int = -1
private var backageView: View? = null
private var isCheck = false
init {
LayoutInflater.from(context).inflate(R.layout.m1_bottom_check, this, true)
try {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BottomSelectView)
backageViewId = typedArray.getResourceId(R.styleable.BottomSelectView_backageViewId, -1)
bottomTitle = typedArray.getString(R.styleable.BottomSelectView_bottomTitle) ?: ""
selectedDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_selectedDrawable, -1)
normalDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_normalDrawable, -1)
bottomTitleNormalColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleNormalColor,
ContextCompat.getColor(context,R.color.white))
bottomTitleCheckedColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleCheckedColor,
ContextCompat.getColor(context,R.color.white))
typedArray.recycle()
initView(context)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun initView(context: Context) {
if (selectedDrawable > 0) {
aciv_center_image.setImageResource(normalDrawable)
}
actv_title.text = bottomTitle
}
fun setCheckItem(isCheck: Boolean) {
if (isCheck != this.isCheck) {
this.isCheck = isCheck
notifiBackageView()
}
}
private fun notifiBackageView() {
if (isCheck) {
backageView?.visibility = View.VISIBLE
aciv_center_image.setImageResource(selectedDrawable)
actv_title.setTextColor(bottomTitleNormalColor)
} else {
backageView?.visibility = View.GONE
aciv_center_image.setImageResource(normalDrawable)
actv_title.setTextColor(bottomTitleCheckedColor)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
parent?.let {
if (parent is ConstraintLayout) {
if (backageViewId > 0) {
backageView = (parent as ConstraintLayout).findViewById(backageViewId)
}
}
}
if (isCheck) {
backageView?.visibility = View.VISIBLE
}
}
}

View File

@@ -0,0 +1,70 @@
package com.mogo.och.taxi.passenger.ui.orderinfo
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.taxi.passenger.R
class ItineraryView(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) :
ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) {
// 速度
lateinit var actvSpeedValue: AppCompatTextView
// 速度单位
lateinit var actvSpeedUnit: AppCompatTextView
// 终点站
lateinit var actvEndstation: AppCompatTextView
// 距离终点距离
lateinit var actvDistance: AppCompatTextView
// 距离终点距离单位
lateinit var actvDistanceUnit: AppCompatTextView
// 剩余时间
lateinit var actvSurplusTime: AppCompatTextView
// 剩余时间单位
lateinit var actvSurplusTimeUnit: AppCompatTextView
// 到达时间
lateinit var actvArrivedTime: AppCompatTextView
private fun initView(context: Context?) {
LayoutInflater.from(context).inflate(R.layout.taxi_p_itinerary, this, true)
actvSpeedValue = findViewById(R.id.actv_speed_value)
actvSpeedUnit = findViewById(R.id.actv_speed_unit)
actvEndstation = findViewById(R.id.actv_endstation)
actvDistance = findViewById(R.id.actv_distance)
actvDistanceUnit = findViewById(R.id.actv_distance_unit)
actvSurplusTime = findViewById(R.id.actv_surplus_time)
actvSurplusTimeUnit = findViewById(R.id.actv_surplus_time_unit)
actvArrivedTime = findViewById(R.id.actv_arrived_time)
}
fun setSpeed(speedValue:String,speedUnit:String){
actvSpeedValue.text = speedValue
actvSpeedUnit.text = speedUnit
}
fun setEndStation(endStation:String){
actvEndstation.text = endStation
}
fun setDistanceInfo(distance:String,distanceUnit:String,
surplusTime:String,surplusTimeUnit:String,
arrivedTime:String
){
actvDistance.text = distance
actvDistanceUnit.text = distanceUnit
actvSurplusTime .text= surplusTime
actvSurplusTimeUnit.text = surplusTimeUnit
actvArrivedTime .text= arrivedTime
}
init {
try {
initView(context)
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -37,7 +37,7 @@ public class TPRouteDataTestUtils {
builder.setLongitude(s.getDouble("lon"));
list.add(builder.build());
}
TaxiPassengerModel.getInstance().startToRouteAndWipe(list);
TaxiPassengerModel.INSTANCE.startToRouteAndWipe();
} catch (JSONException e) {
e.printStackTrace();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_107"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
tools:ignore="MissingDefaultResource">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_center_image"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="@dimen/dp_90"
android:layout_height="@dimen/dp_90"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_title"
app:layout_constraintStart_toStartOf="@+id/aciv_center_image"
app:layout_constraintEnd_toEndOf="@+id/aciv_center_image"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/dp_4_5"
android:textSize="@dimen/dp_20"
android:text="靠边停车"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</merge>

View File

@@ -18,28 +18,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<com.mogo.eagle.core.function.hmi.ui.widget.SteeringWheelView
android:id="@+id/steering_wheel"
android:layout_width="@dimen/dp_630"
android:layout_height="@dimen/dp_630"
android:layout_marginLeft="-59dp"
android:layout_marginTop="@dimen/dp_32"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/module_och_autopilot_iv"
android:layout_width="@dimen/module_mogo_och_operation_status_bg_width"
android:layout_height="@dimen/module_mogo_och_operation_status_bg_height"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="40dp"
android:layout_marginTop="@dimen/dp_120"
android:scaleType="fitXY"
android:src="@drawable/taxi_p_un_auto_nor"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--pnc行为决策-->
<com.mogo.eagle.core.function.hmi.ui.vehicle.PncActionsView
android:layout_width="wrap_content"
@@ -61,60 +39,6 @@
app:roma_open="@drawable/iv_roma_taxi_passenger_press_bg"
app:layout_constraintLeft_toLeftOf="parent" />
<ImageView
android:id="@+id/module_och_taxi_swich_map_iv"
android:layout_width="@dimen/module_mogo_och_operation_status_bg_width"
android:layout_height="@dimen/module_mogo_och_operation_status_bg_height"
android:layout_gravity="center"
android:layout_marginLeft="40dp"
android:layout_marginTop="40dp"
android:layout_marginBottom="@dimen/dp_50"
android:background="@drawable/taxi_p_switch_map_medium"
android:scaleType="fitXY"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<!--消息盒子-->
<com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxButtonView
android:id="@+id/viewPassengerMsgBoxButton"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginStart="320dp"
android:layout_marginBottom="50dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
/>
<com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView
android:id="@+id/viewPassengerMsgBoxBubble"
android:layout_width="650dp"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
app:layout_constraintBottom_toTopOf="@id/viewPassengerMsgBoxButton"
app:layout_constraintLeft_toLeftOf="@id/viewPassengerMsgBoxButton"
app:layout_constraintRight_toRightOf="@id/viewPassengerMsgBoxButton" />
<com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxListView
android:id="@+id/viewPassengerMsgBoxList"
android:layout_width="650dp"
android:layout_height="750dp"
android:layout_marginBottom="20dp"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/viewPassengerMsgBoxButton"
app:layout_constraintLeft_toLeftOf="@id/viewPassengerMsgBoxButton"
app:layout_constraintRight_toRightOf="@id/viewPassengerMsgBoxButton" />
<ImageView
android:id="@+id/iv_temp"
android:layout_width="300dp"
android:layout_height="76dp"
android:layout_gravity="center"
android:layout_marginRight="@dimen/dp_40"
android:layout_marginBottom="@dimen/dp_50"
android:background="@drawable/taxi_p_mogologo_nor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/btnAutopilotDisable"
android:layout_width="wrap_content"
@@ -198,4 +122,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.mogo.och.taxi.passenger.ui.bottom.BottomBar
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_107"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
tools:ignore="MissingDefaultResource">
<TextClock
android:id="@+id/cl_order_time"
android:format12Hour="HH:mm MM月dd日 EEEE"
android:format24Hour="HH:mm MM月dd日 EEEE"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/actv_overmapview_press"
android:visibility="gone"
android:src="@drawable/taxi_p_bottom_bar_select_bg"
app:layout_constraintStart_toStartOf="@+id/actv_overmapview"
app:layout_constraintEnd_toEndOf="@+id/actv_overmapview"
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomCheckView
android:id="@+id/actv_overmapview"
app:backageViewId="@+id/actv_overmapview_press"
app:layout_constraintHorizontal_chainStyle="packed"
app:selectedDrawable="@drawable/charter_p_bottom_softsettiing_press"
app:normalDrawable="@drawable/charter_p_bottom_softsettiing_normal"
app:bottomTitle="全局概览"
app:layout_constraintEnd_toStartOf="@+id/actv_video"
app:layout_constraintStart_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/actv_video_press"
android:visibility="gone"
android:src="@drawable/taxi_p_bottom_bar_select_bg"
app:layout_constraintStart_toStartOf="@+id/actv_video"
app:layout_constraintEnd_toEndOf="@+id/actv_video"
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomCheckView
android:id="@+id/actv_video"
app:backageViewId="@+id/actv_video_press"
app:selectedDrawable="@drawable/charter_p_bottom_softsettiing_press"
app:normalDrawable="@drawable/charter_p_bottom_softsettiing_normal"
app:bottomTitle="蘑菇咨询"
app:layout_constraintStart_toEndOf="@+id/actv_overmapview"
app:layout_constraintEnd_toStartOf="@+id/actv_roma"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/actv_roma_press"
android:visibility="gone"
android:src="@drawable/taxi_p_bottom_bar_select_bg"
app:layout_constraintStart_toStartOf="@+id/actv_roma"
app:layout_constraintEnd_toEndOf="@+id/actv_roma"
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomCheckView
android:id="@+id/actv_roma"
app:backageViewId="@+id/actv_roma_press"
app:selectedDrawable="@drawable/charter_p_bottom_softsettiing_press"
app:normalDrawable="@drawable/charter_p_bottom_softsettiing_normal"
app:bottomTitle="漫游"
app:layout_constraintStart_toEndOf="@+id/actv_video"
app:layout_constraintEnd_toStartOf="@+id/actv_setting"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/actv_setting_press"
android:visibility="gone"
android:src="@drawable/taxi_p_bottom_bar_select_bg"
app:layout_constraintStart_toStartOf="@+id/actv_setting"
app:layout_constraintEnd_toEndOf="@+id/actv_setting"
android:layout_width="@dimen/dp_359"
android:layout_height="@dimen/dp_107"/>
<com.mogo.och.bus.passenger.ui.view.bottom.BottomCheckView
android:id="@+id/actv_setting"
app:backageViewId="@+id/actv_setting_press"
app:selectedDrawable="@drawable/charter_p_bottom_softsettiing_press"
app:normalDrawable="@drawable/charter_p_bottom_softsettiing_normal"
app:bottomTitle="线路"
app:layout_constraintStart_toEndOf="@+id/actv_roma"
app:layout_constraintEnd_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</merge>

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
tools:layout_width="wrap_content"
tools:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_speed_value"
tools:text="速度"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_speed_unit"
tools:text="速度单位"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_endstation"
tools:text="目的地"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_distance"
tools:text="剩余距离"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_distance_unit"
tools:text="剩余距离单位"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_surplus_time"
tools:text="剩余时间"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_surplus_time_unit"
android:text="剩余时间单位"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_arrived_time"
android:text="到达时间"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
</merge>

View File

@@ -28,4 +28,19 @@
</attr>
</declare-styleable>
<declare-styleable name="BottomSelectView">
<!-- 默认图片 -->
<attr name="normalDrawable" format="reference" />
<!-- 点击图片 -->
<attr name="selectedDrawable" format="reference" />
<!-- 显示背景view -->
<attr name="backageViewId" format="reference" />
<attr name="bottomTitle" format="string"/>
<attr name="bottomTitleNormalColor" format="color"/>
<attr name="bottomTitleCheckedColor" format="color"/>
</declare-styleable>
</resources>

View File

@@ -95,12 +95,12 @@ public class TaxiGrabOrderFragment extends BaseTaxiUIFragment implements View.On
Calendar calendar = DateTimeUtil.formatLongToCalendar(order.bookingTime);
if (DateTimeUtil.compareDateIsCurrentDay(calendar)){
mOrderReserverTime.setText("用车时间:今天 "+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm));
VoiceNotice.showNotice("预约单,今天"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm)+""
+order.startSiteAddr+""+order.endSiteAddr);
// VoiceNotice.showNotice("预约单,今天"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.HH_mm)+"从"
// +order.startSiteAddr+"到"+order.endSiteAddr);
}else {
mOrderReserverTime.setText("用车时间:"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.MM_dd_HH_mm));
VoiceNotice.showNotice("预约单,"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.MM_dd)+""
+order.startSiteAddr+""+order.endSiteAddr);
// VoiceNotice.showNotice("预约单,"+ DateTimeUtil.formatCalendarToString(calendar, DateTimeUtil.MM_dd)+"从"
// +order.startSiteAddr+"到"+order.endSiteAddr);
}
mOrderStartStation.setText(order.startSiteAddr);
mOrderEndStation.setText(order.endSiteAddr);

View File

@@ -15,12 +15,12 @@
},
"taxi" :{
"driver": ["ochDFHQ"],
"driverpassenger": ["ochDFHQ"],
"driverPassenger": ["ochDFHQ"],
"passenger": ["ochDFHQ"]
},
"bus" :{
"driver": ["ochJL"],
"driverpassenger": ["ochJL"],
"driverPassenger": ["ochJL"],
"passenger": ["ochJL"]
},
"charter" :{
@@ -58,7 +58,7 @@
},
"bus" :{
"driver": ["ochJL"],
"driverpassenger": ["ochJL"],
"driverPassenger": ["ochJL"],
"passenger": ["ochJL"]
}
}

View File

@@ -1,5 +1,5 @@
project.android.productFlavors {
driverpassenger {
driverPassenger {
dimension "role"
externalNativeBuild {
ndk {