diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt index dd5ffce344..91c1194884 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt @@ -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, "结束路距计算") } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt index d7bd2cb1ac..633384e64c 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt @@ -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") } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt index 72a72bd85e..88c7f2912e 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt @@ -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, "结束路距计算") } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BizLoopManager.kt similarity index 70% rename from OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BizLoopManager.kt index aaacdf7319..ff512902fa 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BizLoopManager.kt @@ -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{ + 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") diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt index 88aba91287..a987ec2d5c 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt @@ -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) \ No newline at end of file +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) \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java index 27fef64839..1d38df720d 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java @@ -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); } } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java deleted file mode 100644 index dd4b3336fd..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java +++ /dev/null @@ -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); -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java index d800e68e66..f89ebcb8ef 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java @@ -15,9 +15,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback { // 当前位置距离上车点的距离(米)、预估时间(秒) void onCurrentOrderDistToEndChanged(long meters, long timeInSecond); - //当前路名字 - void onCurrentRoadName(String currentRoadName); - // 司机已确认开启自动驾驶环境 void onDriverHasCheckedPilotCondition(boolean isBoarded); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt index 1e3ec5ccd0..19dfedc935 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt @@ -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 diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java deleted file mode 100644 index c43702af78..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java +++ /dev/null @@ -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 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) { - - } -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java deleted file mode 100644 index f95bba5744..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ /dev/null @@ -1,1078 +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 android.content.Intent; -import android.net.ConnectivityManager; -import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -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.commons.module.status.IMogoStatusChangedListener; -import com.mogo.commons.module.status.MogoStatusManager; -import com.mogo.commons.module.status.StatusDescriptor; -import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; -import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.enums.DataSourceType; -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.api.datacenter.union.ILimitingVelocityListener; -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; -import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager; -import com.mogo.eagle.core.function.call.v2x.CallerLimitingVelocityListenerManager; -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.CoordinateUtils; -import com.mogo.eagle.core.utilcode.util.NetworkUtils; -import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -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; -import com.mogo.och.common.module.manager.OCHAdasAbilityManager; -import com.mogo.och.common.module.manager.distancemamager.IDistanceListener; -import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener; -import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager; -import com.mogo.och.common.module.map.AmapNaviToDestinationModel; -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; -import com.mogo.och.common.module.utils.PinYinUtil; -import com.mogo.och.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.IOCHTaxiPassengerControllerStatusCallback; -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.callback.ITaxiPassengerVeloctityCallback; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; -import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager; -import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; -import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager; - -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -import io.reactivex.Observable; -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; -import mogo_msg.MogoReportMsg; -import system_master.SystemStatusInfo; - -/** - * Created by pangfan on 2021/8/19 - * - * 网约车 - 出租车业务逻辑处理 - */ -public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback { - - private static final String TAG = TaxiPassengerModel.class.getSimpleName(); - - private static final class SingletonHolder { - private static final TaxiPassengerModel INSTANCE = new TaxiPassengerModel(); - } - - public static TaxiPassengerModel getInstance() { - return SingletonHolder.INSTANCE; - } - - private Context mContext; - private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentOCHOrder; //当前订单 - private volatile List mInServiceList = Collections.emptyList(); //进行中订单 - private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单 - - private IOCHTaxiPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 - private IOCHTaxiPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 - - private final Map mOrderStatusCallbackMap = new ConcurrentHashMap<>(); - private final Map mControllerStatusCallbackMap = new ConcurrentHashMap<>(); - - private ITaxiPassengerVeloctityCallback mVeloctityCallback;//道路限速返回 - - private int mPreRouteIndex = 0; - - private Disposable subscribe; - private int delayTime = 2; - - private double mLongitude, mLatitude; - private MogoLocation mLocation = null; - - private final List mLocationsModels = new ArrayList<>(); - - private TaxiPassengerModel() { - } - - public void setMoGoAutopilotPlanningListener(IOCHTaxiPassengerAutopilotPlanningCallback - moGoAutopilotPlanningCallback) { - this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback; - } - - public void setADASStatusCallback(IOCHTaxiPassengerADASStatusCallback callback) { - this.mADASStatusCallback = callback; - } - - public void setControllerStatusCallback(String tag,IOCHTaxiPassengerControllerStatusCallback callback) { - if (tag == null || "".equals(tag)) return; - - if (callback == null) { - mControllerStatusCallbackMap.remove(tag); - return; - } - - mControllerStatusCallbackMap.put(tag,callback); - - } - - public void setOrderStatusCallback(String tag ,IOCHTaxiPassengerOrderStatusCallback callback) { - if (tag == null || "".equals(tag)) return; - - if (callback == null) { - mOrderStatusCallbackMap.remove(tag); - return; - } - - mOrderStatusCallbackMap.put(tag,callback); - } - - public void setVeloctityCallback(ITaxiPassengerVeloctityCallback callback){ - this.mVeloctityCallback = callback; - } - - public void init( Context context ) { - mContext = context.getApplicationContext(); - 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(new Consumer() { - @Override - public void accept(Throwable e) { - if (e instanceof UndeliverableException) { - e = e.getCause(); - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "UndeliverableException"); - } - if ((e instanceof IOException)) {// - // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IOException"); - return; - } - if (e instanceof InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "InterruptedException"); - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - // that's likely a bug in the application - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - if (e instanceof IllegalStateException) { - // that's a bug in RxJava or in a custom operator - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IllegalStateException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"Undeliverable exception"); - } - }); - - startOrStopOrderLoop(); - } - - /** - * 订单轮询 初始化主Fragment的Presenter init 调用 - */ - public void startOrStopOrderLoop(){ - if (NetworkUtils.isConnected(mContext)) { - startOrStopOrderLoop(true); - } - } - - /** - * 关闭订单轮训 页面摧毁时 - */ - public void release() { - startOrStopOrderLoop(false); - startOrStopQueryOrderRemaining(false); - releaseListeners(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } - } - - private void initListeners() { - - // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 - CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); - IntentManager.getInstance().registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); - MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10,mMapLocationListener); - - //2021.11.1 自动驾驶路线规划接口 - CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); - - //增加限速监听 - CallerLimitingVelocityListenerManager.INSTANCE.addListener(TAG,limitingVelocityListener); - - AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); - - //开启自驾后 异常信息返回 - OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener); - - CallerMsgBoxEventListenerManager.INSTANCE.addListener(TAG,iMsgBoxEventListener); - - TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG,distanceListener); - - TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener); - } - - private void releaseListeners() { - MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - - // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - - MogoAiCloudSocketManager.getInstance(mContext) - .unregisterLifecycleListener(10010); - - CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener); - CallerPlanningRottingListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); - CallerLimitingVelocityListenerManager.INSTANCE.removeListener(limitingVelocityListener); - - AbnormalFactorsLoopManager.INSTANCE.stopLoopAbnormalFactors(); - - OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null); - - CallerMsgBoxEventListenerManager.INSTANCE.removeListener(iMsgBoxEventListener); - - TrajectoryAndDistanceManager.INSTANCE.removeListener(TAG); - } - - /** - * 订单轮训 - * @param start true 开启订单轮训 - * false 关闭订单轮训 - */ - private void startOrStopOrderLoop(boolean start) { - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "startOrStopOrderLoop() " + start); - if (start) { - TaxiPassengerModelLoopManager.getInstance().startInAndWaitOrdersLoop(); - } else { - TaxiPassengerModelLoopManager.getInstance().stopInAndWaitOrdersLoop(); - } - } - - /** - * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等) - * - * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时, - * 才更新最新进行中单到本地 - */ - public void queryInAndWaitOrders() { - TaxiPassengerServiceManager.queryOrdersInAndWaitService(mContext, - new OchCommonServiceCallback() { - @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 (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } - } else { - //1.1.2. 当本地有currentOrder: - //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新 - //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新 - if (!mCurrentOCHOrder.orderNo.equals(data.data.servicing.get(0).orderNo)) { - queryCurOrderStatus(); -// } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) { - } else { //todo 订单拦截放到各自实现去做 - updateNativeCurrentOrder(data.data.servicing.get(0)); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } - } - } - } else { - // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更 - if (mCurrentOCHOrder != null) { - queryCurOrderStatus(); - } - recoverNaviInfo(); - } - } - - @Override - public void onError() { - - } - - @Override - public void onFail(int code, String msg) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"queryInAndWaitOrders"+code+msg); - } - }); - } - - //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder - private void queryCurOrderStatus() { - if (mCurrentOCHOrder == null) { - return; - } - final String orderNo = mCurrentOCHOrder.orderNo; - TaxiPassengerServiceManager.queryOrderById(mContext, orderNo, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerOrderQueryRespBean data) { - if (data != null && data.data != null - && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(data.data.orderNo)) { - if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.getCode() - || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() - || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.getCode()) { - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(data.data); - } - } - clearCurrentOCHOrder(); - } else { - updateNativeCurrentOrder(data.data); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } - } - } - } - - @Override - public void onFail(int code, String msg) { - - } - }); - } - - // 获取当前订单 - public TaxiPassengerOrderQueryRespBean.Result getCurrentOCHOrder() { - return mCurrentOCHOrder; - } - - // 获取当前订单状态 - public TaxiPassengerOrderStatusEnum getCurOrderStatus() { - TaxiPassengerOrderQueryRespBean.Result order = TaxiPassengerModel.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; - clearAutopilotControlParameters(); - 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(MogoLocation 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); - } - } - - - //监听网络变化,避免启动机器时无网导致无法更新订单信息 - private final IDistanceListener distanceListener = distance -> { - - }; - - private final ITrajectoryListener trajectoryListener = (routeArrivied, routeArriving, location) -> { - List routeArriviedTemp = new ArrayList<>(); - List routeArrivingTemp = new ArrayList<>(); - LatLng temp; - for (MogoLocation mogoLocation : routeArrivied) { - temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); - routeArriviedTemp.add(temp); - } - for (MogoLocation mogoLocation : routeArriving) { - temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); - routeArrivingTemp.add(temp); - } - mAutopilotPlanningCallback.routeResultByServer(routeArriviedTemp,routeArrivingTemp,location); - setRouteLineMarker(); - }; - private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { - @Override - public void onIntentReceived( String intentStr, Intent intent ) { - CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "onIntentReceived = %s", intentStr ); - if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) { - if ( NetworkUtils.isConnected( mContext ) ) { - startOrStopOrderLoop(true); - } - } - } - }; - - private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() { - // VR mode变更回调 - @Override - public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { - if (StatusDescriptor.VR_MODE == descriptor) { - if (mControllerStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ - callback.onVRModeChanged(isTrue); - } - } - } - } - }; - - // 自车定位 - private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() { - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - //位置变化时,通过围栏判断是否到达x点 - if (null == gnssInfo) return; - if (checkCurrentOCHOrder()) { - if (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.OnTheWayToEnd) { - calculateTravelDistance(gnssInfo); - } - } - mLongitude = gnssInfo.getLongitude(); - mLatitude = gnssInfo.getLatitude(); - - mLocation = gnssInfo; - // CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude); - for (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ - callback.onCarLocationChanged(gnssInfo); - } - } - - }; - - private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ - - @Override - public void onAutopilotDockerInfo(@NonNull String dockerVersion) { - } - - @Override - public void onAutopilotRouteLineId(long lineId) { - } - - @Override - public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { - } - - @Override - public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { - } - - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - } - - private boolean arriveAtEnd = false; //乘客app专用字段 - - @Override - public void onAutopilotStatusResponse(int state) { -// CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "state = %s", state ); - if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); - if (mCurrentOCHOrder != null - && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.UserArriveAtStart) { - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, true, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); - startServicePilotDone(); - } - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - 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) { - 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 onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) { - if (FunctionBuildConfig.isDemoMode - && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - arriveAtEnd = true; - } - - if (arrivalNotification == null || !checkCurrentOCHOrder() - || (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtEnd)) { - return; - } - } - - @Override - public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { - } - }; - - private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener(){ - - @Override - public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { - if (null != routeList && routeList.getWayPointsList().size() > 0){ - calculateRouteLineSum(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,routeList.getWayPointsList())); - startToRouteAndWipe(routeList.getWayPointsList()); - } - } - - }; - - private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() { - @Override - public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) { - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage); - } - }; - - private final IMsgBoxEventListener iMsgBoxEventListener = new IMsgBoxEventListener() { - @Override - public void onBubbleReportClickEvent(@NonNull MsgBoxBean msgBoxBean) { - - } - - @Override - public void onBubbleV2XClickEvent(@NonNull MsgBoxBean msgBoxBean) { - - } - - @Override - public void onBubbleOperationClickEvent(@NonNull MsgBoxBean msgBoxBean) { - - } - - @Override - public void onUpdateTipEvent(boolean isShow) { - - } - - @Override - public void onSummaryClickEvent() { - if (mCurrentOCHOrder == null){ - ToastUtils.showLong("行程已结束"); - }else { - OverlayLeftViewUtils.INSTANCE.transmissionIndexGet(OverlayLeftViewUtils.OVERVIEW); - } - } - }; - - public void startToRouteAndWipe(List models) { - List locationsModels = CoordinateCalculateRouteUtil - .coordinateConverterWgsToGcjLocations(mContext,models); - mLocationsModels.clear(); - mLocationsModels.addAll(locationsModels); - startOrStopRouteAndWipe(true); - showRottingMapView(); - } - - public void showRottingMapView(){ - AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.showRottingMapView(); - } - } - - public void startNaviByAmap() { - if (mCurrentOCHOrder != null && - mCurrentOCHOrder.orderStatus == TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode()){ - AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); - - double orderEndStationLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); - double orderEndStationLng = mCurrentOCHOrder.endSiteGcjPoint.get(0); - NaviLatLng startNaviLatLng = new NaviLatLng(mLatitude, mLongitude); - NaviLatLng endNaviLatLng = new NaviLatLng(orderEndStationLat,orderEndStationLng); - AmapNaviToDestinationModel.getInstance(mContext).initAMapNavi(startNaviLatLng, endNaviLatLng); - AmapNaviToDestinationModel.getInstance(mContext).setVoiceIsMute(false); - } - } - - /** - * 实时轨迹擦除 - * @param isStart - */ - public void startOrStopRouteAndWipe(boolean isStart){ - - } - - /** - * 设置小地图路径的起终点marker - */ - public void setRouteLineMarker(){ - if (mCurrentOCHOrder.startSiteGcjPoint == null || mCurrentOCHOrder.startSiteGcjPoint.isEmpty() || mCurrentOCHOrder.startSiteGcjPoint.size() < 2|| - mCurrentOCHOrder.endSiteGcjPoint == null || mCurrentOCHOrder.endSiteGcjPoint.isEmpty() || mCurrentOCHOrder.endSiteGcjPoint.size() < 2) { - setMarker(null,null); - return; - } - LatLng startStation = new LatLng(mCurrentOCHOrder.startSiteGcjPoint.get(1),mCurrentOCHOrder.startSiteGcjPoint.get(0)); - LatLng endStation = new LatLng(mCurrentOCHOrder.endSiteGcjPoint.get(1),mCurrentOCHOrder.endSiteGcjPoint.get(0)); - setMarker(startStation,endStation); - } - - private void setMarker(LatLng startStation,LatLng endStation){ - if (mAutopilotPlanningCallback != null) { - mAutopilotPlanningCallback.setLineMarker(startStation,endStation); - } - } - - /** - * 限速监听 - */ - private final ILimitingVelocityListener limitingVelocityListener = new ILimitingVelocityListener(){ - - @Override - public void onUnion(int limitingVelocity, @NonNull DataSourceType sourceType) { - - } - - @Override - public void onLimitingVelocityChange(int limitingVelocity, DataSourceType dataSourceType) { - if (mVeloctityCallback != null){ - mVeloctityCallback.onLimitingVelocityChange(limitingVelocity); - } - } - }; - - /** - * 导航订单起点到终点 获得剩余时间,里程,预计到达时间 - */ - public void initGeocodeSearch() { - if (mCurrentOCHOrder != null){ - TaxiPassengerGeocodeSearchModel.getInstance(mContext).initGeocodeSearch(); - TaxiPassengerGeocodeSearchModel.getInstance(mContext).setOCHTaciNaviChangedCallback(this); - } - } - - public void destoryGeocodeSearch(){ - TaxiPassengerGeocodeSearchModel.getInstance(mContext).destroyGeocodeSearch(); - } - - public void startOrStopQueryOrderRemaining(boolean isStart){ - if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingLoop(); - }else { - TaxiPassengerModelLoopManager.getInstance().stopQueryOrderRemainingLoop(); - } - } - - /** - * 查询订单剩余里程和时间 - */ - public void queryOrderRemaining(){ - if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.queryOrderRemaining(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerOrderQueryRemainingResp data) { - if (data != null && data.data!=null){ - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"distance = "+data.data.distance+" ,duration = "+data.data.duration); - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderDistToEndChanged(data.data.distance,data.data.duration); - } - } - } - - @Override - public void onFail(int code, String msg) { - - } - }); - } - - public void queryOrderRouteList() { - if (mCurrentOCHOrder == null) return; - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route--- queryOrderRouteList"); - TaxiPassengerServiceManager.queryOrderRouteList(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerQueryOrderRouteResp data) { - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route---"+GsonUtil.jsonFromObject(data)); - if (data != null && data.data != null && data.data != null && data.data.size() > 0){ - if (mAutopilotPlanningCallback != null){ - calculateRouteLineSum(data.data); -// if (mAutopilotPlanningCallback != null){ -// mAutopilotPlanningCallback.setLineMarker(data.data); -// } - mLocationsModels.clear(); - List locationsModels = CoordinateCalculateRouteUtil. - coordinateConverterLatlngToLocation(data.data); - mLocationsModels.addAll(locationsModels); - startOrStopRouteAndWipe(true); - } - }else { - subscribe = Observable.timer(delayTime, TimeUnit.SECONDS).subscribe(aLong -> { - queryOrderRouteList(); - }); - } - } - - @Override - public void onFail(int code, String msg) { - subscribe = Observable.timer(delayTime, TimeUnit.SECONDS).subscribe(aLong -> { - queryOrderRouteList(); - }); - } - }); - } - - @Override - public void onCurrentRoadName(String currentRoadName) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentRoadName(currentRoadName); - } - } - - /** - * 订单结束或者取消的时候, 刷新导航标识位以及缓存的数据 - */ - public void recoverNaviInfo(){ - SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS); - } - - public void calculateRouteLineSum(List points){ - float sumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(points); - SharedPrefsMgr.getInstance(mContext).putInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,(int) sumLength); - } - - public void checkPhoneAndUpdateStatus(String phoneTail,ITaxiPassengerCommonCallback commonCallback) { - if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.checkPhoneAndUpdateOrderStatus(mContext, mCurrentOCHOrder.orderNo, - phoneTail, new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - if (data != null && data.code == 0 && mCurrentOCHOrder != null){ - //乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询 - mCurrentOCHOrder.orderStatus = TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode(); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } - } - if(commonCallback!=null) { - commonCallback.onCommonCallback(); - } - - } - - @Override - public void onError() { - ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!"); - } - - @Override - public void onFail(int code, String msg) { - ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!"); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"提交用户输入的手机后4位、并进行状态扭转 后台结果错误"+code+msg); - } - }); - } - - public void arrivedAndScore(TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean , ITaxiPassengerCommonValueCallback commonCallback) { - if (taxiPassengerScoreUpdateOrderReqBean.orderNo == null) return; - TaxiPassengerServiceManager.arrivedAndScore(mContext,taxiPassengerScoreUpdateOrderReqBean, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - if(commonCallback!=null) { - commonCallback.onCommonCallback(true); - } - } - - @Override - public void onError() { - ToastUtils.showLong("网络错误请稍后再试"); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"对订单进行打分 1-5分 网络错误"); - if(commonCallback!=null) { - commonCallback.onCommonCallback(false); - } - } - - @Override - public void onFail(int code, String msg) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"对订单进行打分 1-5分 后台结果错误"+code+msg); - if(commonCallback!=null) { - commonCallback.onCommonCallback(false); - } - } - }); - } - - public void loopQueryPilotStatus(){ - if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.queryPilotStatus(mContext, mCurrentOCHOrder.orderNo, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - if (data != null && data.code == 0 && data.data.equals(true)) { - updateAutopilotStatus(true); - startOrStopReadyToAutopilotLoop(false); - } - } - - @Override - public void onFail(int code, String msg) { - updateAutopilotStatus(false); - } - }); - } - - public void updateAutopilotStatus(boolean isBoarded){ - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onDriverHasCheckedPilotCondition(isBoarded); - } - } - } - - public void startDriverReadyToAutopilotLoop(){ - if (NetworkUtils.isConnected(mContext)) { - startOrStopReadyToAutopilotLoop(true); - } - } - - public void startOrStopReadyToAutopilotLoop(boolean isStart) { - if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot(); - }else { - TaxiPassengerModelLoopManager.getInstance().stopReadyToAutopilot(); - } - } - - public void startServicePilotDone(){ - if (mCurrentOCHOrder == null) return; - TaxiPassengerStartReqBean.Result result = new TaxiPassengerStartReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; - TaxiPassengerServiceManager.startServicePilotDone(mContext, - mCurrentOCHOrder.orderNo, result, - new OchCommonServiceCallback(){ - - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - - } - - @Override - public void onFail(int code, String msg) { -// ToastUtils.showShort(msg); - } - }); - } - - public void startAutopilot() { - if (!checkCurrentOCHOrder()) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "no order or order is empty."); - ToastUtils.showShort("当前订单不存在或异常!"); - return; - } - - if (mCurrentOCHOrder.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode()){ - startServicePilotDone(); - } - - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { - ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + - ", 请稍候重试"); - - TaxiPassengerAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo, - OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason()); - return; - } - - AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (parameters == null){ - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is empty."); - return; - } - - CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters); - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "start autopilot with parameter: %s" - , GsonUtil.jsonFromObject(parameters) - + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr - + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); - - - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, false, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); - } - - private AutopilotControlParameters initAutopilotControlParameters() { - if (!checkCurrentOCHOrder()) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "no order or order is empty."); - ToastUtils.showShort("当前订单不存在或异常!"); - return null; - } - - AutopilotControlParameters parameters = new AutopilotControlParameters(); - double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0); - double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1); - double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0); - double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1); - - parameters.vehicleType = mCurrentOCHOrder.businessType; - parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) - parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) - parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon); - parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon); - - if (parameters.autoPilotLine == null) { - parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( - mCurrentOCHOrder.lineId, - mCurrentOCHOrder.csvFileUrl, mCurrentOCHOrder.csvFileMd5, - mCurrentOCHOrder.txtFileUrl, mCurrentOCHOrder.txtFileMd5, - mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel, - mCurrentOCHOrder.csvFileUrlDPQP, mCurrentOCHOrder.csvFileMd5DPQP, - mCurrentOCHOrder.txtFileUrlDPQP, mCurrentOCHOrder.txtFileMd5DPQP, - mCurrentOCHOrder.contrailSaveTimeDPQP); - } - - return parameters; - } - - /** - * 将业务订单信息保存,鹰眼可取用 - */ - public void updateAutopilotControlParameters() { - - AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (null == parameters){ - CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "AutopilotControlParameters is empty."); - return; - } - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is update."); - CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); - } - - public void clearAutopilotControlParameters(){ - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is clear."); - CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null); - } - - - private void runOnUIThread(Runnable executor) { - if (executor == null) { - return; - } - if (Looper.myLooper() != Looper.getMainLooper()) { - UiThreadHandler.post(executor); - } else { - executor.run(); - } - } - - public void setStation(){ - if(mCurrentOCHOrder!=null){ - MogoLocation startStation = new MogoLocation(); - startStation.setLongitude(mCurrentOCHOrder.startSiteGcjPoint.get(0)); - startStation.setLatitude(mCurrentOCHOrder.startSiteGcjPoint.get(1)); - MogoLocation endStation = new MogoLocation(); - endStation.setLongitude(mCurrentOCHOrder.endSiteGcjPoint.get(0)); - endStation.setLatitude(mCurrentOCHOrder.endSiteGcjPoint.get(1)); - TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation,mCurrentOCHOrder.lineId); - } - } - - public void cleanStation(){ - TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null,null,-1L); - } - -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt new file mode 100644 index 0000000000..c1b148e1c0 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -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() //进行中订单 + + private var mADASStatusCallback: IOCHTaxiPassengerADASStatusCallback? = null//Model->Presenter:自动驾驶状态相关 + private var mAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback? = null//Model->Presenter:自动驾驶线路规划 + private val mOrderStatusCallbackMap: MutableMap = 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 { + 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 { + 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, + routeArriving: MutableList, + location: MogoLocation + ) { + val routeArriviedTemp: MutableList = ArrayList() + val routeArrivingTemp: MutableList = 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 { + 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 { + 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?) { + 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 { + 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? + ) { + if (taxiPassengerScoreUpdateOrderReqBean.orderNo == null) return + TaxiPassengerServiceManager.arrivedAndScore( + mContext!!, taxiPassengerScoreUpdateOrderReqBean, + object : OchCommonServiceCallback { + 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 { + 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 { + 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) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java deleted file mode 100644 index bb3ebec0dc..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ /dev/null @@ -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; - } - } -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 655a1a1f6c..6118ec321f 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -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 implements - IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerControllerStatusCallback, + IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerOrderStatusCallback { private static final String TAG = BaseTaxiPassengerPresenter.class.getSimpleName(); @@ -41,7 +39,7 @@ public class BaseTaxiPassengerPresenter extends Presenter 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{ 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 { 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 mView.showArrivedEndLayout2Thank(aBoolean)); + TaxiPassengerModel.INSTANCE.arrivedAndScore(taxiPassengerScoreUpdateOrderReqBean,aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean)); } /** * 开启自动驾驶 */ public void startAutopilot(){ - TaxiPassengerModel.getInstance().startAutopilot(); + TaxiPassengerModel.INSTANCE.startAutopilot(); } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java index e0e6edf5e9..9e5c913800 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java @@ -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 - 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 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 mArrivedEndView; @@ -68,12 +66,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment { - 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 { - 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 onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState()), 1000L); - } - @NonNull @Override protected BaseTaxiPassengerPresenter createPresenter() { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt index 926ee23f72..3bc1fcbcff 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt @@ -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( diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt new file mode 100644 index 0000000000..ed6fc91156 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt @@ -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() + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt new file mode 100644 index 0000000000..4d8d70e314 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt @@ -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 + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt new file mode 100644 index 0000000000..0effb501b0 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt @@ -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() + } + } + + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java index d837a76b89..a7d355ff95 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java @@ -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(); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_normal.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_normal.png new file mode 100644 index 0000000000..8d3c31d0d4 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_normal.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_press.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_press.png new file mode 100644 index 0000000000..07ab27a462 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_press.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_bg.png new file mode 100644 index 0000000000..8cdac88f73 Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_select_bg.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_select_bg.png new file mode 100644 index 0000000000..d033e0a51c Binary files /dev/null and b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_select_bg.png differ diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml new file mode 100644 index 0000000000..b6cd6a1a9a --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml index a5533567ba..e9488c88d9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml @@ -18,28 +18,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - - - - - - - - - - - - - -