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 index 1fc6e04113..32bdacd61d 100644 --- 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 @@ -412,6 +412,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback //清除订单信息 public void clearCurrentOCHOrder() { mCurrentOCHOrder = null; + clearAutopilotControlParameters(); SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER); } @@ -930,12 +931,36 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback return; } + AutopilotControlParameters parameters = initAutopilotControlParameters(); + if (parameters == null){ + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is empty."); + return; + } + + CallerAutoPilotManager.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); - AutopilotControlParameters parameters = new AutopilotControlParameters(); parameters.vehicleType = mCurrentOCHOrder.businessType; parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) @@ -953,15 +978,26 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback mCurrentOCHOrder.contrailSaveTimeDPQP); } - CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "start autopilot with parameter: %s" - , GsonUtil.jsonFromObject(parameters) - + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr - + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); + return parameters; + } + /** + * 将业务订单信息保存,鹰眼可取用 + */ + public void updateAutopilotControlParameters() { - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, false, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); + 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); } 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 b508715fd3..11ae9bf1c7 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 @@ -92,27 +92,26 @@ public class TaxiPassengerServingOrderPresenter extends PresentermView.updateOrderStatusView(order)); - }else if (mCurrentPassengerOrder.orderStatus != order.orderStatus) { - runOnUIThread(() ->mView.updateOrderStatusView(order)); - - if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){ - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "-----OnTheWayToEndStation----"); - TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(true); - } - - if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == mCurrentPassengerOrder.orderStatus - || TaxiPassengerOrderStatusEnum.ArriveAtEnd.getCode() == mCurrentPassengerOrder.orderStatus){ + if (TaxiPassengerOrderStatusEnum.Cancel.getCode() == order.orderStatus + || TaxiPassengerOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus + || TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){ TaxiPassengerModel.getInstance().startOrStopQueryOrderRemaining(false); + TaxiPassengerModel.getInstance().clearAutopilotControlParameters(); + CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "Cancel or ArriveAtEnd or JourneyCompleted"); } - mCurrentPassengerOrder = order; + + mCurrentPassengerOrder = order; //当前无订单 + runOnUIThread(() ->mView.updateOrderStatusView(order)); } } diff --git a/app/build.gradle b/app/build.gradle index c00bd0ba20..5986ac9217 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,6 +55,10 @@ if (!isAndroidTestBuild()) { leak_canary_crash_fix { enable !isReleaseBuild } + + anr_fix { + enable true + } } } } diff --git a/app/src/main/java/com/mogo/launcher/lancet/ANRFix.kt b/app/src/main/java/com/mogo/launcher/lancet/ANRFix.kt new file mode 100644 index 0000000000..878eafd753 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/ANRFix.kt @@ -0,0 +1,71 @@ +package com.mogo.launcher.lancet + +import androidx.annotation.* +import com.knightboost.lancet.api.* +import com.knightboost.lancet.api.annotations.* +import com.knightboost.lancet.api.annotations.Weaver +import com.mogo.eagle.core.utilcode.util.* +import kotlinx.coroutines.Runnable + +@Keep +@Weaver +@Group("anr_fix") +class ANRFix { + + @Insert + @TargetClass("com.zhidao.cosupload.service.UploadService") + @TargetMethod(methodName = "addUploadPaths") + private fun fixAddUploadPathsANR() { + ThreadUtils.getIoPool().execute(ANRFixTask(This.get(), "addUploadPaths")) + } + + @Insert + @TargetClass("com.zhidao.cosupload.service.UploadService") + @TargetMethod(methodName = "upload") + private fun fixUploadANR(@ClassOf("com.zhidao.cosupload.model.CacheUploadIdData") data: Any?) { + ThreadUtils.getIoPool().execute(ANRFixTask2(This.get(), "upload", data)) + } + + @Insert + @TargetClass("com.zhidao.cosupload.manager.CosUploadManagerImpl") + @TargetMethod(methodName = "upload") + private fun fixCosUploadManagerImplANR(productLine: String?, paths: List?, eventId: String?, @ClassOf("com.zhidao.cosupload.DbPriorityConfig") config: Any?) { + ThreadUtils.getIoPool().execute(ANRFixTask3(This.get(), "upload", productLine, paths, eventId, config)) + } +} + +class ANRFixTask(private val delegate: Any, private val methodName: String): Runnable { + + override fun run() { + delegate.javaClass.declaredMethods.find { + it.name != methodName && it.name.contains(methodName) + }?.also { + it.isAccessible = true + it.invoke(delegate) + } + } +} + +class ANRFixTask2(private val delegate: Any, private val methodName: String, private val p: Any?): Runnable { + + override fun run() { + delegate.javaClass.declaredMethods.find { + it.name != methodName && it.name.contains(methodName) + }?.also { + it.isAccessible = true + it.invoke(delegate, p) + } + } +} + +class ANRFixTask3(private val delegate: Any, private val methodName: String,private val productLine: String?, private val paths: List?, private val eventId: String?, private val config: Any?): Runnable { + + override fun run() { + delegate.javaClass.declaredMethods.find { + it.name != methodName && it.name.contains(methodName) + }?.also { + it.isAccessible = true + it.invoke(delegate, productLine, paths, eventId, config) + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt index 8de6cf1fcc..eb67733969 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.overview.vm import androidx.lifecycle.* import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.map.Infrastructure +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo import com.mogo.eagle.core.function.overview.OverviewDao import com.mogo.eagle.core.function.overview.remote.OverViewServiceApi import com.mogo.eagle.core.function.overview.remote.V2XEvent @@ -74,23 +75,29 @@ class OverViewModel( } } - fun getAllV2XEventsByLineId(lineId: String, sn: String) { + fun getAllV2XEventsByLineId(sn: String) { if (disposable != null && !disposable!!.isDisposed) { disposable!!.dispose() } + // 1分钟查询一次 - disposable = Observable.interval(0, 60000, TimeUnit.MILLISECONDS) + disposable = Observable.interval(2000, 60000, TimeUnit.MILLISECONDS) .flatMap { - MoGoRetrofitFactory.getInstance(HostConst.getHost()) - .create(OverViewServiceApi::class.java) - .queryAllV2XEventsByLineId(lineId, sn) - .map { - if (it.code == 200 || it.code == 0) { - return@map it.result?.v2XEventList - } else { - return@map null + val lineId = getLineId() + if (lineId > 0) { + MoGoRetrofitFactory.getInstance(HostConst.getHost()) + .create(OverViewServiceApi::class.java) + .queryAllV2XEventsByLineId(lineId.toString(), sn) + .map { + if (it.code == 200 || it.code == 0) { + return@map it.result?.v2XEventList + } else { + return@map ArrayList() + } } - } + } else { + Observable.just(ArrayList()) + } } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -106,4 +113,16 @@ class OverViewModel( fun stopQueryV2XEvents() { disposable?.dispose() } + + private fun getLineId(): Long { + var lineId: Long = -1 + val parameter = getAutoPilotStatusInfo() + .autopilotControlParameters + if (parameter != null) { + if (parameter.autoPilotLine != null) { + lineId = parameter.autoPilotLine!!.lineId + } + } + return lineId + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java index 12b07a5c10..37ab1567d9 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/OverviewMapFragment.java @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.smp; import android.content.Context; import android.os.Bundle; -import android.os.Looper; import android.view.View; import androidx.annotation.Nullable; @@ -21,7 +20,6 @@ import com.mogo.eagle.core.function.map.R; import com.mogo.eagle.core.function.overview.InfStructureManager; import com.mogo.eagle.core.function.overview.ViewModelExtKt; import com.mogo.eagle.core.function.overview.vm.OverViewModel; -import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import java.util.List; @@ -81,9 +79,8 @@ public class OverviewMapFragment extends BaseFragment @Override public void startQueryV2XEvents() { if (isAdded()) { - long lineId = getLineId(); - if (lineId > 0 && mViewModel != null) { - mViewModel.getAllV2XEventsByLineId("" + lineId, MoGoAiCloudClientConfig.getInstance().getSn()); + if (mViewModel != null) { + mViewModel.getAllV2XEventsByLineId(MoGoAiCloudClientConfig.getInstance().getSn()); } } } @@ -130,11 +127,7 @@ public class OverviewMapFragment extends BaseFragment mViewModel.getV2XEventLiveData().observe(this.getViewLifecycleOwner(), v2XEvents -> { mAMapCustomView.showV2XEventMarkers(v2XEvents); }); - - long lineId = getLineId(); - if (lineId > 0) { - mViewModel.getAllV2XEventsByLineId("" + lineId, MoGoAiCloudClientConfig.getInstance().getSn()); - } + mViewModel.getAllV2XEventsByLineId(MoGoAiCloudClientConfig.getInstance().getSn()); } /**