diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 17b18d8f60..d9c488eb18 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -288,7 +288,6 @@ public class BusFragment extends BaseBusTabFragment // 出车的时候重制站点状态 mPresenter.queryBusRoutes(); tvOperationStatus.setText("收车"); - showSlidePanle("滑动出发"); showPanel(); } else { AIAssist.getInstance(getContext()).speakTTSVoice("已收车"); diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java index 32a2df0688..c48274d617 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoHandAdasMsgManager.java @@ -102,7 +102,6 @@ public class MoGoHandAdasMsgManager implements public void onAutopilotBrakeLightData(boolean brakeLight) { } - @Override public void onAutopilotCarConfig(@NotNull MessagePad.CarConfigResp carConfigResp) { if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.getMacAddress())) { diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java new file mode 100644 index 0000000000..0769aeb280 --- /dev/null +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeApiService.java @@ -0,0 +1,29 @@ +package com.mogo.eagle.core.function.appupgrade.network; + +import com.mogo.eagle.core.data.bindingcar.BindingcarInfo; +import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo; +import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo; + +import io.reactivex.Observable; +import okhttp3.RequestBody; +import retrofit2.http.Body; +import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; + +/** + * @author lixiaopeng + * @description 绑定车辆 + * @since: 6/20/22 + */ +public interface UpgradeApiService { + /** + * 获取升级信息 + * + * @return {@link UpgradeAppInfo} + */ + @Headers("Content-Type:application/json;charset=UTF-8") + @POST("pad/selectPadByMac") + Observable getUpgradeInfo(@Body RequestBody requestBody); + +} diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java new file mode 100644 index 0000000000..d05c8f46ef --- /dev/null +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppNetWorkManager.java @@ -0,0 +1,104 @@ +package com.mogo.eagle.core.function.appupgrade.network; + +import android.content.Context; +import android.util.Log; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.constants.SharedPrefsConstants; +import com.mogo.eagle.core.data.bindingcar.BindingcarInfo; +import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo; +import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo; +import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; +import com.mogo.eagle.core.network.MoGoRetrofitFactory; +import com.mogo.eagle.core.network.utils.GsonUtil; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; +import com.mogo.eagle.core.utilcode.util.AppUtils; +import com.mogo.eagle.core.utilcode.util.GsonUtils; +import com.mogo.module.common.constants.HostConst; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.RequestBody; + +/** + * @author lixiaopeng + * @description 获取升级信息 + * @since: 3/25/22 + */ +public class UpgradeAppNetWorkManager { + private static volatile UpgradeAppNetWorkManager requestNoticeManager; + private final UpgradeApiService mUpgradeApiService; + private static final String TAG = "UpgradeAppNetWorkManager"; + + + private UpgradeAppNetWorkManager() { + mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.UPGRADE_APP_HOST) + .create(UpgradeApiService.class); + } + + public static UpgradeAppNetWorkManager getInstance() { + if (requestNoticeManager == null) { + synchronized (UpgradeAppNetWorkManager.class) { + if (requestNoticeManager == null) { + requestNoticeManager = new UpgradeAppNetWorkManager(); + } + } + } + return requestNoticeManager; + } + + + /** + * 获取app升级信息 + */ + public void getAppUpgradeInfo(Context context, int screenType) { + String sn = "X20202203105S688HZ"; + String versionCode = "2070000"; + String versionName = "2.7.0"; + int screenType1 = 1; + +// String sn = MoGoAiCloudClientConfig.getInstance().getSn(); +// String versionCode = AppUtils.getAppVersionCode(); +// String versionName = AppUtils.getAppVersionName(); + + UpgradeAppRequest request = new UpgradeAppRequest("apps_control", sn, versionCode, versionName, screenType1); + RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); + mUpgradeApiService.getUpgradeInfo(requestBody) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.d("liyz", "UpgradeAppInfo ------> "); + } + + @Override + public void onNext(@NonNull UpgradeAppInfo info) { + if (info != null && info.getData() != null) { + Log.d("liyz", "UpgradeAppInfo url = " + info.getData().getApp_url() + "----code = " + info.getData().getVersion_code()); + //TODO 弹框 + + } + } + + @Override + public void onError(@NonNull Throwable e) { + CallerLogger.INSTANCE.e(TAG, "getBindingcarInfo onError e = " + e.toString() + "---e.getMessage = " + e.getMessage()); + Log.e("liyz", "UpgradeAppInfo onError e = " + e.toString() + "---e.getMessage = " + e.getMessage()); + } + + @Override + public void onComplete() { + } + }); + + } + +} diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java new file mode 100644 index 0000000000..8be28f9bcd --- /dev/null +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/appupgrade/network/UpgradeAppRequest.java @@ -0,0 +1,72 @@ +package com.mogo.eagle.core.function.appupgrade.network; + +/** + * @author lixiaopeng + * @description 获取app升级信息 + * @since: 11/15/21 + */ +public class UpgradeAppRequest { + private String resources; + private String sn; + private String version_code; + private String version_name; + private int screen_type; + + public UpgradeAppRequest(String resources, String sn, String versionCode, String versionName, int type) { + this.resources = resources; + this.sn = sn; + this.version_code = versionCode; + this.version_name = versionName; + this.screen_type = type; + } + + public String getResources() { + return resources; + } + + public void setResources(String resources) { + this.resources = resources; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getVersion_code() { + return version_code; + } + + public void setVersion_code(String version_code) { + this.version_code = version_code; + } + + public String getVersion_name() { + return version_name; + } + + public void setVersion_name(String version_name) { + this.version_name = version_name; + } + + public int getScreen_type() { + return screen_type; + } + + public void setScreen_type(int screen_type) { + this.screen_type = screen_type; + } + + @Override + public String toString() { + return "UpgradeAppRequest{" + + "sn='" + sn + '\'' + + ", version_code='" + version_code + '\'' + + ", version_name='" + version_name + '\'' + + ", screen_type=" + screen_type + + '}'; + } +} diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index f47c784a14..68cd68ef9e 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.config.HmiBuildConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.function.api.bindingcar.BindingcarCallBack; import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingcarProvider; +import com.mogo.eagle.core.function.appupgrade.network.UpgradeAppNetWorkManager; import com.mogo.eagle.core.function.bindingcar.network.BindingcarNetWorkManager; import com.mogo.eagle.core.function.ipcupgrade.IPCUpgradeManager; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; @@ -127,5 +128,12 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { return screenType; } + /** + * 查询app是否需要升级 + */ + @Override + public void queryAppUpgrade() { + UpgradeAppNetWorkManager.getInstance().getAppUpgradeInfo(mContext, getScreenType()); + } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 6abcf9ee64..2eb1df4849 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -46,6 +46,7 @@ import com.mogo.eagle.core.function.hmi.notification.WarningFloat import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator import com.mogo.eagle.core.function.hmi.ui.bindingcar.ModifyBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.bindingcar.ToBindingCarDialog +import com.mogo.eagle.core.function.hmi.ui.bindingcar.UpgradeAppDialog import com.mogo.eagle.core.function.hmi.ui.camera.CameraListView import com.mogo.eagle.core.function.hmi.ui.notice.NoticeBannerView import com.mogo.eagle.core.function.hmi.ui.notice.NoticeNormalBannerView @@ -965,6 +966,7 @@ class MoGoHmiFragment : MvpFragment(), private var modifyBindingCarDialog: ModifyBindingCarDialog? = null private var toBindingCarDialog: ToBindingCarDialog? = null + private var upgradeAppDialog: UpgradeAppDialog? = null override fun showToBindingcarDialog() { if (toBindingCarDialog == null) { @@ -978,7 +980,16 @@ class MoGoHmiFragment : MvpFragment(), modifyBindingCarDialog = ModifyBindingCarDialog(requireContext()) } modifyBindingCarDialog!!.showModifyBindingcarDialog() + } + /** + * 升级app弹框 + */ + override fun showUpgradeDialog(name: String, url: String) { + if (upgradeAppDialog == null) { + upgradeAppDialog = UpgradeAppDialog(requireContext()) + } + upgradeAppDialog!!.showUpgradeAppDialog(name, url) } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt new file mode 100644 index 0000000000..77bd028a93 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/bindingcar/UpgradeAppDialog.kt @@ -0,0 +1,75 @@ +package com.mogo.eagle.core.function.hmi.ui.bindingcar + +import android.content.Context +import android.util.Log +import android.widget.TextView +import androidx.lifecycle.LifecycleObserver +import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.toast.TipToast +import com.mogo.module.common.dialog.BaseFloatDialog +import com.mogo.service.IMogoServiceApis +import com.mogo.service.statusmanager.IMogoStatusChangedListener +import com.mogo.service.statusmanager.StatusDescriptor + +/** + * @brief APP升级提示弹框 + * @author lixiaopeng + */ +class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver{ + + private val TAG = "UpgradeAppDialog" + private var confirmTv: TextView? = null + private var cancleTv: TextView? = null + private var tag: String? = null + private var downloarUrl: String? = null + + private var mServiceApis: IMogoServiceApis? = null + private val statusChangedListenerForCheckNotice = IMogoStatusChangedListener { descriptor, isTrue -> + if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND) { + dismiss() + } + } + + init { + setContentView(R.layout.dialog_upgrade_app) + setCanceledOnTouchOutside(true) + + confirmTv = findViewById(R.id.tv_upgrade_confirm) + cancleTv = findViewById(R.id.tv_upgrade_cancel) + + confirmTv?.setOnClickListener { + downloadApp() + } + + cancleTv?.setOnClickListener { + dismiss() + } + } + + /** + * 去下载 TODO 成功或者失败 + */ + fun downloadApp() { + tag?.let { downloarUrl?.let { it1 -> CallerDevaToolsManager.downLoadPackage(it, it1) } } + + dismiss() + } + + override fun dismiss() { + super.dismiss() + } + + fun showUpgradeAppDialog(name: String, url: String) { + if (isShowing) { + return + } + tag = name + downloarUrl = url + Log.d("liyz", "tag = $tag ---- downloarUrl = $downloarUrl") + show() + } + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index d1e6d0c4e1..6d5d33f765 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -64,6 +64,8 @@ import com.mogo.eagle.core.utilcode.util.* import com.mogo.map.MogoMap import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* +import com.mogo.module.service.routeoverlay.* +import com.tencent.liteav.basic.datareport.a.B import com.zhidao.easysocket.utils.L import kotlinx.android.synthetic.main.view_debug_setting.view.* import mogo.telematics.pad.MessagePad @@ -965,6 +967,16 @@ class DebugSettingView @JvmOverloads constructor( accelerationIsShow = isChecked } + tbRouteDynamicEffect.isChecked = AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + + tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + RouteStrategy.enable(true) + } else { + RouteStrategy.enable(false) + } + } + btnThresholdDefine.setOnClickListener { try { accelerationThresholdNum = etThreshold.text.toString().toDouble() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt index ef030b5530..e3e3e44df8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt @@ -5,16 +5,19 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingCarListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils @@ -58,7 +61,13 @@ class SystemVersionView @JvmOverloads constructor( //鹰眼版本视图点击事件 ivPadVersion.setOnClickListener { CallerLogger.i("$M_HMI$$TAG", "pad version view clicked") +// CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade() + + Logger.d("liyz", "ivPadVersion --click ") + } + + //工控机版本视图点击事件 ivAdVersion.setOnClickListener { CallerLogger.i("$M_HMI$$TAG", "ad version view clicked") diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml new file mode 100644 index 0000000000..3ee8397d47 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_upgrade_app.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index a92f6810e7..41e399344a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -1257,6 +1257,17 @@ android:textOn="关闭「加速度面板」" android:textSize="@dimen/dp_24" /> + + 1) { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index 4298b23cd2..cbc84fa420 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt @@ -466,7 +466,6 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb l3.location = V2XMarkerLocation().also { l4 -> l4.lat = this.roadwork?.center?.point?.lat ?: 0.0 l4.lon = this.roadwork?.center?.point?.lon ?: 0.0 - l4.angle = -1.0 } }) } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java index df4fac4f22..07506627d6 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java @@ -48,7 +48,7 @@ public class V2XAlarmServer { // 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告 for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) { // 0、道路事件必须有朝向,角度>=0; - boolean ignoreAngle = v2XRoadEventEntity.getLocation().getAngle() < 0; + boolean ignoreAngle = EventTypeEnum.AI_ROAD_WORK.getPoiType().equals(v2XRoadEventEntity.getPoiType()); if (v2XRoadEventEntity.getLocation().getAngle() >= 0 || ignoreAngle) { // 计算车辆距离指定气泡的距离 MarkerLocation eventLocation = v2XRoadEventEntity.getLocation(); diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java new file mode 100644 index 0000000000..9ad5ccd4b5 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/AppInfo.java @@ -0,0 +1,137 @@ +package com.mogo.eagle.core.data.bindingcar; + +import java.io.Serializable; + +/** + * @author lixiaopeng + * @description + * @since 6/21/22 + */ +public class AppInfo implements Serializable { + private IdInfo _id; + private String bk_inst_id; + private String bk_inst_name; + private String bk_supplier_account; + private int screen_type; //1,司机屏,2乘客屏 + private String sn; + private long last_time; + private String app_url; + private String bk_obj_id; + private String version_code; + private String version_name; + private long create_time; + + public IdInfo get_id() { + return _id; + } + + public void set_id(IdInfo _id) { + this._id = _id; + } + + public String getBk_inst_id() { + return bk_inst_id; + } + + public void setBk_inst_id(String bk_inst_id) { + this.bk_inst_id = bk_inst_id; + } + + public String getBk_inst_name() { + return bk_inst_name; + } + + public void setBk_inst_name(String bk_inst_name) { + this.bk_inst_name = bk_inst_name; + } + + public String getBk_supplier_account() { + return bk_supplier_account; + } + + public void setBk_supplier_account(String bk_supplier_account) { + this.bk_supplier_account = bk_supplier_account; + } + + public int getScreen_type() { + return screen_type; + } + + public void setScreen_type(int screen_type) { + this.screen_type = screen_type; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public long getLast_time() { + return last_time; + } + + public void setLast_time(long last_time) { + this.last_time = last_time; + } + + public String getApp_url() { + return app_url; + } + + public void setApp_url(String app_url) { + this.app_url = app_url; + } + + public String getBk_obj_id() { + return bk_obj_id; + } + + public void setBk_obj_id(String bk_obj_id) { + this.bk_obj_id = bk_obj_id; + } + + public String getVersion_code() { + return version_code; + } + + public void setVersion_code(String version_code) { + this.version_code = version_code; + } + + public String getVersion_name() { + return version_name; + } + + public void setVersion_name(String version_name) { + this.version_name = version_name; + } + + public long getCreate_time() { + return create_time; + } + + public void setCreate_time(long create_time) { + this.create_time = create_time; + } + + @Override + public String toString() { + return "AppInfo{" + + "_id=" + _id + + ", bk_inst_id='" + bk_inst_id + '\'' + + ", bk_inst_name='" + bk_inst_name + '\'' + + ", bk_supplier_account='" + bk_supplier_account + '\'' + + ", screen_type=" + screen_type + + ", sn='" + sn + '\'' + + ", last_time=" + last_time + + ", app_url='" + app_url + '\'' + + ", bk_obj_id='" + bk_obj_id + '\'' + + ", version_code='" + version_code + '\'' + + ", version_name='" + version_name + '\'' + + ", create_time=" + create_time + + '}'; + } +} diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/IdInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/IdInfo.java new file mode 100644 index 0000000000..08fd7d1b1d --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/IdInfo.java @@ -0,0 +1,16 @@ +package com.mogo.eagle.core.data.bindingcar; + +import java.io.Serializable; +import java.util.List; + +/** + * @author lixiaopeng + * @description + * @since 6/21/22 + */ +public class IdInfo implements Serializable { + private String timestamp; + private String date; + + +} diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java new file mode 100644 index 0000000000..f712ebfa61 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/bindingcar/UpgradeAppInfo.java @@ -0,0 +1,27 @@ +package com.mogo.eagle.core.data.bindingcar; + +import com.mogo.eagle.core.data.BaseData; + +/** + * @author lixiaopeng + * @description app升级管理 + * @since: 6/21/22 + */ +public class UpgradeAppInfo extends BaseData { + public AppInfo data; + + public AppInfo getData() { + return data; + } + + public void setData(AppInfo data) { + this.data = data; + } + + @Override + public String toString() { + return "UpgradeAppInfo{" + + "data=" + data + + '}'; + } +} diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/bindingcar/IMoGoBindingcarProvider.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/bindingcar/IMoGoBindingcarProvider.java index 5b8e1062b8..b9b0ab4d3f 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/bindingcar/IMoGoBindingcarProvider.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/bindingcar/IMoGoBindingcarProvider.java @@ -10,7 +10,17 @@ import java.util.List; * @since: 3/15/22 */ public interface IMoGoBindingcarProvider extends IMoGoFunctionServerProvider { + /** + * 修改工控机的绑定关系 + * @param callBack + */ void modifyCarInfo(BindingcarCallBack callBack); + + /** + * 获取车辆的信息 + * @param macAddress + * @param widevineIDWithMd5 + */ void getBindingcarInfo(String macAddress, String widevineIDWithMd5); /** @@ -27,4 +37,10 @@ public interface IMoGoBindingcarProvider extends IMoGoFunctionServerProvider { * @param dockerVersion 当前工控机版本 */ void queryContainers(String padSn,String dockerVersion); + + /** + * 查询app是否有更新 + */ + void queryAppUpgrade(); + } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt index 81c46f9114..84495fb04b 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt @@ -205,6 +205,11 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy { */ fun showModifyBindingcarDialog() + /** + * 展示升级app弹框 + */ + fun showUpgradeDialog(name: String, url: String) + /** * 呈现工控机升级确认框 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index a12d3ca256..294d7cee0a 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -269,6 +269,10 @@ object CallerHmiManager : CallerBase() { waringProviderApi?.showModifyBindingcarDialog() } + fun showUpgradeDialog(name: String, url: String) { + waringProviderApi?.showUpgradeDialog(name, url) + } + /** * 呈现工控机升级确认框 */ diff --git a/gradle.properties b/gradle.properties index 472e674e45..c2175cc5d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -63,26 +63,26 @@ SERVICE_CHAIN_VERSION=1.1.0 LOGLIB_VERSION=1.3.1 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION -MOGO_NETWORK_VERSION=1.4.3.3 +MOGO_NETWORK_VERSION=1.4.3.6 # 鉴权 -MOGO_PASSPORT_VERSION=1.4.3.3 +MOGO_PASSPORT_VERSION=1.4.3.6 # 常链接 -MOGO_SOCKET_VERSION=1.4.3.3 +MOGO_SOCKET_VERSION=1.4.3.6 # 数据采集 -MOGO_REALTIME_VERSION=1.4.3.3 +MOGO_REALTIME_VERSION=1.4.3.6 # 探路,道路事件发布,获取 -MOGO_TANLU_VERSION=1.4.3.3 +MOGO_TANLU_VERSION=1.4.3.6 # 直播推流 -MOGO_LIVE_VERSION=1.4.3.3 +MOGO_LIVE_VERSION=1.4.3.6 # 直播拉流 -MOGO_TRAFFICLIVE_VERSION=1.4.3.3 +MOGO_TRAFFICLIVE_VERSION=1.4.3.6 # 定位服务 -MOGO_LOCATION_VERSION=1.4.3.3 +MOGO_LOCATION_VERSION=1.4.3.6 # 远程通讯模块 -MOGO_TELEMATIC_VERSION=1.4.3.3 +MOGO_TELEMATIC_VERSION=1.4.3.6 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=2.2.0.9 +MAP_SDK_VERSION=2.2.1.1 MAP_SDK_OPERATION_VERSION=1.0.13 # websocket WEBSOCKET_VERSION=1.1.7 @@ -155,7 +155,7 @@ MOGO_OCH_TAXI_VERSION=2.0.66 # mogoAiCloud sdk services MOGO_AICLOUD_SERVICES_SDK_VERSION=2.1.16.10 # v2x-sdk -MOGO_V2X_SDK_VERSION=1.4.3.3 +MOGO_V2X_SDK_VERSION=1.4.3.6 ################# 旧版本架构模块版本 ################# diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java index 72747569f9..2cfc5ca01a 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/HostConst.java @@ -22,5 +22,6 @@ public class HostConst { public static final String BINDING_SN_HOST = "https://mygateway.zhidaozhixing.com/cmdbapi/"; //中台提供的接口服务 public static final String BINDING_SN_HOST_TEST = "https://mygateway.zhidaozhixing.com/cmdbapitest/"; //中台提供的接口服务测试 + public static final String UPGRADE_APP_HOST = "http://10.0.200.12:32423/unify/selectResources/"; } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt index 49f2fa1eaa..245956ad78 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/enums/EventTypeEnum.kt @@ -32,6 +32,12 @@ enum class EventTypeEnum( "前方施工", "道路施工" ), + //施工-AI云下发 + AI_ROAD_WORK( + "100061", "道路施工", "前方施工", R.drawable.icon_warning_v2x_road_construction, + "前方施工", "道路施工" + ), + //拥堵 FOURS_BLOCK_UP( "10007", "道路拥堵", "前方拥堵", R.drawable.icon_warning_v2x_congestion, @@ -368,6 +374,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeStr ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeStr FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeStr + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeStr FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeStr FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeStr FOURS_FOG.poiType -> FOURS_FOG.poiTypeStr @@ -389,6 +396,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeStrVr ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeStrVr FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeStrVr + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeStrVr FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeStrVr FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeStrVr FOURS_FOG.poiType -> FOURS_FOG.poiTypeStrVr @@ -410,6 +418,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeSrcVr ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeSrcVr FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeSrcVr + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeSrcVr FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeSrcVr FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeSrcVr FOURS_FOG.poiType -> FOURS_FOG.poiTypeSrcVr @@ -431,7 +440,7 @@ enum class EventTypeEnum( fun getPoiTypeBg(poiType: String, isVrMode: Boolean): Int { return when (poiType) { FOURS_BLOCK_UP.poiType, FOURS_LIVING.poiType-> if (isVrMode) R.drawable.bg_v2x_event_type_orange_vr else R.drawable.bg_v2x_event_type_orange - TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType, + TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType, FOURS_PONDING.poiType, FOURS_FOG.poiType, FOURS_ICE.poiType, FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> if (isVrMode) R.drawable.bg_v2x_event_type_red_vr else R.drawable.bg_v2x_event_type_read @@ -447,7 +456,7 @@ enum class EventTypeEnum( FOURS_BLOCK_UP.poiType, FOURS_LIVING.poiType -> R.drawable.bg_v2x_event_type_orange TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, - FOURS_ROAD_WORK.poiType, FOURS_PONDING.poiType, + FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType, FOURS_PONDING.poiType, FOURS_FOG.poiType, FOURS_ICE.poiType, FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType, @@ -464,12 +473,12 @@ enum class EventTypeEnum( fun isRoadEvent(poiType: String?): Boolean { return when (poiType) { TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, - FOURS_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType, + FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType, FOURS_PONDING.poiType, FOURS_FOG.poiType, FOURS_ICE.poiType, FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, - FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType -> true + FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType, AI_ROAD_WORK.poiType -> true else -> false } } @@ -480,7 +489,7 @@ enum class EventTypeEnum( @JvmStatic fun isNeedRoadEventUgc(poiType: String?): Boolean { return when (poiType) { - ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType, + ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,AI_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType, FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, @@ -496,6 +505,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.tts ROAD_CLOSED.poiType -> ROAD_CLOSED.tts FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.tts + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.tts FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.tts FOURS_PONDING.poiType -> FOURS_PONDING.tts FOURS_FOG.poiType -> FOURS_FOG.tts @@ -512,6 +522,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> "交通检查" ROAD_CLOSED.poiType -> "封路" FOURS_ROAD_WORK.poiType -> "施工" + AI_ROAD_WORK.poiType -> "施工" FOURS_BLOCK_UP.poiType -> "道路拥堵" FOURS_PONDING.poiType -> "道路积水" FOURS_FOG.poiType -> "出现浓雾" @@ -528,6 +539,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.content ROAD_CLOSED.poiType -> ROAD_CLOSED.content FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.content + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.content FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.content FOURS_PONDING.poiType -> FOURS_PONDING.content FOURS_FOG.poiType -> FOURS_FOG.content @@ -547,6 +559,7 @@ enum class EventTypeEnum( R.drawable.mogo_image_jiaotongjiancha_small ROAD_CLOSED.poiType -> R.drawable.mogo_image_fenglu_small FOURS_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_small + AI_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_small FOURS_BLOCK_UP.poiType -> R.drawable.mogo_image_yongdu_small FOURS_PONDING.poiType -> R.drawable.mogo_image_jishui_small FOURS_ICE.poiType -> R.drawable.mogo_image_jiebing_small @@ -564,6 +577,7 @@ enum class EventTypeEnum( TRAFFIC_CHECK.poiType -> R.drawable.mogo_image_jiaotongjiancha_nor ROAD_CLOSED.poiType -> R.drawable.mogo_image_fenglu_nor FOURS_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_nor + AI_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_nor FOURS_BLOCK_UP.poiType -> R.drawable.mogo_image_yongdu_nor FOURS_PONDING.poiType -> R.drawable.mogo_image_jishui_nor FOURS_ICE.poiType -> R.drawable.mogo_image_jiebing_nor @@ -586,6 +600,7 @@ enum class EventTypeEnum( FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故" FOURS_BLOCK_UP.poiType -> "拥堵" FOURS_ROAD_WORK.poiType -> "施工" + AI_ROAD_WORK.poiType -> "施工" FOURS_PONDING.poiType -> "道路积水" else -> "实时路况" } @@ -600,6 +615,7 @@ enum class EventTypeEnum( FOURS_FOG.poiType -> R.raw.v2x_nongwu TRAFFIC_CHECK.poiType -> R.raw.v2x_jiaotongjiancha FOURS_ROAD_WORK.poiType -> R.raw.v2x_daolushigong + AI_ROAD_WORK.poiType -> R.raw.v2x_daolushigong FOURS_ICE.poiType -> R.raw.v2x_daolujiebing FOURS_PONDING.poiType -> R.raw.v2x_daolujishui GHOST_PROBE.poiType -> R.raw.v2x_guzhangqiuzhu @@ -618,6 +634,7 @@ enum class EventTypeEnum( FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故" FOURS_BLOCK_UP.poiType -> "拥堵" FOURS_ROAD_WORK.poiType -> "施工" + AI_ROAD_WORK.poiType -> "施工" FOURS_PONDING.poiType -> "道路积水" else -> "实时路况" } @@ -638,6 +655,10 @@ enum class EventTypeEnum( FOURS_ROAD_WORK.poiType -> { R.drawable.v_to_x_marker_11 } + //AI施工 + AI_ROAD_WORK.poiType -> { + R.drawable.v_to_x_marker_11 + } //拥堵 FOURS_BLOCK_UP.poiType -> { R.drawable.v_to_x_marker_5 @@ -760,6 +781,7 @@ enum class EventTypeEnum( TYPE_USECASE_ID_ROAD_GIVE_WAY.poiType -> TYPE_USECASE_ID_ROAD_GIVE_WAY.content TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.content FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.content + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.content TYPE_ERROR.poiType -> TYPE_ERROR.content TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.content GHOST_PROBE.poiType -> GHOST_PROBE.content @@ -802,6 +824,7 @@ enum class EventTypeEnum( TYPE_USECASE_ID_ROAD_GIVE_WAY.poiType -> TYPE_USECASE_ID_ROAD_GIVE_WAY.tts TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.tts FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.tts + AI_ROAD_WORK.poiType -> AI_ROAD_WORK.tts TYPE_ERROR.poiType -> TYPE_ERROR.tts TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.tts GHOST_PROBE.poiType -> GHOST_PROBE.tts diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/CloudPoiManager.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/CloudPoiManager.java index 3923d87bbe..c065a00369 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/CloudPoiManager.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/CloudPoiManager.java @@ -44,6 +44,8 @@ public class CloudPoiManager { R.drawable.module_common_icon_map_marker_road_block_off2, R.drawable.module_common_icon_map_marker_road_block_off2_white, "封路")); poiWrapper.put(EventTypeEnum.FOURS_ROAD_WORK.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_ROAD_WORK.getPoiType(), R.drawable.module_common_icon_map_marker_road_work2, R.drawable.module_common_icon_map_marker_road_work2_white, "施工")); + poiWrapper.put(EventTypeEnum.AI_ROAD_WORK.getPoiType(), new PoiWrapper(EventTypeEnum.AI_ROAD_WORK.getPoiType(), + R.drawable.module_common_icon_map_marker_road_work2, R.drawable.module_common_icon_map_marker_road_work2_white, "施工")); poiWrapper.put(EventTypeEnum.FOURS_BLOCK_UP.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_BLOCK_UP.getPoiType(), R.drawable.module_common_icon_map_marker_road_block_up2, R.drawable.module_common_icon_map_marker_road_block_up2_white, "拥堵")); poiWrapper.put(EventTypeEnum.FOURS_PONDING.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_PONDING.getPoiType(), diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java index 3e66800edd..c147785033 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java @@ -66,7 +66,7 @@ public class MogoServiceProvider implements IMogoModuleProvider { MarkerServiceHandler.init( context ); MogoServices.getInstance().preInit( context ); MogoServices.getInstance().init( AbsMogoApplication.getApp() ); - MogoRouteOverlayManager.getInstance(context).init(); + MogoRouteOverlayManager.getInstance().init(); } @Override diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java index a443af288a..07615c0c58 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java @@ -1,29 +1,25 @@ package com.mogo.module.service.routeoverlay; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_OLD_ROUTE; - -import android.content.Context; import android.os.SystemClock; +import android.util.Log; + import androidx.annotation.NonNull; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.deva.scene.SceneModule; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; @@ -31,107 +27,57 @@ public class MogoRouteOverlayManager implements IMoGoAutopilotPlanningListener, IMoGoAutopilotStatusListener, IMoGoMapLocationListener { private static volatile MogoRouteOverlayManager sInstance; - private Context mContext; - private String TAG = "route"; + private static final String TAG = "Route"; private int STATUS_AUTOPILOT = 0;//0 非自动驾驶 ; 1 自动驾驶 - // private MogoLatLng mEnding; private MogoLocation mLocation; - private AtomicBoolean isArriveAtStation = new AtomicBoolean(false); + private final AtomicBoolean isArriveAtStation = new AtomicBoolean(false); - private volatile List mTrajectoryList = null; + private List mTrajectoryList = null; - private MogoRouteOverlayManager(Context context) { - mContext = context; - } + private final Lock mLock = new ReentrantLock(); + + private MogoRouteOverlayManager() {} public void init() { CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, this); CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this); CallerMapLocationListenerManager.INSTANCE.addListener(TAG, this); -// intiDrawer(); } - public static MogoRouteOverlayManager getInstance(Context context) { + public static MogoRouteOverlayManager getInstance() { if (sInstance == null) { synchronized (MogoRouteOverlayManager.class) { if (sInstance == null) { - sInstance = new MogoRouteOverlayManager(context); + sInstance = new MogoRouteOverlayManager(); } } } return sInstance; } - private StringBuilder trajectoryMsg = null; - @Override public void onAutopilotTrajectory(@NonNull List items) { - long start = SystemClock.elapsedRealtime(); + if (isArriveAtStation.get()) { + return; + } + if (items.isEmpty()) { + return; + } + MogoLocation location = mLocation; + if (location == null) { + return; + } try { - if (isArriveAtStation.get()) { - return; - } - if (items.size() == 0) { - return; - } - MogoLocation location = mLocation; - if (location == null) { - return; - } + mLock.lock(); mTrajectoryList = items; - Map tags = CallerDevaToolsManager.INSTANCE.getModuleTAG(); - boolean isPrintLog = false; - if (tags != null && tags.containsKey(SceneConstant.M_OLD_ROUTE)) { - SceneModule scene = tags.get(M_OLD_ROUTE); - isPrintLog = scene.getLog(); - } - if (isPrintLog) { - if (trajectoryMsg == null) { - trajectoryMsg = new StringBuilder(128); - } - if (trajectoryMsg.length() > 0) { - trajectoryMsg.setLength(0); - } - trajectoryMsg.append("{"); - trajectoryMsg.append(System.currentTimeMillis()).append(";"); - trajectoryMsg.append(location.getLongitude()).append(";"); - trajectoryMsg.append(location.getLatitude()).append(";"); - trajectoryMsg.append(location.getAltitude()).append(";"); - trajectoryMsg.append(location.getBearing()).append(";"); - trajectoryMsg.append(location.getSpeed()).append(";"); - for (int i = 0; i < items.size(); i++) { - // 临时解决车尾拖线问题,丢弃距离车最近的几个经纬度,原因是惯性导航的中心靠近车尾,会导致经纬度靠近尾部,且两个数据不同频 - MessagePad.TrajectoryPoint a = items.get(i); - double lon = a.getLongitude(); - double lat = a.getLatitude(); - trajectoryMsg.append(lon).append(","); - trajectoryMsg.append(lat).append(","); - } - trajectoryMsg.append("}"); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "receive router data:" + items.size()); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, trajectoryMsg.toString()); - } else { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "receive router data:" + items.size()); - } } finally { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "--- onAutopilotTrajectory -- cost:" + (SystemClock.elapsedRealtime() - start) + " ms"); + mLock.unlock(); } } @Override - public void onAutopilotRotting(MessagePad.GlobalPathResp globalPathResp) { -// if (globalPathResp == null || globalPathResp.getWayPointsList().size() == 0) { -// return; -// } -// List latLngList = new ArrayList<>(); -// for (MessagePad.Location routeModel : globalPathResp.getWayPointsList()) { -// latLngList.add(new MogoLatLng(routeModel.getLatitude(), routeModel.getLongitude())); -// } -// int listSize = latLngList.size(); -// mEnding = latLngList.get(listSize - 1); -// RouteOverlayDrawer.getInstance(mContext).addEndingMarker(latLngList.get(listSize - 1).lat,latLngList.get(listSize - 1).lon); - } + public void onAutopilotRotting(MessagePad.GlobalPathResp globalPathResp) {} @Override @@ -144,34 +90,20 @@ public class MogoRouteOverlayManager implements if (this.STATUS_AUTOPILOT == 1) { isArriveAtStation.set(false); } - //CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG ,"onAutopilotStatusResponse:"+STATUS_AUTOPILOT); -// if (STATUS_AUTOPILOT == 1 ){ -// if (mEnding != null){ -// RouteOverlayDrawer.getInstance(mContext).addEndingMarker(mEnding.lat,mEnding.lon); -// } -// }else { -// -// } if (STATUS_AUTOPILOT != 1) { - RouteOverlayDrawer.getInstance(mContext).clearEndingMarker(); - RouteOverlayDrawer.getInstance(mContext).clearMogoRouteOverlay(); + RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); } } @Override public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) { - if (arrivalNotification == null) { return; } - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "onArriveAt data : " + arrivalNotification); -// //演示模式下 到达终点将忽略 引导线绘制 选项关闭 -// FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; - + Log.d(TAG, "onArriveAt data : " + arrivalNotification); if (!isArriveAtStation.get()) { isArriveAtStation.set(true); - RouteOverlayDrawer.getInstance(mContext).clearEndingMarker(); - RouteOverlayDrawer.getInstance(mContext).clearMogoRouteOverlay(); + RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); } } @@ -186,7 +118,6 @@ public class MogoRouteOverlayManager implements if (from != 1) { return; } - long start = SystemClock.elapsedRealtime(); boolean isExcept = false; try { if (location == null) { @@ -194,14 +125,13 @@ public class MogoRouteOverlayManager implements return; } if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || STATUS_AUTOPILOT == 1) { - RouteOverlayDrawer.getInstance(mContext).drawTrajectoryList(location, mTrajectoryList); + RouteOverlayDrawer.getInstance().drawTrajectoryList(mLock, location, mTrajectoryList); } } finally { mLocation = location; if (isExcept) { - RouteOverlayDrawer.getInstance(mContext).setVisible(false); + RouteOverlayDrawer.getInstance().hide(); } -// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "--- onLocationChanged -- cost:" + (SystemClock.elapsedRealtime() - start) + " ms"); } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java index f3d145dcd8..df77438030 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java @@ -1,70 +1,42 @@ package com.mogo.module.service.routeoverlay; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_OLD_ROUTE; import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; import android.os.Handler; import android.os.HandlerThread; import android.os.SystemClock; +import android.util.Log; import androidx.core.util.Pools; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.util.ColorUtils; -import com.mogo.map.MogoMarkerManager; import com.mogo.map.MogoOverlayManager; -import com.mogo.map.marker.IMogoMarker; -import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; import com.mogo.module.common.utils.DrivingDirectionUtils; -import com.mogo.module.service.R; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.locks.Lock; import mogo.telematics.pad.MessagePad; public class RouteOverlayDrawer { private static final String TAG = "MogoRouteOverlayManager"; - private volatile IMogoPolyline mMoGoPolyline; // 连接线参数 - private final MogoPolylineOptions mPolylineOptions; private Handler mRenderHandler; - private final Bitmap endingBitmap; - private final Context mContext; +// private Handler mLogHandler; + IMogoOverlayManager mogoOverlayManager; - private IMogoMarker endMarker; - private MogoMarkerOptions markerOptions; private static volatile RouteOverlayDrawer sInstance; - private static final String markerType = "route_ending"; - private RouteOverlayDrawer(Context context) { - mPolylineOptions = new MogoPolylineOptions(); - mPolylineOptions.zIndex(75000f); - mPolylineOptions.setGps(true); - // 引导线颜色, + private RouteOverlayDrawer() { // 渐变色 - mContext = context; mogoOverlayManager = MogoOverlayManager.getInstance(); - endingBitmap = BitmapFactory.decodeResource(context.getResources(), - R.drawable.icon_route_ending); - - List list = new ArrayList<>(); - int[] startColor = ColorUtils.hexToArgb("#CC64C3EA"); - int[] endColor = ColorUtils.hexToArgb("#0064C3EA"); - list.add(Color.argb(startColor[0], startColor[1], startColor[2], startColor[3])); - list.add(Color.argb(endColor[0], endColor[1], endColor[2], endColor[3])); // 线条粗细,渐变,渐变色值 - mPolylineOptions.width(20).useGradient(true).colorValues(list); HandlerThread renderTask = new HandlerThread("routing_render") { @Override protected void onLooperPrepared() { @@ -73,153 +45,307 @@ public class RouteOverlayDrawer { } }; renderTask.start(); + +// HandlerThread logHandler = new HandlerThread("log_handler") { +// @Override +// protected void onLooperPrepared() { +// super.onLooperPrepared(); +// mLogHandler = new Handler(getLooper()); +// } +// }; +// logHandler.start(); } - public static RouteOverlayDrawer getInstance(Context context) { + public static RouteOverlayDrawer getInstance() { if (sInstance == null) { synchronized (RouteOverlayDrawer.class) { if (sInstance == null) { - sInstance = new RouteOverlayDrawer(context); + sInstance = new RouteOverlayDrawer(); } } } return sInstance; } - public synchronized void release() { - sInstance = null; - } - - private Object readResolve() { - // 阻止反序列化,必须实现 Serializable 接口 - return sInstance; - } - - public void addEndingMarker(double lat, double lon) { - if (endMarker != null) { - return; - } - if (markerOptions == null) { - markerOptions = new MogoMarkerOptions() - .matchOnRoadSide(true) - .gps(true) - .icon(endingBitmap) - .owner(markerType) - .anchor(0.5f, 0.5f) - .scale(0.5f) - .zIndex(30001); -// .object(markerShowEntity) - } - markerOptions.latitude(lat).longitude(lon); - //CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"addEndingMarker-"+lat+":"+lon); - endMarker = MogoMarkerManager.getInstance(mContext).addMarker(markerType, markerOptions); -// if (DebugConfig.isDebug()){ -// ToastUtils.showLong("绘制终点marker,"+lat+":"+lon); -// } - } - public void clearMogoRouteOverlay() { - if (mMoGoPolyline != null) { - mMoGoPolyline.remove(); - mMoGoPolyline = null; - } - - if (mRenderTask != null) { + if (mRenderTask != null && mRenderHandler != null) { + mRenderTask.remove(); mRenderHandler.removeCallbacks(mRenderTask); } } - public void clearEndingMarker() { - //CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"clearEndingMarker"); - endMarker = null; - MogoMarkerManager.getInstance(mContext).removeMarkers(markerType); + public void remove() { + if (mRenderTask != null && mRenderHandler != null) { + mRenderTask.remove(); + mRenderHandler.removeCallbacks(mRenderTask); + } + } + + public void hide() { + if (mRenderTask != null && mRenderHandler != null) { + mRenderTask.hide(); + mRenderHandler.removeCallbacks(mRenderTask); + } + } + + private static class RenderOptions { + + private IMogoPolyline mPolyLine; + private final MogoPolylineOptions mOptions; + + private static int taskSequence = 0; + + //private Handler mHandler; + + private final IMogoOverlayManager mOverlayManager; + + //private ChildRenderTask mTask; + + private class ChildRenderTask implements Runnable { + + private List colors; + private List points; + + public void setData(List colors, List points) { + this.colors = colors; + this.points = points; + } + + @Override + public void run() { + if (this.colors == null || this.colors.isEmpty()) { + return; + } + + if (this.points == null || this.points.isEmpty()) { + return; + } + mOptions.colorValues(colors); + mOptions.points(points); + if (mPolyLine == null || mPolyLine.isDestroyed()) { + mPolyLine = mOverlayManager.addPolyline(mOptions); + } else { + mPolyLine.setOption(mOptions); + } + if (mPolyLine != null && !mPolyLine.isVisible()) { + mPolyLine.setVisible(true); + } + } + } + + public RenderOptions(IMogoOverlayManager overlay) { + mOverlayManager = overlay; + mOptions = new MogoPolylineOptions().width(20).useGradient(true).zIndex(75000f).setGps(true); +// new HandlerThread("child-render-" +(taskSequence++)) { +// @Override +// protected void onLooperPrepared() { +// super.onLooperPrepared(); +// mHandler = new Handler(getLooper()); +// } +// }.start(); + } + + public void show(List colors, List points) { +// if (mTask == null) { +// mTask = new ChildRenderTask(); +// } +// mTask.setData(colors, points); +// if (mHandler != null) { +// mHandler.removeCallbacks(mTask); +// mHandler.post(mTask); +// } + mOptions.colorValues(colors); + mOptions.points(points); + if (mPolyLine == null || mPolyLine.isDestroyed()) { + mPolyLine = mOverlayManager.addPolyline(mOptions); + } else { + mPolyLine.setOption(mOptions); + } + if (mPolyLine != null && !mPolyLine.isVisible()) { + mPolyLine.setVisible(true); + } + } + + public void hide() { +// if (mTask != null && mHandler != null) { +// mHandler.removeCallbacks(mTask); +// } + if (mPolyLine != null && mPolyLine.isVisible()) { + mPolyLine.setVisible(false); + } + } + + public void remove() { +// if (mTask != null && mHandler != null) { +// mHandler.removeCallbacks(mTask); +// } + if (mPolyLine != null && !mPolyLine.isDestroyed()) { + mPolyLine.remove(); + mPolyLine = null; + } + } } private class RenderTask implements Runnable { - private volatile List routeList; - private volatile MogoLocation location; + private List routeList; + private MogoLocation location; private final Pools.Pool pools; private final LinkedList points; + private final Pools.Pool options; + private Lock mLock; + public RenderTask() { this.pools = new Pools.SimplePool<>(500); this.points = new LinkedList<>(); + this.options = new Pools.SimplePool<>(5); } - public void setData(MogoLocation location, List routeList) { + public void setData(Lock lock, MogoLocation location, List routeList) { this.location = location; this.routeList = routeList; + this.mLock = lock; } @SuppressLint("LongLogTag") @Override public void run() { - LinkedList points = this.points; - points.clear(); + Lock lock = this.mLock; + if (lock == null) { + return; + } + LinkedList pps = this.points; boolean isExcept = false; +// StringBuilder sb; + int total; try { + pps.clear(); long drawStart = SystemClock.elapsedRealtime(); - List routes = this.routeList; - int total; - if (routes == null || (total = routes.size()) < 2) { - isExcept = true; - return; - } - for (int i = 0; i < total; i++) { - MessagePad.TrajectoryPoint route = null; - try { - route = routes.get(i); - if (route == null) { - continue; + try { + lock.lock(); + List routes = this.routeList; + if (routes == null || (total = routes.size()) < 2) { + isExcept = true; + return; + } + RouteStrategy.INSTANCE.start(); +// sb = new StringBuilder(); +// sb.append(System.currentTimeMillis()).append(" "); + for (int i = 0; i < total; i++) { + MessagePad.TrajectoryPoint route = null; + try { + route = routes.get(i); + if (route == null) { + continue; + } + } catch (Throwable t) { + Log.d("Route", "render-error:" + t.getMessage()); } - } catch (Throwable t) { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "render-error:" + t.getMessage()); + if (route == null) { + //数组越界了,结束循环 + break; + } + +// sb.append(route.getVelocity()).append(" "); +// sb.append(route.getAcceleration()).append(" "); +// sb.append(route.getAccumulatedDis()).append(" "); + MogoLatLng acquire = pools.acquire(); + double latitude = route.getLatitude(); + double longitude = route.getLongitude(); + if (acquire == null) { + acquire = new MogoLatLng(latitude, longitude); + } else { + acquire.lon = longitude; + acquire.lat = latitude; + } + pps.add(acquire); + RouteStrategy.INSTANCE.check(route.getVelocity(), route.getAcceleration()); } - if (route == null) { - //数组越界了,结束循环 - break; + RouteStrategy.INSTANCE.end(); + } finally { + lock.unlock(); + } + Strategy strategy = RouteStrategy.INSTANCE.getStrategy(); + /// Log.d("ROUTE_XX", "strategy:" + strategy + "->route: " +sb); + +// StringBuilder newSb = new StringBuilder("strategy:" + strategy + "->route: "); +// newSb.append(sb); +// if (mLogHandler != null) { +// mLogHandler.sendMessage(Message.obtain(mLogHandler, () -> { +// BufferedWriter bw = null; +// try { +// File file = new File(Environment.getExternalStorageDirectory(), "log.txt"); +// if (!file.exists()) { +// file.createNewFile(); +// } +// bw = new BufferedWriter(new FileWriter(file, true)); +// bw.write(newSb.toString()); +// bw.newLine(); +// bw.flush(); +// } catch (Throwable t) { +// try { +// if (bw != null) { +// bw.close(); +// } +// } catch (Throwable t2) { +// +// } +// } +// })); +// } + Integer[] indexes = strategy.getIndexes(); + Integer[] colors = strategy.getColors(); + LinkedList> parts = new LinkedList<>(); + if (indexes.length > 0) { + for (int i = 0; i < indexes.length; i += 2) { + int startIndex = indexes[i]; + int endIndex = indexes[i + 1]; + parts.add(new LinkedList<>(pps.subList(startIndex, Math.min(endIndex + 1, pps.size())))); } - MogoLatLng acquire = pools.acquire(); - double latitude = route.getLatitude(); - double longitude = route.getLongitude(); - if (acquire == null) { - acquire = new MogoLatLng(latitude, longitude); - } else { - acquire.lon = longitude; - acquire.lat = latitude; - } - points.add(acquire); } double lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(); double lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(); int removeCount = 0; - if (points.size() > 0) { - MogoLatLng top = null; - while (points.size() != 0) { - MogoLatLng first = points.peek(); - if (first == null) { + int colorsIndex = 0; + if (!parts.isEmpty()) { + L:while (!parts.isEmpty()) { + LinkedList part = parts.peek(); + if (part == null) { continue; } - if (first == top) { - break; + MogoLatLng top = null; + while (!part.isEmpty()) { + MogoLatLng first = part.peek(); + if (first == null) { + part.poll(); + continue; + } + if (first == top) { + break L; + } + lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(); + lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(); + long angle = isPointOnCarFront(lon, lat, location.getBearing(), first.lon, first.lat); + if (angle >= 90) { + removeCount++; + pps.remove(first); + try { + pools.release(first); + } catch (Throwable ignore) { + } finally { + part.poll(); + } + } + top = first; } - lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(); - lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(); - long angle = isPointOnCarFront(lon, lat, location.getBearing(), first.lon, first.lat); - if (angle >= 90) { - removeCount++; - pools.release(first); - points.poll(); - } - top = first; + parts.poll(); + colorsIndex += 2; } - - if (points.size() == 0) { + if (parts.isEmpty()) { isExcept = true; return; } - MogoLatLng self = pools.acquire(); if (self == null) { self = new MogoLatLng(lat, lon); @@ -227,70 +353,102 @@ public class RouteOverlayDrawer { self.lat = lat; self.lon = lon; } - points.addFirst(self); - if (mMoGoPolyline == null || mMoGoPolyline.isDestroyed()) { - mPolylineOptions.points(points); - mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions); - } else { - mPolylineOptions.points(points); - mMoGoPolyline.setOption(mPolylineOptions); + pps.addFirst(self); + parts.get(0).addFirst(self); + List ll = new ArrayList<>(); + for (int i = 0; i < parts.size(); i++) { + LinkedList ps = parts.get(i); + RenderOptions options = this.options.acquire(); + if (options == null) { + options = new RenderOptions(mogoOverlayManager); + } + ll.add(options); + List cls = new ArrayList<>(); + cls.add(colors[colorsIndex++]); + cls.add(colors[colorsIndex++]); + options.show(cls, ps); } - if (mMoGoPolyline != null && !mMoGoPolyline.isDestroyed() && !mMoGoPolyline.isVisible()) { - mMoGoPolyline.setVisible(true); + hide(); + for (int i = ll.size() - 1; i >= 0 ; i--) { + this.options.release(ll.get(i)); } } else { isExcept = true; } long drawEnd = SystemClock.elapsedRealtime(); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "drawTrajectoryList cost : " + (drawEnd - drawStart) + "ms and isExcept:" + isExcept + "::removeCount:" + removeCount + "::total:" + total); + Log.d("Route", "draw cost:" + (drawEnd - drawStart) + "ms and isExcept:" + isExcept + "::removeCount:" + removeCount + "::total:" + total); } catch (Throwable t) { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "drawTrajectoryList error (isExcept: "+isExcept+") : " + t); + Log.d("Route","error:" + Log.getStackTraceString(t)); } finally { - if (isExcept) { - setVisible(false); - } - if (points.size() > 0) { - for (int i = 0; i < points.size(); i++) { - MogoLatLng latLng = points.get(i); - if (latLng == null) { - continue; - } - pools.release(latLng); + try { + if (isExcept) { + hide(); } + if (!pps.isEmpty()) { + for (int i = 0; i < pps.size(); i++) { + MogoLatLng latLng = pps.get(i); + if (latLng == null) { + continue; + } + pools.release(latLng); + } + } + } catch (Throwable t) { + Log.d("Route", "error2:" + Log.getStackTraceString(t)); } } } + private void hide() { + List list = new ArrayList<>(); + RenderOptions acquire = this.options.acquire(); + while (acquire != null) { + acquire.hide(); + list.add(acquire); + acquire = this.options.acquire(); + } + for (int i = 0; i < list.size(); i++) { + this.options.release(list.get(i)); + } + } + + public void remove() { + List list = new ArrayList<>(); + RenderOptions acquire = this.options.acquire(); + while (acquire != null) { + acquire.remove(); + list.add(acquire); + acquire = this.options.acquire(); + } + for (int i = 0; i < list.size(); i++) { + this.options.release(list.get(i)); + } + } + private long isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) { long start = SystemClock.elapsedRealtime(); try { // 计算车辆与点之间的夹角 long diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi2( car_lon, car_lat, lon, lat, car_head); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "isPointOnCarFront: angle->" + diffAngle); + Log.d("Route", "isPointOnCarFront: angle->" + diffAngle); return diffAngle; } finally { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "isPointOnCarFront cost:" + (SystemClock.elapsedRealtime() - start) + "ms"); + Log.d("Route", "isPointOnCarFront cost:" + (SystemClock.elapsedRealtime() - start) + "ms"); } } } - private volatile RenderTask mRenderTask; + private RenderTask mRenderTask; - public void drawTrajectoryList(MogoLocation carLoc, List routeList) { + public void drawTrajectoryList(Lock lock, MogoLocation carLoc, List routeList) { if (mRenderTask == null) { mRenderTask = new RenderTask(); } - mRenderTask.setData(carLoc, routeList); + mRenderTask.setData(lock, carLoc, routeList); if (mRenderHandler != null) { mRenderHandler.removeCallbacks(mRenderTask); mRenderHandler.post(mRenderTask); } } - - public void setVisible(boolean isVisible) { - if (mMoGoPolyline != null && !mMoGoPolyline.isDestroyed()) { - mMoGoPolyline.setVisible(isVisible); - } - } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteStrategy.kt b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteStrategy.kt new file mode 100644 index 0000000000..9856abe474 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteStrategy.kt @@ -0,0 +1,202 @@ +package com.mogo.module.service.routeoverlay + +import android.graphics.* +import com.mogo.eagle.core.data.config.* +import com.mogo.eagle.core.utilcode.mogo.* +import java.lang.Double.NaN +import java.util.* +import kotlin.collections.ArrayList + + +interface IStrategy { + + fun getColors(): Array + + fun getIndexes(): Array +} + +class Colors { + + companion object { + val COLOR_BLUE_DARK = Color.parseColor("#2ABAD9") + val COLOR_BLUE_LIGHT = Color.parseColor("#332ABAD9") + val COLOR_RED_DARK = Color.parseColor("#CA4C15") + val COLOR_TRANSPARENT = Color.parseColor("#002ABAD9") + } +} + + +sealed class Strategy: IStrategy + +class Uniform(private val count: Int, private val colors: Array? = null): Strategy() { + + override fun getColors(): Array = colors ?: arrayOf(Colors.COLOR_BLUE_DARK, Colors.COLOR_TRANSPARENT) + + override fun getIndexes(): Array = arrayOf(0, count) +} + + +class SlowDown(private val colors: Array, private val indexes: Array): Strategy() { + + override fun getColors(): Array = colors + + override fun getIndexes(): Array = indexes + + override fun toString(): String { + return indexes.joinToString(",") + } +} + + +class SpeedUp(private val count: Int): Strategy() { + override fun getColors(): Array = arrayOf(Colors.COLOR_BLUE_DARK, Colors.COLOR_TRANSPARENT) + + override fun getIndexes(): Array = arrayOf(0, count) +} + + +object RouteStrategy { + + private var strategy: Strategy? = null + private var index: Int = 0 + + private var oldV: Double = NaN + private var oldA: Double = NaN + private var mode: Int = -1 // 0: 匀速, 1:减速, 2: 加速 + private val colors4SlowDown: LinkedList = LinkedList() + private val colors4Uniform: LinkedList = LinkedList() + private val indexes4SlowDown: LinkedList = LinkedList() + private var isLightBlueAll = false + private var isRedBlue = false + private var ignore = false + private var firstV: Double = NaN + + private var isEnable = AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) + + fun enable(enable: Boolean) { + isEnable = enable + } + + fun start() { + strategy = null + index = 0 + mode = -1 + ignore = false + colors4Uniform.clear() + colors4SlowDown.clear() + indexes4SlowDown.clear() + isLightBlueAll = false + isRedBlue = false + oldA = NaN + oldV = NaN + firstV = NaN + } + + fun end() { + strategy = acquireStrategy() + } + + private fun acquireStrategy(): Strategy? { + if (mode == 0) { + return if (colors4Uniform.isNotEmpty()) Uniform(index, colors = Array(colors4Uniform.size) { + colors4Uniform[it] + }) else null + } + if (mode == 2) { + return SpeedUp(index) + } + + if (indexes4SlowDown.isEmpty() || !isLightBlueAll) { + return null + } + val count = indexes4SlowDown.size + if (count == 3) { + val colors = when { + isRedBlue -> { + arrayOf(Colors.COLOR_RED_DARK, Colors.COLOR_BLUE_DARK, Colors.COLOR_BLUE_LIGHT, Colors.COLOR_TRANSPARENT) + } + else -> { + return Uniform(index) + } + } + val indexes = ArrayList() + val i = indexes4SlowDown[2] + if (index - i < 5) { + return Uniform(index) + } + indexes += 0 + indexes += i + indexes += i + indexes += index + return SlowDown(colors, indexes = indexes.toTypedArray()) + } + return null + } + + fun check(speed: Double, acc: Double) { + try { + if (!isEnable){ + return + } + if (ignore) { + return + } + if (oldV.isNaN()) { + return + } + if (oldA.isNaN()) { + return + } + if (index < 3) { + //丢掉前3个点 + return + } + if (firstV.isNaN()) { + firstV = speed; + return + } + if (speed == oldV) { + if (speed <= 0.01) { + colors4Uniform.clear() + colors4Uniform.add(Colors.COLOR_BLUE_LIGHT) + colors4Uniform.add(Colors.COLOR_TRANSPARENT) + } + ignore = true + mode = 0 + return + } + + if (speed > oldV) { + mode = 2 + ignore = true + return + } + + if (speed < oldV) { + if (mode != 1) { + indexes4SlowDown.add(0) + mode = 1 + } + } + if (mode == 1) { + if (!isLightBlueAll && speed <= 0.01) { + isLightBlueAll = true + indexes4SlowDown.add(index) + ignore = true + return + } + + if (!isRedBlue && firstV > 0 && speed > 0 && speed <= firstV / 2.0) { + isRedBlue = true + indexes4SlowDown.add(index) + } + } + } finally { + index++ + oldV = speed + oldA = acc + } + } + + fun getStrategy(): Strategy = if (isEnable) strategy ?: Uniform(index) else SpeedUp(index) +} \ No newline at end of file