diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java index 9bb8ef491e..f36d0a0d07 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/OchBusProvider.java @@ -8,6 +8,7 @@ import androidx.fragment.app.FragmentActivity; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.bus.constant.OchBusConst; import com.mogo.och.bus.fragment.OchBusFragment; @@ -36,10 +37,7 @@ public class OchBusProvider implements IMogoOCH { */ private void stepIntoVrMode(){ Logger.d( TAG, "进入vr模式" ); - MogoApisHandler.getInstance() - .getApis() - .getMapServiceApi() - .getMapUIController() + MogoMapUIController.getInstance() .openVrMode(false); } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java index 60d9fa8eca..6973d4f7f7 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java @@ -30,6 +30,8 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMapUIController; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.module.common.MogoApisHandler; @@ -119,15 +121,13 @@ public abstract class BaseOchBusTabFragment(); mContext = context; - mogoOverlayManager = MogoApisHandler.getInstance().getApis().getMapServiceApi().getOverlayManager(mContext); + mogoOverlayManager = MogoOverlayManager.getInstance(); } /** diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java index e790784ebb..e6b6ca23ae 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java @@ -4,11 +4,10 @@ package com.mogo.och.taxi.passenger.callback; import java.util.List; import mogo.telematics.pad.MessagePad; - /** * @author: wangmingjun * @date: 2021/11/1 */ -interface IOCHTaxiAutopilotPlanningCallback { +public interface IOCHTaxiPassengerAutopilotPlanningCallback { void routeResult(List models); } \ No newline at end of file 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 3d4a2da445..9a1c435b68 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 @@ -4,7 +4,6 @@ import android.content.Context; import android.content.Intent; import android.location.Location; import android.net.ConnectivityManager; -import android.text.TextUtils; import androidx.annotation.Nullable; @@ -14,7 +13,6 @@ import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo; import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo; -import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; @@ -57,6 +55,9 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; + /** * Created by pangfan on 2021/8/19 * @@ -472,6 +473,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + @Override + public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { + + } + private boolean arriveAtEnd = false; //乘客app专用字段 @Override @@ -525,18 +531,13 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } @Override - public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) { - - } - - @Override - public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo data) { + public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) { if (FunctionBuildConfig.isDemoMode && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { arriveAtEnd = true; } - if (data == null || !checkCurrentOCHOrder() + if (arrivalNotification == null || !checkCurrentOCHOrder() || (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtEndStation)) { return; } @@ -544,28 +545,29 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback // TipToast.shortTip("到达目的地"); } } + }; - private IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){ + private final IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){ + + @Override + public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { + if (null != routeList && routeList.getWayPointsList().size() > 0){ + mAutopilotPlanningCallback.routeResult(routeList.getWayPointsList()); + } + } @Override public void onAutopilotTrajectory(ArrayList trajectoryInfos) { } - @Override - public void onAutopilotRotting(AutopilotRouteInfo routeList) { - if (null != routeList && routeList.getModels() != null){ - mAutopilotPlanningCallback.routeResult(routeList.getModels()); - - } - } }; /** * 限速监听 */ - private LimitingVelocityListener limitingVelocityListener = new LimitingVelocityListener(){ + private final LimitingVelocityListener limitingVelocityListener = new LimitingVelocityListener(){ @Override public void onLimitingVelocityChange(int limitingVelocity) { @@ -597,7 +599,4 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } - /** - * END - */ } 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 ac42091c69..418956526e 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 @@ -8,7 +8,6 @@ import androidx.annotation.RequiresApi; import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.mvp.Presenter; -import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback; @@ -21,6 +20,8 @@ import com.mogo.och.taxi.passenger.ui.TaxiPassengerServingOrderFragment; import java.util.ArrayList; import java.util.List; +import mogo.telematics.pad.MessagePad; + /** * @author: wangmingjun * @date: 2022/3/14 @@ -59,11 +60,11 @@ public class TaxiPassengerServingOrderPresenter extends Presenter models) { + public void routeResult(List models) { if (models == null) return; List latLngList = new ArrayList<>(); - for (AutopilotRouteInfo.RouteModels routeModel : models) { - latLngList.add(new MogoLatLng(routeModel.getLat(), routeModel.getLon())); + for (MessagePad.Location routeModel : models) { + latLngList.add(new MogoLatLng(routeModel.getLatitude(), routeModel.getLongitude())); } mView.routeResult(latLngList); } @@ -81,7 +82,7 @@ public class TaxiPassengerServingOrderPresenter extends Presenter list = new ArrayList<>(); - for (int i = 0; i < 200 ; i++){ + List list = new ArrayList<>(); + for (int i = 0; i < 200; i++) { + MessagePad.Location.Builder builder = MessagePad.Location.newBuilder(); AutopilotRouteInfo.RouteModels routeModels = new AutopilotRouteInfo.RouteModels(); - if (i <= 100){ - routeModels.setLat(40.199248903658166); - routeModels.setLon(116.73435586102245 + i * 0.0001); - }else { - routeModels.setLat(40.199248903658166 + i * 0.0001); - routeModels.setLon(116.73435586102245 + 100 * 0.0001); + if (i <= 100) { + builder.setLatitude(40.199248903658166); + builder.setLongitude(116.73435586102245 + i * 0.0001); + } else { + builder.setLatitude(40.199248903658166 + i * 0.0001); + builder.setLongitude(116.73435586102245 + 100 * 0.0001); } - list.add(routeModels); + list.add(builder.build()); } mPresenter.routeResult(list); return true; @@ -142,10 +140,10 @@ public class TaxiPassengerServingOrderFragment extends /** * 设置进度条最大值为 起点终点首次规划出的值 */ - private void setSeekBarMax(){ + private void setSeekBarMax() { //计算订单起点和终点距离 int maxInt = TaxiPassengerModel.getInstance().calculateOrderDistanceSum(); - Logger.d(TAG,"maxInt = "+maxInt); + Logger.d(TAG, "maxInt = " + maxInt); mProgressSeekBar.setMax(maxInt); } @@ -153,7 +151,7 @@ public class TaxiPassengerServingOrderFragment extends * 行驶进度值更新 */ @RequiresApi(api = Build.VERSION_CODES.N) - private void updateDriveProcessLoading(int progressLoading){ + private void updateDriveProcessLoading(int progressLoading) { mProgressSeekBar.setProgress( TaxiPassengerModel.getInstance().calculateOrderDistanceSum() - progressLoading , true); @@ -198,6 +196,7 @@ public class TaxiPassengerServingOrderFragment extends /** * 绘制 + * * @param coordinates */ private void drawablePolyline(List coordinates) { @@ -212,7 +211,7 @@ public class TaxiPassengerServingOrderFragment extends } } - private void clearPolyline(){ + private void clearPolyline() { if (mMapDirectionView != null) { UiThreadHandler.post(new Runnable() { @Override @@ -227,13 +226,13 @@ public class TaxiPassengerServingOrderFragment extends mTPOrderStartStation.setText(order.startSiteAddr); mTPOrderEndStation.setText(order.endSiteAddr); - if (TaxiPassengerOrderStatusEnum.ArriveAtStartStation.getCode() == order.orderStatus){ + if (TaxiPassengerOrderStatusEnum.ArriveAtStartStation.getCode() == order.orderStatus) { mTPOrderStatus.setText(getString(R.string.taxi_p_arrive_to_start)); setSeekBarMax(); return; } - if (TaxiPassengerOrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus){ + if (TaxiPassengerOrderStatusEnum.OnTheWayToEndStation.getCode() == order.orderStatus) { mTPOrderStatus.setText(R.string.taxi_p_start_to_end); return; } @@ -246,7 +245,7 @@ public class TaxiPassengerServingOrderFragment extends DecimalFormat fnum = new DecimalFormat("##0.00"); String remainDis = fnum.format((float) meters / 1000); int remainTime = (int) timeInSecond / 60; - updateOrderDisAndTimeView(remainDis,remainTime,arriveTime); + updateOrderDisAndTimeView(remainDis, remainTime, arriveTime); updateDriveProcessLoading(meters); } @@ -266,39 +265,41 @@ public class TaxiPassengerServingOrderFragment extends /** * 更新速度 + * * @param newSpeed */ private void updateSpeedView(float newSpeed) { int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值 - if (speed < mLimitingVelocity ){ - mTPSpeedTv.setText(getSpeedTextStyle(String.valueOf(speed),true)); - }else { + if (speed < mLimitingVelocity) { + mTPSpeedTv.setText(getSpeedTextStyle(String.valueOf(speed), true)); + } else { mTPSpeedTv.setText(getSpeedTextStyle(String.valueOf(speed), false)); } } /** * 设置速度的颜色 + * * @param content * @param isNormal 正常状态 true, 超速状态 * @return */ - private SpannableStringBuilder getSpeedTextStyle(String content,boolean isNormal){ - if (isNormal){ + private SpannableStringBuilder getSpeedTextStyle(String content, boolean isNormal) { + if (isNormal) { return TaxiPassengerUtils.getGradientFontSpan(content - , 0xFFCEEEFF ,0xFFA1DAFF); - }else {//超速 + , 0xFFCEEEFF, 0xFFA1DAFF); + } else {//超速 return TaxiPassengerUtils.getGradientFontSpan(content - ,0xFFFE2505 ,0xFFFF6F62); + , 0xFFFE2505, 0xFFFF6F62); } } - private void runOnUIThread( Runnable executor ) { - if ( executor == null ) { + private void runOnUIThread(Runnable executor) { + if (executor == null) { return; } - if ( Looper.myLooper() != Looper.getMainLooper() ) { - UiThreadHandler.post( executor ); + if (Looper.myLooper() != Looper.getMainLooper()) { + UiThreadHandler.post(executor); } else { executor.run(); } @@ -311,6 +312,7 @@ public class TaxiPassengerServingOrderFragment extends /** * 设置指南针旋转 + * * @param bearing */ private void startIvCompass(float bearing) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerV2XNotificationView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerV2XNotificationView.java new file mode 100644 index 0000000000..bebbb2625c --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerV2XNotificationView.java @@ -0,0 +1,90 @@ +package com.mogo.och.taxi.passenger.ui; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.widget.ImageView; +import android.widget.TextView; + +import com.mogo.eagle.core.data.enums.SidePattern; +import com.mogo.eagle.core.function.api.hmi.view.IViewNotification; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.taxi.passenger.R; + +import org.jetbrains.annotations.Nullable; + +/** + * V2X预警事件view:通过FloatWindow呈现,无需加入到自定义layout中 + * + * Created on 2022/3/16 + */ +public class TaxiPassengerV2XNotificationView extends IViewNotification { + + private ImageView mV2XNotificationIcon; + private TextView mV2XNotificationText; + + public TaxiPassengerV2XNotificationView(@Nullable Context context) { + this(context, null, 0); + } + + public TaxiPassengerV2XNotificationView(@Nullable Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public TaxiPassengerV2XNotificationView(@Nullable Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context) { + LayoutInflater.from(context).inflate(R.layout.taxi_p_v2x_notification_view, this, + true); + + mV2XNotificationIcon = findViewById(R.id.taxi_p_v2x_notification_icon_iv); + mV2XNotificationText = findViewById(R.id.taxi_p_v2x_notification_text_tv); + + // 设置View的出场位置 + setSidePattern(SidePattern.LEFT); + setLayoutGravity(Gravity.LEFT); + // 设置View的停留位置:相对屏幕左上角的位置 + setOffsetX(getResources(). + getDimensionPixelSize(R.dimen.taxi_p_v2x_notification_view_margin_left)); + setOffsetY(getResources(). + getDimensionPixelSize(R.dimen.taxi_p_v2x_notification_view_margin_top)); + } + + @Override + public void setWarningIcon(int warningIcon) { + super.setWarningIcon(warningIcon); + UiThreadHandler.post(() -> { + mV2XNotificationIcon.setImageResource(warningIcon); + }); + } + + @Override + public void setWarningIcon(@Nullable Drawable drawable) { + super.setWarningIcon(drawable); + UiThreadHandler.post(() -> { + mV2XNotificationIcon.setImageDrawable(drawable); + }); + } + + @Override + public void setWarningContent(@Nullable CharSequence warningContent) { + super.setWarningContent(warningContent); + UiThreadHandler.post(() -> { + mV2XNotificationText.setText(warningContent); + }); + } + + @Override + public void setWarningContent(int warningContentId) { + super.setWarningContent(warningContentId); + UiThreadHandler.post(() -> { + mV2XNotificationText.setText(warningContentId); + }); + } +} diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_v2x_notification_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_v2x_notification_view.xml new file mode 100644 index 0000000000..c354474ee2 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/drawable/bg_taxi_p_v2x_notification_view.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_v2x_notification_view.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_v2x_notification_view.xml new file mode 100644 index 0000000000..573f199065 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_v2x_notification_view.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml index c160630cf4..21b397b8fa 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values-sw320dp/dimens.xml @@ -39,4 +39,12 @@ 154px 127px 60px + + 31px + 110px + 10px + 70px + 120px + 39px + 20px \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml index 1dc9f73763..84694a1e19 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values-xhdpi-2560x1440/dimens.xml @@ -102,4 +102,12 @@ 154px 127px 60px + + 31px + 110px + 10px + 70px + 120px + 39px + 20px \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml index 3d8d1d88f4..351f21c4f7 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/colors.xml @@ -23,4 +23,6 @@ #006D43 #FFE198 #FF9B00 + + #80000000 \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml b/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml index 679981a15f..957abe6b50 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/values/dimens.xml @@ -100,4 +100,12 @@ 154px 127px 60px + + 31px + 110px + 10px + 70px + 120px + 39px + 20px \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java index 7f6fdc8b77..fe3f042400 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/MogoOCHTaxi.java @@ -9,6 +9,7 @@ import androidx.fragment.app.FragmentActivity; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.och.taxi.constant.OCHTaxiConst; import com.mogo.och.taxi.ui.OCHTaxiFragment; @@ -44,10 +45,7 @@ class MogoOCHTaxi implements IMogoOCH , IMogoStatusChangedListener { */ private void stepIntoVrMode() { Logger.d( TAG, "进入vr模式" ); - MogoApisHandler.getInstance() - .getApis() - .getMapServiceApi() - .getMapUIController() + MogoMapUIController.getInstance() .openVrMode( false ); } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java index 95988abf48..102212c192 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/OCHTaxiOverlayManager.java @@ -6,6 +6,7 @@ import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.v2x.events.utils.LocationUtils; import com.mogo.eagle.core.utilcode.util.ColorUtils; +import com.mogo.map.MogoOverlayManager; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; @@ -32,7 +33,7 @@ public class OCHTaxiOverlayManager { // 引导线颜色 mPolylineColors = new ArrayList<>(); mContext = context; - mogoOverlayManager = MogoApisHandler.getInstance().getApis().getMapServiceApi().getOverlayManager(mContext); + mogoOverlayManager = MogoOverlayManager.getInstance(); } /** diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java index 0d8bab297d..f698d2fe36 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java @@ -36,6 +36,8 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerSmpManager; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.MogoMapUIController; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.module.common.MogoApisHandler; @@ -115,14 +117,12 @@ public abstract class BaseOchTaxiTabFragment { override fun onMessageResponseClient(msg: MogoProtocolMsg?, sign: String?) { // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 - msg?.let { - AdasManager.getInstance().parseIPCData(it.body) + try { + msg?.let { + AdasManager.getInstance().parseIPCData(it.body) + } + } catch (e: Exception) { + e.printStackTrace() + CallerLogger.e("$M_ADAS_IMPL$TAG", "乘客屏解析数据流程中出现异常:${e.message}") } } @@ -264,7 +269,7 @@ class MoGoAutopilotProvider : } override fun setIPCReboot() { - AdasManager.getInstance().rebootIPC() + AdasManager.getInstance().rebootAPDocker() } override fun recordCause(key: String?, name: String?, id: String?, reason: String?) { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index f35d23bac2..537c897962 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -31,6 +31,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showAdUpgradeStatus import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showDockerRebootResult +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.module.common.MogoApisHandler import com.mogo.module.common.datacenter.SnapshotLocationDataCenter @@ -61,6 +62,7 @@ class MoGoAdasListenerImpl : OnAdasListener { const val TAG = "OnAdasListenerAdapter" } + //车前引导线 @ChainLog( linkCode = CHAIN_LINK_ADAS, endpoint = PAD, @@ -90,6 +92,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //感知物体 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -107,6 +110,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //自车定位信息 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -124,7 +128,7 @@ class MoGoAdasListenerImpl : OnAdasListener { MogoApisHandler.getInstance().apis.adasControllerApi.satelliteTime = java.lang.Double.valueOf(gnssInfo.satelliteTime).toLong() if (1 == FunctionBuildConfig.gpsProvider) { - MarkerServiceHandler.getApis().mapServiceApi.mapUIController.syncLocation2Map( + CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map( gnssInfo ) SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo(gnssInfo) @@ -132,6 +136,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //自车状态(底盘),车灯等。 override fun onVehicleState( header: MessagePad.Header, vehicleState: VehicleStateOuterClass.VehicleState? @@ -144,6 +149,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //自动驾驶状态 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -181,6 +187,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //监控 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -205,6 +212,7 @@ class MoGoAdasListenerImpl : OnAdasListener { invokeAutopilotSNRequest() } + //工控机基础配置信息 override fun onCarConfigResp( header: MessagePad.Header, carConfigResp: MessagePad.CarConfigResp? @@ -214,6 +222,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //数据采集,badCase @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -231,6 +240,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //全局路径规划 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -248,6 +258,7 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + //预警信息 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, @@ -260,6 +271,7 @@ class MoGoAdasListenerImpl : OnAdasListener { invokeAutopilotWarnMessage(warn) } + //到站回调 @ChainLog( linkCode = CHAIN_LINK_ADAS, linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA, diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/MoGoChatFacade.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/MoGoChatFacade.kt index 3a249b884c..397a83f29c 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/MoGoChatFacade.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/MoGoChatFacade.kt @@ -38,6 +38,7 @@ import com.mogo.eagle.core.function.chat.facade.utils.log import com.mogo.eagle.core.function.chat.facade.voice.VoiceControlFacade import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.mogo.eagle.core.utilcode.util.Utils +import com.mogo.map.MogoLocationClient import kotlinx.coroutines.* import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.channels.Channel @@ -580,7 +581,7 @@ object MoGoChatFacade: IMoGoChatFacade { } //告之服务器给发送方下发接收通话消息 try { - val location = BridgeApi.locationClient()?.lastKnowLocation + val location = MogoLocationClient.getInstance(context())?.lastKnowLocation val response = serverApi.requestConnectStatus(ConnectStatusParam(MoGoAiCloudClientConfig.getInstance().sn, sn, roomId, PUSH_MSG_AGREE_ENTER, CALL_TYPE_VOICE.type).also { it.nickName = mySelf.get().name it.headImgUrl = mySelf.get().icon @@ -811,7 +812,7 @@ object MoGoChatFacade: IMoGoChatFacade { } val response = serverApi.inviteJoinVehicleTeam(CallRequestParam().also { val user = mySelf.get() - val location = BridgeApi.locationClient()?.lastKnowLocation + val location = MogoLocationClient.getInstance(context())?.lastKnowLocation it.snSender = mySn it.snReceiver = sn it.nickName = user.name @@ -957,7 +958,7 @@ object MoGoChatFacade: IMoGoChatFacade { } //告之服务器给发送方下发接收通话消息 try { - val location = BridgeApi.locationClient()?.lastKnowLocation + val location = MogoLocationClient.getInstance(context())?.lastKnowLocation val response = serverApi.requestConnectStatus(ConnectStatusParam(MoGoAiCloudClientConfig.getInstance().sn, sn, roomId, PUSH_MSG_AGREE_ENTER, CALL_TYPE_VEHICLE_TEAM.type).also { it.nickName = mySelf.get().name it.headImgUrl = mySelf.get().icon diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/bridge/BridgeApi.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/bridge/BridgeApi.kt index 14e2a87d78..cba2a2e7ec 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/bridge/BridgeApi.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/bridge/BridgeApi.kt @@ -21,8 +21,6 @@ internal object BridgeApi { internal fun context(): Context = contextHolder?.get() ?: Utils.getApp() - internal fun locationClient() = apis?.mapServiceApi?.getSingletonLocationClient(context()) - internal fun intentManager() = apis?.intentManagerApi internal fun statusManager() = apis?.statusManagerApi diff --git a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/net/ChatServiceModel.kt b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/net/ChatServiceModel.kt index e1ffcaef0e..58072fd676 100644 --- a/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/net/ChatServiceModel.kt +++ b/core/function-impl/mogo-core-function-chat/src/main/java/com/mogo/eagle/core/function/chat/facade/net/ChatServiceModel.kt @@ -5,6 +5,7 @@ import com.google.gson.Gson import com.google.gson.JsonElement import com.google.gson.JsonObject import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.data.chat.UserInfo import com.mogo.eagle.core.data.constants.MogoServicePaths @@ -15,6 +16,7 @@ import com.mogo.eagle.core.function.chat.facade.consts.ChatHttp import com.mogo.eagle.core.function.chat.facade.consts.ChatHttp.Companion.getConfig import com.mogo.eagle.core.function.chat.facade.net.bean.* import com.mogo.eagle.core.function.chat.facade.utils.log +import com.mogo.map.MogoLocationClient import com.mogo.service.IMogoServiceApis import retrofit2.http.* import java.lang.IllegalStateException @@ -72,7 +74,7 @@ internal class ChatServiceModel { suspend fun requestConnectStatus(params: ConnectStatusParam): BaseResponse { val map = hashMapOf() val sn = MoGoAiCloudClientConfig.getInstance().sn - val location = BridgeApi.locationClient()?.lastKnowLocation + val location = MogoLocationClient.getInstance(AbsMogoApplication.getApp())?.lastKnowLocation if (location != null) { params.lon = location.longitude params.lat = location.latitude @@ -103,7 +105,7 @@ internal class ChatServiceModel { suspend fun requestRoomInfo(param: CallRequestParam): BaseResponse { val map = hashMapOf() - val location = BridgeApi.locationClient()?.lastKnowLocation + val location = MogoLocationClient.getInstance(AbsMogoApplication.getApp())?.lastKnowLocation if (location != null) { param.lat = location.latitude param.lon = location.longitude diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index c83b4db0c7..2bf4e937eb 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -19,8 +19,8 @@ import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.Utils import com.zhjt.mogo_core_function_devatools.badcase.api.entity.BadCaseResponse.Reason -import com.zhjt.mogo_core_function_devatools.badcase.mvp.BadCasePresenter -import com.zhjt.mogo_core_function_devatools.badcase.mvp.BadCaseView +import com.zhjt.mogo_core_function_devatools.badcase.biz.BadCasePresenter +import com.zhjt.mogo_core_function_devatools.badcase.biz.BadCaseView import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/BadCasePresenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/BadCasePresenter.kt deleted file mode 100644 index 857b814f8a..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/BadCasePresenter.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.badcase.mvp - -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager -import com.zhjt.mogo_core_function_devatools.badcase.api.entity.UploadResult -import com.zhjt.mogo_core_function_devatools.badcase.mvp.biz.IBadCasePresenter -import com.zhjt.mogo_core_function_devatools.badcase.repository.Repository -import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord - -internal class BadCasePresenter : IBadCasePresenter { - - private val repository by lazy { - Repository() - } - - override suspend fun loadBadCases() = repository.loadBadCases() - - override suspend fun insertRecord(record: AutoPilotRecord) { - try { - repository.insert(record) - } catch (t: Throwable) { - CallerLogger.e("$M_DEVA${BadCaseManager.TAG}", "-- 插入数据失败 -- msg: $t") - } - } - - override suspend fun getUnConsumedRecords(): List { - return try { - repository.getAllUnConsumedRecord() ?: emptyList() - } catch (t: Throwable) { - CallerLogger.e("$M_DEVA${BadCaseManager.TAG}", "-- 获取所有未消费的数据失败 -- msg: $t") - emptyList() - } - } - - override suspend fun deleteRecord(record: AutoPilotRecord) { - try { - repository.deleteRecord(record) - } catch (t: Throwable) { - CallerLogger.e("$M_DEVA${BadCaseManager.TAG}", "-- 删除某条记录失败 -- msg: $t") - } - } - - override suspend fun upload(map: Map): UploadResult? = repository.upload(map) - - override suspend fun updateLastModified(timestamp: Long) { - repository.uploadLastModified(timestamp) - } - - override suspend fun getLastModified(): Long { - CallerLogger.d("$M_DEVA${BadCaseManager.TAG}", " --- 2 ----") - return repository.getLastModified() - } -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/BadCaseView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/BadCaseView.kt deleted file mode 100644 index 435605a055..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/BadCaseView.kt +++ /dev/null @@ -1,176 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.badcase.mvp - -import android.annotation.SuppressLint -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.GradientDrawable -import android.graphics.drawable.StateListDrawable -import android.util.AttributeSet -import android.util.StateSet -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat -import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult -import com.mogo.eagle.core.utilcode.kotlin.* -import com.zhjt.mogo_core_function_devatools.R -import com.zhjt.mogo_core_function_devatools.badcase.api.entity.BadCaseResponse.Reason -import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord -import kotlinx.android.synthetic.main.layout_badcase_collect.view.* -import kotlinx.coroutines.launch -import java.text.SimpleDateFormat -import java.util.* - -internal class BadCaseView: ConstraintLayout { - - @Volatile - private var selectCase: Reason? = null - - @Volatile - private var cases: List? = null - - private val presenter by lazy { - BadCasePresenter() - } - - private var onDismiss: (() -> Unit)? = null - private var onSelect:(suspend (reason: Reason) -> Unit)? = null - - private val scope by lazy { - lifecycleOwner.lifecycleScope - } - - private var record: AutoPilotRecord? = null - - constructor(context: Context) : this(context, null) - - constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) - - @SuppressLint("SetTextI18n") constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { - LayoutInflater.from(context).inflate(R.layout.layout_badcase_collect, this, true) - background = ColorDrawable(Color.parseColor("#F0151D41")) - isClickable = true - layoutParams = ViewGroup.LayoutParams(960.toPixels().toInt(), 1528.toPixels().toInt()) - close?.onClick { - onDismiss?.invoke() - } - cancel?.also { - it.background = shape(solid = Color.parseColor("#3B4577"), radius = 16) - it.onClick { - onDismiss?.invoke() - } - } - ok?.also { - val enabled = gradient(radius = 16.toPixels().toInt(), orientation = GradientDrawable.Orientation.LEFT_RIGHT, centerX = 0.06f, startColor = Color.rgb(35, 146, 252), endColor = Color.rgb(28, 75, 252)) - val disabled = gradient(radius = 16.toPixels().toInt(), orientation = GradientDrawable.Orientation.LEFT_RIGHT, centerX = 0.06f, startColor = Color.rgb(24, 71, 129), endColor = Color.rgb(21, 46, 129)) - it.background = object : StateListDrawable() {}.also { itx -> - itx.addState(intArrayOf(android.R.attr.state_enabled), enabled) - itx.addState(StateSet.WILD_CARD, disabled) - } - it.onClick { - selectCase?.run { - scope.launch { - onSelect?.invoke(this@run) - } - } - } - } - scope.launchWhenCreated { - time_of_take_over?.text = "接管时间:${SimpleDateFormat("yyyy.MM.dd HH:mm", Locale.getDefault()).format(record?.toLongTime() ?: System.currentTimeMillis())}" - showLoading() - presenter.loadBadCases().also { - cases = it - refresh(it) - } - hideLoading() - } - } - - private fun refresh(causes: List) { - cases = causes - rv_take_over?.let { - it.layoutManager = LinearLayoutManager(it.context, LinearLayoutManager.VERTICAL, false) - it.adapter = object : RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BadCaseViewHolder = BadCaseViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.layout_badcase_item, parent, false)) - override fun onBindViewHolder(holder: BadCaseViewHolder, position: Int) { - val cases = cases - if (cases == null || cases.isEmpty()) { - return - } - if (position >= cases.size) { - return - } - val case = cases[position] - holder.bindData(case) - } - override fun getItemCount(): Int = cases?.size ?: 0 - } - } - } - - private fun showLoading() { - pb?.let { - it.visibility = View.VISIBLE - } - } - - private fun hideLoading() { - pb?.let { - it.visibility = View.INVISIBLE - } - } - - private inner class BadCaseViewHolder(item: View) : RecyclerView.ViewHolder(item) { - - private val check: ImageView = item.findViewById(R.id.check) - private val reason: TextView = item.findViewById(R.id.reason) - - init { - check.background = StateListDrawable().also { - it.addState(intArrayOf(android.R.attr.state_selected), ContextCompat.getDrawable(itemView.context, R.drawable.icon_ap_badcase_check)) - it.addState(StateSet.WILD_CARD, ContextCompat.getDrawable(itemView.context, R.drawable.icon_ap_badcase_default)) - } - } - - @SuppressLint("NotifyDataSetChanged") - fun bindData(case: Reason) { - check.isSelected = case.isChecked - reason.text = case.reason ?: "" - if (case.isChecked) { - ok?.isSelected = true - } - itemView.onClick { - case.isChecked = !case.isChecked - selectCase = case - cancelOtherChecked(case) - ok?.isEnabled = hasCheckedItem() - rv_take_over?.adapter?.notifyDataSetChanged() - } - } - - private fun hasCheckedItem(): Boolean = cases?.find { it.isChecked } != null - - private fun cancelOtherChecked(case: Reason) { - val cases = cases - if (cases == null || cases.isEmpty()) { - return - } - cases.filterNot { it == case }.forEach { - it.isChecked = false - } - } - } - - fun register(record: AutoPilotRecord?, onDismiss: () -> Unit, onSelect:suspend (reason: Reason) -> Unit) { - this.record = record - this.onDismiss = onDismiss - this.onSelect = onSelect - } -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/biz/IBadCasePresenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/biz/IBadCasePresenter.kt deleted file mode 100644 index 4652dc9f60..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/mvp/biz/IBadCasePresenter.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.badcase.mvp.biz - -import com.zhjt.mogo_core_function_devatools.badcase.api.entity.BadCaseResponse.Reason -import com.zhjt.mogo_core_function_devatools.badcase.api.entity.UploadResult -import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord -import kotlinx.coroutines.flow.Flow - - -internal interface IBadCasePresenter { - - suspend fun loadBadCases(): List - - suspend fun updateLastModified(timestamp: Long) - - suspend fun getLastModified(): Long - - suspend fun upload(map: Map): UploadResult? - - suspend fun insertRecord(record: AutoPilotRecord) - - suspend fun getUnConsumedRecords(): List - - suspend fun deleteRecord(record: AutoPilotRecord) -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt index bae5e06443..a1ad4ca389 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt @@ -1,5 +1,8 @@ package com.zhjt.mogo_core_function_devatools.scene + +//todo 1. SceneLogCache增加模块名称,提供场景需要 +//todo 2. 对特定场景提供数据, 网约车,调度... class SceneManager { companion object { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt index aa27bd98ee..483800259c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt @@ -6,11 +6,10 @@ import android.view.View import androidx.appcompat.view.ContextThemeWrapper import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner -import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern +import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.reminder.Reminder import com.mogo.eagle.core.utilcode.reminder.api.impl.ViewReminder diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt index 635188dc3a..2060d4c113 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt @@ -12,7 +12,7 @@ import android.view.LayoutInflater import android.view.View import android.view.WindowManager import com.mogo.eagle.core.function.hmi.notification.anim.AnimatorManager -import com.mogo.eagle.core.function.hmi.notification.enums.ShowPattern +import com.mogo.eagle.core.data.enums.ShowPattern import com.mogo.eagle.core.function.hmi.notification.widget.ParentFrameLayout import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI @@ -24,8 +24,8 @@ import com.mogo.eagle.core.utilcode.util.WindowUtils * 弹窗Window 管理 */ internal class WarningFloatWindowHelper( - val context: Context, - var config: WarningNotificationConfig + val context: Context, + var config: WarningNotificationConfig ) { var TAG = "WarningFloatWindowHelper" @@ -85,7 +85,7 @@ internal class WarningFloatWindowHelper( frameLayout?.tag = config.floatTag // 将浮窗布局文件添加到父容器frameLayout中,并返回该浮窗文件 val floatingView = config.layoutView?.also { frameLayout?.addView(it) } - ?: LayoutInflater.from(context).inflate(config.layoutId!!, frameLayout, true) + ?: LayoutInflater.from(context).inflate(config.layoutId!!, frameLayout, true) // 为了避免创建的时候闪一下,我们先隐藏视图,不能直接设置GONE,否则定位会出现问题 floatingView.visibility = View.INVISIBLE // 将frameLayout添加到系统windowManager中 @@ -142,34 +142,34 @@ internal class WarningFloatWindowHelper( config.statusListenerMapIMoGo.forEach { listener -> listener.onShow() } - if (frameLayout == null|| frameLayout?.isAttachedToWindow == false || config.isAnim) return + if (frameLayout == null || frameLayout?.isAttachedToWindow == false || config.isAnim) return enterAnimator = AnimatorManager(frameLayout!!, params, windowManager, config) - .enterAnim()?.apply { - // 可以延伸到屏幕外,动画结束按需去除该属性,不然旋转屏幕可能置于屏幕外部 - params.flags = - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + .enterAnim()?.apply { + // 可以延伸到屏幕外,动画结束按需去除该属性,不然旋转屏幕可能置于屏幕外部 + params.flags = + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - addListener(object : Animator.AnimatorListener { - override fun onAnimationRepeat(animation: Animator?) {} + addListener(object : Animator.AnimatorListener { + override fun onAnimationRepeat(animation: Animator?) {} - override fun onAnimationEnd(animation: Animator?) { - config.isAnim = false - if (!config.immersionStatusBar) { - // 不需要延伸到屏幕外了,防止屏幕旋转的时候,浮窗处于屏幕外 - params.flags = - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + override fun onAnimationEnd(animation: Animator?) { + config.isAnim = false + if (!config.immersionStatusBar) { + // 不需要延伸到屏幕外了,防止屏幕旋转的时候,浮窗处于屏幕外 + params.flags = + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + } } - } - override fun onAnimationCancel(animation: Animator?) {} + override fun onAnimationCancel(animation: Animator?) {} - override fun onAnimationStart(animation: Animator?) { - floatingView.visibility = View.VISIBLE - config.isAnim = true - } - }) - start() - } + override fun onAnimationStart(animation: Animator?) { + floatingView.visibility = View.VISIBLE + config.isAnim = true + } + }) + start() + } if (enterAnimator == null) { floatingView.visibility = View.VISIBLE windowManager.updateViewLayout(floatingView, params) @@ -183,16 +183,16 @@ internal class WarningFloatWindowHelper( config.statusListenerMapIMoGo.forEach { listener -> listener.onDismiss() } - if (frameLayout == null|| frameLayout?.isAttachedToWindow == false || (config.isAnim && enterAnimator == null)) return + if (frameLayout == null || frameLayout?.isAttachedToWindow == false || (config.isAnim && enterAnimator == null)) return enterAnimator?.cancel() val animator: Animator? = - AnimatorManager(frameLayout!!, params, windowManager, config).exitAnim() + AnimatorManager(frameLayout!!, params, windowManager, config).exitAnim() if (animator == null) remove() else { // 二次判断,防止重复调用引发异常 if (config.isAnim) return config.isAnim = true params.flags = - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS animator.addListener(object : Animator.AnimatorListener { override fun onAnimationRepeat(animation: Animator?) {} @@ -214,7 +214,14 @@ internal class WarningFloatWindowHelper( config.isAnim = false WarningFloatWindowManager.remove(config.floatTag) // removeView是异步删除,在Activity销毁的时候会导致窗口泄漏,所以使用removeViewImmediate直接删除view - windowManager.run { if (force) removeViewImmediate(frameLayout) else removeView(frameLayout) } + windowManager.run { + frameLayout?.removeAllViews() + if (force) { + removeViewImmediate(frameLayout) + } else { + removeView(frameLayout) + } + } } catch (e: Exception) { CallerLogger.e("$M_HMI$TAG", "浮窗关闭出现异常:$e") } @@ -235,9 +242,9 @@ internal class WarningFloatWindowHelper( view.getLocationOnScreen(location) // 通过绝对高度和相对高度比较,判断包含顶部状态栏 val statusBarHeight = - if (location[1] > params.y) WindowUtils.getStatusBarHeight(view.context.applicationContext) else 0 + if (location[1] > params.y) WindowUtils.getStatusBarHeight(view.context.applicationContext) else 0 val parentBottom = - WindowUtils.getScreenHeight(view.context.applicationContext) - statusBarHeight + WindowUtils.getScreenHeight(view.context.applicationContext) - statusBarHeight when (config.gravity) { // 右上 Gravity.END, Gravity.END or Gravity.TOP, Gravity.RIGHT, Gravity.RIGHT or Gravity.TOP -> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt index 722c037e3d..51997f5177 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt @@ -3,8 +3,8 @@ package com.mogo.eagle.core.function.hmi.notification import android.view.View import android.view.WindowManager import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator -import com.mogo.eagle.core.function.hmi.notification.enums.ShowPattern -import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern +import com.mogo.eagle.core.data.enums.ShowPattern +import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatCallbacks import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener @@ -16,55 +16,55 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener */ data class WarningNotificationConfig( // 浮窗的xml布局文件 - var layoutId: Int? = null, - var layoutView: View? = null, + var layoutId: Int? = null, + var layoutView: View? = null, // 当前浮窗的tag - var floatTag: String? = null, + var floatTag: String? = null, // 是否正在执行动画 - var isAnim: Boolean = false, + var isAnim: Boolean = false, // 是否显示 - var isShow: Boolean = false, + var isShow: Boolean = false, // 状态栏沉浸 - var immersionStatusBar: Boolean = false, + var immersionStatusBar: Boolean = false, // 浮窗的吸附方式(默认不吸附,拖到哪里是哪里) - var sidePattern: SidePattern = SidePattern.DEFAULT, + var sidePattern: SidePattern = SidePattern.DEFAULT, // 浮窗显示类型(默认只在当前页显示) - var showPattern: ShowPattern = ShowPattern.CURRENT_ACTIVITY, + var showPattern: ShowPattern = ShowPattern.CURRENT_ACTIVITY, // 倒计时关闭window,-1 表示不自动关闭, 单位毫秒。1s = 1000ms - var countDownTime: Long = 0, + var countDownTime: Long = 0, // 浮窗的摆放方式,使用系统的Gravity属性 - var gravity: Int = 0, + var gravity: Int = 0, // 坐标的偏移量 - var offsetPair: Pair = Pair(0, 0), + var offsetPair: Pair = Pair(0, 0), // 固定的初始坐标,左上角坐标 - var locationPair: Pair = Pair(0, 0), + var locationPair: Pair = Pair(0, 0), // ps:优先使用固定坐标,若固定坐标不为原点坐标,gravity属性和offset属性无效 // 四周边界值 - var leftBorder: Int = 0, - var topBorder: Int = -999, - var rightBorder: Int = 9999, - var bottomBorder: Int = 9999, + var leftBorder: Int = 0, + var topBorder: Int = -999, + var rightBorder: Int = 9999, + var bottomBorder: Int = 9999, // 出入动画 - var floatAnimator: OnFloatAnimator? = DefaultAnimator(), + var floatAnimator: OnFloatAnimator? = DefaultAnimator(), // 设置视图状态监听;show,dismiss - var statusListenerMapIMoGo: ArrayList< IMoGoWarningStatusListener> = ArrayList(), + var statusListenerMapIMoGo: ArrayList< IMoGoWarningStatusListener> = ArrayList(), // Callbacks - var callbacks: OnFloatCallbacks? = null, + var callbacks: OnFloatCallbacks? = null, // 窗口宽度 - var width: Int = WindowManager.LayoutParams.WRAP_CONTENT, + var width: Int = WindowManager.LayoutParams.WRAP_CONTENT, // 窗口高度 - var height: Int = WindowManager.LayoutParams.WRAP_CONTENT + var height: Int = WindowManager.LayoutParams.WRAP_CONTENT ) { var isEnqueue: Boolean = false var isOverride: Boolean = true diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt index 675ed6ddda..d382563d0f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/anim/DefaultAnimator.kt @@ -5,7 +5,7 @@ import android.animation.ValueAnimator import android.graphics.Rect import android.view.View import android.view.WindowManager -import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern +import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator import com.mogo.eagle.core.utilcode.util.WindowUtils import kotlin.math.min @@ -32,11 +32,11 @@ open class DefaultAnimator : OnFloatAnimator { ): Animator? = getAnimator(view, params, windowManager, sidePattern, true) private fun getAnimator( - view: View, - params: WindowManager.LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern, - isExit: Boolean + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern, + isExit: Boolean ): Animator { val triple = initValue(view, params, windowManager, sidePattern) // 退出动画的起始值、终点值,与入场动画相反 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/interfaces/OnFloatAnimator.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/interfaces/OnFloatAnimator.kt index 4568229584..f3f5c43070 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/interfaces/OnFloatAnimator.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/interfaces/OnFloatAnimator.kt @@ -3,7 +3,7 @@ package com.mogo.eagle.core.function.hmi.notification.interfaces import android.animation.Animator import android.view.View import android.view.WindowManager -import com.mogo.eagle.core.function.hmi.notification.enums.SidePattern +import com.mogo.eagle.core.data.enums.SidePattern /** * @author: donghongyu 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 42819b6d13..fcb1237545 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 @@ -15,31 +15,34 @@ import com.mogo.eagle.core.data.autopilot.AdUpgradeStateHelper import com.mogo.eagle.core.data.camera.CameraEntity import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.constants.MoGoFragmentPaths -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI +import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy +import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity +import com.mogo.eagle.core.function.api.hmi.view.IViewNotification import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.function.call.check.CallerCheckManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.WaringConst 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.notification.enums.SidePattern 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 import com.mogo.eagle.core.function.hmi.ui.setting.DebugSettingView import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotAndCheckView import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.Utils @@ -56,8 +59,10 @@ import java.util.* */ @Route(path = MoGoFragmentPaths.PATH_FRAGMENT_HMI) class MoGoHmiFragment : MvpFragment(), - IMoGoWaringProvider, - MoGoWarningContract.View, IMoGoAutopilotIdentifyListener { + IMoGoWaringProvider, + IMoGoHmiViewProxy, + MoGoWarningContract.View, + IMoGoAutopilotIdentifyListener { private val TAG = "MoGoHmiFragment" // DebugSettingView @@ -83,8 +88,12 @@ class MoGoHmiFragment : MvpFragment private var upgradeTipsView: (() -> View)? = null // HMI 视图控件代理 - // 红绿灯View代理 - private var mViewTrafficLightVr: IViewTrafficLight? = null + // 红绿灯 View代理 + private var mViewTrafficLight: IViewTrafficLight? = null + // 限速 View代理 + private var mViewLimitingVelocity: IViewLimitingVelocity? = null + // V2X预警弹窗 View 代理 + private var mViewNotification: IViewNotification? = null override fun vipIdentification(visible: Boolean) { @@ -132,7 +141,10 @@ class MoGoHmiFragment : MvpFragment activity?.let { CarcorderPreviewView.show(it) } }, 1000)*/ + // 首次初始化使用默认视图 setProxyTrafficLightView(viewTrafficLightVr) + setProxyLimitingSpeedView(viewLimitingVelocity) + setProxyNotificationView(V2XNotificationView(view.context)) } @OptIn(ExperimentalCoroutinesApi::class) @@ -180,8 +192,16 @@ class MoGoHmiFragment : MvpFragment } } + override fun setProxyNotificationView(view: IViewNotification) { + mViewNotification = view + } + override fun setProxyTrafficLightView(view: IViewTrafficLight) { - mViewTrafficLightVr = view + mViewTrafficLight = view + } + + override fun setProxyLimitingSpeedView(view: IViewLimitingVelocity) { + mViewLimitingVelocity = view } private fun showToolsFloat() { @@ -279,23 +299,24 @@ class MoGoHmiFragment : MvpFragment setToolsViewVisibility(View.GONE) } + // 控制 BadCase 按钮展示 if (HmiBuildConfig.isShowBadCaseView) { CallerDevaToolsManager.initBadCase(vsBadCaseToolsView) } - // 控制 限速UI 展示 - if (HmiBuildConfig.isShowLimitingVelocityView) { - showLimitingVelocity(View.VISIBLE) - } else { - showLimitingVelocity(View.GONE) - } - // 控制 红绿灯 展示 if (HmiBuildConfig.isShowTrafficLightView) { setTrafficLightVrVisibility(View.VISIBLE) } else { setTrafficLightVrVisibility(View.GONE) } + + // 控制 远程摄像头图标 展示 + if (HmiBuildConfig.isShowCameraView) { + setCameraViewVisibility(View.VISIBLE) + } else { + setCameraViewVisibility(View.GONE) + } } override fun getLayoutId(): Int { @@ -315,7 +336,7 @@ class MoGoHmiFragment : MvpFragment } override fun setTrafficLightVrVisibility(visibility: Int) { - mViewTrafficLightVr?.visibility = visibility + mViewTrafficLight?.visibility = visibility } override fun setAutopilotStatusViewVisibility(visibility: Int) { @@ -330,6 +351,10 @@ class MoGoHmiFragment : MvpFragment ivToolsIcon?.visibility = visibility } + override fun setCameraViewVisibility(visibility: Int) { + ivCameraIcon?.visibility = visibility + } + /** * 开关DebugView */ @@ -399,63 +424,65 @@ class MoGoHmiFragment : MvpFragment val floatWindow = mWarningFloat val showTag = floatWindow?.config?.floatTag if (floatWindow == null || TextUtils.isEmpty(showTag) || !floatWindow.isShow() || floatWindow.config.floatTag != tag) { - val notificationView = V2XNotificationView(it) - notificationView.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType.toString())) - val warningContent = alertContent - ?: EventTypeEnum.getWarningContent(v2xType.toString()) - if (warningContent.isEmpty()) { - CallerLogger.e("$M_HMI$TAG", "Show warningContent is null or empty!") - return@launchWhenResumed - } else { - notificationView.setWarningContent(warningContent) - } - if (floatWindow != null && floatWindow.isShow()) { - WarningFloat.dismiss(floatWindow.config.floatTag, true) - } - mWarningFloat = WarningFloat.with(it) - .setTag(tag) - .setLayout(notificationView) - .setSidePattern(SidePattern.RESULT_TOP) - .setCountDownTime(expireTime) - .setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110) - .setImmersionStatusBar(true) - .isEnqueue(true) - .addWarningStatusListener(listenerIMoGo) - .addWarningStatusListener(object : IMoGoWarningStatusListener { - override fun onShow() { - // 创建弹窗成功才进行TTS播报 - CallerLogger.d( - "$M_HMI$TAG", - "mWarningFloat = $mWarningFloat---ttsContent = $ttsContent" - ) - if (mWarningFloat != null && !TextUtils.isEmpty(ttsContent) && playTts) { - CallerLogger.d("$M_HMI$TAG", "---> ttsContent = $ttsContent") - AIAssist.getInstance(activity) - .speakTTSVoice(ttsContent) - } - } - }) - .setAnimator(object : DefaultAnimator() { - override fun enterAnim( - view: View, - params: WindowManager.LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.enterAnim(view, params, windowManager, sidePattern)?.apply { - interpolator = OvershootInterpolator() - } + // 代理View初始化了才可以弹窗 + mViewNotification?.let { notificationView-> + notificationView.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType.toString())) + val warningContent = alertContent + ?: EventTypeEnum.getWarningContent(v2xType.toString()) + if (warningContent.isEmpty()) { + CallerLogger.e("$M_HMI$TAG", "Show warningContent is null or empty!") + return@launchWhenResumed + } else { + notificationView.setWarningContent(warningContent) + } + if (floatWindow != null && floatWindow.isShow()) { + WarningFloat.dismiss(floatWindow.config.floatTag, true) + } + mWarningFloat = WarningFloat.with(it) + .setTag(tag) + .setLayout(notificationView) + .setSidePattern(notificationView.sidePattern) + .setCountDownTime(expireTime) + .setGravity(notificationView.layoutGravity, offsetX = notificationView.offsetX, offsetY = notificationView.offsetY) + .setImmersionStatusBar(true) + .isEnqueue(true) + .addWarningStatusListener(listenerIMoGo) + .addWarningStatusListener(object : IMoGoWarningStatusListener { + override fun onShow() { + // 创建弹窗成功才进行TTS播报 + CallerLogger.d( + "$M_HMI$TAG", + "mWarningFloat = $mWarningFloat---ttsContent = $ttsContent" + ) + if (mWarningFloat != null && !TextUtils.isEmpty(ttsContent) && playTts) { + CallerLogger.d("$M_HMI$TAG", "---> ttsContent = $ttsContent") + AIAssist.getInstance(activity) + .speakTTSVoice(ttsContent) + } + } + }) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern)?.apply { + interpolator = OvershootInterpolator() + } - override fun exitAnim( - view: View, - params: WindowManager.LayoutParams, - windowManager: WindowManager, - sidePattern: SidePattern - ): Animator? = - super.exitAnim(view, params, windowManager, sidePattern) - ?.setDuration(200) - }) - .show() + override fun exitAnim( + view: View, + params: WindowManager.LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() + } } else { val notification = floatWindow.config.layoutView as? V2XNotificationView if (alertContent?.isNotEmpty() == true) { @@ -483,30 +510,30 @@ class MoGoHmiFragment : MvpFragment * @param checkLightId 0-都是默认不亮起,1-红,2-黄,3-绿 */ override fun showWarningTrafficLight(checkLightId: Int) { - mViewTrafficLightVr?.showWarningTrafficLight(checkLightId) + mViewTrafficLight?.showWarningTrafficLight(checkLightId) } override fun isWarningTrafficLightShow(): Boolean { - return mViewTrafficLightVr?.visibility == View.VISIBLE + return mViewTrafficLight?.visibility == View.VISIBLE } /** * 关闭红绿灯预警展示,并重制灯态 */ override fun disableWarningTrafficLight() { - mViewTrafficLightVr?.disableWarningTrafficLight() + mViewTrafficLight?.disableWarningTrafficLight() } override fun changeCountdownRed(redNum: Int) { - mViewTrafficLightVr?.changeCountdownRed(redNum) + mViewTrafficLight?.changeCountdownRed(redNum) } override fun changeCountdownYellow(yellowNum: Int) { - mViewTrafficLightVr?.changeCountdownYellow(yellowNum) + mViewTrafficLight?.changeCountdownYellow(yellowNum) } override fun changeCountdownGreen(greenNum: Int) { - mViewTrafficLightVr?.changeCountdownGreen(greenNum) + mViewTrafficLight?.changeCountdownGreen(greenNum) } /** @@ -515,19 +542,24 @@ class MoGoHmiFragment : MvpFragment * @param greenNum 绿灯倒计时 */ override fun changeCountdownTrafficLightNum(readNum: Int, yellowNum: Int, greenNum: Int) { - mViewTrafficLightVr?.changeCountdownTrafficLightNum(readNum, yellowNum, greenNum) + mViewTrafficLight?.changeCountdownTrafficLightNum(readNum, yellowNum, greenNum) } /** * 控制展示限速标志及内容 */ override fun showLimitingVelocity(limitingSpeed: Int) { - if (limitingSpeed > 0) { - tvLimitingVelocity?.visibility = View.VISIBLE - tvLimitingVelocity?.text = "$limitingSpeed" + // 控制 限速UI 展示 + if (HmiBuildConfig.isShowLimitingVelocityView) { + if (limitingSpeed > 0) { + mViewLimitingVelocity?.visibility = View.VISIBLE + mViewLimitingVelocity?.updateLimitingSpeed(limitingSpeed) + } else { + mViewLimitingVelocity?.visibility = View.INVISIBLE + mViewLimitingVelocity?.updateLimitingSpeed(0) + } } else { - tvLimitingVelocity?.visibility = View.INVISIBLE - tvLimitingVelocity?.text = "0" + disableLimitingVelocity() } } @@ -535,8 +567,8 @@ class MoGoHmiFragment : MvpFragment * 控制关闭限速标志及内容 */ override fun disableLimitingVelocity() { - tvLimitingVelocity?.visibility = View.GONE - tvLimitingVelocity?.text = "0" + mViewLimitingVelocity?.visibility = View.GONE + mViewLimitingVelocity?.updateLimitingSpeed(0) } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/carcorder/CarcorderPreviewView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/carcorder/CarcorderPreviewView.kt index cbd7938af3..5607bdd909 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/carcorder/CarcorderPreviewView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/carcorder/CarcorderPreviewView.kt @@ -15,7 +15,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.hmi.R 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.notification.enums.SidePattern +import com.mogo.eagle.core.data.enums.SidePattern import com.mogo.usbcamera.UVCCameraHelper import com.serenegiant.usb.ParentPreviewConstraintLayout import com.serenegiant.usb.widget.CameraViewInterface 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 4985482949..ce0d42f47a 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 @@ -27,6 +27,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerHDMapManager import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.map.CallerSmpManager import com.mogo.eagle.core.function.call.obu.CallerOBUManager import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager @@ -89,7 +90,7 @@ class DebugSettingView @JvmOverloads constructor( private var mRouteInfoSize = 0 private val mapUiController by lazy { - MogoApisHandler.getInstance().apis?.mapServiceApi?.mapUIController + CallerMapUIServiceManager.getMapUIController() } private var lastVisualAngleMode: VisualAngleMode? = null diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt new file mode 100644 index 0000000000..b1c509d6f2 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt @@ -0,0 +1,27 @@ +package com.mogo.eagle.core.function.hmi.ui.widget + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity +import com.mogo.eagle.core.function.hmi.R +import kotlinx.android.synthetic.main.view_limiting_speed_vr.view.* + +/** + * 限速控件 + */ +class LimitingVelocityView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : IViewLimitingVelocity(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.view_limiting_speed_vr, this, true) + } + + override fun updateLimitingSpeed(limitingSpeed: Int) { + super.updateLimitingSpeed(limitingSpeed) + tvLimitingVelocity.text = "$limitingSpeed" + } +} \ 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/widget/PerspectiveSwitchView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt index 187e4ba834..8b2d1bac06 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/PerspectiveSwitchView.kt @@ -7,6 +7,8 @@ import android.view.View import android.widget.FrameLayout import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.function.hmi.R +import com.mogo.map.MogoMapUIController +import com.mogo.map.MogoMarkerManager import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.module.common.MogoApisHandler import com.mogo.module.common.constants.DataTypes @@ -31,19 +33,16 @@ class PerspectiveSwitchView @JvmOverloads constructor( override fun onClick(v: View?) { //切换地图的远近视图 - if (MogoApisHandler.getInstance().apis.mapServiceApi.mapUIController.currentMapVisualAngle.isLongSight) { - MogoApisHandler.getInstance().apis.mapServiceApi.getMarkerManager(AbsMogoApplication.getApp()) + if (MogoMapUIController.getInstance().currentMapVisualAngle.isLongSight) { + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .visibleAllMarkers() - MogoApisHandler.getInstance().apis.mapServiceApi - .mapUIController.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) + MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null) textSwitch.setText(R.string.module_map_model_normal) - } else if (MogoApisHandler.getInstance().apis.mapServiceApi.mapUIController.currentMapVisualAngle.isMediumSight) { - MogoApisHandler.getInstance().apis.mapServiceApi.getMarkerManager(AbsMogoApplication.getApp()) + } else if (MogoMapUIController.getInstance().currentMapVisualAngle.isMediumSight) { + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) .inVisibleWithoutMarkers(DataTypes.TYPE_MARKER_ADAS) - MogoApisHandler.getInstance().apis.mapServiceApi - .mapUIController.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null) + MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null) textSwitch.setText(R.string.module_map_model_faster) } } - } \ 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/widget/SpeedPanelView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt index da9c059d33..59af18a473 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt @@ -11,6 +11,7 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.map.MogoMapUIController import com.mogo.map.navi.IMogoCarLocationChangedListener2 import com.mogo.service.IMogoServiceApis import java.util.* @@ -63,18 +64,13 @@ class SpeedPanelView @JvmOverloads constructor( private val timerTask = object : TimerTask() { override fun run() { if (mLatLng != null) { - if (mMogoServiceApis.mapServiceApi != null && mMogoServiceApis.mapServiceApi.mapUIController != null) { - mSpeedLimmit = mMogoServiceApis.mapServiceApi.mapUIController.getSpeedLimmit( - mLatLng!!.longitude, - mLatLng!!.latitude, - mLatLng!!.bearing - ) - UiThreadHandler.post { - val speed = (mLatLng!!.speed * 3.6f).toInt() - mSpeedChartView.setArcColor(Color.parseColor(if (speed > mSpeedLimmit) "#DB3137" else "#3E77F6")) - mSpeedChartView.setValues(speed) - setBackgroundResource(if (speed > mSpeedLimmit) R.drawable.yi_biao_pan_bg_speeding else R.drawable.yi_biao_pan_bg_nor) - } + mSpeedLimmit = MogoMapUIController.getInstance() + .getSpeedLimmit(mLatLng!!.longitude, mLatLng!!.latitude, mLatLng!!.bearing) + UiThreadHandler.post { + val speed = (mLatLng!!.speed * 3.6f).toInt() + mSpeedChartView.setArcColor(Color.parseColor(if (speed > mSpeedLimmit) "#DB3137" else "#3E77F6")) + mSpeedChartView.setValues(speed) + setBackgroundResource(if (speed > mSpeedLimmit) R.drawable.yi_biao_pan_bg_speeding else R.drawable.yi_biao_pan_bg_nor) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XNotificationView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XNotificationView.kt index fa3cc75639..7cb59295d2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XNotificationView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/V2XNotificationView.kt @@ -3,49 +3,58 @@ package com.mogo.eagle.core.function.hmi.ui.widget import android.content.Context import android.graphics.drawable.Drawable import android.util.AttributeSet +import android.view.Gravity import android.view.LayoutInflater import androidx.annotation.DrawableRes import androidx.annotation.Nullable import androidx.annotation.StringRes -import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.data.enums.SidePattern +import com.mogo.eagle.core.function.api.hmi.view.IViewNotification import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.notification_v2x_msg_vr.view.* /** + * 默认预警弹窗实现 *@author xiaoyuzhou *@date 2021/8/6 12:25 下午 */ class V2XNotificationView @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) { + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : IViewNotification(context, attrs, defStyleAttr) { init { LayoutInflater.from(context).inflate(R.layout.notification_v2x_msg_vr, this, true) + // 设置View的出场位置 + sidePattern = SidePattern.RESULT_TOP + layoutGravity = Gravity.CENTER_HORIZONTAL + // 设置View的停留位置 + offsetX = 0 + offsetY = 110 } - fun setWarningIcon(@DrawableRes warningIcon: Int) { + override fun setWarningIcon(@DrawableRes warningIcon: Int) { UiThreadHandler.post { ivWaringIcon.setImageResource(warningIcon) } } - fun setWarningIcon(@Nullable drawable: Drawable) { + override fun setWarningIcon(@Nullable drawable: Drawable) { UiThreadHandler.post { ivWaringIcon.setImageDrawable(drawable) } } - fun setWarningContent(@Nullable warningContent: CharSequence) { + override fun setWarningContent(@Nullable warningContent: CharSequence) { UiThreadHandler.post { tvWaringContent.text = warningContent } } - fun setWarningContent(@StringRes warningContentId: Int) { + override fun setWarningContent(@StringRes warningContentId: Int) { UiThreadHandler.post { tvWaringContent.setText(warningContentId) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 436fb26470..33fb48ffc0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -63,7 +63,7 @@ android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:visibility="gone" /> + tools:visibility="visible" /> @@ -135,8 +135,8 @@ app:layout_constraintTop_toTopOf="parent" tools:visibility="visible" /> - + android:visibility="visible"/> + android:visibility="visible"/> + android:visibility="visible"/> + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-main/build.gradle b/core/function-impl/mogo-core-function-main/build.gradle index 5a732f53a5..ece45dd1c2 100644 --- a/core/function-impl/mogo-core-function-main/build.gradle +++ b/core/function-impl/mogo-core-function-main/build.gradle @@ -70,7 +70,7 @@ dependencies { api rootProject.ext.dependencies.mogoserviceapi api rootProject.ext.dependencies.moduleservice api rootProject.ext.dependencies.mogoservice - api rootProject.ext.dependencies.mapcustom + api rootProject.ext.dependencies.mogomap api rootProject.ext.dependencies.crashreportupgrade // api rootProject.ext.dependencies.crashreportbugly @@ -96,7 +96,7 @@ dependencies { api project(':services:mogo-service') api project(':modules:mogo-module-service') - api project(':libraries:map-custom') + api project(':libraries:mogo-map') api project(':test:crashreport-upgrade') // api project(':test:crashreport-bugly') api project(':test:crashreport-apmbyte') diff --git a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/EventDispatchCenter.java b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/EventDispatchCenter.java index c4fe332a4d..22af3e7933 100644 --- a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/EventDispatchCenter.java +++ b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/EventDispatchCenter.java @@ -270,7 +270,6 @@ public class EventDispatchCenter implements } } } - CallerLogger.INSTANCE.i(M_MAIN +TAG, "onMapChanged event cost " + (System.currentTimeMillis() - start) + "ms"); } @Override diff --git a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index b410b7d63f..61c366b1d9 100644 --- a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -25,6 +25,7 @@ import com.mogo.commons.mvp.MvpFragment; import com.mogo.eagle.core.data.constants.MoGoFragmentPaths; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.main.cards.MogoModulesManager; import com.mogo.eagle.core.function.main.service.MogoMainService; import com.mogo.eagle.core.function.main.utils.DisplayEffectsHelper; @@ -34,9 +35,11 @@ import com.mogo.eagle.core.utilcode.mogo.permissions.PermissionsDialogUtils; import com.mogo.eagle.core.utilcode.mogo.toast.ResourcesHelper; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ProcessUtils; +import com.mogo.map.listener.IMogoHosListenerRegister; import com.mogo.map.listener.MogoMapListenerHandler; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.uicontroller.EnumMapUI; +import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.service.IMogoServiceApis; import com.mogo.service.adas.IMogoADASControlStatusChangedListener; @@ -104,14 +107,14 @@ public class MainActivity extends MvpActivity implement // if (CallChatApi.getInstance().getApiProvider() != null) { // CallChatApi.getInstance().getApiProvider().initVehicleTeamContainer("init", R.id.module_main_id_message_history_fragment_container, this); // } - //申请悬浮窗权限 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // 检查是否有悬浮窗权限 - if (Settings.canDrawOverlays(this)) { - return; - } - PermissionsDialogUtils.openAppDetails(this, "显示悬浮窗", REQUEST_CODE_DIALOG); - } +// //申请悬浮窗权限 +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// // 检查是否有悬浮窗权限 +// if (Settings.canDrawOverlays(this)) { +// return; +// } +// PermissionsDialogUtils.openAppDetails(this, "显示悬浮窗", REQUEST_CODE_DIALOG); +// } } // 隐藏布局 @@ -189,9 +192,10 @@ public class MainActivity extends MvpActivity implement MogoModulesManager.getInstance().init(this); - if (mServiceApis.getMapServiceApi() != null) { - mServiceApis.getMapServiceApi().getHostListenerRegister().registerHostMapListener(EventDispatchCenter.getInstance()); - mServiceApis.getMapServiceApi().getHostListenerRegister().registerMarkerClickListener(EventDispatchCenter.getInstance()); + IMogoHosListenerRegister listenerRegister = CallerMapUIServiceManager.INSTANCE.getHostListenerRegister(); + if (listenerRegister != null) { + listenerRegister.registerHostMapListener(EventDispatchCenter.getInstance()); + listenerRegister.registerMarkerClickListener(EventDispatchCenter.getInstance()); } initAdasControlStatusListener(); @@ -376,8 +380,11 @@ public class MainActivity extends MvpActivity implement @Override protected void onDestroy() { super.onDestroy(); - mServiceApis.getMapServiceApi().getHostListenerRegister().unregisterMarkerClickListener(); - mServiceApis.getMapServiceApi().getHostListenerRegister().unregisterHostMapListener(); + IMogoHosListenerRegister listenerRegister = CallerMapUIServiceManager.INSTANCE.getHostListenerRegister(); + if (listenerRegister != null) { + listenerRegister.unregisterMarkerClickListener(); + listenerRegister.unregisterHostMapListener(); + } mServiceApis.getRegisterCenterApi().unregisterADASControlStatusChangedListener(TAG); mMogoStatusManager.setMainPageLaunchedStatus(TAG, false); mMogoStatusManager.setMainPageIsBackgroundStatus(TAG, false); @@ -386,7 +393,8 @@ public class MainActivity extends MvpActivity implement mMogoFragmentManager.destroy(); mMogoFragmentManager = null; } - mServiceApis.getMapServiceApi().getMapUIController().destroy(); + IMogoMapUIController mapUIController = CallerMapUIServiceManager.INSTANCE.getMapUIController(); + if (mapUIController != null) mapUIController.destroy(); AdasConfigApiController.getInstance().release(); mServiceApis.getAdasControllerApi().release(); CallerLogger.INSTANCE.d(M_MAIN + TAG, "destroy."); diff --git a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index 7b3f6d6a64..639013b61c 100644 --- a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -22,11 +22,14 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.chat.biz.ChatConsts; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.notice.PushUIConstants; +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.ProcessUtils; import com.mogo.map.MapApiPath; +import com.mogo.map.location.IMogoLocationClient; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; @@ -185,11 +188,11 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { // clientConfig.setUseOriginSocket(true); clientConfig.setIHttpDnsCurrentLocation(() -> { - MogoLocation mogoLocation = - MogoApisHandler.getInstance() - .getApis().getMapServiceApi() - .getSingletonLocationClient(getApp()) - .getLastKnowLocation(); + MogoLocation mogoLocation = null; + IMogoLocationClient locationClient = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getApp()); + if (locationClient != null) { + mogoLocation = locationClient.getLastKnowLocation(); + } HttpDnsSimpleLocation httpDnsSimpleLocation; if (mogoLocation != null && mogoLocation.getLatitude() != 0 @@ -214,7 +217,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { e.printStackTrace(); httpDnsSimpleLocation = new HttpDnsSimpleLocation("010", 1, 1); } - CallerLogger.INSTANCE.d(M_MAIN+TAG, "使用缓存GPS信息:" + httpDnsSimpleLocation); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "使用缓存GPS信息:" + httpDnsSimpleLocation); } return httpDnsSimpleLocation; }); @@ -224,7 +227,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { new IMoGoTokenCallback() { @Override public void onTokenGot(String token, String sn) { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "onTokenGot "); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "onTokenGot "); // 异步初始化NetConfig asyncInit(); // HttpDns ttl回调 --- socketTTL @@ -235,7 +238,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { @Override public void onError(int code, String msg) { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "初始化MogoAiCloudSdk failed ,reason : " + msg + " , 未能开启长链服务和初始化Modules服务"); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "初始化MogoAiCloudSdk failed ,reason : " + msg + " , 未能开启长链服务和初始化Modules服务"); } } ); @@ -256,33 +259,36 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); apis.getLocationInfoApi().start(); - apis.getMapServiceApi().getSingletonLocationClient(getApplicationContext()).addLocationListener(location -> { - apis.getLocationInfoApi().provideLocation(location); - }); + IMogoLocationClient locationClient = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getApplicationContext()); + if (locationClient != null) { + locationClient.addLocationListener(location -> { + apis.getLocationInfoApi().provideLocation(location); + }); + } } } private void startSocketService() { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "startSocketService"); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "startSocketService"); IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); // 关闭长链服务 apis.getSocketManagerApi(getApplicationContext()).destroy(); apis.getSocketManagerApi(this).registerLifecycleListener(10020, new IMogoLifecycleListener() { @Override public void onConnectFailure() { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "socket-onConnectFailure"); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "socket-onConnectFailure"); DebugConfig.setDownloadSnapshot(false); } @Override public void onConnectSuccess() { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "socket-onConnectSuccess"); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "socket-onConnectSuccess"); DebugConfig.setDownloadSnapshot(true); } @Override public void onConnectLost() { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "socket-onConnectLost"); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "socket-onConnectLost"); DebugConfig.setDownloadSnapshot(false); } }); @@ -297,7 +303,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { } private void initModules() { - CallerLogger.INSTANCE.d(M_MAIN+TAG, "initModules"); + CallerLogger.INSTANCE.d(M_MAIN + TAG, "initModules"); //mogo deva tools MogoModulePaths.addModule(new MogoModule(MogoServicePaths.PATH_DEVA_TOOLS, "IMoGoDevaToolsProvider")); // 初始化 bugly 升级 @@ -328,21 +334,10 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { // 推送模块 MogoModulePaths.addModule(new MogoModule(PushUIConstants.PATH, "PUSH_UI")); - - /* - * 不同身份加载的特殊模块 - */ - switch (FunctionBuildConfig.appIdentityMode) { - // 司机身份专属模块 - case 0x00: - // 地图数据收集模块 - MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_MAP_DATA_COLLECT_PROVIDER, "MoGoMapDataCollector")); - break; - case 0x01: - - break; - default: - break; + // 司机身份专属模块 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // 地图数据收集模块 + MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_MAP_DATA_COLLECT_PROVIDER, "MoGoMapDataCollector")); } if (!DebugConfig.isLauncher()) { @@ -350,7 +345,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { .getInstance().initManager(this); } - CallerLogger.INSTANCE.i(M_MAIN+TAG, "App launch timer cost " + (System.currentTimeMillis() - start) + "ms"); + CallerLogger.INSTANCE.i(M_MAIN + TAG, "App launch timer cost " + (System.currentTimeMillis() - start) + "ms"); } @Override diff --git a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/delaycheck/DelayCheckUtil.java b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/delaycheck/DelayCheckUtil.java index ab6834db00..267df7b8f6 100644 --- a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/delaycheck/DelayCheckUtil.java +++ b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/delaycheck/DelayCheckUtil.java @@ -6,12 +6,15 @@ import android.os.Message; import android.os.SystemClock; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.network.RequestOptions; import com.mogo.eagle.core.network.SubscribeImpl; import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.map.location.IMogoLocationClient; import com.mogo.module.common.MogoApisHandler; import io.reactivex.schedulers.Schedulers; @@ -103,7 +106,11 @@ public class DelayCheckUtil implements Handler.Callback { } private void startUpload() { - MogoLocation lastLocation = MogoApisHandler.getInstance().getApis().getMapServiceApi().getSingletonLocationClient(context).getLastKnowLocation(); + IMogoLocationClient locationClient = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(AbsMogoApplication.getApp()); + MogoLocation lastLocation = null; + if (locationClient != null) { + lastLocation = locationClient.getLastKnowLocation(); + } if (lastLocation == null) { handler.sendEmptyMessageDelayed(MSG_START_DELAY_CHECK, DELAY_CHECK_DELAY); return; diff --git a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java index d80ef1a1bc..af38fd178b 100644 --- a/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java +++ b/core/function-impl/mogo-core-function-main/src/main/java/com/mogo/eagle/core/function/main/service/MogoMainService.java @@ -17,6 +17,7 @@ import com.mogo.eagle.core.function.main.EventDispatchCenter; import com.mogo.eagle.core.function.main.cards.MogoModulesManager; import com.mogo.eagle.core.function.main.delaycheck.DelayCheckUtil; import com.mogo.eagle.core.function.main.monitoring.VehicleMonitoring; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.location.IMogoLocationClient; import com.mogo.map.location.IMogoLocationListener; @@ -76,8 +77,8 @@ class MogoMainService extends Service implements IMogoLocationListener { private void initAndStartLocation() { CallerLogger.INSTANCE.d(M_MAIN + TAG, "开始定位"); - if (mServiceApis != null) { - mLocationClient = mServiceApis.getMapServiceApi().getSingletonLocationClient(AbsMogoApplication.getApp()); + mLocationClient = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(AbsMogoApplication.getApp()); + if (mLocationClient != null) { mLocationClient.addLocationListener(this); mLocationClient.start(2_000L); } diff --git a/core/function-impl/mogo-core-function-map/build.gradle b/core/function-impl/mogo-core-function-map/build.gradle index dc7953c680..bdc0e70839 100644 --- a/core/function-impl/mogo-core-function-map/build.gradle +++ b/core/function-impl/mogo-core-function-map/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation rootProject.ext.dependencies.mogomap implementation rootProject.ext.dependencies.mogomapapi + implementation rootProject.ext.dependencies.moduleservice } else { implementation project(':modules:mogo-module-common') implementation project(':services:mogo-service-api') @@ -81,6 +82,7 @@ dependencies { implementation project(":libraries:mogo-map") implementation project(":libraries:mogo-map-api") implementation project(':libraries:mogo-adas') + implementation project(':modules:mogo-module-service') } } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java similarity index 96% rename from services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java rename to core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java index 70f5860947..fe220da3be 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/map/MogoMapService.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java @@ -1,9 +1,10 @@ -package com.mogo.service.impl.map; +package com.mogo.eagle.core.function.impl; import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.eagle.core.data.constants.MogoServicePaths; +import com.mogo.eagle.core.function.api.map.IMogoMapService; import com.mogo.map.MogoGeoSearch; import com.mogo.map.MogoLocationClient; import com.mogo.map.MogoMap; @@ -22,7 +23,6 @@ import com.mogo.map.search.poisearch.IMogoPoiSearch; import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; import com.mogo.map.search.traffic.IMogoTrafficSearch; import com.mogo.map.uicontroller.IMogoMapUIController; -import com.mogo.service.map.IMogoMapService; /** * @author congtaowang diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/map/MoGoLocationUpdater4AutoPilot.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/map/MoGoLocationUpdater4AutoPilot.kt deleted file mode 100644 index 6f0ddd336d..0000000000 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/map/MoGoLocationUpdater4AutoPilot.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.mogo.eagle.core.function.impl.map - -import android.content.Context -import com.alibaba.android.arouter.facade.annotation.Route -import com.mogo.eagle.core.data.constants.MogoServicePaths -import com.mogo.eagle.core.function.api.map.location.IMoGoLocationUpdater4AutoPilot -import com.mogo.eagle.core.utilcode.util.Utils -import com.mogo.module.common.MogoApisHandler -import com.mogo.service.IMogoServiceApis - - -@Route(path = MogoServicePaths.PATH_MAP_LOCATION_UPDATE_4_AUTO_PILOT) -class MoGoLocationUpdater4AutoPilot: IMoGoLocationUpdater4AutoPilot { - - private val TAG = "MoGoLocationUpdater4AutoPilot" - - override val functionName = TAG; - - private val api: IMogoServiceApis? by lazy { - MogoApisHandler.getInstance().apis - } - - override fun updateLocation(location: Any?) { - api?.mapServiceApi?.getSingletonLocationClient(Utils.getApp())?.updateLocation(location); - } - - override fun init(context: Context?) { - //DO NOTING - } - - override fun onDestroy() { - //DO NOTHING - } -} \ No newline at end of file diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MogoMarkerServiceImpl.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/MogoMarkerServiceImpl.java similarity index 62% rename from modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MogoMarkerServiceImpl.java rename to core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/MogoMarkerServiceImpl.java index e06270ba39..baccec9c2c 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MogoMarkerServiceImpl.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/MogoMarkerServiceImpl.java @@ -1,16 +1,18 @@ -package com.mogo.module.service.marker; +package com.mogo.eagle.core.function.impl.marker; import android.content.Context; import androidx.annotation.Nullable; import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.eagle.core.data.constants.MogoServicePaths; +import com.mogo.eagle.core.function.api.map.marker.IMogoMarkerService; +import com.mogo.map.MogoMapUIController; import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.drawer.MarkerDrawer; import com.mogo.module.common.entity.MarkerShowEntity; -import com.mogo.module.service.MarkerServiceHandler; -import com.mogo.eagle.core.data.constants.MogoServicePaths; -import com.mogo.service.module.IMogoMarkerService; +import com.mogo.module.service.marker.MapMarkerManager; /** * @author congtaowang @@ -27,7 +29,7 @@ public class MogoMarkerServiceImpl implements IMogoMarkerService { @Override public IMogoMarker drawMarker( Object object ) { if ( object instanceof MarkerShowEntity ) { - return MarkerServiceHandler.getMapMarkerManager().drawMapMarker( ( ( MarkerShowEntity ) object ), MarkerDrawer.MARKER_Z_INDEX_HIGH ); + return MapMarkerManager.getInstance().drawMapMarker( ( ( MarkerShowEntity ) object ), MarkerDrawer.MARKER_Z_INDEX_HIGH ); } return null; } @@ -36,4 +38,9 @@ public class MogoMarkerServiceImpl implements IMogoMarkerService { public void init( Context context ) { } + + @Override + public IMogoMapUIController getMapUIController() { + return MogoMapUIController.getInstance(); + } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFragment.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFragment.java index e92b3ff768..5b3fba0e35 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFragment.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFragment.java @@ -9,14 +9,17 @@ import androidx.annotation.Nullable; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.commons.mvp.MvpFragment; import com.mogo.eagle.core.data.constants.MoGoFragmentPaths; +import com.mogo.eagle.core.data.constants.MogoServicePaths; +import com.mogo.eagle.core.function.api.map.IMogoMapFrameController; import com.mogo.eagle.core.function.api.map.hd.IMoGoMapFragmentProvider; +import com.mogo.eagle.core.function.call.base.CallerBase; import com.mogo.map.IMogoMap; import com.mogo.map.IMogoUiSettings; import com.mogo.map.MogoMapView; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoApisHandler; -import com.mogo.service.map.IMogoMapFrameController; +import com.mogo.service.IMogoServiceApis; /** * @author donghongyu @@ -48,7 +51,7 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > @Override protected void initViews() { - MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().initDelegate( this ); + CallerBase.getApiInstance(IMogoMapFrameController.class, MogoServicePaths.PATH_MAP_FRAME_CONTROLLER).initDelegate(this); } @Override @@ -173,7 +176,7 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > @Override public void destroy() { - MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().destroy(); + CallerBase.getApiInstance(IMogoMapFrameController.class, MogoServicePaths.PATH_MAP_FRAME_CONTROLLER).destroy(); } @Override diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFrameController.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFrameController.java index 9218ddbf0c..faddfe847f 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFrameController.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFrameController.java @@ -4,7 +4,7 @@ import android.content.Context; import com.alibaba.android.arouter.facade.annotation.Route; import com.mogo.eagle.core.data.constants.MogoServicePaths; -import com.mogo.service.map.IMogoMapFrameController; +import com.mogo.eagle.core.function.api.map.IMogoMapFrameController; public /** diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/live/CameraLiveNoticeHelper.java b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/live/CameraLiveNoticeHelper.java index fe3aff9eeb..d7bc443291 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/live/CameraLiveNoticeHelper.java +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/live/CameraLiveNoticeHelper.java @@ -9,6 +9,7 @@ import android.text.TextUtils; import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.commons.AbsMogoApplication; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.function.monitoring.R; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; @@ -77,7 +78,7 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.icon_space, null); options.icon(bitmap); - mMogoMarker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext) + mMogoMarker = CallerMapUIServiceManager.INSTANCE.getMarkerManager(mContext) .addMarker(PushDataType.TYPE_PUSH_CAMERA_DATA, options); if (mMogoMarker != null) { mMogoMarker.setInfoWindowAdapter(new CameraWindow3DAdapter(AbsMogoApplication.getApp(), options)); @@ -107,7 +108,7 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.module_camera_normal_traffic, null); options.icon(bitmap); - mMogoMarker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext) + mMogoMarker = CallerMapUIServiceManager.INSTANCE.getMarkerManager(mContext) .addMarker(PushDataType.TYPE_PUSH_CAMERA_DATA, options); if (mMogoMarker != null) { mMogoMarker.setOwner(PushDataType.TYPE_PUSH_CAMERA_DATA); diff --git a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt index 9655114b70..716ed288db 100644 --- a/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt +++ b/core/function-impl/mogo-core-function-monitoring/src/main/java/com/mogo/eagle/core/function/monitoring/CronTaskManager.kt @@ -10,6 +10,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.monitoring.net.CameraListServices +import com.mogo.map.MogoLocationClient import com.mogo.module.common.MogoApisHandler import com.mogo.module.common.constants.HostConst import io.reactivex.android.schedulers.AndroidSchedulers @@ -86,7 +87,7 @@ class CronTaskManager(private var context: Context?) { * 请求路口一定范围内的设备信息(包含:摄像头、灯) */ private fun requestDeviceList() { - MogoApisHandler.getInstance().apis.mapServiceApi.getSingletonLocationClient(context).lastKnowLocation?.let { location -> + MogoLocationClient.getInstance(context).lastKnowLocation?.let { location -> disposable = netWork.create(CameraListServices::class.java, HostConst.CITY_HOST) .getDeviceList(location.longitude, location.latitude, 500) .subscribeOn(Schedulers.io()) @@ -119,7 +120,7 @@ class CronTaskManager(private var context: Context?) { } private fun requestCarCameraList() { - MogoApisHandler.getInstance().apis.mapServiceApi.getSingletonLocationClient(context).lastKnowLocation?.let { location -> + MogoLocationClient.getInstance(context).lastKnowLocation?.let { location -> carDisposable = netWork.create(CameraListServices::class.java, HostConst.CITY_HOST) .getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude)) diff --git a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/repository/PushRepository.kt b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/repository/PushRepository.kt index 3c2a0a5fd4..d6f4422c8a 100644 --- a/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/repository/PushRepository.kt +++ b/core/function-impl/mogo-core-function-notice/src/main/java/com/mogo/eagle/core/function/notice/repository/PushRepository.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.notice.model.PushBean import com.mogo.eagle.core.function.notice.utils.HandlerUtils import com.mogo.eagle.core.function.notice.view.getApis import com.mogo.eagle.core.function.notice.viewmodel.PushViewModel +import com.mogo.map.MogoLocationClient import com.mogo.service.statusmanager.IMogoStatusChangedListener import com.mogo.service.statusmanager.StatusDescriptor import java.util.* @@ -48,7 +49,7 @@ class PushRepository(mContext: Context) { .pushBeanDao() } private val locationClient = - getApis(mContext).mapServiceApi.getSingletonLocationClient(appContext) + MogoLocationClient.getInstance(appContext) private val mHandler = Handler(Looper.getMainLooper()) diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt index 0094b65af8..fa8346c6cc 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt @@ -12,11 +12,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtils import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.map.MogoMapUIController import com.mogo.module.common.datacenter.SnapshotLocationDataCenter import com.mogo.module.common.drawer.TrafficMarkerDrawer import com.mogo.module.common.enums.EventTypeEnum import com.mogo.service.IMogoServiceApis -import com.mogo.service.map.IMogoMapService import com.zhidao.support.obu.MogoObuManager import com.zhidao.support.obu.OnMogoObuListener import com.zhidao.support.obu.constants.ObuConstants @@ -38,7 +38,6 @@ class MogoPrivateObuManager private constructor() { } private var mMogoServiceApis: IMogoServiceApis? = null - private var mIMogoMapService: IMogoMapService? = null private var mContext: Context? = null private var mObuStatusInfo = CallerObuListenerManager.getObuStatusInfo() @@ -47,8 +46,6 @@ class MogoPrivateObuManager private constructor() { mMogoServiceApis = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS) .navigation(context) as IMogoServiceApis mContext = context - mIMogoMapService = mMogoServiceApis!!.mapServiceApi - connectObu(context, ipAddress) MogoObuManager.getInstance().registerListener(mogoObuListener) } @@ -179,7 +176,7 @@ class MogoPrivateObuManager private constructor() { // 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU if (2 == FunctionBuildConfig.gpsProvider) { - mIMogoMapService?.mapUIController?.syncLocation2Map(data) + MogoMapUIController.getInstance().syncLocation2Map(data) SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo(data) } 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 ef208ac848..ee1b7f442c 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 @@ -21,6 +21,7 @@ import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.v2x.events.alarm.V2XAlarmServer import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.context @@ -341,7 +342,7 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb v2xPolyline.points = pointsOdl //CallerLogger.d("$M_V2X$TAG", "当前地图的缩放比例为:" + zoomLevel); - val zoomLevel: Float = BridgeApi.mapUiController()?.zoomLevel ?: 0.0f + val zoomLevel: Float = CallerMapUIServiceManager.getMapUIController()?.zoomLevel ?: 0.0f //CallerLogger.d("$M_V2X$TAG", "当前地图的缩放比例为:" + zoomLevel); if (zoomLevel > 0 && zoomLevel <= 17 && BridgeApi.v2xStatus()?.isRoadEventWindowShow == false) { // 缩放地图 val context: Context = context() diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/bridge/BridgeApi.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/bridge/BridgeApi.kt index 66adce5b28..d61979e468 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/bridge/BridgeApi.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/bridge/BridgeApi.kt @@ -7,7 +7,6 @@ import com.mogo.eagle.core.function.v2x.events.consts.MoGoV2XServicePaths import com.mogo.eagle.core.function.v2x.events.manager.* import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshModel import com.mogo.eagle.core.utilcode.util.Utils -import com.mogo.map.uicontroller.IMogoMapUIController import com.mogo.module.common.MogoApisHandler import com.mogo.service.statusmanager.IMogoStatusManager import java.lang.ref.WeakReference @@ -61,18 +60,10 @@ internal object BridgeApi { fun context(): Context = this.context.get()?.get() ?: Utils.getApp() - fun mapUiController(): IMogoMapUIController? = apis?.mapServiceApi?.mapUIController - - fun map() = apis?.mapServiceApi - fun statusManager(): IMogoStatusManager? = apis?.statusManagerApi fun analytics() = apis?.analyticsApi - fun overlay() = apis?.mapServiceApi?.getOverlayManager(context()) - - fun marker() = apis?.mapServiceApi?.getMarkerManager(context()) - fun v2xMarker() = v2xMarker fun v2xPolyline() = v2xPolyline @@ -98,8 +89,4 @@ internal object BridgeApi { fun intentManager() = apis?.intentManagerApi fun actionManager() = apis?.actionManagerApi - - fun locationClient() = apis?.mapServiceApi?.getSingletonLocationClient(context()) - - fun markerService() = apis?.markerService } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java index a3777a8b5a..74bd1d5fa7 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.v2x.events.consts.MoGoV2XServicePaths; import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; import com.mogo.eagle.core.function.v2x.events.entity.model.DrawLineInfo; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoPersonWarnPolylineManager; +import com.mogo.map.MogoOverlayManager; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; @@ -54,7 +55,7 @@ public class MoGoPersonWarnPolylineManager implements IMoGoPersonWarnPolylineMan options.add(locations.get(i)); } // 绘制线的对象 - IMogoOverlayManager overlay = BridgeApi.INSTANCE.overlay(); + IMogoOverlayManager overlay = MogoOverlayManager.getInstance(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); mMogoPolyline.setTransparency(0.5f); diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java index 24eab422f9..645b3bba52 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.v2x.events.consts.MoGoV2XServicePaths; import com.mogo.eagle.core.function.v2x.events.consts.V2XConst; import com.mogo.eagle.core.function.v2x.events.entity.model.DrawLineInfo; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoStopPolylineManager; +import com.mogo.map.MogoOverlayManager; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; @@ -53,7 +54,7 @@ public class MoGoStopPolylineManager implements IMoGoStopPolylineManager { options.add(locations.get(i)); } // 绘制线的对象 - IMogoOverlayManager overlay = BridgeApi.INSTANCE.overlay(); + IMogoOverlayManager overlay = MogoOverlayManager.getInstance(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java index f77a17417a..2ee97d01b6 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java @@ -7,6 +7,7 @@ import android.content.Context; import android.graphics.Bitmap; import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -21,6 +22,8 @@ import com.mogo.eagle.core.function.v2x.events.marker.V2XMarkerAdapter; import com.mogo.eagle.core.function.v2x.events.utils.EntityUtilsKt; import com.mogo.eagle.core.function.v2x.events.utils.MapUtils; import com.mogo.eagle.core.utilcode.util.ViewUtils; +import com.mogo.map.MogoMapUIController; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.IMogoMarkerManager; @@ -74,7 +77,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager { } clearAlarmPOI(); // 锁车 - IMogoMapUIController mapUiController = BridgeApi.INSTANCE.mapUiController(); + IMogoMapUIController mapUiController = MogoMapUIController.getInstance(); if (mapUiController != null) { mapUiController.recoverLockMode(); } @@ -231,7 +234,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager { @Override public void drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener) { try { - IMogoMapUIController mapUiController = BridgeApi.INSTANCE.mapUiController(); + IMogoMapUIController mapUiController = MogoMapUIController.getInstance(); if (mapUiController != null) { mapUiController.changeMapMode(EnumMapUI.NorthUP_2D); } @@ -273,7 +276,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager { mAlarmInfoMarker = MarkerDrawer.getInstance().drawMapMarkerImpl(markerShowEntity, MarkerDrawer.MARKER_Z_INDEX_HIGH, clickListener); } else { optionsRipple.icon(V2XMarkerAdapter.getV2XRoadEventViewPng(context, roadEventEntity)); - IMogoMarkerManager marker = BridgeApi.INSTANCE.marker(); + IMogoMarkerManager marker = MogoMarkerManager.getInstance(context); if (marker != null) { mAlarmInfoMarker = marker.addMarker(V2X_EVENT_ALARM_POI, optionsRipple); } @@ -319,7 +322,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager { @Override public void clearALLPOI() { try { - IMogoMarkerManager markerManager = BridgeApi.INSTANCE.marker(); + IMogoMarkerManager markerManager = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()); if (markerManager != null) { markerManager.removeMarkers(); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XPolylineManager.java index 88e6536cb2..21badb6fae 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XPolylineManager.java @@ -9,6 +9,7 @@ import com.mogo.eagle.core.function.v2x.events.consts.MoGoV2XServicePaths; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XPolylineManager; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XStatusManager; import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager; +import com.mogo.map.MogoOverlayManager; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; @@ -90,7 +91,7 @@ public class MoGoV2XPolylineManager implements IMoGoV2XPolylineManager { options.add(V2XStatusManager.getInstance().getTargetMoGoLatLng()); // 绘制线的对象 - IMogoOverlayManager overlay = BridgeApi.INSTANCE.overlay(); + IMogoOverlayManager overlay = MogoOverlayManager.getInstance(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java index 14a46f253f..d3e3cf2c1c 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java @@ -11,6 +11,7 @@ import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; import com.mogo.eagle.core.function.v2x.events.consts.MoGoV2XServicePaths; import com.mogo.eagle.core.function.v2x.events.entity.model.DrawLineInfo; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoWarnPolylineManager; +import com.mogo.map.MogoOverlayManager; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; @@ -61,7 +62,7 @@ public class MoGoWarnPolylineManager implements IMoGoWarnPolylineManager { } // 绘制线的对象 - IMogoOverlayManager overlay = BridgeApi.INSTANCE.overlay(); + IMogoOverlayManager overlay = MogoOverlayManager.getInstance(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/overlay/V2XOptimalRouteOverlay.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/overlay/V2XOptimalRouteOverlay.java index 8d072eefcd..6bf879689e 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/overlay/V2XOptimalRouteOverlay.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/overlay/V2XOptimalRouteOverlay.java @@ -5,6 +5,7 @@ import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; import com.mogo.eagle.core.function.v2x.events.utils.LocationUtils; import com.mogo.eagle.core.utilcode.util.ColorUtils; +import com.mogo.map.MogoOverlayManager; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; @@ -65,7 +66,7 @@ public class V2XOptimalRouteOverlay { // 线条粗细,渐变,渐变色值 mPolylineOptions.width(25).useGradient(true).colorValues(mPolylineColors); // 绘制线 - IMogoOverlayManager overlay = BridgeApi.INSTANCE.overlay(); + IMogoOverlayManager overlay = MogoOverlayManager.getInstance(); if (overlay != null) { mMoGoPolyline = overlay.addPolyline(mPolylineOptions); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java index d25c08774a..73dbe92c0b 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java @@ -16,6 +16,7 @@ import com.mogo.eagle.core.function.v2x.events.scenario.scene.warning.V2XFrontWa import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.ThreadUtils; import com.mogo.eagle.core.utilcode.util.Utils; +import com.mogo.map.MogoMapUIController; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.module.common.entity.V2XMessageEntity; @@ -105,7 +106,7 @@ public class V2XScenarioManager implements IV2XScenarioManager { * 道路事件触发后,切换到中景 */ private void sceneChange() { - IMogoMapUIController mapUiController = BridgeApi.INSTANCE.mapUiController(); + IMogoMapUIController mapUiController = MogoMapUIController.getInstance(); if (mapUiController != null && mapUiController.getCurrentMapVisualAngle() != VisualAngleMode.MODE_MEDIUM_SIGHT) { mapUiController.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java index 8cec39cc26..9829db825e 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java @@ -4,6 +4,7 @@ import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XMarkerManager; import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XPolylineManager; import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker; +import com.mogo.map.MogoMapUIController; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.entity.V2XRoadEventEntity; @@ -31,7 +32,7 @@ public class V2XRoadEventMarker implements IV2XMarker { @Override public void clearPOI() { // 锁车就是将地图视图移植中心点,因为行驶中的车和地图要相对的跟随 - IMogoMapUIController mapUiController = BridgeApi.INSTANCE.mapUiController(); + IMogoMapUIController mapUiController = MogoMapUIController.getInstance(); if (mapUiController != null) { mapUiController.loseLockMode(); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java index b945baeda5..6a830f02ea 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java @@ -8,6 +8,7 @@ import com.mogo.eagle.core.function.v2x.events.entity.net.V2XOptimalRouteDataRes import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XMarkerManager; import com.mogo.eagle.core.function.v2x.events.observer.V2XOptimalRouteObserver; import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker; +import com.mogo.map.MogoMapUIController; import com.mogo.map.uicontroller.IMogoMapUIController; /** @@ -41,7 +42,7 @@ public class V2XOptimalRouteVREventMarker implements IV2XMarker - val tileId = MogoApisHandler.getInstance().apis - .mapServiceApi.mapUIController.getTileId(it.longitude, it.latitude) + val tileId = CallerMapUIServiceManager.getMapUIController()?.getTileId(it.longitude, it.latitude) ?: 0 trafficLightNetWorkModel.requestRoadID( tileId, it.latitude, it.longitude, it.bearing.toDouble(), { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt index e143629724..373f73bad2 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/vip/VipCarManager.kt @@ -5,6 +5,7 @@ import android.location.Location import android.os.Handler import android.os.Looper import android.os.Message +import androidx.core.content.contentValuesOf import com.mogo.cloud.commons.utils.CoordinateUtils import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X import com.mogo.eagle.core.data.trafficlight.* @@ -13,6 +14,7 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.trafficlight.CallTrafficLightListenerManager import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager import com.mogo.eagle.core.function.v2x.trafficlight.core.MogoTrafficLightManager @@ -130,16 +132,24 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe //如果上次结果和本次灯态结果变化比较大,则已变灯,控制HMI展示弹窗 if (abs(currentResult!!.remain - it.remain) > 5 && currentResult.isGreen()) { CallerLogger.d("$M_V2X$TAG", "调用showWarningV2X to show") - CallerHmiManager.showWarningV2X(EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType.toInt(), EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, object : IMoGoWarningStatusListener { - override fun onShow() {} - override fun onDismiss() { - CallerLogger.d( - "$M_V2X$TAG", - "showWarningV2X vip dismiss , resetConditions" - ) - resetConditions() - } - }, true, 5000L) + CallerHmiManager.showWarningV2X( + EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType.toInt(), + EventTypeEnum.TYPE_VIP_IDENTIFICATION.content, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts, + EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType, + object : IMoGoWarningStatusListener { + override fun onShow() {} + override fun onDismiss() { + CallerLogger.d( + "$M_V2X$TAG", + "showWarningV2X vip dismiss , resetConditions" + ) + resetConditions() + } + }, + true, + 5000L + ) } } @@ -234,12 +244,14 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } private fun turnLight(controlTime: Int) { - result?.let { - val bearing = - MogoApisHandler.getInstance().apis.mapServiceApi.getSingletonLocationClient(mContext).lastKnowLocation.bearing.toDouble() + if (result == null || mContext == null) return + val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!) + if (locationClient != null) { + var bearing = + locationClient.lastKnowLocation.bearing.toDouble() CallerLogger.d("$M_V2X$TAG", "turnLight -- bearing : $bearing") MogoTrafficLightManager.INSTANCE.turnLightToGreen( - it.lightId, it.crossId, bearing, controlTime, + result!!.lightId, result!!.crossId, bearing, controlTime, { CallerLogger.d("$M_V2X$TAG", "变灯请求成功") }, diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt index c9cd9c2008..72dd593cc0 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt @@ -65,4 +65,10 @@ object HmiBuildConfig { */ @JvmField var isShowTrafficLightView = false + + /** + * 是否显示摄像头图标 + */ + @JvmField + var isShowCameraView = true } \ 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/notification/enums/ShowPattern.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/ShowPattern.kt similarity index 83% rename from core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/enums/ShowPattern.kt rename to core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/ShowPattern.kt index e9f0a88ccd..8f2c45b8d1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/enums/ShowPattern.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/ShowPattern.kt @@ -1,4 +1,4 @@ -package com.mogo.eagle.core.function.hmi.notification.enums +package com.mogo.eagle.core.data.enums /** * @author: donghongyu diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/enums/SidePattern.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/SidePattern.kt similarity index 91% rename from core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/enums/SidePattern.kt rename to core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/SidePattern.kt index 49dcdf5bbf..90aee12dda 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/enums/SidePattern.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/SidePattern.kt @@ -1,4 +1,4 @@ -package com.mogo.eagle.core.function.hmi.notification.enums +package com.mogo.eagle.core.data.enums /** * @author: donghongyu diff --git a/core/mogo-core-function-api/build.gradle b/core/mogo-core-function-api/build.gradle index 56faa70676..d0b7e2c76b 100644 --- a/core/mogo-core-function-api/build.gradle +++ b/core/mogo-core-function-api/build.gradle @@ -51,9 +51,11 @@ dependencies { if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_data compileOnly rootProject.ext.dependencies.adasHigh + compileOnly rootProject.ext.dependencies.mogomapapi } else { implementation project(':core:mogo-core-data') compileOnly project(':libraries:mogo-adas') + compileOnly project(':libraries:mogo-map-api') } } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/IMoGoHmiViewProxy.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/IMoGoHmiViewProxy.kt new file mode 100644 index 0000000000..f07cdfe6df --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/IMoGoHmiViewProxy.kt @@ -0,0 +1,30 @@ +package com.mogo.eagle.core.function.api.hmi + +import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity +import com.mogo.eagle.core.function.api.hmi.view.IViewNotification +import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight + +/** + * 设置HMI中控件代理接口 + */ +interface IMoGoHmiViewProxy { + + + /** + * 设置 V2X预警 代理View + * @param view + */ + fun setProxyNotificationView(view: IViewNotification) + + /** + * 设置 红绿灯 代理View + * @param view + */ + fun setProxyTrafficLightView(view: IViewTrafficLight) + + /** + * 设置 限速 代理View + * @param view + */ + fun setProxyLimitingSpeedView(view: IViewLimitingVelocity) +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt new file mode 100644 index 0000000000..aef782d2d6 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.function.api.hmi.view + +import android.content.Context +import android.util.AttributeSet +import android.widget.LinearLayout + +/** + * 定义限速View具备的接口 + */ +abstract class IViewLimitingVelocity(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : + LinearLayout(context, attrs, defStyleAttr) { + + /** + * 更新限速数据 + * @param limitingSpeed 限速值,单位:km/h + */ + open fun updateLimitingSpeed(limitingSpeed: Int) {} +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewNotification.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewNotification.kt new file mode 100644 index 0000000000..9c9e1ff864 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewNotification.kt @@ -0,0 +1,58 @@ +package com.mogo.eagle.core.function.api.hmi.view + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.Gravity +import android.widget.LinearLayout +import androidx.annotation.DrawableRes +import androidx.annotation.IntDef +import androidx.annotation.Nullable +import androidx.annotation.StringRes +import com.mogo.eagle.core.data.enums.SidePattern + +/** + * 定义 通知视图 接口 + */ +abstract class IViewNotification(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : + LinearLayout(context, attrs, defStyleAttr) { + + @kotlin.annotation.Retention(AnnotationRetention.SOURCE) + @IntDef(*[ + Gravity.LEFT, Gravity.RIGHT, + Gravity.TOP, Gravity.BOTTOM, + Gravity.START, Gravity.END, + Gravity.CENTER_HORIZONTAL, Gravity.CENTER_VERTICAL, + Gravity.FILL_HORIZONTAL, Gravity.FILL_VERTICAL, + ]) + annotation class GravityFlag + + /** + * 视图布局 + */ + @GravityFlag + open var layoutGravity: Int = Gravity.CENTER_HORIZONTAL + + /** + * 视图动画的出场方式 + */ + open var sidePattern: SidePattern = SidePattern.RESULT_TOP + + /** + * 距离屏幕左上角 0,0点 X 轴距离,单位:px + */ + open var offsetX: Int = 0 + + /** + * 距离屏幕左上角 0,0点 Y 轴距离,单位:px + */ + open var offsetY: Int = 0 + + open fun setWarningIcon(@DrawableRes warningIcon: Int) {} + + open fun setWarningIcon(@Nullable drawable: Drawable) {} + + open fun setWarningContent(@Nullable warningContent: CharSequence) {} + + open fun setWarningContent(@StringRes warningContentId: Int) {} +} \ No newline at end of file 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 0fcc25b4ef..b2166aae87 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 @@ -4,13 +4,13 @@ import android.view.View import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData -import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight +import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy /** * @author xiaoyuzhou * @date 2021/8/2 7:36 下午 */ -interface IMoGoWaringProvider { +interface IMoGoWaringProvider : IMoGoHmiViewProxy { /** * 隐藏 脉速表 @@ -42,6 +42,8 @@ interface IMoGoWaringProvider { */ fun setToolsViewVisibility(visibility: Int) + fun setCameraViewVisibility(visibility: Int) + /** * 控制转向灯 */ @@ -213,9 +215,4 @@ interface IMoGoWaringProvider { fun showBadCaseFloat(tag: String = "BadCaseFloat", floatView: View): () -> Unit - /** - * 设置红绿灯代理View - * @param view - */ - fun setProxyTrafficLightView(view: IViewTrafficLight) } \ No newline at end of file diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapFrameController.java similarity index 91% rename from services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java rename to core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapFrameController.java index 696221d40a..dd8a647202 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapFrameController.java @@ -1,4 +1,4 @@ -package com.mogo.service.map; +package com.mogo.eagle.core.function.api.map; import com.alibaba.android.arouter.facade.template.IProvider; import com.mogo.map.IDestroyable; diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java similarity index 97% rename from services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java rename to core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java index 6de195dc40..90b86a1810 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapService.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java @@ -1,4 +1,4 @@ -package com.mogo.service.map; +package com.mogo.eagle.core.function.api.map; import android.content.Context; diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/location/IMoGoLocationUpdater4AutoPilot.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/location/IMoGoLocationUpdater4AutoPilot.kt deleted file mode 100644 index 6e5e77deb1..0000000000 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/location/IMoGoLocationUpdater4AutoPilot.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.mogo.eagle.core.function.api.map.location - -import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider - -/** - * @author renwj - * @date 2021/11/04 16:10 下午 - * 此类主要用来同步自动驾驶定位信息给各业务方 - */ -interface IMoGoLocationUpdater4AutoPilot : IMoGoFunctionServerProvider { - - fun updateLocation(location: Any?) -} \ No newline at end of file diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoMarkerService.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/marker/IMogoMarkerService.java similarity index 73% rename from services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoMarkerService.java rename to core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/marker/IMogoMarkerService.java index 8493cba40c..7bfe77bd25 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/module/IMogoMarkerService.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/marker/IMogoMarkerService.java @@ -1,9 +1,10 @@ -package com.mogo.service.module; +package com.mogo.eagle.core.function.api.map.marker; import androidx.annotation.Nullable; import com.alibaba.android.arouter.facade.template.IProvider; import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.uicontroller.IMogoMapUIController; /** * @author congtaowang @@ -19,4 +20,6 @@ public interface IMogoMarkerService extends IProvider { */ @Nullable IMogoMarker drawMarker( Object object ); + + IMogoMapUIController getMapUIController(); } 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 2104ebd2b2..f17a73c9cd 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 @@ -6,6 +6,8 @@ import com.mogo.eagle.core.data.constants.MoGoFragmentPaths import com.mogo.eagle.core.data.enums.WarningDirectionEnum import com.mogo.eagle.core.data.notice.NoticeNormalData import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData +import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity +import com.mogo.eagle.core.function.api.hmi.view.IViewNotification import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener @@ -54,6 +56,10 @@ object CallerHmiManager : CallerBase() { waringProviderApi?.setToolsViewVisibility(visibility) } + fun setCameraViewVisibility(visibility: Int) { + waringProviderApi?.setCameraViewVisibility(visibility) + } + /** * 控制转向灯功能 */ @@ -289,13 +295,28 @@ object CallerHmiManager : CallerBase() { return waringProviderApi?.showBadCaseFloat(tag, floatView) } - /** - * 设置红绿灯代理View + * 设置 红绿灯 代理View * @param view */ fun setProxyTrafficLightView(view: IViewTrafficLight) { waringProviderApi?.setProxyTrafficLightView(view) } + /** + * 设置 限速 代理View + * @param view + */ + fun setProxyLimitingSpeedView(view: IViewLimitingVelocity) { + waringProviderApi?.setProxyLimitingSpeedView(view) + } + + /** + * 设置 V2X弹窗预警 代理View + * @param view + */ + fun setProxyNotificationView(view: IViewNotification) { + waringProviderApi?.setProxyNotificationView(view) + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerLocationUpdaterManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerLocationUpdaterManager.kt deleted file mode 100644 index 2532c984c2..0000000000 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerLocationUpdaterManager.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.mogo.eagle.core.function.call.map - -import com.mogo.eagle.core.data.constants.MogoServicePaths -import com.mogo.eagle.core.function.api.map.location.IMoGoLocationUpdater4AutoPilot -import com.mogo.eagle.core.function.call.base.CallerBase - -object CallerLocationUpdaterManager { - - private val updater : IMoGoLocationUpdater4AutoPilot? by lazy { - CallerBase.getApiInstance( - IMoGoLocationUpdater4AutoPilot::class.java, - MogoServicePaths.PATH_MAP_LOCATION_UPDATE_4_AUTO_PILOT) - } - - fun updateLocation(location: Any?) { - updater?.updateLocation(location); - } -} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt new file mode 100644 index 0000000000..bab7121e86 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt @@ -0,0 +1,39 @@ +package com.mogo.eagle.core.function.call.map + +import android.content.Context +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.map.IMogoMapService +import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.map.listener.IMogoHosListenerRegister +import com.mogo.map.location.IMogoLocationClient +import com.mogo.map.marker.IMogoMarkerManager +import com.mogo.map.search.geo.IMogoGeoSearch +import com.mogo.map.uicontroller.IMogoMapUIController + +object CallerMapUIServiceManager { + private val serviceProvider : IMogoMapService? by lazy { + CallerBase.getApiInstance( + IMogoMapService::class.java, + MogoServicePaths.PATH_SERVICES_MAP) + } + + fun getMapUIController(): IMogoMapUIController? { + return serviceProvider?.mapUIController + } + + fun getHostListenerRegister(): IMogoHosListenerRegister? { + return serviceProvider?.hostListenerRegister + } + + fun getSingletonLocationClient(context: Context): IMogoLocationClient? { + return serviceProvider?.getSingletonLocationClient(context) + } + + fun getGeoSearch(context: Context): IMogoGeoSearch? { + return serviceProvider?.getGeoSearch(context) + } + + fun getMarkerManager(context: Context): IMogoMarkerManager? { + return serviceProvider?.getMarkerManager(context) + } +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/CallerLogger.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/CallerLogger.kt index 7bd90bf05e..fc76cc6b6b 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/CallerLogger.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/CallerLogger.kt @@ -4,27 +4,27 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.Scene.Companion.scene object CallerLogger { - fun i(tag: String, message: Any? = null) { + fun i(tag: String, message: Any? = null, vararg args: Any?) { if (scene.check(tag)) { - Logger.i(tag, message.toString(), null) + Logger.i(tag, message.toString(), *args) } } - fun d(tag: String, message: Any? = null) { + fun d(tag: String, message: Any? = null, vararg args: Any?) { if (scene.check(tag)) { - Logger.d(tag, message.toString(), null) + Logger.d(tag, message.toString(), *args) } } - fun w(tag: String, message: Any? = null) { + fun w(tag: String, message: Any? = null, vararg args: Any?) { if (scene.check(tag)) { - Logger.w(tag, message.toString(), null) + Logger.w(tag, message.toString(), *args) } } - fun e(tag: String, message: Any? = null) { + fun e(tag: String, message: Any? = null, vararg args: Any?) { if (scene.check(tag)) { - Logger.e(tag, message.toString(), null) + Logger.e(tag, message.toString(), *args) } } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/Logger.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/Logger.java index dabc026b82..dd2ada2507 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/Logger.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/Logger.java @@ -15,43 +15,44 @@ public final class Logger { return sPrinter.init(logLevel); } - public static void d( String tag, String message, Object... args) { - if(isLoggable(LogLevel.DEBUG)) sPrinter.d(tag, message, args); + + public static void d(String tag, String message, Object... args) { + if (isLoggable(LogLevel.DEBUG)) sPrinter.d(tag, message, args); } - public static void e( String tag, String message, Object... args) { - if(isLoggable(LogLevel.ERROR)) sPrinter.e(tag, null, message, args); + public static void e(String tag, String message, Object... args) { + if (isLoggable(LogLevel.ERROR)) sPrinter.e(tag, null, message, args); } - public static void e( String tag, Throwable throwable, String message, Object... args) { - if(isLoggable(LogLevel.ERROR)) sPrinter.e(tag, throwable, message, args); + public static void e(String tag, Throwable throwable, String message, Object... args) { + if (isLoggable(LogLevel.ERROR)) sPrinter.e(tag, throwable, message, args); } - public static void i( String tag, String message, Object... args) { - if(isLoggable(LogLevel.INFO)) sPrinter.i(tag, message, args); + public static void i(String tag, String message, Object... args) { + if (isLoggable(LogLevel.INFO)) sPrinter.i(tag, message, args); } - public static void v( String tag, String message, Object... args) { - if(isLoggable(LogLevel.VERBOSE)) sPrinter.v(tag, message, args); + public static void v(String tag, String message, Object... args) { + if (isLoggable(LogLevel.VERBOSE)) sPrinter.v(tag, message, args); } - public static void w( String tag, String message, Object... args) { - if(isLoggable(LogLevel.WARN)) sPrinter.w(tag, message, args); + public static void w(String tag, String message, Object... args) { + if (isLoggable(LogLevel.WARN)) sPrinter.w(tag, message, args); } - public static void easyLog( String tag, String message) { - if(isLoggable(LogLevel.DEBUG)) sPrinter.d(tag, message); + public static void easyLog(String tag, String message) { + if (isLoggable(LogLevel.DEBUG)) sPrinter.d(tag, message); } - public static void json( String tag, String json) { - if(isLoggable(LogLevel.DEBUG)) sPrinter.json(tag, json); + public static void json(String tag, String json) { + if (isLoggable(LogLevel.DEBUG)) sPrinter.json(tag, json); } - public static void xml( String tag, String xml) { - if(isLoggable(LogLevel.DEBUG)) sPrinter.xml(tag, xml); + public static void xml(String tag, String xml) { + if (isLoggable(LogLevel.DEBUG)) sPrinter.xml(tag, xml); } - private static boolean isLoggable(LogLevel logLevel){ + private static boolean isLoggable(LogLevel logLevel) { return sPrinter.getSettings().getLogLevel().level <= logLevel.level; } } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt index 3a9081b1ce..5cab1a506f 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/logger/scene/Scene.kt @@ -44,8 +44,6 @@ class Scene { val otherMap = SceneLogCache(mutableMapOf(), true) sceneCache[M_OTHER] = otherMap - //todo 1. SceneLogCache增加模块名称,提供场景需要 - //todo 2. 对特定场景提供数据, 网约车,调度... } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java index 82b3414c46..84b1791d05 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ToastUtils.java @@ -522,9 +522,9 @@ public final class ToastUtils { return new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_TOAST); } else if (UtilsBridge.isGrantedDrawOverlays()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - return new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); + return new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_APPLICATION_PANEL); } else { - return new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_PHONE); + return new WindowManagerToast(toastUtils, WindowManager.LayoutParams.TYPE_TOAST); } } return new ActivityToast(toastUtils); diff --git a/gradle.properties b/gradle.properties index ef71ef8108..0425450858 100644 --- a/gradle.properties +++ b/gradle.properties @@ -82,7 +82,7 @@ MOGO_LOCATION_VERSION=1.3.31 MOGO_TELEMATIC_VERSION=1.3.31 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=2.0.5.3 +MAP_SDK_VERSION=2.0.5.7 MAP_SDK_OPERATION_VERSION=1.0.12 # websocket WEBSOCKET_VERSION=1.1.7 diff --git a/libraries/mogo-map/build.gradle b/libraries/mogo-map/build.gradle index bf618818ac..4003766372 100644 --- a/libraries/mogo-map/build.gradle +++ b/libraries/mogo-map/build.gradle @@ -33,6 +33,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } } dependencies { @@ -41,20 +46,21 @@ dependencies { implementation rootProject.ext.dependencies.arouter kapt rootProject.ext.dependencies.aroutercompiler - + implementation rootProject.ext.dependencies.mogocustommap if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_utils implementation rootProject.ext.dependencies.mogomapapi implementation rootProject.ext.dependencies.mogocommons implementation rootProject.ext.dependencies.mogo_core_data - + implementation rootProject.ext.dependencies.mogo_core_function_call } else { implementation project(':core:mogo-core-utils') implementation project(':libraries:mogo-map-api') implementation project(':foudations:mogo-commons') implementation project(':core:mogo-core-data') + implementation project(':core:mogo-core-function-call') } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapMarkerClickHandler.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapMarkerClickHandler.java new file mode 100644 index 0000000000..92ef0d829c --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapMarkerClickHandler.java @@ -0,0 +1,77 @@ +package com.mogo.map; + +import static com.mogo.map.marker.MarkerType.MAP_STATIC; + +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.marker.AMapMarkerWrapper; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.marker.MarkerWrapperClickHelper; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.map.marker.MogoMarkersHandler; +import com.zhidaoauto.map.sdk.open.marker.Marker; + +import java.util.Map; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * marker 点击事件处理 + */ +public class AMapMarkerClickHandler { + + private static volatile AMapMarkerClickHandler sInstance; + + private AMapMarkerClickHandler() { + } + + public static AMapMarkerClickHandler getInstance() { + if (sInstance == null) { + synchronized (AMapMarkerClickHandler.class) { + if (sInstance == null) { + sInstance = new AMapMarkerClickHandler(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + private Object readResolve() { + // 阻止反序列化,必须实现 Serializable 接口 + return sInstance; + } + + public boolean handleMarkerClicked(Marker marker) { + if (marker == null) { + return false; + } + //地图道路上静态数,暂时只过滤traffic类型下发点击事件 + if (MarkerWrapperClickHelper.getInstance().isStaticMarker(marker.getId())){ + IMogoMarker iMogoMarker = new AMapMarkerWrapper(marker,new MogoMarkerOptions()); + iMogoMarker.setOwner(MAP_STATIC); //TODO 后续可能由于类型比较多,需要owner匹配机制,以及控制owner细粒度 + Logger.d("AMapMarkerWrapper", "traffic marker 点击回调"); + return MogoMarkersHandler.getInstance().onStaticMarkerClicked(iMogoMarker); + } + + Map mogoMarkerMap = MarkerWrapperClickHelper.getInstance().getMogoMarkerMap(); + if (mogoMarkerMap.containsKey(marker.getId())) { + IMogoMarker mogoMarker = mogoMarkerMap.get(marker.getId()); + final IMogoMarkerClickListener listener = mogoMarker.getOnMarkerClickListener(); + Logger.d("AMapMarkerWrapper", "marker 点击回调:%s -> %s", mogoMarker, marker); + if (listener != null) { + boolean result = listener.onMarkerClicked(mogoMarker); + if (result) { + return true; + } + } + return MogoMarkersHandler.getInstance().onMarkerClicked(mogoMarker); + } + return false; + } + +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapUiSettingsWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapUiSettingsWrapper.java new file mode 100644 index 0000000000..6865f453de --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapUiSettingsWrapper.java @@ -0,0 +1,110 @@ +package com.mogo.map; + +import com.zhidaoauto.map.sdk.open.view.MapAutoViewHelper; + +import java.lang.reflect.Method; + +/** + * @author congtaowang + * @since 2019-12-18 + *

+ * 代理自研地图UiSettings + */ +public class AMapUiSettingsWrapper implements IMogoUiSettings { + + private MapAutoViewHelper mUiSettings; + + public AMapUiSettingsWrapper( MapAutoViewHelper mUiSettings ) { + this.mUiSettings = mUiSettings; + } + + @Override + public void setScaleControlsEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + } + } + + @Override + public void setZoomControlsEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + mUiSettings.setZoomGesturesEnabled( enabled ); + } + } + + @Override + public void setCompassEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + if(enabled){ + mUiSettings.showDirection(); + }else{ + mUiSettings.hiddenDirection(); + } + } + } + + @Override + public void setMyLocationButtonEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + if(enabled){ + mUiSettings.showLocation(); + }else{ + mUiSettings.hiddenLocation(); + } + } + } + + @Override + public void setScrollGesturesEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + mUiSettings.setScrollGesturesEnabled( enabled ); + } + } + + @Override + public void setZoomGesturesEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + mUiSettings.setZoomGesturesEnabled( enabled ); + } + } + + @Override + public void setTiltGesturesEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + mUiSettings.setTiltGesturesEnabled( enabled ); + } + } + + @Override + public void setRotateGesturesEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + mUiSettings.setRotateGesturesEnabled( enabled ); + } + } + + @Override + public void setAllGesturesEnabled( boolean enabled ) { + if ( mUiSettings != null ) { + mUiSettings.setAllGesturesEnabled( enabled ); + } + } + + @Override + public void setIndoorSwitchEnabled( boolean enabled ) { + if ( mUiSettings != null ) { +// mUiSettings.setIndoorSwitchEnabled( enabled ); + } + } + + @Override + public void setLogoEnable( boolean enabled ) { + if ( mUiSettings != null ) { + try { + Method method = mUiSettings.getClass().getMethod( "setLogoEnable", boolean.class ); + method.setAccessible( true ); + method.invoke( mUiSettings, enabled ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java new file mode 100644 index 0000000000..100967c614 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -0,0 +1,1057 @@ +package com.mogo.map; + +import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_300; +import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS; +import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP; +import static com.mogo.map.uicontroller.VisualAngleMode.MODE_CLOSE_SIGHT; +import static com.mogo.map.uicontroller.VisualAngleMode.MODE_LONG_SIGHT; +import static com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT; + +import android.content.Context; +import android.graphics.Point; +import android.graphics.Rect; +import android.location.Location; +import android.os.Bundle; +import android.os.Trace; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; + +import com.mogo.commons.constants.SharedPrefsConstants; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.config.HdMapBuildConfig; +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapStyleListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; +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.GsonUtils; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.listener.MogoMapListenerHandler; +import com.mogo.map.navi.MogoCarLocationChangedListenerRegister; +import com.mogo.map.uicontroller.CarCursorOption; +import com.mogo.map.uicontroller.EnumMapUI; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.map.uicontroller.MapCameraPosition; +import com.mogo.map.uicontroller.MapControlResult; +import com.mogo.map.uicontroller.VisualAngleMode; +import com.mogo.map.utils.MogoMapUtils; +import com.mogo.map.utils.ObjectUtils; +import com.mogo.map.utils.PointInterpolatorUtil; +import com.mogo.map.utils.ResIdCache; +import com.zhidaoauto.map.sdk.open.MapAutoApi; +import com.zhidaoauto.map.sdk.open.abs.MapStatusListener; +import com.zhidaoauto.map.sdk.open.abs.OnCameraChangeListener; +import com.zhidaoauto.map.sdk.open.abs.OnMapClickListener; +import com.zhidaoauto.map.sdk.open.abs.OnMapLoadedListener; +import com.zhidaoauto.map.sdk.open.abs.OnMapStyleListener; +import com.zhidaoauto.map.sdk.open.abs.OnMapTouchListener; +import com.zhidaoauto.map.sdk.open.abs.OnMapViewVisualAngleChangeListener; +import com.zhidaoauto.map.sdk.open.camera.CameraPosition; +import com.zhidaoauto.map.sdk.open.camera.CameraUpdateFactory; +import com.zhidaoauto.map.sdk.open.camera.LatLngBounds; +import com.zhidaoauto.map.sdk.open.data.MapDataApi; +import com.zhidaoauto.map.sdk.open.data.SinglePointRoadInfo; +import com.zhidaoauto.map.sdk.open.location.LocationListener; +import com.zhidaoauto.map.sdk.open.location.MyLocationStyle; +import com.zhidaoauto.map.sdk.open.location.RTKAutopilotLocationBean; +import com.zhidaoauto.map.sdk.open.marker.BitmapDescriptorFactory; +import com.zhidaoauto.map.sdk.open.marker.Marker; +import com.zhidaoauto.map.sdk.open.marker.OnMarkClickListener; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; +import com.zhidaoauto.map.sdk.open.tools.MapTools; +import com.zhidaoauto.map.sdk.open.view.MapAutoView; +import com.zhidaoauto.map.sdk.open.view.MapAutoViewHelper; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.json.JSONObject; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import mogo.telematics.pad.MessagePad; + +public class AMapViewWrapper implements IMogoMapView, + IMogoMapUIController, + LocationListener, + OnMapLoadedListener, + MapStatusListener, + OnCameraChangeListener, + OnMapClickListener, + OnMapTouchListener, + OnMarkClickListener, + OnMapStyleListener, + MapStyleController.IMapStyleAutoChangedListener, OnMapViewVisualAngleChangeListener { + + private static final String TAG = "AMapViewWrapper"; + private final MapAutoView mMapView; + private final IMogoMap mIMap; + private AMapMarkerClickHandler mMarkerClickHandler; + + private final CarCursorOption DEFAULT_OPTION = new CarCursorOption.Builder() + .carCursorRes(R.drawable.map_api_ic_current_location2) + .naviCursorRes(R.drawable.ic_amap_navi_cursor) + .build(); + private CarCursorOption mCarCursorOption = DEFAULT_OPTION; + private EnumMapUI mCurrentCarUIMode; + private EnumMapUI mCurrentUI; + private VisualAngleMode mVisualAngleMode = MODE_MEDIUM_SIGHT; + + private int mLockZoom = 16; + private long startTime; + private float mDefaultZoomLevel = 16.0f; + private boolean mIsCarLocked = false; + private boolean mIsLightStyle = false; + private boolean mMapLoaded = false; + private boolean mIsFirstLocated = true; + private boolean mIsDelayed = false; + + public AMapViewWrapper(MapAutoView mMapView) { + startTime = System.currentTimeMillis(); + CallerLogger.INSTANCE.i(TAG, "autoop--AMapViewWrapper: init"); + this.mMapView = mMapView; + initViews(); + initListeners(); + this.mIMap = new AMapWrapper(this.mMapView.getMapAutoViewHelper(), this.mMapView, this); + } + + private void initViews() { + + } + + private void initMapView() { + if (mMapView == null) { + return; + } + MapAutoViewHelper options = mMapView.getMapAutoViewHelper(); + if (options != null) { + //设置手势是否可以缩放 isCanZoom true 可缩放 false 不可缩放 + options.setZoomGesturesEnabled(true); + options.setScaleVRMode(true); + if (options.getMyLocationStyle() != null) { + options.getMyLocationStyle().setDisplayAnimEnable(false); + } + //修改自车模型,未来需区分车的类型 + options.setMyLocationStyle(options.getMyLocationStyle().myLocationIcon(HdMapBuildConfig.currentCarVrIconRes, true)); +// MapAutoApi.INSTANCE.getMyLocationStyle().myLocationIcon(HdMapBuildConfig.currentCarVrIconRes, true); + } + } + + private void initListeners() { + + mMapView.setOnMarkClickListener(this); + mMarkerClickHandler = AMapMarkerClickHandler.getInstance(); + mMapView.setOnMapLoadedListener(this); + mMapView.setOnMapTouchListener(this); + mMapView.setOnMapClickListener(this); + mMapView.getLocationClient().registerListener(this); + mMapView.registerListener(this, MapAutoApi.LISTENER_TYPE_ZOOM); + mMapView.registerListener(this, MapAutoApi.LISTENER_TYPE_ROTATE); + mMapView.registerListener(this, MapAutoApi.LISTENER_TYPE_3D); + mMapView.setOnCameraChangeListener(this); + mMapView.setOnMapStyleListener(this); + mMapView.setOnMapViewVisualAngleChangeListener(this); + CallerLogger.INSTANCE.d(TAG, "styleop - initListeners - setOnMapStyleListener - view " + mMapView); + } + + private Context getContext() { + return mMapView.getContext(); + } + + @Override + public View getMapView() { + return mMapView; + } + + @Override + public IMogoMap getMap() { + return mIMap; + } + + @Override + public void onCreate(Bundle bundle) { + if (mMapView != null) { + mMapView.onCreate(bundle); + CallerLogger.INSTANCE.d(TAG, "map onCreate"); + } + } + + @Override + public void onResume() { + if (mMapView != null) { + mMapView.onResume(); + CallerLogger.INSTANCE.d(TAG, "map onResume"); + } + } + + @Override + public void onPause() { + if (mMapView != null) { + mMapView.onPause(); + CallerLogger.INSTANCE.d(TAG, "map onPause"); + } + } + + @Override + public void onDestroy() { + if (mMapView != null) { + mMapView.onDestroy(); + mMapView.setOnMarkClickListener(null); + mMapView.setOnMapLoadedListener(null); + mMapView.setOnMapTouchListener(null); + mMapView.setOnMapClickListener(null); + mMapView.getLocationClient().unRegisterListener(this); + mMapView.setOnCameraChangeListener(null); + CallerLogger.INSTANCE.d(TAG, "map onDestroy"); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + if (mMapView != null) { + mMapView.onSaveInstanceState(outState); + CallerLogger.INSTANCE.d(TAG, "map onSaveInstanceState"); + } + } + + @Override + public void onLowMemory() { + + } + + @Override + public void setTrafficEnabled(boolean visible) { + if (checkAMapView()) { + // mMapView.getMapAutoViewHelper().setTraffic( visible ); + } + } + + @Override + public MapControlResult changeZoom(boolean zoom) { + if (checkAMapView()) { + mDefaultZoomLevel = (getMap().getZoomLevel() + 0.5f); + if (zoom) { + if (mDefaultZoomLevel >= 20f) { + return MapControlResult.TARGET; + } + } else { + if (mDefaultZoomLevel <= 7f) { + return MapControlResult.TARGET; + } + } + + if (zoom) { + mDefaultZoomLevel += 1f; + if (mDefaultZoomLevel > 19f) { + mDefaultZoomLevel = 19f; + } + } else { + mDefaultZoomLevel -= 1f; + if (mDefaultZoomLevel < 8f) { + mDefaultZoomLevel = 8f; + } + } + changeZoom(mDefaultZoomLevel); + } + return MapControlResult.SUCCESS; + } + + @Override + public MapControlResult changeZoom(float zoom) { + if (mCurrentUI == EnumMapUI.Type_VR) { + return MapControlResult.ERROR; + } + CallerLogger.INSTANCE.d(TAG, "changeZoom : " + zoom); + if (DebugConfig.isDebug()) { + CallerLogger.INSTANCE.d(TAG, Log.getStackTraceString(new Throwable())); + } + getMap().changeZoom(zoom); + return MapControlResult.SUCCESS; + } + + @Override + public void changeMapMode(EnumMapUI ui) { + if (ui == null) { + return; + } + + CallerLogger.INSTANCE.d(TAG, "设置的样式 :" + ui); + if (checkAMapView()) { + mMapView.getMapAutoViewHelper().setScaleVRMode(true); + mMapView.getMapAutoViewHelper().setMapStyle(MapAutoApi.MAP_STYLE_VR); + // TODO 这里临时修改关闭2D +// switch (ui) { +// case CarUp_2D: +// case CarUp_3D: +// case NorthUP_2D: +// setUIMode(ui); +// break; +// case Type_VR: +// mMapView.getMapAutoViewHelper().setScaleVRMode(true); +// mMapView.getMapAutoViewHelper().setMapStyle(MapAutoApi.MAP_STYLE_VR); +// return; +// case Type_Light: +// mMapView.getMapAutoViewHelper().setAutoSwitchStyle(false); +// mMapView.getMapAutoViewHelper().setMapStyle(MapAutoApi.MAP_STYLE_DAY); +// mIsLightStyle = true; +// break; +// case Type_Night: +// mMapView.getMapAutoViewHelper().setAutoSwitchStyle(false); +// mMapView.getMapAutoViewHelper().setMapStyle(MapAutoApi.MAP_STYLE_NIGHT); +// mIsLightStyle = false; +// break; +// case Type_AUTO_LIGHT_Night: +// mMapView.getMapAutoViewHelper().setAutoSwitchStyle(true); +// break; +// } + + } + } + + @Override + public void changeMapVisualAngle(VisualAngleMode angelMode, MogoLatLng mogoLatLng) { + MapAutoViewHelper mapAutoViewHelper = mMapView.getMapAutoViewHelper(); + if (mapAutoViewHelper != null) { + CallerLogger.INSTANCE.d(TAG, " 用户更改视距 currentThread : " + Thread.currentThread().getName()); + mVisualAngleMode = angelMode; + if (angelMode == MODE_CLOSE_SIGHT) { + if (mogoLatLng == null) { + CallerLogger.INSTANCE.e(TAG, "切换地图近景需要传入要移动的经纬度数据"); + return; + } + // 近景传入经纬度为点击地图上静态marker经纬度数据,为GPS坐标点。 + mapAutoViewHelper.setNearViewAnglePosition(new LonLatPoint(mogoLatLng.lon, mogoLatLng.lat), true); + } else { + mapAutoViewHelper.setMapViewVisualAngle(angelMode.getCode()); + } + } + } + + @Override + public VisualAngleMode getCurrentMapVisualAngle() { + return mVisualAngleMode; + } + + @Override + public void moveToCenter(MogoLatLng latLng) { + moveToCenter(latLng, true); + } + + private boolean checkAMapView() { + if (mMapView == null || mMapView.getMapAutoViewHelper() == null) { + CallerLogger.INSTANCE.e(TAG, "自研mapView实例为空,请检查"); + return false; + } + return true; + } + + @Override + public void moveToCenter(MogoLatLng latLng, boolean animate) { + CallerLogger.INSTANCE.d(TAG, "move to center " + latLng); + if (latLng == null || latLng.lat == 0.0d || latLng.lon == 0.0d) { + CallerLogger.INSTANCE.e(TAG, "latlng = null or is illegal"); + return; + } + if (DebugConfig.isDebug()) { + CallerLogger.INSTANCE.d(TAG, Log.getStackTraceString(new Throwable())); + } + loseLockMode(); + mMapView.getMapAutoViewHelper().animateCamera(new LonLatPoint(latLng.lon, latLng.lat)); + } + + @Override + public void showMyLocation(boolean visible) { + CallerLogger.INSTANCE.d(TAG, "showMyLocation1 " + visible); + // 如果是VR模式 + if (mCurrentUI == EnumMapUI.Type_VR) { + return; + } + // 不是VR模式情况强制刷新下 + if (checkAMapView()) { + MyLocationStyle style = mMapView.getMapAutoViewHelper().getMyLocationStyle(); + if (visible) { + // 强制刷新一遍车标 + style.myLocationIcon(mCarCursorOption.getCarCursorRes()); + } + mMapView.getMapAutoViewHelper().setMyLocationStyle(style); + } + } + + @Override + public void showMyLocation(View view) { + if (DebugConfig.isDebug()) { + CallerLogger.INSTANCE.d(TAG, Log.getStackTraceString(new Throwable())); + } + if (checkAMapView()) { + MyLocationStyle style = mMapView.getMapAutoViewHelper().getMyLocationStyle(); + style.myLocationIcon(BitmapDescriptorFactory.INSTANCE.convertViewToBitmap(view)); + mMapView.getMapAutoViewHelper().setMyLocationStyle(style); + } + } + + public void initMyLocation() { + if (checkAMapView()) { + mMapView.getMapAutoViewHelper().setMyLocationEnabled(true); + MyLocationStyle style = mMapView.getMapAutoViewHelper().getMyLocationStyle(); + style.setLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER); + style.interval(1000); + // style.anchor( 0.5F, 0.5F ); + // style.strokeColor( Color.TRANSPARENT ); + // style.strokeWidth( 0 ); + // style.radiusFillColor( Color.TRANSPARENT ); + mMapView.getMapAutoViewHelper().setMyLocationStyle(style); + } + } + + @Override + public void recoverLockMode() { + if (checkAMapView()) { + if (mCurrentUI == EnumMapUI.Type_VR) { + return; + } + CallerLogger.INSTANCE.d(TAG, "锁车"); + mMapView.getMapAutoViewHelper().setLockMode(true); + mIsCarLocked = true; + } + } + + @Override + public void loseLockMode() { + if (mCurrentUI == EnumMapUI.Type_VR) { + return; + } + CallerLogger.INSTANCE.d(TAG, "解锁锁车"); + mMapView.getMapAutoViewHelper().setLockMode(false); + mIsCarLocked = false; + } + + @Override + public void setLockZoom(int var1) { + mLockZoom = var1; + } + + @Override + public void displayOverview(Rect bounds) { + + } + + @Override + public float getScalePerPixel() { + return getMap().getScalePerPixel(); + } + + @Override + public float getZoomLevel() { + return getMap().getZoomLevel(); + } + + @Override + public float getRoadWidth(double lon, double lat, float angle, boolean isGpsLocation, boolean isRTK) { + return getMap().getRoadWidth(lon, lat, angle, isGpsLocation, isRTK); + } + + @Override + public MogoLatLng getCameraNorthEastPosition() { + return ObjectUtils.fromAMap(MapTools.INSTANCE.getVisibleRegion().getRightTopPoint()); + } + + @Override + public MogoLatLng getCameraSouthWestPosition() { + try { + return ObjectUtils.fromAMap(MapTools.INSTANCE.getVisibleRegion().getLeftBottomPoint()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public MogoLatLng getWindowCenterLocation() { + try { + return ObjectUtils.fromAMap(mMapView.getMapAutoViewHelper().getCenter()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public void setPointToCenter(double mapCenterX, double mapCenterY) { + if (checkAMapView()) { + if (mCurrentUI == EnumMapUI.Type_VR) { + return; + } + CallerLogger.INSTANCE.d(TAG, "setPointToCenter x : " + mapCenterX + " y : " + mapCenterY); + mMapView.getMapAutoViewHelper().setPointToCenter((float) mapCenterX, (float) mapCenterY); + } + } + + @Override + public Point getLocationPointInScreen(MogoLatLng latLng) { + if (checkAMapView()) { + try { + return MapTools.INSTANCE.toScreenLocation(ObjectUtils.fromMogo(latLng)); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + return null; + } + + @Override + public MogoLatLng getLocationMogoLatLngInScreen(Point point) { + if (checkAMapView()) { + try { + return ObjectUtils.fromAMap( + MapTools.INSTANCE.fromScreenLocation(point)); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + return null; + } + + @Override + public void setRenderFps(int fps) { + if (checkAMapView()) { + if (mMapView.getMapAutoViewHelper() != null) { + mMapView.getMapAutoViewHelper().setRenderFps(fps); + CallerLogger.INSTANCE.d(TAG, "设置刷新帧率 fps = " + fps); + } + } + } + + @Override + public void showBounds(String tag, MogoLatLng carPosition, List lonLats, Rect bound, boolean lockCarPosition) { + if (!checkAMapView()) { + return; + } + if (mCurrentUI == EnumMapUI.Type_VR) { + CallerLogger.INSTANCE.w(TAG, "vr 模式下忽略该设置"); + return; + } + CallerLogger.INSTANCE.i(TAG, "showBounds : " + tag + " , " + carPosition.toString() + " , " + bound.toShortString() + " , " + lockCarPosition); + try { + LatLngBounds latLngBounds = MogoMapUtils.getLatLngBounds(carPosition, lonLats, lockCarPosition); + if (!lockCarPosition) { + loseLockMode(); + } + mMapView.getMapAutoViewHelper().setCenter(ObjectUtils.fromMogo(carPosition)); + mMapView.getMapAutoViewHelper().moveCamera(CameraUpdateFactory.INSTANCE.newLatLngBounds(latLngBounds, bound.left, bound.right, bound.top, bound.bottom)); + } catch (Exception e) { + CallerLogger.INSTANCE.e(TAG, "tag : " + tag + " error : " + e); + } + } + + @Override + public void forceRender() { + if (checkAMapView()) { + mMapView.getMapAutoViewHelper().runOnDrawFrame(); + } + } + + @Override + public float calculateLineDistance(MogoLatLng p1, MogoLatLng p2) throws Exception { + if (p1 == null || p2 == null) { + throw new Exception("计算距离的点不能为 null"); + } + return MogoMapUtils.calculateLineDistance(ObjectUtils.fromMogo(p1), ObjectUtils.fromMogo(p2)); + } + + + @Override + public EnumMapUI getCurrentUiMode() { + return mCurrentCarUIMode; + } + + @Override + public void changeMyLocation(Location location) { + } + + @Override + public synchronized boolean isCarLocked() { + return mMapView.getMapAutoViewHelper().getLockMode(); + } + + @Override + public void setCarCursorOption(CarCursorOption option) { + if (mCurrentUI == EnumMapUI.Type_VR) { + return; + } + if (mCarCursorOption != null && mCarCursorOption != DEFAULT_OPTION) { + mCarCursorOption.destroy(); + } + if (option != null) { + try { + mCarCursorOption = option.clone(); + } catch (Exception e) { + mCarCursorOption = DEFAULT_OPTION; + } + } else { + mCarCursorOption = DEFAULT_OPTION; + } + if (!checkAMapView()) { + return; + } + + if (mMapView.getMapAutoViewHelper() == null) { + return; + } + MyLocationStyle style = mMapView.getMapAutoViewHelper().getMyLocationStyle(); + if (mCarCursorOption.getCarCursorBmp() != null && !mCarCursorOption.getCarCursorBmp().isRecycled()) { + style.myLocationIcon(mCarCursorOption.getCarCursorBmp()); + } else { + if (mCarCursorOption.getCarCursorRes() != 0) { + style.myLocationIcon(mCarCursorOption.getCarCursorRes()); + } + } + mMapView.getMapAutoViewHelper().setMyLocationStyle(style); + } + + @Override + public MapCameraPosition getMapCameraPosition() { + if (checkAMapView()) { + CameraPosition cameraPosition = mMapView.getMapAutoViewHelper().getCameraPosition(); + return ObjectUtils.fromAMap(cameraPosition); + } + return null; + } + + @Override + public void changeBearing(float bearing) { + if (checkAMapView()) { + mMapView.getMapAutoViewHelper().setMapViewRotation(bearing); + } + } + + @Override + public void changeMapViewAngle(int type) { + if (checkAMapView()) { + //mMapView.getMapAutoViewHelper().testMapViewAngle(type); + } + } + + @Override + public void changeCurrentIcon(int iconId) { + if (checkAMapView()) { + mMapView.getMapAutoViewHelper().getMyLocationStyle().myLocationIcon(iconId, true); + } + } + + @Override + public long getTileId(double lon, double lat) { + return getMap().getUIController().getTileId(lon, lat); + } + + @Override + public int getSpeedLimmit(double lon, double lat, float angle) { + return MapDataApi.INSTANCE.getLimitSpeed(lon, lat, angle); + } + + @Override + public void onLocationChanged(@NotNull com.zhidaoauto.map.sdk.open.location.MogoLocation location) { + MogoLocation mLastLocation = ObjectUtils.fromLocation(location); + UiThreadHandler.post(() -> CallerMapLocationListenerManager.INSTANCE.invokeMapLocationChangeListener(mLastLocation)); + + Location sysLocation = new Location(location.getProvider()); + sysLocation.setAltitude(location.getAltitude()); + sysLocation.setLatitude(location.getLat()); + sysLocation.setLongitude(location.getLon()); + sysLocation.setProvider(location.getProvider()); + sysLocation.setAccuracy(location.getAcceleration()); + sysLocation.setTime(location.getDuration()); + sysLocation.setBearing((float) location.getHeading()); + sysLocation.setSpeed(location.getSpeed()); + + // 将有效经纬度暂存本地,提供给下一次的Http-DNS使用,防止首次请求位置获取不到 + if (location.getLat() > 0) { + SharedPrefsMgr.getInstance(mMapView.getContext()) + .putString(SharedPrefsConstants.LOCATION_CITY_CODE, location.getCityCode()); + SharedPrefsMgr.getInstance(mMapView.getContext()) + .putString(SharedPrefsConstants.LOCATION_LATITUDE, String.valueOf(location.getLat())); + SharedPrefsMgr.getInstance(mMapView.getContext()) + .putString(SharedPrefsConstants.LOCATION_LONGITUDE, String.valueOf(location.getLon())); + } + + + if (MogoCarLocationChangedListenerRegister.getInstance().getListener() != null) { + MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2(sysLocation); + } + if (checkAMapView() && mMapLoaded) { + // 地图初始化完成后,每隔5s自动判断当前地图的模式 + if (mIsFirstLocated) { + if (!mIsDelayed) { + mIsDelayed = true; + UiThreadHandler.postDelayed(() -> { + //CallerLogger.INSTANCE.d(TAG, "倒计时结束"); + mIsFirstLocated = false; + }, 5_000L); + } + } else { + mIsFirstLocated = true; + mIsDelayed = false; + CallerLogger.INSTANCE.d(TAG, "同步定位:" + GsonUtils.toJson(location)); + MapStyleController.getInstance().onLocationChanged(location, this); + } + } + } + + @Override + public void onMapClick(@Nullable LonLatPoint lonLatPoint) { + MogoMapListenerHandler.getInstance().onMapClick(ObjectUtils.fromAMap(lonLatPoint)); + } + + + @Override + public void onMapInit() { + CallerLogger.INSTANCE.i(TAG, "autoop--onMapInit: "); + MogoMapListenerHandler.getInstance().onMapLoaded(); + } + + @Override + public void onMapLoaded() { + CallerLogger.INSTANCE.i(TAG, "autoop--onMapLoaded: "); + mMapLoaded = true; + CameraPosition cameraPosition = mMapView.getMapAutoViewHelper().getCameraPosition(); + Trace.beginSection("timer.onCameraChangeFinish"); + MogoMapListenerHandler.getInstance().onMapChanged(ObjectUtils.fromAMap(cameraPosition.getTarget()), + cameraPosition.getZoom(), + cameraPosition.getTilt(), + cameraPosition.getBearing()); + Trace.endSection(); + initMapView(); + initMyLocation(); + } + + @Override + public boolean onTouch(@Nullable MotionEvent motionEvent) { + MogoMapListenerHandler.getInstance().onTouch(motionEvent); + return false; + } + + @Override + public void onMarkClick(@NotNull Marker markerInfo) { + mMarkerClickHandler.handleMarkerClicked(markerInfo); + } + + @Override + public void onRoadLoaded(@Nullable String s) { + CallerLogger.INSTANCE.i(TAG, "autoop--onMapLoaded: "); + + } + + @Override + public void onMapStatusChanged(int type, int value) { + //CallerLogger.INSTANCE.i(TAG, "mapop--onMapStatusChanged-: " + type + "," + value); + } + + @Override + public void onMapViewVisualAngleChange(int i) { + CallerLogger.INSTANCE.d(TAG, " 地图自动更改视距 currentThread : " + Thread.currentThread().getName()); + mVisualAngleMode = getVisualAngleMode(i); + MogoMapListenerHandler.getInstance().onMapVisualAngleChanged(mVisualAngleMode); + } + + private VisualAngleMode getVisualAngleMode(int mode) { + switch (mode) { + case 0: + return MODE_CLOSE_SIGHT; + case 1: + return MODE_MEDIUM_SIGHT; + case 2: + return MODE_LONG_SIGHT; + case 3: + return MAP_STYLE_VR_ANGLE_300; + case 4: + return MAP_STYLE_VR_ANGLE_TOP; + case 5: + return MAP_STYLE_VR_ANGLE_CROSS; + default: + throw new IllegalStateException("mode is unCorrect"); + } + } + + @Override + public void onCameraChange(int type, int value) { + //CallerLogger.INSTANCE.i(TAG, "mapop--onCameraChange-: " + type + "," + value); + } + + @Override + public void onCameraChangeFinish(@Nullable CameraPosition cameraPosition) { + // CallerLogger.INSTANCE.i( TAG, "mapop--onCameraChangeFinish-: " + cameraPosition + "cost:" + ( System.currentTimeMillis() - startTime ) ); + if (cameraPosition != null) { + Trace.beginSection("timer.onCameraChangeFinish"); + MogoMapListenerHandler.getInstance().onMapChanged(ObjectUtils.fromAMap(cameraPosition.getTarget()), + cameraPosition.getZoom(), + cameraPosition.getTilt(), + cameraPosition.getBearing()); + Trace.endSection(); + } + } + + @Override + public void emphasizeMyLocation() { + + } + + @Override + public void onChangeMapStyle(int styleId) { + + EnumMapUI last = mCurrentUI; + CallerLogger.INSTANCE.d(TAG, "currentMapStyle = " + styleId); + + if (styleId == MapAutoApi.MAP_STYLE_DAY + || styleId == MapAutoApi.MAP_STYLE_DAY_NAV) { + mCurrentUI = EnumMapUI.Type_Light; + } else if (styleId == MapAutoApi.MAP_STYLE_NIGHT + || styleId == MapAutoApi.MAP_STYLE_NIGHT_NAV) { + mCurrentUI = EnumMapUI.Type_Night; + } else if (styleId == MapAutoApi.MAP_STYLE_VR) { + mCurrentUI = EnumMapUI.Type_VR; + // 进入vr模式的时候自动切换到车头朝上 + change2CarUp(); + } + + if (last == mCurrentUI) { + CallerLogger.INSTANCE.d(TAG, "currentUI is same as last = " + mCurrentUI); + return; + } + + // vr 模式切换到普通模式下,保持之前的白天模式 wtf. + if (last == EnumMapUI.Type_VR && mCurrentUI != EnumMapUI.Type_Light) { + if (mIsLightStyle) { + changeMapMode(EnumMapUI.Type_Light); + return; + } + } + CallerLogger.INSTANCE.d(TAG, Log.getStackTraceString(new Throwable())); + if (mCurrentUI != null) { + UiThreadHandler.post(() -> { + try { + CallerLogger.INSTANCE.d(TAG, "currentUI = " + mCurrentUI); + MogoMapListenerHandler.getInstance().onMapModeChanged(mCurrentUI); + CallerMapStyleListenerManager.INSTANCE.invokeMapStyleChange(styleId); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + } + + /** + * 切换到车头朝上 + */ + private void change2CarUp() { + mMapView.getMapAutoViewHelper().setMapViewPerspective(MapAutoApi.MAP_PERSPECTIVE_UP_CAR); + } + + + @Override + public void onStyleAutoChanged(boolean isVrMode) { + if (isVrMode) { + if (mCurrentUI != EnumMapUI.Type_VR) { + CallerLogger.INSTANCE.d(TAG, "自动切换为vr模式"); + changeMapMode(EnumMapUI.Type_VR); + } + } else { + if (mCurrentUI == EnumMapUI.Type_VR) { + CallerLogger.INSTANCE.d(TAG, "自动切换为2D模式"); + if (mIsLightStyle) { + changeMapMode(EnumMapUI.Type_Light); + } else { + changeMapMode(EnumMapUI.Type_Night); + } + } + } + } + + private boolean mRtkEnable = false; + + @Override + public void rtkEnable(boolean enable) { + try { + mRtkEnable = !mRtkEnable; + TipToast.shortTip(mRtkEnable ? "已开启rtk道路匹配" : "已开启gps道路匹配"); + mMapView.getLocationClient().rtkEnable(mRtkEnable); + } catch (Exception e) { + CallerLogger.INSTANCE.e(TAG, "rtkEnable has exception : " + e); + } + } + + @Override + public void syncLocation2Map(JSONObject data) { + if (!checkAMapView()) { + return; + } + if (data == null) { + CallerLogger.INSTANCE.d(TAG, "停止使用rtk定位数据"); + return; + } + double lon = data.optDouble("lon", -1); + double lat = data.optDouble("lat", -1); + double alt = data.optDouble("alt", -1); + double heading = data.optDouble("heading", -1); + double acceleration = data.optDouble("acceleration", -1); + double yawRate = data.optDouble("yawRate", -1); + double speed = data.optDouble("speed", -1); + long systemTime = data.optLong("systemTime"); + long satelliteTime = data.optLong("satelliteTime"); + + if (lon == -1) { + return; + } + RTKAutopilotLocationBean bean = new RTKAutopilotLocationBean(); + bean.setYaw_rate(yawRate); + bean.setHeading(heading); + bean.setAcceleration(acceleration); + bean.setAlt(alt); + bean.setSystemTime(systemTime); + bean.setSatelliteTime(satelliteTime); + bean.setLon(lon); + bean.setGnss_speed(((float) speed)); + bean.setLat(lat); + // 使用外部定位数据修改自车位置 + mMapView.getLocationClient().updateRTKAutoPilotLocation(bean); + CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getContext()).updateLocation(bean); + CallerMapDataCollectorManager.INSTANCE.setIsInit(); + } + + @Override + public void syncLocation2Map(MessagePad.GnssInfo gnssInfo) { + if (!checkAMapView()) { + return; + } + if (gnssInfo.getLongitude() == -1) { + return; + } + RTKAutopilotLocationBean bean = new RTKAutopilotLocationBean(); + bean.setYaw_rate(gnssInfo.getYawRate()); + bean.setHeading(gnssInfo.getHeading()); + bean.setAcceleration(gnssInfo.getAcceleration()); + bean.setAlt(gnssInfo.getAltitude()); + bean.setSystemTime(Double.valueOf(gnssInfo.getSystemTime()).longValue()); + bean.setSatelliteTime(Double.valueOf(gnssInfo.getSatelliteTime()).longValue()); + bean.setLon(gnssInfo.getLongitude()); + bean.setLat(gnssInfo.getLatitude()); + bean.setGnss_speed(((float) gnssInfo.getGnssSpeed())); + // 使用外部定位数据修改自车位置 + mMapView.getLocationClient().updateRTKAutoPilotLocation(bean); + CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getContext()).updateLocation(bean); + CallerMapDataCollectorManager.INSTANCE.setIsInit(); + } + + @Override + public void openVrMode(boolean zoomGestureEnable) { + try { + mMapView.getMapAutoViewHelper().setZoomGesturesEnabled(zoomGestureEnable); + mMapView.getMapAutoViewHelper().setMapStyle(MapAutoApi.MAP_STYLE_VR); + } catch (Exception e) { + e.printStackTrace(); + } + } + + Map roadCacheMap = new ConcurrentHashMap<>(); + private final RoadCacheWrapper noCache = new RoadCacheWrapper(null); + + @Override + public void clearRoadCacheById(String id) { + roadCacheMap.remove(id); + } + + @Override + public double[] matchRoad(String id, double lon, double lat, double angle, boolean isGpsLocation, boolean isRTK) { + return matchRoad(id, lon, lat, angle, isGpsLocation, isRTK, true); + } + + /** + * 带缓存的道路匹配算法 + *

+ * 使用{@link MapDataApi#INSTANCE#getSinglePointMatchRoad()}这个方法获取道路数据会存在一定耗时,目前是4-10ms,因为请求频繁,为了 + * 减小这部分耗时,使用一个ConcurrentHashMap{@link #roadCacheMap}缓存道路数据,此缓存是以目标车id为key,道路数据为value,以此减少 + * 道路数据获取次数。 + *

+ * 当出现道路改变的情况,需要重新获取道路数据,采用递归的方式重获道路数据以及添加缓存,为了避免一直获取不到道路数据,一直递归,增加useCache参数跳出递归。 + *

+ * 道路改变的情况主要分为: + * 1. 目标车距离道路中心线距离超过阈值 matchThreshold(取路宽的1/4为阈值); + * 2. 目标车到道路中心线的映射点不在道路上(此判断在{@link PointInterpolatorUtil#mergeToRoad(double, double, List)}),也就是说已经驶出了这条道路 + * + * @param id 目标车唯一标识 + * @param lon 目标车经度 + * @param lat 目标车纬度 + * @param angle 目标车角度 + * @param isGpsLocation true-使用gps定位数据 + * @param isRTK true-使用rtk数据 + * @param usdCache true-使用道路缓存 false-不使用道路缓存 + * @return double[]{匹配后经度,匹配后纬度,目标车距离车道中心线距离},若匹配后经纬度值为-1,则没有匹配成功 + */ + private double[] matchRoad(String id, double lon, double lat, double angle, boolean isGpsLocation, boolean isRTK, boolean usdCache) { + double[] wgs = new double[]{lon, lat}; + long start = System.currentTimeMillis(); + + RoadCacheWrapper roadCache = roadCacheMap.get(id); + double matchThreshold = -1; + if (roadCache == null || roadCache == noCache) { + SinglePointRoadInfo singlePointRoadInfo = MapDataApi.INSTANCE.getSinglePointMatchRoad(((float) wgs[0]), ((float) wgs[1]), ((float) angle), isGpsLocation, isRTK); + if (singlePointRoadInfo != null && singlePointRoadInfo.getCoords() != null && !singlePointRoadInfo.getCoords().isEmpty()) { + roadCache = new RoadCacheWrapper(singlePointRoadInfo.getCoords()); + roadCache.setLaneWidth(singlePointRoadInfo.getLaneWidth()); + } + } + + if (roadCache != null + && roadCache.getRoad() != null + && !roadCache.getRoad().isEmpty()) { + // 未获取到道路中心线数据 + start = System.currentTimeMillis(); + matchThreshold = roadCache.getLaneWidth() / 4; + + double[] matchedPoint = PointInterpolatorUtil.mergeToRoad(wgs[0], wgs[1], roadCache.getRoad()); + if (matchThreshold > 0 && matchedPoint[2] > 0 && matchedPoint[2] <= matchThreshold) { + // 目标车在阈值范围内 + roadCacheMap.put(id, roadCache); + // CallerLogger.INSTANCE.i("timer-matchRoad-3", "cost " + (System.currentTimeMillis() - start) + "ms"); + return matchedPoint; + // CallerLogger.INSTANCE.i("timer-matchRoad-2", "cost " + (System.currentTimeMillis() - start) + "ms roadId: "+roadCache.getLastLat()); + } else if (matchedPoint[2] > matchThreshold && matchedPoint[2] < 1.5) { + // 目标车在阈值范围外,也就是说距离道路中心线太远了,就不吸附了 + return null; + } else { + // 目标车到道路中心线的映射点不在道路上,也就是已经使出了缓存的那条道路,需要重新获取一条道路,用useCache这个参数来避免重复递归 + roadCacheMap.put(id, noCache); + // CallerLogger.INSTANCE.i("timer-matchRoad-2", "cost " + (System.currentTimeMillis() - start) + "ms roadId: " + roadCache.getLastLat()); + if (usdCache) { + return matchRoad(id, lon, lat, angle, isGpsLocation, isRTK, false); + } else { + return null; + } + } + } + roadCacheMap.put(id, noCache); + return null; + } + + @Override + public String getMarkerInfoResName(String speedVal) { + return ResIdCache.getVal(speedVal); + } + + @Override + public void setMarkerInfoResName(String speedVal, String val) { + ResIdCache.putVal(speedVal, val); + } + + @Override + public void setMapDAngle(float angle) { + mMapView.getMapAutoViewHelper().setMapDAngle(angle); + } + +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java new file mode 100644 index 0000000000..c234b670cc --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java @@ -0,0 +1,326 @@ +package com.mogo.map; + +import android.content.Context; +import android.graphics.Point; + +import com.mogo.eagle.core.data.traffic.TrafficData; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.marker.AMapInfoWindowAdapter; +import com.mogo.map.marker.AMapMarkerWrapper; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.map.marker.MogoMarkersHandler; +import com.mogo.map.overlay.AMapPolylineWrapper; +import com.mogo.map.overlay.IMogoPolyline; +import com.mogo.map.overlay.MogoPolylineOptions; +import com.mogo.map.uicontroller.AMapUIController; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.MapAutoApi; +import com.zhidaoauto.map.sdk.open.data.MapDataApi; +import com.zhidaoauto.map.sdk.open.data.SinglePointRoadInfo; +import com.zhidaoauto.map.sdk.open.marker.Marker; +import com.zhidaoauto.map.sdk.open.marker.MarkerHelper; +import com.zhidaoauto.map.sdk.open.marker.MarkerOptions; +import com.zhidaoauto.map.sdk.open.marker.MarkerSimpleData; +import com.zhidaoauto.map.sdk.open.marker.MultiPointOverlayOptions; +import com.zhidaoauto.map.sdk.open.poyline.Polyline; +import com.zhidaoauto.map.sdk.open.poyline.PolylineOptions; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; +import com.zhidaoauto.map.sdk.open.tools.MapTools; +import com.zhidaoauto.map.sdk.open.view.MapAutoView; +import com.zhidaoauto.map.sdk.open.view.MapAutoViewHelper; + +import java.util.ArrayList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +/** + * @author congtaowang + * @since 2019-12-18 + *

+ * 代理自研AMap + */ +public class AMapWrapper implements IMogoMap { + + private static final String TAG = "AMapWrapper"; + + private static MapAutoViewHelper sAMap; + private IMogoMapUIController mUIcontroller; + private MapAutoViewHelper mAMap; + private MapAutoView mMapView; + private IMogoUiSettings mUiSettings; + + public AMapWrapper(MapAutoViewHelper map, MapAutoView mapView, IMogoMapUIController controller) { + Logger.i(TAG, "autoop--AMapWrapper: init" + this); + this.mAMap = map; + sAMap = map; + this.mMapView = mapView; + mUIcontroller = controller; + // 设置实现自定义 info window + MapAutoApi.INSTANCE.setInfoWindowAdapter(new AMapInfoWindowAdapter()); + AMapUIController.getInstance().initClient(mUIcontroller); + } + + public static MapAutoViewHelper getAMap() { + return sAMap; + } + + @Override + public IMogoUiSettings getUiSettings() { + if (!checkAMap()) { + return null; + } + if (mUiSettings == null) { + mUiSettings = new AMapUiSettingsWrapper(mAMap); + } + return mUiSettings; + } + + @Override + public IMogoMapUIController getUIController() { + return mUIcontroller; + } + + @Override + public IMogoMarker addMarker(String tag, MogoMarkerOptions options) { + //Logger.i(TAG, "autoop-addMarker: " + tag + ",MogoMarkerOptions:" + options + ",AMap:" + (mAMap != null) + ",this:" + this); + if (!checkAMap()) { + return null; + } + MarkerOptions markerOptions = ObjectUtils.fromMogo(options); + if (markerOptions == null) { + Logger.e(TAG, "marker参数为空"); + return null; + } + final IMogoMarker mogoMarker = new AMapMarkerWrapper(mAMap.addMarker(markerOptions), options); + if (options.isAutoManager()) { + MogoMarkersHandler.getInstance().add(tag, mogoMarker); + } + return mogoMarker; + } + + @Override + public void updateBatchMarkerPosition(ArrayList optionsArrayList) { + if (!checkAMap()) { + return; + } + ArrayList markerOptionsArrayList = new ArrayList<>(); + for (MessagePad.TrackedObject mogoMarkerOptions : optionsArrayList) { + MarkerSimpleData markerOptions = ObjectUtils.fromTrafficData(mogoMarkerOptions); + if (markerOptions == null) { + Logger.e(TAG, "marker参数为空"); + break; + } + markerOptionsArrayList.add(markerOptions); + } + + MarkerHelper.INSTANCE.updateBatchMarkerPositon(markerOptionsArrayList,false,8.0f,0,100); + } + + @Override + public String addPreVehicleModel(int type, int modelRes) { + try { + return MarkerHelper.INSTANCE.addPreVehicleModel(type, modelRes); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override + public void removeMarker(String uuidString) { + try { + MarkerHelper.INSTANCE.removeMarker(uuidString); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public ArrayList addMarkers(String tag, ArrayList options, boolean moveToCenter) { + if (!checkAMap()) { + return null; + } + + if (options == null || options.isEmpty()) { + return null; + } + + ArrayList markers = new ArrayList<>(); + ArrayList markerOptions = new ArrayList<>(); + ArrayList mogoMarkers = new ArrayList<>(); + for (MogoMarkerOptions option : options) { + if (option == null) { + continue; + } + MarkerOptions mo = ObjectUtils.fromMogo(option); + if (mo == null) { + continue; + } + markerOptions.add(mo); + } + if (markerOptions.isEmpty()) { + return null; + } + MultiPointOverlayOptions multiPointOverlayOptions = new MultiPointOverlayOptions(); + multiPointOverlayOptions.setData(markerOptions); + multiPointOverlayOptions.setMarkerIcon(R.drawable.marker_blue); + List data = mAMap.addMarkers(multiPointOverlayOptions).getOptions().getData(); + for (int i = 0; i < data.size(); i++) { + markers.add(new Marker(data.get(i))); + } + if (markers == null || markers.isEmpty()) { + return null; + } + for (int i = 0; i < markers.size(); i++) { + Marker marker = markers.get(i); + if (marker == null) { + continue; + } + mogoMarkers.add(new AMapMarkerWrapper(marker, options.get(i))); + } + MogoMarkersHandler.getInstance().add(tag, mogoMarkers); + return mogoMarkers; + } + + @Override + public void clear() { + if (checkAMap()) { + mAMap.clearPanel(); + } + } + + @Override + public void clear(boolean isKeepMyLocationOverlay) { + if (checkAMap()) { + mAMap.clearPanel(); + } + } + + @Override + public void setPointToCenter(int x, int y) { + if (checkAMap()) { + LonLatPoint lonLatPoint = MapTools.INSTANCE.fromScreenLocation(new Point(x, y)); + mAMap.setCenter(lonLatPoint); + } + } + + @Override + public void setTouchPoiEnable(boolean touchPoiEnable) { + if (checkAMap()) { + mAMap.setTouchPoiEnable(touchPoiEnable); + } + } + + @Override + public void setTrafficEnable(boolean enable) { + if (checkAMap()) { + mAMap.setTraffic(enable); + } + } + + @Override + public void showBuildings(boolean enabled) { + if (checkAMap()) { + mAMap.showBuildings(enabled); + } + } + + @Override + public void showIndoorMap(boolean enable) { + if (checkAMap()) { +// mAMap.showIndoorMap( enable ); + } + } + + @Override + public void showMapText(boolean enable) { + if (checkAMap()) { + mAMap.showMapText(enable); + } + } + + @Override + public void stopAnimation() { + if (checkAMap()) { +// mAMap.stopAnimation(); + } + } + + @Override + public float getScalePerPixel() { + if (checkAMap()) { + return mAMap.getScalePerPixel(); + } + return 0; + } + + @Override + public void changeZoom(float zoom) { + Logger.d(TAG, "changeZoom %s", zoom); + if (checkAMap()) { + mAMap.setZoom((int) zoom); + } + } + + @Override + public float getZoomLevel() { + if (checkAMap()) { + try { + return mAMap.getZoom(); + } catch (Exception e) { + + } + } + return 0; + + + } + + @Override + public IMogoPolyline addPolyline(MogoPolylineOptions options) { + if (checkAMap()) { + PolylineOptions polylineOptions = ObjectUtils.fromMogo(options); + Logger.d(TAG, "addPolyline %s", polylineOptions.toString()); + if (polylineOptions == null) { + return null; + } + Polyline polyline = null; + if (polylineOptions.getLineWidth() > 0) { + polyline = mAMap.drawThickLine(polylineOptions); + } else { + polyline = mAMap.drawLine(polylineOptions); + } + return new AMapPolylineWrapper(polyline, options); + } + return null; + } + + @Override + public String getMapVersion() { + return MapAutoApi.INSTANCE.getSDKVersion(); + } + + private boolean checkAMap() { + mAMap = mMapView.getMapAutoViewHelper(); + sAMap = mAMap; + if (mAMap == null) { + Logger.e(TAG, "自研map实例为空,请检查"); + return false; + } + return true; + } + + @Override + public float getRoadWidth(double lon, double lat, float angle, boolean isGpsLocation, boolean isRTK) { + SinglePointRoadInfo singlePointRoadInfo = MapDataApi.INSTANCE.getSinglePointMatchRoad(lon, lat, angle, isGpsLocation, isRTK); + + return singlePointRoadInfo != null ? singlePointRoadInfo.getLaneWidth() : 0; + } + + private Context getContext() { + return mMapView.getContext(); + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java b/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java new file mode 100644 index 0000000000..f3ade54241 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/CustomMapApiBuilder.java @@ -0,0 +1,90 @@ +package com.mogo.map; + +import android.content.Context; +import android.util.Log; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.location.ALocationClient; +import com.mogo.map.location.IMogoLocationClient; +import com.mogo.map.search.GeocodeSearchClient; +import com.mogo.map.search.PoiSearchClient; +import com.mogo.map.search.geo.IMogoGeoSearch; +import com.mogo.map.search.poisearch.IMogoPoiSearch; +import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; +import com.mogo.map.search.traffic.IMogoTrafficSearch; +import com.mogo.map.uicontroller.AMapUIController; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.zhidaoauto.map.sdk.open.MapAutoApi; +import com.zhidaoauto.map.sdk.open.MapParams; +import com.zhidaoauto.map.sdk.open.view.MapAutoView; + +/** + * @author congtaowang + * @since 2020/12/9 + *

+ * 描述 + */ +@Route(path = MapApiPath.PATH) +public class CustomMapApiBuilder implements IMogoMapApiBuilder { + + private static final String TAG = "CustomMapApiBuilder"; + + @Override + public IMogoGeoSearch getGeoSearch(Context context) { + return new GeocodeSearchClient(context); + } + + @Override + public IMogoLocationClient getLocationClient(Context context) { + return new ALocationClient(context); + } + + @Override + public IMogoMapUIController getMapUIController() { + return AMapUIController.getInstance(); + } + + + @Override + public IMogoPoiSearch getPoiSearchClient(Context context, MogoPoiSearchQuery query) { + return new PoiSearchClient(context, query); + } + + @Override + public IMogoMapView getMapView(Context context) { + Log.d(TAG, "setDebugMode==true"); + MapParams mapParams = MapParams.Companion.init(); + mapParams.setDebugMode(false) + //todo 1-使用本地地图数据,0-使用在线地图数据 + //.setDataFileSource(1) + .setCoordinateType(MapParams.COORDINATETYPE_GCJ02) + .setPerspectiveMode(MapParams.MAP_PERSPECTIVE_3D) + // .setZoom( 20 ) + // .setPointToCenter( 0.734375f, 0.5f ) + //todo 2D模式下需要注意ADAS部分遮挡 + .setPointToCenter(0.5f, 0.5f) + .setStyleMode(MapParams.MAP_STYLE_VR); + + MapAutoApi.INSTANCE.init(context, mapParams); + MapAutoView mapAutoView = new MapAutoView(context); + //mapAutoView.registerRenderListener(l -> Log.i(TAG, "renderTime: " + l)); + IMogoMapView mapView = new AMapViewWrapper(mapAutoView); + return mapView; + } + + @Override + public IMogoTrafficSearch getTrafficSearch() { + return null; + } + + @Override + public void destroy() { + + } + + @Override + public void init(Context context) { + Logger.d(TAG, "init"); + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/Interrupter.java b/libraries/mogo-map/src/main/java/com/mogo/map/Interrupter.java new file mode 100644 index 0000000000..cd56fad840 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/Interrupter.java @@ -0,0 +1,16 @@ +package com.mogo.map; + +/** + * @author congtaowang + * @since 2020-04-10 + *

+ * 拦截器 + */ +public interface Interrupter { + + /** + * 是否拦截 + * @return true - 拦截, false - 不拦截 + */ + boolean interrupt(); +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MapCenterPoint.java b/libraries/mogo-map/src/main/java/com/mogo/map/MapCenterPoint.java new file mode 100644 index 0000000000..e396fa354d --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MapCenterPoint.java @@ -0,0 +1,19 @@ +package com.mogo.map; + +/** + * @author congtaowang + * @since 2020-04-10 + *

+ * 地图视图中心点 + */ +public class MapCenterPoint { + + public final double x; + public final double y; + + public MapCenterPoint( double x, double y ) { + this.x = x; + this.y = y; + } + +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MapStyleController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MapStyleController.java new file mode 100644 index 0000000000..5638199449 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MapStyleController.java @@ -0,0 +1,187 @@ +package com.mogo.map; + + +import com.mogo.commons.debug.DebugConfig; +import com.zhidaoauto.map.sdk.open.location.MogoLocation; + +import java.util.ArrayList; +import java.util.List; + +public +/** + * @author congtaowang + * @since 2020/12/25 + * + * 地图样式控制 + */ +class MapStyleController { + + + private static volatile MapStyleController sInstance; + + private boolean mIsInVrMode = false; + + private List< VrAreaFilter > mVrAreaFilters = new ArrayList<>(); + + private MapStyleController() { + mVrAreaFilters.add( new ShunYiArea() ); + mVrAreaFilters.add( new OCHArea() ); +// mVrAreaFilters.add( new HuiXinXiJieArea() ); + } + + public static MapStyleController getInstance() { + if ( sInstance == null ) { + synchronized ( MapStyleController.class ) { + if ( sInstance == null ) { + sInstance = new MapStyleController(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + private Object readResolve() { + // 阻止反序列化,必须实现 Serializable 接口 + return sInstance; + } + + public void onLocationChanged( MogoLocation location, IMapStyleAutoChangedListener listener ) { + if ( location == null ) { + return; + } + + // 网约车不自动切换vr、2d模式 + if ( DebugConfig.isOCHModule() ) { + return; + } + + boolean isInVrMode = false; + for ( VrAreaFilter vrAreaFilter : mVrAreaFilters ) { + if ( vrAreaFilter == null ) { + continue; + } + isInVrMode |= vrAreaFilter.isVrArea( location ); + if ( isInVrMode ) { + break; + } + } + if ( isInVrMode ) { + if ( !mIsInVrMode ) { + // 第一次进入 vr 区域,自动变为 vr 模式 + mIsInVrMode = true; + if ( listener != null ) { + listener.onStyleAutoChanged( true ); + } + } + } else { + if ( mIsInVrMode ) { + // 驶出 vr 区域,自动变为 2d 模式 + mIsInVrMode = false; + if ( listener != null ) { + listener.onStyleAutoChanged( false ); + } + } + } + } + + public interface IMapStyleAutoChangedListener { + void onStyleAutoChanged(boolean isVrMode); + } + + public interface VrAreaFilter { + default boolean isVrArea(MogoLocation location) { + if ( location == null ) { + return false; + } + return location.getLat() > getLeftBottomLat() && location.getLon() > getLeftBottomLon() + && location.getLat() < getRightTopLat() && location.getLon() < getRightTopLon(); + } + + double getLeftBottomLat(); + + double getLeftBottomLon(); + + double getRightTopLat(); + + double getRightTopLon(); + } + + public static class ShunYiArea implements VrAreaFilter { + + // 顺义一期高精地图范围(目前圈定了一个矩形区域,认为都是高精地图区域) + private final double leftBottomLat = 40.18728; + private final double leftBottomLon = 116.71194; + private final double rightTopLat = 40.20671; + private final double rightTopLon = 116.74804; + + @Override + public double getLeftBottomLat() { + return leftBottomLat; + } + + @Override + public double getLeftBottomLon() { + return leftBottomLon; + } + + @Override + public double getRightTopLat() { + return rightTopLat; + } + + @Override + public double getRightTopLon() { + return rightTopLon; + } + } + + public static class OCHArea implements VrAreaFilter { + + @Override + public double getLeftBottomLat() { + return 39.97645; + } + + @Override + public double getLeftBottomLon() { + return 116.41673; + } + + @Override + public double getRightTopLat() { + return 0; + } + + @Override + public double getRightTopLon() { + return 0; + } + } + + public static class HuiXinXiJieArea implements VrAreaFilter { + + @Override + public double getLeftBottomLat() { + return 39.96741320378243; + } + + @Override + public double getLeftBottomLon() { + return 116.41045709250723; + } + + @Override + public double getRightTopLat() { + return 39.98232698552779; + } + + @Override + public double getRightTopLon() { + return 116.41879656379113; + } + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/RoadCacheWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/RoadCacheWrapper.java new file mode 100644 index 0000000000..4f3a9c2497 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/RoadCacheWrapper.java @@ -0,0 +1,87 @@ +package com.mogo.map; + +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; + +import java.util.List; + +/** + * 道路数据缓存 + * + * @author tongchenfei + */ +public class RoadCacheWrapper { + private List road; + private double lastDistanceDiff; + private int roadLength = -1; + + private float laneWidth = -1; + + public RoadCacheWrapper(List road) { + setRoad(road); + } + + public List getRoad() { + return road; + } + + public void setRoad(List road) { + this.road = road; + if(road!=null) { + roadLength = road.size(); + } + } + + public double getLastDistanceDiff() { + return lastDistanceDiff; + } + + public void setLastDistanceDiff(double lastDistanceDiff) { + this.lastDistanceDiff = lastDistanceDiff; + } + + public double getLastLat(){ + if (roadLength != -1) { + return road.get(roadLength - 1).getLatitude(); + } + return 0; + } + + public double getLastLon(){ + if (roadLength != -1) { + return road.get(roadLength - 1).getLongitude(); + } + return 0; + } + + public float getLaneWidth() { + return laneWidth; + } + + public void setLaneWidth(float laneWidth) { + this.laneWidth = laneWidth; + } + + public boolean inCache(double lon, double lat) { + if (roadLength > 0) { + LonLatPoint start = road.get(0); + LonLatPoint end = road.get(roadLength - 1); + boolean latInRoad = false; + boolean lonInRoad = false; + if (start.getLatitude() > end.getLatitude()) { + latInRoad = lat <= start.getLatitude() && lat >= end.getLatitude(); + }else{ + latInRoad = lat >= start.getLatitude() && lat <= end.getLatitude(); + } + + if (start.getLongitude() > end.getLongitude()) { + lonInRoad = lon <= start.getLongitude() && lon >= end.getLongitude(); + }else{ + lonInRoad = lon >= start.getLongitude() && lon <= end.getLongitude(); + } + + return latInRoad && lonInRoad; + } + return false; + } + +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/Scene.java b/libraries/mogo-map/src/main/java/com/mogo/map/Scene.java new file mode 100644 index 0000000000..06b2ac8d91 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/Scene.java @@ -0,0 +1,55 @@ +package com.mogo.map; + +/** + * @author congtaowang + * @since 2020-04-10 + *

+ * 描述 + */ +public interface Scene { + + /** + * 普通场景 + */ + int COMMON = 0; + + /** + * 选点 + */ + int CHOOSE_POINT = 1; + + /** + * 导航 + */ + int NAVI = 2; + + /** + * 导航 vs 道路事件 + */ + int NAVI_WITH_ROAD_EVENT = 21; + + /** + * 巡航 + */ + int AIMLESS = 3; + + /** + * 巡航 vs 道路事件 + */ + int AIMLESS_WITH_ROAD_EVENT = 31; + + /** + * 路线规划 + */ + int CALCULATE_PATH = 4; + + /** + * 分类搜索 + */ + int CATEGORY_SEARCH = 5; + + /** + * V2X触发了预警场景 + */ + int CATEGORY_V2X_EVENT = 6; +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/location/ALocationClient.java b/libraries/mogo-map/src/main/java/com/mogo/map/location/ALocationClient.java new file mode 100644 index 0000000000..29dc726857 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/location/ALocationClient.java @@ -0,0 +1,150 @@ +package com.mogo.map.location; + +import android.content.Context; +import android.os.Trace; + +import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.location.LocationClient; +import com.zhidaoauto.map.sdk.open.location.LocationListener; +import com.zhidaoauto.map.sdk.open.location.RTKAutopilotLocationBean; + +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; +import java.util.Set; + +/** + * @author congtaowang + * @since 2019-12-19 + *

+ * 自研定位 + */ +public class ALocationClient implements IMogoLocationClient { + + private static final String TAG = "ALocationClient"; + + private MogoLocation mLastLocation; + private final LocationListener mListener = new InternalLocationListener(); + + private boolean mIsDestroyed = false; + + public ALocationClient( Context context ) { + mClient = new LocationClient( context ); + mClient.registerListener( mListener ); + mLastLocation = ObjectUtils.fromLocation( mClient.getLastKnownMogoLocation() ); + if ( mLastLocation == null ) { + mLastLocation = new MogoLocation(); + } + } + + private LocationClient mClient; + + @Override + public void start() { + start( 2_000L ); + } + + @Override + public void start( long interval ) { + if ( mIsDestroyed ) { + destroyWarming(); + return; + } + if ( mClient != null ) { + mClient.start(); + } + } + + @Override + public void stop() { + if ( mIsDestroyed ) { + destroyWarming(); + return; + } + if ( mClient != null && mClient.isAGpsStarted() ) { + mClient.stop(); + } + } + + @Override + public void addLocationListener( IMogoLocationListener listener ) { + // do not impl. + } + + @Override + public void removeLocationListener( IMogoLocationListener listener ) { + // do not impl. + } + + @Override + public MogoLocation getLastKnowLocation() { + if ( mIsDestroyed ) { + destroyWarming(); + return null; + } + return mLastLocation; + } + + @Override + public synchronized void destroy() { + mIsDestroyed = true; + if ( mClient != null ) { + mClient.unRegisterListener( mListener ); + mClient.destory(); + } + mClient = null; + mLastLocation = null; + } + + private class InternalLocationListener implements LocationListener { + + @Override + public void onLocationChanged( @NotNull com.zhidaoauto.map.sdk.open.location.MogoLocation location ) { + if ( mIsDestroyed ) { + destroyWarming(); + return; + } + if ( location == null || + location.getLat() == 0.0D || + location.getLon() == 0.0D ) { + return; + } + Trace.beginSection( "timer.onLocationChanged" ); + mLastLocation = ObjectUtils.fromLocation( location ); + UiThreadHandler.post(() -> CallerMapLocationListenerManager.INSTANCE.invokeMapLocationChangeListener(mLastLocation)); + + Set< IMogoLocationListener > listeners = MogoLocationListenerRegister.getInstance().getListeners(); + synchronized ( listeners ) { + Iterator< IMogoLocationListener > listenerIterator = listeners.iterator(); + while ( listenerIterator.hasNext() ) { + listenerIterator.next().onLocationChanged( mLastLocation.clone() ); + } + } + Trace.endSection(); + } + } + + private void destroyWarming() { + CallerLogger.INSTANCE.w( TAG, "location client has destroyed." ); + } + + @Override + public void updateLocation(Object locationToUpdate) { + if (locationToUpdate == null) { + return; + } + if (locationToUpdate instanceof MogoLocation) { + return; + } + if (locationToUpdate instanceof RTKAutopilotLocationBean) { + RTKAutopilotLocationBean current = (RTKAutopilotLocationBean) locationToUpdate; + if (mClient != null) { + mClient.updateRTKAutoPilotLocation(current); + } + } + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/marker/AMapInfoWindowAdapter.java b/libraries/mogo-map/src/main/java/com/mogo/map/marker/AMapInfoWindowAdapter.java new file mode 100644 index 0000000000..680dbc3eee --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/marker/AMapInfoWindowAdapter.java @@ -0,0 +1,44 @@ +package com.mogo.map.marker; + +import android.view.View; + +import com.mogo.map.AMapMarkerClickHandler; +import com.zhidaoauto.map.sdk.open.abs.marker.InfoWindowAdapter; +import com.zhidaoauto.map.sdk.open.marker.Marker; +import com.zhidaoauto.map.sdk.open.marker.OnInfoWindowClickListener; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * 自定义infowindow + */ +public final class AMapInfoWindowAdapter implements InfoWindowAdapter, OnInfoWindowClickListener { + + public View getInfoWindow( Marker marker ) { + if ( marker.getMObject() instanceof IMogoMarker ) { + IMogoMarker mogoMarker = ( ( IMogoMarker ) marker.getMObject() ); + IMogoInfoWindowAdapter delegate = mogoMarker.getInfoWindowAdapter(); + if ( delegate != null ) { + final View infoView = delegate.getInfoWindow( mogoMarker ); + marker.setOnInfoWindowClickListener( this ); + return infoView; + } + } + return null; + } + + @Override + public void onInfoWindowClick( @NotNull Marker marker ) { + AMapMarkerClickHandler.getInstance().handleMarkerClicked( marker ); + } + + @Nullable + @Override + public View getInfoContents( @Nullable Marker marker ) { + return null; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/marker/AMapMarkerWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/marker/AMapMarkerWrapper.java new file mode 100644 index 0000000000..58b3d4783a --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/marker/AMapMarkerWrapper.java @@ -0,0 +1,595 @@ +package com.mogo.map.marker; + +import android.graphics.Bitmap; +import android.graphics.Point; +import android.text.TextUtils; +import android.view.View; +import android.view.animation.Interpolator; + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.marker.anim.OnMarkerAnimationListener; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.abs.marker.MarkerAnimationListener; +import com.zhidaoauto.map.sdk.open.marker.Animation; +import com.zhidaoauto.map.sdk.open.marker.BitmapDescriptor; +import com.zhidaoauto.map.sdk.open.marker.BitmapDescriptorFactory; +import com.zhidaoauto.map.sdk.open.marker.Marker; +import com.zhidaoauto.map.sdk.open.marker.MarkerOptions; +import com.zhidaoauto.map.sdk.open.marker.MarkerScaleAnimation; +import com.zhidaoauto.map.sdk.open.marker.MarkerTranslateAnimation; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; +import com.zhidaoauto.map.sdk.open.tools.MapTools; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Observable; +import java.util.Observer; + +/** + * @author congtaowang + * @since 2019-12-18 + *

+ * 自研marker + */ +public class AMapMarkerWrapper implements IMogoMarker, Observer { + + private final String TAG = AMapMarkerWrapper.class.getName(); + + private Marker mMarker; + private Object mObject; + private IMogoMarkerClickListener mMogoMarkerClickListener; + private IMogoInfoWindowAdapter mMogoInfoWindowAdapter; + + private boolean mIsDestroy = false; + + private MogoMarkerOptions mMogoMarkerOptions; + private String mOwner; + + public AMapMarkerWrapper( Marker marker, MogoMarkerOptions mogoMarkerOptions ) { + this.mMarker = marker; + if ( marker != null ) { + // 设置自研 marker 的object对象为 IMogoMarker 实例。!!!! + marker.setMObject( this ); + if ( !TextUtils.isEmpty( mogoMarkerOptions.getAnchorColor() ) ) { + marker.setAnchorColor( mogoMarkerOptions.getAnchorColor() ); + } + MarkerWrapperClickHelper.getInstance().setMogoMarkerMap( marker.getId(), this ); + } + setObject( mogoMarkerOptions.getObject() ); + this.mMogoMarkerOptions = mogoMarkerOptions; + mMogoMarkerOptions.addObserver( this ); + } + + @Override + public void update( Observable o, Object arg ) { + if ( isDestroyed() ) { + return; + } + setMarkerOptions( mMogoMarkerOptions ); + } + + @Override + public void destroy() { + if ( mMogoMarkerOptions != null ) { + mMogoMarkerOptions.deleteObservers(); + mMogoMarkerOptions = null; + } + if ( mMarker != null ) { + mMarker.remove(); + mMarker.setMObject( null ); + mMarker.setOnInfoWindowClickListener( null ); + mMarker = null; + } + mMogoInfoWindowAdapter = null; + mMogoMarkerClickListener = null; + mObject = null; + mIsDestroy = true; + } + + @Override + public void remove() { + destroy(); + } + + @Override + public void hideInfoWindow() { + if ( mMarker != null ) { + mMarker.hideInfoWindow(); + } + } + + @Override + public void setAlpha( float alpha ) { + if ( mMarker != null ) { + mMarker.setAlpha( alpha ); + } + } + + @Override + public void setAnchor( float anchorU, float anchorV ) { + if ( mMarker != null ) { + mMarker.setAnchor( anchorU, anchorV ); + } + } + + @Override + public void setDraggable( boolean paramBoolean ) { + if ( mMarker != null ) { + mMarker.setDraggable( paramBoolean ); + } + } + + @Override + public void setIcon( Bitmap icon ) { + if ( icon == null || icon.isRecycled() ) { + return; + } + if ( mMarker != null ) { + mMarker.setIcon( icon ); + } + } + + @Override + public void setIcons( ArrayList< Bitmap > icons ) { + if ( icons == null || icons.isEmpty() ) { + return; + } + ArrayList< BitmapDescriptor > descriptors = new ArrayList<>(); + for ( Bitmap icon : icons ) { + if ( icon == null || icon.isRecycled() ) { + continue; + } + descriptors.add( BitmapDescriptorFactory.INSTANCE.fromBitmap( icon ) ); + } + if ( descriptors.isEmpty() ) { + return; + } + if ( mMarker != null ) { + mMarker.setIcons( descriptors ); + } + } + + @Override + public void setInfoWindowEnable( boolean enabled ) { + if ( mMarker != null ) { + if ( enabled ) { + mMarker.showInfoWindow(); + } else { + mMarker.hideInfoWindow(); + } + } + } + + @Override + public void setMarkerOptions( MogoMarkerOptions opt ) { + + final MarkerOptions options = ObjectUtils.fromMogo( opt ); + if ( options == null ) { + return; + } + if ( mMarker != null ) { + mMarker.setMarkerOptions( options ); + setObject( opt.getObject() ); + } + } + + @Override + public void setObject( Object object ) { + mObject = object; + } + + @Override + public Object getObject() { + return mObject; + } + + @Override + public void setPeriod( int period ) { + if ( mMarker != null ) { + mMarker.setPeriod( period ); + } + } + + @Override + public void setPosition( double lat, double lng ) { + if ( mMarker != null ) { + mMarker.setPosition( new LonLatPoint( lng, lat ) ); + } + } + + @Override + public MogoLatLng getPosition() { + if ( mMarker != null ) { + final LonLatPoint latLng = mMarker.getPosition(); + return ObjectUtils.fromAMap( latLng ); + } + return null; + } + + @Override + public void setRotateAngle( float rotate ) { + if ( mMarker != null ) { + mMarker.setRotateAngle( rotate ); + } + } + + @Override + public void setSnippet( String snippet ) { + if ( mMarker != null ) { + mMarker.setSnippet( snippet ); + } + } + + @Override + public void setTitle( String title ) { + if ( mMarker != null ) { + mMarker.setTitle( title ); + } + } + + @Override + public void setToTop() { + if ( mMarker != null ) { + mMarker.setToTop(); + } + } + + @Override + public void setVisible( boolean visible ) { + if ( mMarker != null ) { + mMarker.setVisible( visible ); + } + } + + @Override + public void setZIndex( int zIndex ) { + if ( mMarker != null ) { + mMarker.setZIndex( zIndex ); + } + } + + @Override + public void showInfoWindow() { + if ( mMarker != null ) { + mMarker.showInfoWindow(); + } + } + + @Override + public String getMarkerAssInfo() { + if ( mMarker != null ) { + return mMarker.getMarkeOptions().getAssInfo(); + } + return null; + } + + @Override + public void setOnMarkerClickListener( IMogoMarkerClickListener listener ) { + mMogoMarkerClickListener = listener; + } + + @Override + public IMogoMarkerClickListener getOnMarkerClickListener() { + return mMogoMarkerClickListener; + } + + @Override + public void setInfoWindowAdapter( IMogoInfoWindowAdapter adapter ) { + mMogoInfoWindowAdapter = adapter; + } + + @Override + public IMogoInfoWindowAdapter getInfoWindowAdapter() { + return mMogoInfoWindowAdapter; + } + + @Override + public void setMarkerIconView( IMogoMarkerIconViewCreator creator ) { + if ( creator != null ) { + View iconView = creator.createView( this ); + if ( iconView != null ) { + mMarker.setIcon( iconView ); + } + } + } + + @Override + public boolean isDestroyed() { + return mIsDestroy; + } + + @Override + public void setOwner( String mOwner ) { + this.mOwner = mOwner; + } + + @Override + public String getOwner() { + if ( mOwner != null ) { + return mOwner; + } + if ( mMogoMarkerOptions != null ) { + return mMogoMarkerOptions.getOwner(); + } + return null; + } + + @Override + public void setPositionByPixels( Point position ) { + if ( mMarker != null ) { + mMarker.setPosition( MapTools.INSTANCE.fromScreenLocation( position ) ); + } + } + + public Marker getMarker() { + return mMarker; + } + + @Override + public MogoMarkerOptions getMogoMarkerOptions() { + return mMogoMarkerOptions; + } + + @Override + public void startScaleAnimation( float fromX, float toX, float fromY, float toY, int duration, Interpolator interpolator ) { + if ( isDestroyed() ) { + return; + } + startScaleAnimation( fromX, toX, fromY, toY, duration, interpolator, null ); + } + + @Override + public void startScaleAnimation(float fromX, float toX, float fromY, float toY, int duration, Interpolator interpolator, final OnMarkerAnimationListener listener ) { + if ( isDestroyed() ) { + return; + } + + MarkerScaleAnimation animationScale = new MarkerScaleAnimation( fromX, toX ); + animationScale.setDuration( duration ); +// animationScale.setFillMode(Animation.FILL_MODE_FORWARDS); +// animationScale.setInterpolator(interpolator); + animationScale.setAnimationListener( new MarkerAnimationListener() { + @Override + public void onAnimationEnd( @NotNull Animation animation ) { + if ( isDestroyed() ) { + return; + } + if ( listener != null ) { + listener.onAnimEnd(); + } + } + + @Override + public void onAnimationRepeat( @NotNull Animation animation ) { + + } + + @Override + public void onAnimationStart( @NotNull Animation animation ) { + if ( isDestroyed() ) { + return; + } + if ( listener != null ) { + listener.onAnimStart(); + } + } + } ); + + mMarker.setMarkerScaleAnimation( animationScale ); + mMarker.startAnimation(); + } + + @Override + public void startJumpAnimation(float high, long duration, Interpolator interpolator, final OnMarkerAnimationListener listener ) { + if ( isDestroyed() || high <= 0.0f || interpolator == null || duration < 0 ) { + return; + } + try { + final LonLatPoint latLng = ObjectUtils.fromMogo( getPosition() ); +// Point point = AMapWrapper.getAMap().getProjection().toScreenLocation(latLng); +// point.y -= WindowUtils.dip2px(AbsMogoApplication.getApp(), high); +// LatLng target = AMapWrapper.getAMap().getProjection().fromScreenLocation(point); + //使用TranslateAnimation,填写一个需要移动的目标点 + MarkerTranslateAnimation animation = new MarkerTranslateAnimation( latLng ); +// animation.setInterpolator(interpolator); + animation.setAnimationListener( new MarkerAnimationListener() { + @Override + public void onAnimationEnd( @NotNull Animation animation ) { + if ( isDestroyed() ) { + return; + } + if ( listener != null ) { + listener.onAnimEnd(); + } + } + + @Override + public void onAnimationRepeat( @NotNull Animation animation ) { + + } + + @Override + public void onAnimationStart( @NotNull Animation animation ) { + if ( isDestroyed() ) { + return; + } + if ( listener != null ) { + listener.onAnimStart(); + } + } + } ); + //整个移动所需要的时间 + animation.setDuration( duration * 1000 ); + //设置动画 + mMarker.setTranslateAnimation( animation ); + mMarker.startAnimation(); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + } + + @Override + public void setClickable( boolean clickable ) { + if ( mMarker != null ) { + mMarker.setClickable( clickable ); + } + } + + @Override + public void startSmooth( List< MogoLatLng > points, int duration ) { + startSmoothInMs( points, duration * 1000 ); + } + + @Override + public void startSmoothInMs( List< MogoLatLng > points, long duration ) { + if ( isDestroyed() ) { + return; + } + + if ( mMarker == null ) { + return; + } + + if ( points == null || points.isEmpty() ) { + return; + } + + ArrayList< LonLatPoint > newPoints = new ArrayList<>(); + for ( int i = 0; i < points.size(); i++ ) { + LonLatPoint point = ObjectUtils.fromMogo( points.get( i ) ); + if ( point == null ) { + continue; + } + newPoints.add( point ); + } + if ( newPoints.isEmpty() ) { + return; + } + + mMarker.startSmooth( newPoints, ( int ) duration ); + } + + @Override + public void startScaleAnimationWithAlpha( float fromX, float toX, float fromY, float toY, float fromAlpha, float toAlpha, int duration, Interpolator interpolator, OnMarkerAnimationListener listener ) { + + } + + @Override + public boolean isInfoWindowShowing() { + return mMarker.isInfoWindowShown(); + } + + @Override + public void setGps( boolean isGps ) { + if ( mMarker != null ) { + mMarker.setGps( isGps ); + } + } + + @Override + public String use3DResource( int model3D ) { + try { + mMarker.marker3DIcon( model3D ); + return mMarker.getMarkeOptions().getMarkerIconName(); + } catch ( Exception e ) { + Logger.e( TAG, e, "use3DResource" ); + } + return null; + } + + @Override + public void use3DResource( String resName ) { + try { + mMarker.getMarkeOptions().setVrIcon( true ); + mMarker.setMarkerOptions( mMarker.getMarkeOptions().setMarkerIconName( resName ) ); + } catch ( Exception e ) { + Logger.e( TAG, e, "use3DResource" ); + } + } + + @Override + public void use2DResource( String resName ) { + try { + mMarker.getMarkeOptions().setVrIcon( false ); + mMarker.setMarkerOptions( mMarker.getMarkeOptions().setMarkerIconName( resName ) ); + } catch ( Exception e ) { + Logger.e( TAG, e, "use3DResource" ); + } + } + + private String mLastAnchorColor = ""; + + @Override + public void setAnchorColor( String anchorColor ) { + if ( TextUtils.equals( mLastAnchorColor, anchorColor ) ) { + return; + } + if (mMogoMarkerOptions != null) { + mMogoMarkerOptions.anchorColor( anchorColor ); + } + + if (mMarker != null) { + mMarker.setAnchorColor( anchorColor ); + } + mLastAnchorColor = anchorColor; + } + + @Override + public void updateInfoWindowView( View view ) { + try { + mMarker.setInfoWindowView( view ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + @Override + public void updateInfoWindowView( String viewResName ) { + try { + mMarker.setMarkerInfoName( viewResName ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + @Override + public void setInfoWindowOffset( int offsetX, int offsetY ) { + try { + mMarker.setInfoWindowOffset( offsetX, offsetY ); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + + @Override + public void addDynamicAnchorPosition( MogoLatLng latLng, float angle, long duration ) { + mMarker.addDynamicAnchorPostion( new LonLatPoint( latLng.lon, latLng.lat, angle ), System.currentTimeMillis(), ( int ) duration); + } + + @Override + public String getMarkerResName() { + if ( mMarker != null ) { + try { + return mMarker.getMarkeOptions().getMarkerIconName(); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + return ""; + } + + @Override + public String getMarkerInfoResName() { + if ( mMarker != null ) { + try { + return mMarker.getMarkeOptions().getMarkerInfoName(); + } catch ( Exception e ) { + e.printStackTrace(); + } + } + return ""; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/marker/MarkerWrapperClickHelper.java b/libraries/mogo-map/src/main/java/com/mogo/map/marker/MarkerWrapperClickHelper.java new file mode 100644 index 0000000000..a4e47349f3 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/marker/MarkerWrapperClickHelper.java @@ -0,0 +1,41 @@ +package com.mogo.map.marker; + +import java.util.HashMap; +import java.util.Map; + +public class MarkerWrapperClickHelper { + + private volatile static MarkerWrapperClickHelper markerWrapperClickHelper; + + private final Map mogoMarkerMap = new HashMap<>(); + + private MarkerWrapperClickHelper(){ + + } + + public void setMogoMarkerMap(String id,IMogoMarker iMogoMarker){ + if(isStaticMarker(id)){ + return; + } + this.mogoMarkerMap.put(id,iMogoMarker); + } + + public Map getMogoMarkerMap() { + return mogoMarkerMap; + } + + public static MarkerWrapperClickHelper getInstance(){ + if (markerWrapperClickHelper == null) { + synchronized (MarkerWrapperClickHelper.class) { + if (markerWrapperClickHelper == null) { + markerWrapperClickHelper = new MarkerWrapperClickHelper(); + } + } + } + return markerWrapperClickHelper; + } + + public boolean isStaticMarker(String id){ + return id.contains("traffic"); + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/overlay/AMapPolylineWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/AMapPolylineWrapper.java new file mode 100644 index 0000000000..df69003403 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/overlay/AMapPolylineWrapper.java @@ -0,0 +1,195 @@ +package com.mogo.map.overlay; + + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.poyline.Polyline; +import com.zhidaoauto.map.sdk.open.poyline.PolylineOptions; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2020-03-10 + *

+ * 描述 + */ +public class AMapPolylineWrapper implements IMogoPolyline { + + private Polyline mPolyline; + private MogoPolylineOptions mOptions; + private boolean mIsDestroyed = false; + + public AMapPolylineWrapper( Polyline mPolyline, + MogoPolylineOptions mOptions ) { + this.mPolyline = mPolyline; + this.mOptions = mOptions; + } + + @Override + public void destroy() { + remove(); + } + + @Override + public void remove() { + if ( mPolyline != null ) { + mPolyline.remove(); + } + mIsDestroyed = true; + } + + @Override + public String getId() { + if ( mPolyline != null ) { + return mPolyline.getId(); + } + return null; + } + + @Override + public void setPoints( List< MogoLatLng > lonLats ) { + if ( lonLats == null || lonLats.isEmpty() ) { + mPolyline.setPoints( new ArrayList() ); + return; + } + ArrayList< LonLatPoint > points = new ArrayList<>(); + for ( MogoLatLng lonLat : lonLats ) { + LonLatPoint latLng = ObjectUtils.fromMogo( lonLat ); + if ( latLng == null ) { + continue; + } + points.add( latLng ); + } + mPolyline.setPoints( points ); + } + + @Override + public List< MogoLatLng > getPoints() { + if ( mPolyline == null ) { + return null; + } + ArrayList< MogoLatLng > lonLats = new ArrayList<>(); + List points = mPolyline.getPoints(); + if ( points != null ) { + for ( LonLatPoint latLng : points ) { + MogoLatLng lonLat = ObjectUtils.fromAMap( latLng ); + if ( lonLat == null ) { + continue; + } + lonLats.add( lonLat ); + } + } + return lonLats; + } + + @Override + public void setGeodesic( boolean draw ) { + if ( mPolyline != null ) { + mPolyline.setGeodesic( draw ); + } + } + + @Override + public boolean isGeodesic() { + return mPolyline == null ? false : mPolyline.isGeodesic(); + } + + @Override + public void setDottedLine( boolean dottedLine ) { + if ( mPolyline != null ) { + mPolyline.setDottedLine( dottedLine ); + } + } + + @Override + public boolean isDottedLine() { + return mPolyline == null ? false : mPolyline.isDottedLine(); + } + + @Override + public void setWidth( float width ) { + if ( mPolyline != null ) { + mPolyline.setWidth( width ); + } + } + + @Override + public float getWidth() { + if ( mPolyline != null ) { + return mPolyline.getWidth(); + } + return 0; + } + + @Override + public void setColor( int color ) { + if ( mPolyline != null ) { + mPolyline.setColor( color ); + } + } + + @Override + public int getColor() { + if ( mPolyline != null ) { + return mPolyline.getColor(); + } + return 0; + } + + @Override + public void setZIndex( float zIndex ) { + if ( mPolyline != null ) { + mPolyline.setZIndex( zIndex ); + } + } + + @Override + public float getZIndex() { + if ( mPolyline != null ) { + return mPolyline.getZIndex(); + } + return 0; + } + + @Override + public void setVisible( boolean visible ) { + if ( mPolyline != null ) { + mPolyline.setVisible( visible ); + } + } + + @Override + public boolean isVisible() { + if ( mPolyline != null ) { + return mPolyline.isVisible(); + } + return false; + } + + @Override + public void setTransparency( float transparency ) { + if ( mPolyline != null ) { + mPolyline.setTransparency( transparency ); + } + } + + @Override + public void setOption( MogoPolylineOptions option ) { + PolylineOptions target = ObjectUtils.fromMogo( option ); + if ( target == null ) { + return; + } + mOptions = option; + if ( mPolyline != null ) { + mPolyline.setOption( target ); + } + } + + @Override + public boolean isDestroyed() { + return false; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/search/GeocodeSearchClient.java b/libraries/mogo-map/src/main/java/com/mogo/map/search/GeocodeSearchClient.java new file mode 100644 index 0000000000..b1e86482f0 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/search/GeocodeSearchClient.java @@ -0,0 +1,109 @@ +package com.mogo.map.search; + +import android.content.Context; + +import com.mogo.map.exception.MogoMapException; +import com.mogo.map.search.geo.IMogoGeoSearch; +import com.mogo.map.search.geo.IMogoGeoSearchListener; +import com.mogo.map.search.geo.MogoGeocodeAddress; +import com.mogo.map.search.geo.MogoRegeocodeAddress; +import com.mogo.map.search.geo.query.MogoGeocodeQuery; +import com.mogo.map.search.geo.query.MogoRegeocodeQuery; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.query.GeocodeAddress; +import com.zhidaoauto.map.sdk.open.query.GeocodeResult; +import com.zhidaoauto.map.sdk.open.query.GeocodeSearch; +import com.zhidaoauto.map.sdk.open.query.OnGeocodeSearchListener; +import com.zhidaoauto.map.sdk.open.query.RegeocodeAddress; +import com.zhidaoauto.map.sdk.open.query.RegeocodeResult; +import com.zhidaoauto.map.sdk.open.query.RegeocodeQuery; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-19 + *

+ * 地理编码/逆地理编码自研实现 + */ +public class GeocodeSearchClient implements IMogoGeoSearch, OnGeocodeSearchListener { + + private GeocodeSearch mClient; + private IMogoGeoSearchListener mListener; + + public GeocodeSearchClient( Context context ) { + mClient = new GeocodeSearch( context ); + mClient.setOnGeocodeSearchListener( this ); + } + + @Override + public void setGeoSearchListener( IMogoGeoSearchListener listener ) { + mListener = listener; + } + + @Override + public MogoRegeocodeAddress getFromLocation( MogoRegeocodeQuery query ) throws MogoMapException { + try { + RegeocodeQuery regeocodeQuery = ObjectUtils.fromMogo(query); + RegeocodeAddress regeocodeAddress = mClient.getFromLocation(regeocodeQuery); + return ObjectUtils.fromAMap( regeocodeAddress ); + } catch ( Exception e ) { + throw new MogoMapException( e ); + } + } + + @Override + public List< MogoGeocodeAddress > getFromLocationName( MogoGeocodeQuery query ) throws MogoMapException { + try { + List geocodeAddress = mClient.getFromLocationName( ObjectUtils.fromMogo( query ) ); + if ( geocodeAddress != null ) { + List< MogoGeocodeAddress > mogoGeocodeAddresses = new ArrayList<>(); + for ( GeocodeAddress address : geocodeAddress ) { + MogoGeocodeAddress mogoGeocodeAddress = ObjectUtils.fromAMap( address ); + if ( mogoGeocodeAddress != null ) { + mogoGeocodeAddresses.add( mogoGeocodeAddress ); + } + } + return mogoGeocodeAddresses; + } + return new ArrayList<>(); + } catch ( Exception e ) { + throw new MogoMapException( e ); + } + } + + @Override + public void getFromLocationAsyn( MogoRegeocodeQuery query ) { + if ( mClient != null ) { + mClient.getFromLocationAsyn( ObjectUtils.fromMogo( query ) ); + } + } + + @Override + public void getFromLocationNameAsyn( MogoGeocodeQuery query ) { + if ( mClient != null ) { + mClient.getFromLocationNameAsyn( ObjectUtils.fromMogo( query ) ); + } + } + + @Override + public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i ) { + if ( mListener != null ) { + mListener.onRegeocodeSearched( ObjectUtils.fromAMap( regeocodeResult ) ); + } + } + + @Override + public void onGeocodeSearched(GeocodeResult geocodeResult, int i ) { + if ( mListener != null ) { + mListener.onGeocodeSearched( ObjectUtils.fromAMap( geocodeResult ) ); + } + } + + @Override + public void destroy() { + mClient = null; + mListener = null; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/search/InputtipsSearch.java b/libraries/mogo-map/src/main/java/com/mogo/map/search/InputtipsSearch.java new file mode 100644 index 0000000000..07084ebddc --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/search/InputtipsSearch.java @@ -0,0 +1,87 @@ +package com.mogo.map.search; + +import android.content.Context; + +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.search.inputtips.IMogoInputtipsListener; +import com.mogo.map.search.inputtips.IMogoInputtipsSearch; +import com.mogo.map.search.inputtips.MogoTip; +import com.mogo.map.search.inputtips.query.MogoInputtipsQuery; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.query.Inputtips; +import com.zhidaoauto.map.sdk.open.query.InputtipsListener; +import com.zhidaoauto.map.sdk.open.query.InputtipsQuery; +import com.zhidaoauto.map.sdk.open.query.Tip; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-20 + *

+ * 自研地图 inputtips搜索实现 + */ +public class InputtipsSearch implements IMogoInputtipsSearch, InputtipsListener { + + private static final String TAG = "InputtipsSearch"; + + private Inputtips mClient; + private InputtipsQuery mQuery; + private IMogoInputtipsListener mListener; + + public InputtipsSearch(Context context, MogoInputtipsQuery query) { + mQuery = ObjectUtils.fromMogo(query); + mClient = new Inputtips(context, mQuery); + mClient.setInputtipsListener(this); + } + + @Override + public void setQuery(MogoInputtipsQuery query) { + this.mQuery = ObjectUtils.fromMogo(query); + } + + @Override + public void setInputtipsListener(IMogoInputtipsListener listener) { + this.mListener = listener; + } + + @Override + public void requestInputtipsAsyn() { + if (mClient != null) { + mClient.requestInputtipsAsyn(); + } + } + + @Override + public void onGetInputtips(List list, int i) { + if (i == 0) { + if (mListener != null) { + mListener.onGetInputtips(getResult(list)); + } + } else { + Logger.e(TAG, "errorcode = " + i); + } + } + + private List getResult(List tips) { + List mogoTips = new ArrayList<>(); + if (tips != null) { + //只添加有坐标的结果 + for (Tip tip : tips) { + MogoTip mogoTip = ObjectUtils.fromAMap(tip); + if (mogoTip != null && mogoTip.getPoint() != null) { + mogoTips.add(mogoTip); + } + } + } + return mogoTips; + } + + @Override + public void destroy() { + mClient = null; + mListener = null; + mQuery = null; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/search/PoiSearchClient.java b/libraries/mogo-map/src/main/java/com/mogo/map/search/PoiSearchClient.java new file mode 100644 index 0000000000..8c3971f6ad --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/search/PoiSearchClient.java @@ -0,0 +1,142 @@ +package com.mogo.map.search; + +import android.content.Context; + +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.map.exception.MogoMapException; +import com.mogo.map.search.geo.MogoPoiItem; +import com.mogo.map.search.poisearch.IMogoPoiSearch; +import com.mogo.map.search.poisearch.IMogoPoiSearchListener; +import com.mogo.map.search.poisearch.MogoPoiResult; +import com.mogo.map.search.poisearch.MogoSearchBound; +import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; +import com.mogo.map.utils.ObjectUtils; +import com.zhidaoauto.map.sdk.open.query.OnPoiSearchListener; +import com.zhidaoauto.map.sdk.open.query.PoiItem; +import com.zhidaoauto.map.sdk.open.query.PoiSearch; +import com.zhidaoauto.map.sdk.open.query.PoiSearchResult; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * poi搜索自研实现 + *

+ * 错误码对照表:https://lbs.amap.com/api/android-sdk/guide/map-tools/error-code + */ +public class PoiSearchClient implements IMogoPoiSearch, OnPoiSearchListener { + + private static final String TAG = "PoiSearchClient"; + + private MogoPoiSearchQuery mQuery; + private PoiSearch mClient; + private IMogoPoiSearchListener mListener; + private MogoSearchBound mBound; + + public PoiSearchClient( Context context, MogoPoiSearchQuery query ) { + try { + mQuery = query; + mClient = new PoiSearch( context, ObjectUtils.fromMogo( mQuery ) ); + mClient.setOnPoiSearchListener( this ); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void setPoiSearchListener( IMogoPoiSearchListener listener ) { + mListener = listener; + } + + @Override + public void searchPOIAsyn() { + if ( mClient != null ) { + mClient.searchPOIAsyn(); + } + } + + @Override + public MogoPoiResult searchPOI() throws MogoMapException { + if ( mClient != null ) { + try { + PoiSearchResult search = mClient.searchPOI(); + return ObjectUtils.fromAMap( search ); + } catch ( Exception e ) { + throw new MogoMapException( e ); + } + } + return null; + } + + @Override + public void setQuery( MogoPoiSearchQuery query ) { + mQuery = query; + if ( mClient != null ) { + mClient.setQuery( ObjectUtils.fromMogo( mQuery ) ); + } + } + + @Override + public MogoPoiItem searchPOIId( String poiId ) throws MogoMapException { + if ( mClient != null ) { + try { + PoiItem poiItem = mClient.searchPOIId( poiId ); + return ObjectUtils.fromAMap( poiItem ); + } catch ( Exception e ) { + throw new MogoMapException( e ); + } + } + return null; + } + + @Override + public void searchPOIIdAsyn( String poiId ) { + if ( mClient != null ) { + mClient.searchPOIIdAsyn( poiId ); + } + } + + @Override + public void setBound( MogoSearchBound bound ) { + mBound = bound; + if ( mClient != null ) { + mClient.setBound( ObjectUtils.fromMogo( mBound ) ); + } + } + + @Override + public void onPoiSearched( PoiSearchResult poiResult, int errorCode ) { + if ( errorCode != 0 ) { + Logger.e( TAG, "errorcode is %d", errorCode ); + } + if ( mListener != null ) { + mListener.onPoiSearched( ObjectUtils.fromAMap( poiResult ), errorCode ); + } + } + + @Override + public void onPoiItemSearched( PoiItem poiItem, int errorCode ) { + if ( errorCode != 0 ) { + Logger.e( TAG, "errorcode is %d", errorCode ); + } + if ( mListener != null ) { + mListener.onPoiItemSearched( ObjectUtils.fromAMap( poiItem ), errorCode ); + } + } + + @Override + public void destroy() { + mQuery = null; + mClient = null; + mListener = null; + mBound = null; + } + + @Override + public void onPoiCategorySearched(@Nullable List list, int errorCode) { + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java new file mode 100644 index 0000000000..bc67adf11f --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java @@ -0,0 +1,386 @@ +package com.mogo.map.uicontroller; + +import android.graphics.Point; +import android.graphics.Rect; +import android.location.Location; +import android.view.View; + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.zhidaoauto.map.sdk.open.MapAutoApi; + +import org.json.JSONObject; + +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +/** + * @author congtaowang + * @since 2019-12-26 + *

+ * 描述 + */ +public class AMapUIController implements IMogoMapUIController { + + private static final String TAG = "AMapUIController"; + + private static volatile AMapUIController sInstance; + + private IMogoMapUIController mClient; + + private AMapUIController() { + } + + public static AMapUIController getInstance() { + if (sInstance == null) { + synchronized (AMapUIController.class) { + if (sInstance == null) { + sInstance = new AMapUIController(); + } + } + } + return sInstance; + } + + public void initClient(IMogoMapUIController client) { + this.mClient = client; + } + + public synchronized void release() { + sInstance = null; + } + + @Override + public void setTrafficEnabled(boolean visible) { + if (mClient != null) { + mClient.setTrafficEnabled(visible); + } + } + + @Override + public MapControlResult changeZoom(boolean zoom) { + if (mClient != null) { + return mClient.changeZoom(zoom); + } + return MapControlResult.ERROR; + } + + @Override + public MapControlResult changeZoom(float zoom) { + if (mClient != null) { + return mClient.changeZoom(zoom); + } + return MapControlResult.ERROR; + } + + @Override + public void changeMapMode(EnumMapUI mode) { + if (mClient != null) { + mClient.changeMapMode(mode); + } + } + + @Override + public void changeMapVisualAngle(VisualAngleMode angelMode, MogoLatLng mogoLatLng) { + if (mClient != null) { + mClient.changeMapVisualAngle(angelMode, mogoLatLng); + } + } + + @Override + public VisualAngleMode getCurrentMapVisualAngle() { + if (mClient != null) { + return mClient.getCurrentMapVisualAngle(); + } + return null; + } + + @Override + public void moveToCenter(MogoLatLng latLng, boolean animate) { + if (mClient != null) { + mClient.moveToCenter(latLng, animate); + } + } + + @Override + public void showMyLocation(boolean visible) { + if (mClient != null) { + mClient.showMyLocation(visible); + } + } + + @Override + public void showMyLocation(View view) { + if (mClient != null) { + mClient.showMyLocation(view); + } + } + + @Override + public void recoverLockMode() { + if (mClient != null) { + mClient.recoverLockMode(); + } + } + + @Override + public void loseLockMode() { + if (mClient != null) { + mClient.loseLockMode(); + } + } + + @Override + public void setLockZoom(int var1) { + if (mClient != null) { + mClient.setLockZoom(var1); + } + } + + @Override + public void displayOverview(Rect bounds) { + if (mClient != null) { + mClient.displayOverview(bounds); + } + } + + @Override + public float getScalePerPixel() { + if (mClient != null) { + return mClient.getScalePerPixel(); + } + return 0; + } + + @Override + public float getZoomLevel() { + if (mClient != null) { + return mClient.getZoomLevel(); + } + return 0; + } + + @Override + public float getRoadWidth(double lon, double lat, float angle, boolean isGpsLocation, boolean isRTK) { + if (mClient != null) { + return mClient.getRoadWidth(lon, lat, angle, isGpsLocation, isRTK); + } + return 0; + } + + @Override + public MogoLatLng getCameraNorthEastPosition() { + if (mClient != null) { + return mClient.getCameraNorthEastPosition(); + } + return null; + } + + @Override + public MogoLatLng getCameraSouthWestPosition() { + if (mClient != null) { + return mClient.getCameraSouthWestPosition(); + } + return null; + } + + @Override + public MogoLatLng getWindowCenterLocation() { + if (mClient != null) { + return mClient.getWindowCenterLocation(); + } + return null; + } + + @Override + public void setPointToCenter(double mapCenterX, double mapCenterY) { + if (mClient != null) { + mClient.setPointToCenter(mapCenterX, mapCenterY); + } + } + + @Override + public Point getLocationPointInScreen(MogoLatLng latLng) { + if (mClient != null) { + return mClient.getLocationPointInScreen(latLng); + } + return null; + } + + @Override + public MogoLatLng getLocationMogoLatLngInScreen(Point point) { + if (mClient != null) { + return mClient.getLocationMogoLatLngInScreen(point); + } + return null; + } + + + @Override + public void setRenderFps(int fps) { + if (mClient != null) { + mClient.setRenderFps(fps); + } + } + + @Override + public void showBounds(String tag, MogoLatLng carPosition, List lonLats, Rect bound, boolean lockCarPosition) { + if (mClient != null) { + mClient.showBounds(tag, carPosition, lonLats, bound, lockCarPosition); + } + } + + @Override + public void forceRender() { + if (mClient != null) { + mClient.forceRender(); + } + } + + @Override + public float calculateLineDistance(MogoLatLng p1, MogoLatLng p2) throws Exception { + if (mClient != null) { + return mClient.calculateLineDistance(p1, p2); + } + return 0; + } + + @Override + public EnumMapUI getCurrentUiMode() { + if (mClient != null) { + return mClient.getCurrentUiMode(); + } + return null; + } + + @Override + public void changeMyLocation(Location location) { + if (mClient != null) { + mClient.changeMyLocation(location); + } + } + + @Override + public boolean isCarLocked() { + if (mClient != null) { + return mClient.isCarLocked(); + } + return false; + } + + @Override + public void setCarCursorOption(CarCursorOption option) { + if (mClient != null) { + mClient.setCarCursorOption(option); + } + } + + @Override + public MapCameraPosition getMapCameraPosition() { + if (mClient != null) { + return mClient.getMapCameraPosition(); + } + return null; + } + + @Override + public void changeBearing(float bearing) { + if (mClient != null) { + mClient.changeBearing(bearing); + } + } + + @Override + public void changeMapViewAngle(int type) { + if (mClient != null) { + mClient.changeMapViewAngle(type); + } + } + + @Override + public void changeCurrentIcon(int iconId) { + if (mClient != null) { + mClient.changeCurrentIcon(iconId); + } + } + + @Override + public long getTileId(double lon, double lat) { + return MapAutoApi.INSTANCE.getTileID(lon, lat, 13); // 13为默认获取瓦片层级级别 + } + + @Override + public int getSpeedLimmit(double lon, double lat, float angle) { + return mClient.getSpeedLimmit(lon, lat, angle); + } + + @Override + public void emphasizeMyLocation() { + + } + + @Override + public void rtkEnable(boolean enable) { + if (mClient != null) { + mClient.rtkEnable(enable); + } + } + + @Override + public void syncLocation2Map(JSONObject data) { + if (mClient != null) { + mClient.syncLocation2Map(data); + } + } + + @Override + public void syncLocation2Map(MessagePad.GnssInfo gnssInfo) { + if (mClient != null) { + mClient.syncLocation2Map(gnssInfo); + } + } + + @Override + public void openVrMode(boolean zoomGestureEnable) { + if (mClient != null) { + mClient.openVrMode(zoomGestureEnable); + } + } + + @Override + public double[] matchRoad(String id, double lon, double lat, double angle, boolean isGpsLocation, boolean isRTK) { + if (mClient != null) { + return mClient.matchRoad(id, lon, lat, angle, isGpsLocation, isRTK); + } + return null; + } + + @Override + public String getMarkerInfoResName(String speedVal) { + if (mClient != null) { + return mClient.getMarkerInfoResName(speedVal); + } + return null; + } + + @Override + public void setMarkerInfoResName(String speedVal, String val) { + if (mClient != null) { + mClient.setMarkerInfoResName(speedVal, val); + } + } + + @Override + public void clearRoadCacheById(String id) { + if (mClient != null) { + mClient.clearRoadCacheById(id); + } + } + + @Override + public void setMapDAngle(float angle) { + if (mClient != null) { + mClient.setMapDAngle(angle); + } + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java new file mode 100644 index 0000000000..2c351ff7d3 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/MogoMapUtils.java @@ -0,0 +1,135 @@ +package com.mogo.map.utils; + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.map.exception.MogoMapException; +import com.zhidaoauto.map.sdk.open.camera.LatLngBounds; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; + +import java.util.List; + +/** + * @author congtaowang + * @since 2020-03-04 + *

+ * 地图工具类 + */ +public class MogoMapUtils { + + private static final String TAG = "MogoMapUtils"; + + public static LatLngBounds getLatLngBounds(MogoLatLng carPosition, List< MogoLatLng > lonLats, boolean lockCarPosition ) throws Exception { + + if ( lonLats == null || lonLats.isEmpty() ) { + throw new MogoMapException( "经纬度不能为null或空集合" ); + } + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + for ( MogoLatLng lonLat : lonLats ) { + builder.include( ObjectUtils.fromMogo( lonLat ) ); + } + if ( carPosition != null && !lockCarPosition ) { + builder.include( ObjectUtils.fromMogo( carPosition ) ); + } + LatLngBounds latLngBounds = builder.build(); + if ( !lockCarPosition ) { + return latLngBounds; + } + + if ( carPosition == null ) { + throw new MogoMapException( "自车位置经纬度信息不能为空" ); + } + + if ( latLngBounds.getNortheast() == null && latLngBounds.getSouthwest() == null ) { + return null; + } + + double south = 0.0; + double west = 0.0; + + double east = 0.0; + double north = 0.0; + + double dLat = 0.0; + double dLon = 0.0; + + if ( latLngBounds.getNortheast() == null ) { + dLat = Math.abs( carPosition.lat - latLngBounds.getSouthwest().getLatitude() ); + dLon = Math.abs( carPosition.lon - latLngBounds.getSouthwest().getLongitude() ); + } else if ( latLngBounds.getSouthwest() == null ) { + dLat = Math.abs( carPosition.lat - latLngBounds.getNortheast().getLatitude() ); + dLon = Math.abs( carPosition.lon - latLngBounds.getNortheast().getLongitude() ); + } else { + final double dLat1 = Math.abs( carPosition.lat - latLngBounds.getSouthwest().getLatitude() ); + final double dLon1 = Math.abs( carPosition.lon - latLngBounds.getSouthwest().getLongitude() ); + final double dLat2 = Math.abs( carPosition.lat - latLngBounds.getNortheast().getLatitude() ); + final double dLon2 = Math.abs( carPosition.lon - latLngBounds.getNortheast().getLongitude() ); + dLat = dLat1 > dLat2 ? dLat1 : dLat2; + dLon = dLon1 > dLon2 ? dLon1 : dLon2; + } + + west = carPosition.lat - dLat; + south = carPosition.lon + dLon; + + east = carPosition.lat + dLat; + north = carPosition.lon - dLon; + + if ( south == 0.0 || west == 0.0 || east == 0.0 || north == 0.0 ) { + return null; + } + + if ( east < west ) { + double tmp = east; + east = west; + west = tmp; + } + + if( north < south ){ + double tmp = north; + north = south; + south = tmp; + } + + return new LatLngBounds.Builder().include( new LonLatPoint( east, north ) ).include( new LonLatPoint( west, south ) ).build(); + } + + public static float calculateLineDistance(LonLatPoint var0, LonLatPoint var1) { + if (var0 != null && var1 != null) { + try { + double var2 = var0.getLongitude(); + double var4 = var0.getLatitude(); + double var6 = var1.getLongitude(); + double var8 = var1.getLatitude(); + var2 *= 0.01745329251994329D; + var4 *= 0.01745329251994329D; + var6 *= 0.01745329251994329D; + var8 *= 0.01745329251994329D; + double var10 = Math.sin(var2); + double var12 = Math.sin(var4); + double var14 = Math.cos(var2); + double var16 = Math.cos(var4); + double var18 = Math.sin(var6); + double var20 = Math.sin(var8); + double var22 = Math.cos(var6); + double var24 = Math.cos(var8); + double[] var28 = new double[3]; + double[] var29 = new double[3]; + var28[0] = var16 * var14; + var28[1] = var16 * var10; + var28[2] = var12; + var29[0] = var24 * var22; + var29[1] = var24 * var18; + var29[2] = var20; + return (float)(Math.asin(Math.sqrt((var28[0] - var29[0]) * (var28[0] - var29[0]) + (var28[1] - var29[1]) * (var28[1] - var29[1]) + (var28[2] - var29[2]) * (var28[2] - var29[2])) / 2.0D) * 1.27420015798544E7D); + } catch (Throwable var26) { + var26.printStackTrace(); + return 0.0F; + } + } else { + try { + throw new Exception("非法坐标值"); + } catch (Exception var27) { + var27.printStackTrace(); + return 0.0F; + } + } + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java new file mode 100644 index 0000000000..71037e76d5 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java @@ -0,0 +1,707 @@ +package com.mogo.map.utils; + +import android.graphics.Bitmap; +import android.graphics.Color; +import android.text.TextUtils; +import android.view.View; + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.data.traffic.TrafficData; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.map.overlay.MogoPolylineOptions; +import com.mogo.map.search.geo.MogoGeocodeAddress; +import com.mogo.map.search.geo.MogoGeocodeResult; +import com.mogo.map.search.geo.MogoPoiItem; +import com.mogo.map.search.geo.MogoRegeocodeAddress; +import com.mogo.map.search.geo.MogoRegeocodeResult; +import com.mogo.map.search.geo.query.MogoGeocodeQuery; +import com.mogo.map.search.geo.query.MogoRegeocodeQuery; +import com.mogo.map.search.inputtips.MogoTip; +import com.mogo.map.search.inputtips.query.MogoInputtipsQuery; +import com.mogo.map.search.poisearch.MogoPoiResult; +import com.mogo.map.search.poisearch.MogoSearchBound; +import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery; +import com.mogo.map.uicontroller.MapCameraPosition; +import com.zhidaoauto.map.sdk.open.camera.CameraPosition; +import com.zhidaoauto.map.sdk.open.marker.BitmapDescriptor; +import com.zhidaoauto.map.sdk.open.marker.BitmapDescriptorFactory; +import com.zhidaoauto.map.sdk.open.marker.MarkerOptions; +import com.zhidaoauto.map.sdk.open.marker.MarkerSimpleData; +import com.zhidaoauto.map.sdk.open.poyline.PolylineOptions; +import com.zhidaoauto.map.sdk.open.query.GeocodeAddress; +import com.zhidaoauto.map.sdk.open.query.GeocodeQuery; +import com.zhidaoauto.map.sdk.open.query.GeocodeResult; +import com.zhidaoauto.map.sdk.open.query.InputtipsQuery; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; +import com.zhidaoauto.map.sdk.open.query.PoiItem; +import com.zhidaoauto.map.sdk.open.query.PoiSearchItem; +import com.zhidaoauto.map.sdk.open.query.PoiSearchResult; +import com.zhidaoauto.map.sdk.open.query.Query; +import com.zhidaoauto.map.sdk.open.query.RegeocodeAddress; +import com.zhidaoauto.map.sdk.open.query.RegeocodeQuery; +import com.zhidaoauto.map.sdk.open.query.RegeocodeResult; +import com.zhidaoauto.map.sdk.open.query.SearchBound; +import com.zhidaoauto.map.sdk.open.query.Tip; + +import java.util.ArrayList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +/** + * @author congtaowang + * @since 2019-12-18 + *

+ * 业务对象和实际对象转换 + */ +public class ObjectUtils { + + public static MarkerOptions fromMogo(MogoMarkerOptions opt) { + + if (opt == null) { + return null; + } + ArrayList descriptors = new ArrayList<>(); + final ArrayList icons = opt.getIcons(); + if (icons != null && !icons.isEmpty()) { + for (Bitmap icon : icons) { + if (icon == null || icon.isRecycled()) { + continue; + } + descriptors.add(new BitmapDescriptor(icon)); + } + } + + MarkerOptions markerOptions = new MarkerOptions() + .setGps(opt.isGps()) + .position(new LonLatPoint(opt.getLongitude(), opt.getLatitude())) + .anchor(opt.getU(), opt.getV()) + .icons(descriptors) + .period(opt.getPeriod()) + .controlAngle(opt.isControlAngle()) + .rotateAngle(opt.getRotate()) + .setFlat(opt.isFlat()) + .visible(opt.isVisible()) + .infoWindowEnable(opt.isInifoWindowEnable()) + .scale(opt.getScale()) + .alpha(opt.getAlpha()) + .setInfoWindowOffset(opt.getOffsetX(), opt.getOffsetY()) + .zIndex(opt.getzIndex()); + + try { + if (!TextUtils.isEmpty(opt.getAnchorColor())) { + Color.parseColor(opt.getAnchorColor()); + markerOptions.anchorColor(opt.getAnchorColor()); + } + } catch (Exception e) { + //e.printStackTrace(); + } + markerOptions.vrEnable(opt.is3DMode()); + if (!TextUtils.isEmpty(opt.getResName())) { + markerOptions.setMarkerIconName(opt.getResName()); + } else { + BitmapDescriptor descriptor = getBitmapDescriptorFromMogo(opt); + if (descriptor != null) { + markerOptions.markerIcon(descriptor); + } + if (opt.getIcon3DRes() != 0) { + markerOptions.marker3DIcon(opt.getIcon3DRes()); + } + } + if (!TextUtils.isEmpty(opt.getTitle())) { + markerOptions.title(opt.getTitle()); + } + if (!TextUtils.isEmpty(opt.getSnippet())) { + markerOptions.snippet(opt.getSnippet()); + } + return markerOptions; + } + + public static MarkerSimpleData fromTrafficData(MessagePad.TrackedObject trafficData) { + if (trafficData == null) { + return null; + } + MarkerSimpleData markerOptions = null; + try { + markerOptions = new MarkerSimpleData(); + markerOptions.setId(trafficData.getUuid()); + markerOptions.setMarkerType(trafficData.getType()); + markerOptions.setRotateAngle((float) trafficData.getHeading()); + markerOptions.setLat(trafficData.getLatitude()); + markerOptions.setLon(trafficData.getLongitude()); + } catch (Exception e) { + e.printStackTrace(); + } + return markerOptions; + } + + private static BitmapDescriptor getBitmapDescriptorFromMogo(MogoMarkerOptions options) { + if (options == null) { + return null; + } + Bitmap icon = options.getIcon(); + if (icon != null) { + return BitmapDescriptorFactory.INSTANCE.fromBitmap(icon); + } + View view = options.getIconView(); + if (view != null) { + return BitmapDescriptorFactory.INSTANCE.fromView(view); + } + return null; + } + + + public static MogoLocation fromLocation(com.zhidaoauto.map.sdk.open.location.MogoLocation aLocation) { + if (aLocation == null) { + return null; + } + MogoLocation location = new MogoLocation(); + location.setLocType(1); // 定位类型 + location.setSatellite(4); + location.setSpeed(aLocation.getSpeed()); + location.setLatitude(aLocation.getLat()); + location.setLongitude(aLocation.getLon()); + location.setAltitude(aLocation.getAltitude()); + location.setBearing((float) aLocation.getHeading()); + location.setCityCode(aLocation.getCityCode()); + location.setCityName(aLocation.getCity()); + location.setProvider(aLocation.getProvider()); + location.setAddress(aLocation.getAddress()); + location.setDistrict(aLocation.getDistrict()); + location.setProvince(aLocation.getProvince()); + location.setAdCode(aLocation.getAdCode()); + // location.setAccuracy( aLocation.getAccuracy() ); + // location.setTime( aLocation.getTime() ); +// location.setLocationDetail( aLocation.getLocationDetail() ); +// location.setPoiName( aLocation.getPoiName() ); +// location.setAoiName( aLocation.getAoiName() ); +// location.setErrCode( aLocation.getErrorCode() ); +// location.setErrInfo( aLocation.getErrorInfo() ); +// location.setStreetNum( aLocation.getStreetNum() ); +// location.setDescription( aLocation.getDescription() ); +// location.setBuildingId( aLocation.getBuildingId() ); +// location.setFloor( aLocation.getFloor() ); +// location.setGpsAccuracyStatus( aLocation.getGpsAccuracyStatus() ); + return location; + } + + public static LonLatPoint fromMogo(MogoLatLng latLng) { + if (latLng == null) { + return null; + } + return new LonLatPoint(latLng.lon, latLng.lat); + } + +// public static NaviLatLng fromMogoAsNavi( MogoLatLng latLng ) { +// if ( latLng == null ) { +// return null; +// } +// return new NaviLatLng( latLng.lat, latLng.lng ); +// } + +// public static LatLng fromMogo2( MogoLatLng latLng ) { +// if ( latLng == null ) { +// return null; +// } +// return new LatLng( latLng.lat, latLng.lng ); +// } + + public static MogoLatLng fromAMap(LonLatPoint point) { + if (point == null) { + return null; + } + return new MogoLatLng(point.getLatitude(), point.getLongitude()); + } + +// public static MogoLatLng CameraPositionfromAMap( LatLng point ) { +// if ( point == null ) { +// return null; +// } +// return new MogoLatLng( point.latitude, point.longitude ); +// } + + public static GeocodeQuery fromMogo(MogoGeocodeQuery query) { + if (query == null) { + return null; + } + GeocodeQuery q = new GeocodeQuery(query.getLocationName(), query.getCity()); + return q; + } + + public static RegeocodeQuery fromMogo(MogoRegeocodeQuery query) { + if (query == null) { + return null; + } + RegeocodeQuery q = new RegeocodeQuery(fromMogo(query.getPoint()), 1000); + return q; + } + +// public static MogoAoiItem fromAMap( AoiItem amapItem ) { +// if ( amapItem == null ) { +// return null; +// } +// MogoAoiItem mogoAoiItem = new MogoAoiItem(); +// mogoAoiItem.setAdCode( amapItem.getAdCode() ); +// mogoAoiItem.setAoiArea( amapItem.getAoiArea() ); +// mogoAoiItem.setAoiCenterPoint( fromAMap( amapItem.getAoiCenterPoint() ) ); +// mogoAoiItem.setAoiId( amapItem.getAoiId() ); +// mogoAoiItem.setAoiName( amapItem.getAoiName() ); +// return mogoAoiItem; +// } +// +// public static MogoBusinessArea fromAMap( BusinessArea amapItem ) { +// if ( amapItem == null ) { +// return null; +// } +// MogoBusinessArea mogoBusinessArea = new MogoBusinessArea(); +// mogoBusinessArea.setCenterPoint( fromAMap( amapItem.getCenterPoint() ) ); +// mogoBusinessArea.setName( amapItem.getName() ); +// return mogoBusinessArea; +// } +// +// +// public static MogoCrossroad fromAMap( Crossroad amapItem ) { +// if ( amapItem == null ) { +// return null; +// } +// MogoCrossroad mogoCrossroad = new MogoCrossroad(); +// mogoCrossroad.setDirection( amapItem.getDirection() ); +// mogoCrossroad.setDistance( amapItem.getDistance() ); +// mogoCrossroad.setFirstRoadId( amapItem.getFirstRoadId() ); +// mogoCrossroad.setFirstRoadName( amapItem.getFirstRoadName() ); +// mogoCrossroad.setSecondRoadId( amapItem.getSecondRoadId() ); +// mogoCrossroad.setSecondRoadName( amapItem.getSecondRoadName() ); +// return mogoCrossroad; +// } + + public static MogoGeocodeAddress fromAMap(GeocodeAddress address) { + if (address == null) { + return null; + } + MogoGeocodeAddress mogoGeocodeAddress = new MogoGeocodeAddress(); + mogoGeocodeAddress.setAdcode(address.getAdcode()); + mogoGeocodeAddress.setBuilding(address.getBuilding()); + mogoGeocodeAddress.setCity(address.getCity()); + mogoGeocodeAddress.setDistrict(address.getDistrict()); + mogoGeocodeAddress.setFormatAddress(address.getFormatAddress()); + mogoGeocodeAddress.setLatlng(fromAMap(address.getLonlat())); + mogoGeocodeAddress.setLevel(address.getLevel()); + mogoGeocodeAddress.setNeighborhood(address.getNeighborhood()); + mogoGeocodeAddress.setProvince(address.getProvince()); + mogoGeocodeAddress.setTownship(address.getTownship()); + return mogoGeocodeAddress; + } + + public static MogoGeocodeResult fromAMap(GeocodeResult result) { + if (result == null || result.getGeocodeAddressList() == null) { + return null; + } + MogoGeocodeResult mogoGeocodeResult = new MogoGeocodeResult(); + final List addresses = new ArrayList<>(); + List list = result.getGeocodeAddressList(); + for (GeocodeAddress geocodeAddress : list) { + final MogoGeocodeAddress mogoGeocodeAddress = fromAMap(geocodeAddress); + if (mogoGeocodeAddress != null) { + addresses.add(mogoGeocodeAddress); + } + } + + mogoGeocodeResult.setAddresses(addresses); + return mogoGeocodeResult; + } + +// public static MogoIndoorData fromAMap( IndoorData data ) { +// if ( data == null ) { +// return null; +// } +// MogoIndoorData mogoIndoorData = new MogoIndoorData(); +// mogoIndoorData.setFloor( data.getFloor() ); +// mogoIndoorData.setFloorName( data.getFloorName() ); +// mogoIndoorData.setPoiId( data.getPoiId() ); +// return mogoIndoorData; +// } +// +// public static MogoPhoto fromAMap( Photo photo ) { +// if ( photo == null ) {f +// return null; +// } +// MogoPhoto mogoPhoto = new MogoPhoto(); +// mogoPhoto.setTitle( photo.getTitle() ); +// mogoPhoto.setUrl( photo.getUrl() ); +// return mogoPhoto; +// } +// +// public static MogoPoiItemExtension fromAMap( PoiItemExtension poiItemExtension ) { +// if ( poiItemExtension == null ) { +// return null; +// } +// MogoPoiItemExtension mogoPoiItemExtension = new MogoPoiItemExtension(); +// mogoPoiItemExtension.setOpentime( poiItemExtension.getOpentime() ); +// mogoPoiItemExtension.setRating( poiItemExtension.getmRating() ); +// return mogoPoiItemExtension; +// } +// +// public static MogoRegeocodeRoad fromAMap( RegeocodeRoad regeocodeRoad ) { +// if ( regeocodeRoad == null ) { +// return null; +// } +// MogoRegeocodeRoad mogoRegeocodeRoad = new MogoRegeocodeRoad(); +// mogoRegeocodeRoad.setDirection( regeocodeRoad.getDirection() ); +// mogoRegeocodeRoad.setDistance( regeocodeRoad.getDistance() ); +// mogoRegeocodeRoad.setId( regeocodeRoad.getId() ); +// mogoRegeocodeRoad.setName( regeocodeRoad.getName() ); +// mogoRegeocodeRoad.setPoint( fromAMap( regeocodeRoad.getLatLngPoint() ) ); +// return mogoRegeocodeRoad; +// } +// +// public static MogoStreetNumber fromAMap( StreetNumber streetNumber ) { +// if ( streetNumber == null ) { +// return null; +// } +// MogoStreetNumber mogoStreetNumber = new MogoStreetNumber(); +// mogoStreetNumber.setDirection( streetNumber.getDirection() ); +// mogoStreetNumber.setDistance( streetNumber.getDistance() ); +// mogoStreetNumber.setLatLonPoint( fromAMap( streetNumber.getLatLonPoint() ) ); +// mogoStreetNumber.setNumber( streetNumber.getNumber() ); +// mogoStreetNumber.setStreet( streetNumber.getStreet() ); +// return mogoStreetNumber; +// } + +// public static MogoSubPoiItem fromAMap( SubPoiItem subPoiItem ) { +// if ( subPoiItem == null ) { +// return null; +// } +// MogoSubPoiItem mogoSubPoiItem = new MogoSubPoiItem(); +// mogoSubPoiItem.setDistance( subPoiItem.getDistance() ); +// mogoSubPoiItem.setPoiId( subPoiItem.getPoiId() ); +// mogoSubPoiItem.setPoint( fromAMap( subPoiItem.getLatLonPoint() ) ); +// mogoSubPoiItem.setSnippet( subPoiItem.getSnippet() ); +// mogoSubPoiItem.setSubName( mogoSubPoiItem.getSubName() ); +// mogoSubPoiItem.setSubTypeDes( mogoSubPoiItem.getSubTypeDes() ); +// mogoSubPoiItem.setTitle( mogoSubPoiItem.getTitle() ); +// return mogoSubPoiItem; +// } + + public static MogoPoiItem fromAMap(PoiItem poiItem) { + if (poiItem == null) { + return null; + } + MogoPoiItem mogoPoiItem = new MogoPoiItem(); + mogoPoiItem.setAdCode(poiItem.getAdCode()); + mogoPoiItem.setAdName(poiItem.getAdName()); + mogoPoiItem.setBusinessArea(poiItem.getBusinessArea()); + mogoPoiItem.setCityCode(poiItem.getCityCode()); + mogoPoiItem.setCityName(poiItem.getCityName()); + mogoPoiItem.setDirection(poiItem.getDirection()); + mogoPoiItem.setDistance(poiItem.getDistance()); + mogoPoiItem.setEmail(poiItem.getEmail()); + mogoPoiItem.setEnter(fromAMap(poiItem.getEnter())); + mogoPoiItem.setExit(fromAMap(poiItem.getExit())); +// mogoPoiItem.setIndoorData( fromAMap( poiItem.getIndoorData() ) ); + mogoPoiItem.setParkingType(poiItem.getParkingType()); +// mogoPoiItem.setIndoorMap( poiItem.isIndoorMap() ); +// if ( poiItem.getPhotos() != null ) { +// List< MogoPhoto > mogoPhotos = new ArrayList<>(); +// for ( Photo photo : poiItem.getPhotos() ) { +// MogoPhoto mogoPhoto = fromAMap( photo ); +// if ( mogoPhoto != null ) { +// mogoPhotos.add( mogoPhoto ); +// } +// } +// mogoPoiItem.setPhotos( mogoPhotos ); +// } +// mogoPoiItem.setPoiExtension( fromAMap( poiItem.getPoiExtension() ) ); + mogoPoiItem.setPoiId(poiItem.getPoiId()); + mogoPoiItem.setPoint(fromAMap(poiItem.getLonLatPoint())); + mogoPoiItem.setPostcode(poiItem.getPostcode()); + mogoPoiItem.setProvinceCode(poiItem.getProvinceCode()); + mogoPoiItem.setProvinceName(poiItem.getProvinceName()); + mogoPoiItem.setShopID(poiItem.getShopID()); + mogoPoiItem.setSnippet(poiItem.getSnippet()); +// if ( poiItem.getSubPois() != null ) { +// List< MogoSubPoiItem > mogoSubPoiItems = new ArrayList<>(); +// for ( SubPoiItem subPois : poiItem.getSubPois() ) { +// MogoSubPoiItem mogoSubPoiItem = fromAMap( subPois ); +// if ( mogoPoiItem != null ) { +// mogoSubPoiItems.add( mogoSubPoiItem ); +// } +// } +// mogoPoiItem.setSubPois( mogoSubPoiItems ); +// } + mogoPoiItem.setTel(poiItem.getTel()); + mogoPoiItem.setTypeCode(poiItem.getTypeCode()); + mogoPoiItem.setTitle(poiItem.getTitle()); + mogoPoiItem.setTypeDes(poiItem.getTypeDes()); + mogoPoiItem.setWebsite(poiItem.getWebsite()); + return mogoPoiItem; + } + + public static MogoRegeocodeAddress fromAMap(RegeocodeAddress regeocodeAddress) { + if (regeocodeAddress == null) { + return null; + } + MogoRegeocodeAddress mogoRegeocodeAddress = new MogoRegeocodeAddress(); + mogoRegeocodeAddress.setAdCode(regeocodeAddress.getAdCode()); +// if ( regeocodeAddress.getAois() != null ) { +// List< MogoAoiItem > items = new ArrayList<>(); +// for ( AoiItem aois : regeocodeAddress.getAois() ) { +// final MogoAoiItem mogoAoiItem = fromAMap( aois ); +// if ( mogoAoiItem != null ) { +// items.add( mogoAoiItem ); +// } +// } +// mogoRegeocodeAddress.setAois( items ); +// } + + mogoRegeocodeAddress.setBuilding(regeocodeAddress.getBuilding()); +// if ( regeocodeAddress.getBusinessAreas() != null ) { +// List< MogoBusinessArea > mogoBusinessAreas = new ArrayList<>(); +// for ( BusinessArea businessArea : regeocodeAddress.getBusinessAreas() ) { +// MogoBusinessArea mogoBusinessArea = fromAMap( businessArea ); +// if ( mogoBusinessArea != null ) { +// mogoBusinessAreas.add( mogoBusinessArea ); +// } +// } +// mogoRegeocodeAddress.setBusinessAreas( mogoBusinessAreas ); +// } + + mogoRegeocodeAddress.setCity(regeocodeAddress.getCity()); + mogoRegeocodeAddress.setCityCode(regeocodeAddress.getCityCode()); + mogoRegeocodeAddress.setCountry(regeocodeAddress.getCountry()); +// if ( regeocodeAddress.getCrossroads() != null ) { +// List< MogoCrossroad > mogoCrossroads = new ArrayList<>(); +// for ( Crossroad crossroad : regeocodeAddress.getCrossroads() ) { +// +// MogoCrossroad mogoCrossroad = fromAMap( crossroad ); +// if ( mogoCrossroad != null ) { +// mogoCrossroads.add( mogoCrossroad ); +// } +// } +// mogoRegeocodeAddress.setCrossroads( mogoCrossroads ); +// } + mogoRegeocodeAddress.setDistrict(regeocodeAddress.getDistrict()); + mogoRegeocodeAddress.setFormatAddress(regeocodeAddress.getFormatAddress()); + mogoRegeocodeAddress.setNeighborhood(regeocodeAddress.getNeighborhood()); + if (regeocodeAddress.getPoiList() != null) { + List mogoPoiItems = new ArrayList<>(); + List list = regeocodeAddress.getPoiList(); + for (PoiItem pois : list) { + MogoPoiItem mogoPoiItem = fromAMap(pois); + mogoPoiItems.add(mogoPoiItem); + } + mogoRegeocodeAddress.setPois(mogoPoiItems); + } + mogoRegeocodeAddress.setProvince(regeocodeAddress.getProvince()); +// if ( regeocodeAddress.getRoads() != null ) { +// List< MogoRegeocodeRoad > mogoRegeocodeRoads = new ArrayList<>(); +// for ( RegeocodeRoad road : regeocodeAddress.getRoads() ) { +// MogoRegeocodeRoad mogoRegeocodeRoad = fromAMap( road ); +// if ( mogoRegeocodeRoad != null ) { +// mogoRegeocodeRoads.add( mogoRegeocodeRoad ); +// } +// } +// mogoRegeocodeAddress.setRoads( mogoRegeocodeRoads ); +// } +// mogoRegeocodeAddress.setStreetNumber( fromAMap( regeocodeAddress.getStreetNumber() ) ); + mogoRegeocodeAddress.setTowncode(regeocodeAddress.getTowncode()); + mogoRegeocodeAddress.setTownship(regeocodeAddress.getTownship()); + return mogoRegeocodeAddress; + } + + public static MogoRegeocodeResult fromAMap(RegeocodeResult regeocodeResult) { + if (regeocodeResult == null) { + return null; + } + MogoRegeocodeResult mogoRegeocodeResult = new MogoRegeocodeResult(); + mogoRegeocodeResult.setRegeocodeAddress(fromAMap(regeocodeResult.getRegeocodeAddress())); + return mogoRegeocodeResult; + } + + public static InputtipsQuery fromMogo(MogoInputtipsQuery query) { + if (query == null) { + return null; + } + InputtipsQuery inputtipsQuery = new InputtipsQuery(query.getKeyword(), query.getCity()); + inputtipsQuery.setCityLimit(query.isCityLimit()); + inputtipsQuery.setLocation(fromMogo(query.getLocation())); + inputtipsQuery.setType(query.getType()); + return inputtipsQuery; + } + + public static MogoTip fromAMap(Tip tip) { + if (tip == null) { + return null; + } + MogoTip mogoTip = new MogoTip(); + mogoTip.setAdCode(tip.getAdcode()); + mogoTip.setAddress(tip.getAddress()); + mogoTip.setDistrict(tip.getDistrict()); + mogoTip.setName(tip.getName()); + mogoTip.setPoiID(tip.getPoiID()); + mogoTip.setPoint(fromAMap(tip.getLatPoint())); + mogoTip.setTypeCode(tip.getTypeCode()); + return mogoTip; + } + +// public static MogoPoi fromAMap( Poi poi ) { +// if ( poi == null ) { +// return null; +// } +// MogoPoi mogoPoi = new MogoPoi(); +// mogoPoi.setCoordinate( fromAMap( poi.getCoordinate() ) ); +// mogoPoi.setName( poi.getName() ); +// mogoPoi.setPoiId( poi.getPoiId() ); +// return mogoPoi; +// } + + public static MogoPoiSearchQuery fromAMap(Query query) { + if (query == null) { + return null; + } + MogoPoiSearchQuery mogoPoiSearchQuery = new MogoPoiSearchQuery(query.getKeyword(), query.getCategory(), query.getCity()); +// mogoPoiSearchQuery.setBuilding( query.getBuilding() ); + mogoPoiSearchQuery.setCityLimit(query.getCityLimit()); + mogoPoiSearchQuery.setDistanceSort(query.getDistanceSort()); + mogoPoiSearchQuery.setLocation(fromAMap(query.getLocation())); + mogoPoiSearchQuery.setPageNum(query.getPageNum()); + mogoPoiSearchQuery.setPageSize(query.getPageSize()); + return mogoPoiSearchQuery; + } + + public static Query fromMogo(MogoPoiSearchQuery query) { + if (query == null || query.getQuery() == null) { + return null; + } + Query psq = new Query(query.getQuery(), "", ""); + String category = getCategory(query.getQuery()); + if (!category.equals("")) + psq = new Query("", "", getCategory(query.getQuery())); +// psq.setBuilding( query.getBuilding() ); + psq.setCityLimit(query.isCityLimit()); + psq.setDistanceSort(query.isDistanceSort()); + psq.setLocation(fromMogo(query.getLocation())); + psq.setPageNum(query.getPageNum()); + psq.setPageSize(query.getPageSize()); + return psq; + } + + public static MogoSearchBound fromAMap(SearchBound bound) { + if (bound == null) { + return null; + } + if (bound.getShape() == SearchBound.BOUND_SHAPE) { + return new MogoSearchBound(fromAMap(bound.getCenter()), bound.getRange(), bound.isDistanceSort()); + } else if (bound.getShape() == SearchBound.POLYGON_SHAPE) { + return new MogoSearchBound(fromAMap(bound.getPolyGonList())); + } else if (bound.getShape() == SearchBound.RECTANGLE_SHAPE) { + return new MogoSearchBound(fromAMap(bound.getLowerLeft()), fromAMap(bound.getUpperRight())); + } + return null; + } + + public static List fromAMap(List latLngs) { + if (latLngs == null) { + return null; + } + List result = new ArrayList<>(latLngs.size()); + for (LonLatPoint latLng : latLngs) { + result.add(fromAMap(latLng)); + } + return result; + } + + public static List fromMogo(List latLngs) { + if (latLngs == null) { + return null; + } + List result = new ArrayList<>(latLngs.size()); + for (MogoLatLng latLng : latLngs) { + result.add(fromMogo(latLng)); + } + return result; + } + + + public static SearchBound fromMogo(MogoSearchBound bound) { + if (bound == null) { + return null; + } + if (bound.getShape() == MogoSearchBound.SHAPE_BOUND) { + return new SearchBound(fromMogo(bound.getCenterPoint()), bound.getRadiusInMeters(), bound.isDistanceSort()); + } else if (bound.getShape() == MogoSearchBound.SHAPE_POLYGON) { + return new SearchBound(fromMogo(bound.getPolyGonList())); + } else if (bound.getShape() == MogoSearchBound.SHAPE_RECTANGLE) { + return new SearchBound(fromMogo(bound.getLowerLeft()), fromMogo(bound.getUpperRight())); + } + return null; + } + + public static MogoPoiResult fromAMap(PoiSearchResult result) { + if (result == null) { + return null; + } + MogoPoiResult mogoPoiResult = new MogoPoiResult(); + if (result.getItems() != null) { + final List poiItems = result.getItems(); + final ArrayList mogoPoiItems = new ArrayList<>(poiItems.size()); + for (PoiSearchItem poiItem : poiItems) { + mogoPoiItems.add(fromAMap(poiItem.getPoi())); + } + mogoPoiResult.setPois(mogoPoiItems); + } + return mogoPoiResult; + } + + public static PolylineOptions fromMogo(MogoPolylineOptions options) { + if (options == null) { + return null; + } + PolylineOptions target = new PolylineOptions(); + target.setGps(options.gps()); + if (options.getPoints() != null) { + List points = new ArrayList<>(); + for (MogoLatLng point : options.getPoints()) { + points.add(fromMogo(point)); + } + target.lonLatPoints(points); + } + target.setLineWidth(options.getWidth()); + target.zIndex(options.getZIndex()); + target.setColor(options.getColor()); + target.useGradient(options.isGradient()); + if (options.getColorValues() != null) { + target.colorValues(options.getColorValues()); + } +// target.transparency( options.getTransparency() ); +// target.aboveMaskLayer( options.isAboveMaskLayer() ); +// target.lineCapType( PolylineOptions.LineCapType.LineCapRound ); +// target.lineJoinType( PolylineOptions.LineJoinType.LineJoinRound ); +// target.setDottedLineType( PolylineOptions.DOTTEDLINE_TYPE_CIRCLE ); + return target; + } + + + public static MapCameraPosition fromAMap(CameraPosition position) { + if (position == null) { + return null; + } + return new MapCameraPosition(fromAMap(position.getTarget()), position.getBearing(), position.getTilt(), position.getZoom()); + } + + private static String getCategory(String key) { + String category = ""; + if (key.equals("加油站")) { + category = "6"; + } else if (key.equals("停车场")) { + category = "12"; + } else if (key.equals("餐馆")) { + category = "22"; + } else if (key.equals("洗车")) { + category = "8"; + } else if (key.equals("厕所")) { + + } + return category; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java new file mode 100644 index 0000000000..f4013e949e --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/PointInterpolatorUtil.java @@ -0,0 +1,138 @@ +package com.mogo.map.utils; + +import com.mogo.cloud.commons.utils.CoordinateUtils; +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.zhidaoauto.map.sdk.open.query.LonLatPoint; + +import java.util.List; + +/** + * 点之间插值工具类 + * + * @author tongchenfei + */ +public class PointInterpolatorUtil { + private static final String TAG = "PointInterpolatorUtil"; + private static final int DISTANCE_THRESHOLD = 2; + + /** + * 在(x1,y1) (x2,y2)中间插入一些点,使每两个点之间距离<={@link #DISTANCE_THRESHOLD},利用如下公式进行计算 + * xn = x1 + (x2 - x1)*n/a + * yn = y1 + (y2 - y1)*n/a + * a = (distance/{@link #DISTANCE_THRESHOLD}) +1 + * n in 1 .. a-1 + * n == 0 时,xn = x1 + * n == a 时,xn = x2 + *

+ * 将xn依次插入x1到x2之间 + * + * @param points 待插值点集 + * @deprecated 这个方法有问题,并不能算出来想要的值 + */ + @Deprecated + public static void interpolate(List points) { + if (points.size() >= 2) { + // 插值 + for (int i = 0; i < points.size() - 1; i++) { + MogoLatLng current = points.get(i); + MogoLatLng next = points.get(i + 1); + float distance = CoordinateUtils.calculateLineDistance(current.lon, current.lat, next.lon, next.lat); + Logger.d(TAG, i + ": " + distance); + if (distance > DISTANCE_THRESHOLD) { + int inter = (int) (distance / DISTANCE_THRESHOLD) + 1; + for (int j = 1; j < inter; j++) { + double newLat = current.lat + (next.lat - current.lat) * j / inter; + double newLon = current.lon + (next.lon - current.lon) * j / inter; + Logger.d(TAG, "distance: " + distance + ", j: " + j + ", nextLat: " + next.lat + ", nextLon: " + next.lon + ", newLat: " + newLat + ", newLon: " + newLon); + points.add(i + 1, new MogoLatLng(newLat, newLon)); + current = points.get(++i); + } + } + } + + } + } + + /** + * 道路吸附算法 + *

+ * 所谓的道路数据,实际就是道路对应的点集,每两个点之间是直线,但是两点间距并不固定,点集内点的数量也不固定,点集是有序的,按道路方向排序,road[0]是起点。 + * 为了避免拐弯道路的问题,先使用{@link #getCloseTwoPoint(int, int, double, double, List)}从道路数据里面找出距离目标点最近的两个点,记为A、B,最近的两个点就在目标点一前一后排列, + * 这样的话,求一下目标点到AB的垂直映射以及距离{@link #getFootAndMinDistance(double, double, double, double, double, double)},就是吸附后的经纬度和距离 + * + * @param lon 目标经度 + * @param lat 目标纬度 + * @param road 目标道路数据 + * @return double[]{吸附后的经度,吸附后的纬度,目标经纬度距离道路的垂直距离} + */ + public static double[] mergeToRoad(double lon, double lat, List road) { + int closeStart = 0; + int closeEnd = road.size() - 1; + int[] result = getCloseTwoPoint(closeStart, closeEnd, lon, lat, road); + LonLatPoint start = road.get(result[0]); + LonLatPoint end = road.get(result[1]); + return getFootAndMinDistance(lon, lat, start.getLongitude(), start.getLatitude(), end.getLongitude(), end.getLatitude()); + } + + /** + * 获取距离目标点经纬度最近的道路点index + *

+ * 采用二分查找思想,先用道路数据的起点和终点分别计算距离目标点的距离: + * 若起点距离较远,则说明目标点在整条道路的后半段,则将起点后移至原起点和终点的中间,继续递归计算; + * 同理,若终点距离较远,则目标点在前半段,则终点前移,继续递归计算; + * 递归结束条件是起点index和终点index间隔是1; + * + * @param closeStart 距离目标点最近的起始点index + * @param closeEnd 距离目标点最近的终点index + * @param lon 目标点经度 + * @param lat 目标点纬度 + * @param road 目标道路 + * @return int[]{距离目标点最近的起始点index,距离目标点最近的终点index} + */ + private static int[] getCloseTwoPoint(int closeStart, int closeEnd, double lon, double lat, List road) { + if (closeEnd - closeStart == 1) { + return new int[]{closeStart, closeEnd}; + } + LonLatPoint start = road.get(closeStart); + LonLatPoint end = road.get(closeEnd); + float startDistance = CoordinateUtils.calculateLineDistance(start.getLongitude(), start.getLatitude(), lon, lat); + float endDistance = CoordinateUtils.calculateLineDistance(end.getLongitude(), end.getLatitude(), lon, lat); + if (startDistance > endDistance) { + closeStart += (closeEnd - closeStart) / 2; + } else { + closeEnd -= (closeEnd - closeStart) / 2; + } + return getCloseTwoPoint(closeStart, closeEnd, lon, lat, road); + } + + /** + * 计算垂足以及最短距离 + * + * @param x target point lon + * @param y target point lat + * @param x1 线段起点 lon + * @param y1 起点起点 lat + * @param x2 线段终点 lon + * @param y2 线段终点 lat + * @return double[]{footLon,footLat,minDistance} if(footLon == -1) => no foot or foot not in line + */ + private static double[] getFootAndMinDistance(double x, double y, double x1, double y1, double x2, double y2) { + double[] result = new double[]{-1, -1, -1}; + double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1); + if (cross < 0) { + // 垂足没有在线段内,所以也无需计算最短距离 + return result; + } + double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); + if (cross > d2) { + // 垂足没有在线段内,所以也无需计算最短距离 + return result; + } + double r = cross / d2; + result[0] = x1 + (x2 - x1) * r; + result[1] = y1 + (y2 - y1) * r; + result[2] = CoordinateUtils.calculateLineDistance(result[0], result[1], x, y); + return result; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ResIdCache.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ResIdCache.java new file mode 100644 index 0000000000..9737902bd7 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ResIdCache.java @@ -0,0 +1,23 @@ +package com.mogo.map.utils; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author congtaowang + * @since 2021/3/8 + * + * 描述 + */ +public class ResIdCache { + + public static Map< String, String > sMarkerCachesResMd5Values = new HashMap<>(); + + public static String getVal( String name ) { + return sMarkerCachesResMd5Values.get( name ); + } + + public static void putVal( String name, String val ) { + sMarkerCachesResMd5Values.put( name, val ); + } +} diff --git a/libraries/mogo-map/src/main/res/drawable/marker_blue.png b/libraries/mogo-map/src/main/res/drawable/marker_blue.png new file mode 100644 index 0000000000..062dda4a33 Binary files /dev/null and b/libraries/mogo-map/src/main/res/drawable/marker_blue.png differ diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java index 7729e25c2d..73872605f5 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java @@ -1,8 +1,12 @@ package com.mogo.module.common.datacenter; +import static com.mogo.eagle.core.data.config.FunctionBuildConfig.gpsProvider; + import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; +import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; +import com.mogo.map.MogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.service.cloud.location.CloudLocationInfo; @@ -95,21 +99,22 @@ public class SnapshotLocationDataCenter { DebugConfig.setStatusData(DebugConfig.sLat, lat); // 使用与渠道配置一样的gps提供者提供的数据 - CloudLocationInfo cloudLocationInfo = new CloudLocationInfo(); - cloudLocationInfo.setAlt(alt); - cloudLocationInfo.setHeading(heading); - cloudLocationInfo.setLat(lat); - cloudLocationInfo.setLon(lon); - cloudLocationInfo.setSpeed(speed); - cloudLocationInfo.setSatelliteTime(satelliteTime); - cloudLocationInfo.setSystemTime(systemTime); - cloudLocationInfo.setTileId(String.valueOf(MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getTileId(lon, lat))); - //todo list数据暂时无人使用,增加后会导致数据量缓慢增加 -// mMachineCacheList.add(cloudLocationInfo); + if (gpsProvider == FunctionBuildConfig.gpsProvider) { + CloudLocationInfo cloudLocationInfo = new CloudLocationInfo(); + cloudLocationInfo.setAlt(alt); + cloudLocationInfo.setHeading(heading); + cloudLocationInfo.setLat(lat); + cloudLocationInfo.setLon(lon); + cloudLocationInfo.setSpeed(speed); + cloudLocationInfo.setSatelliteTime(satelliteTime); + cloudLocationInfo.setSystemTime(systemTime); + cloudLocationInfo.setTileId(String.valueOf(MogoMapUIController.getInstance().getTileId(lon, lat))); + mMachineCacheList.add(cloudLocationInfo); - mCurLon = cloudLocationInfo.getLon(); - mCurLat = cloudLocationInfo.getLat(); - mSatelliteTime = cloudLocationInfo.getSatelliteTime(); + mCurLon = cloudLocationInfo.getLon(); + mCurLat = cloudLocationInfo.getLat(); + mSatelliteTime = cloudLocationInfo.getSatelliteTime(); + } } public double getCurLon() { diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java new file mode 100644 index 0000000000..0cf901e330 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java @@ -0,0 +1,348 @@ +package com.mogo.module.common.drawer; + +import static com.mogo.cloud.socket.entity.SocketDownDataHelper.FROM_ADAS; + +import android.os.Build; +import android.text.TextUtils; +import android.util.Log; + +import com.mogo.cloud.commons.utils.CoordinateUtils; +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.data.traffic.TrafficData; +import com.mogo.map.MogoMarkerManager; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.constants.DataTypes; +import com.mogo.module.common.utils.Trigonometric; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * @author congtaowang + * @since 2020/10/28 + *

+ * 绘制adas近景识别到的车辆 + */ +public class AdasRecognizedResultDrawer extends BaseDrawer { + + private static final String TAG = "AdasRecognizedResultDrawer"; + + private static volatile AdasRecognizedResultDrawer sInstance; + + /** + * 上一帧数据的缓存 + */ + private static Map mMarkersCaches = new ConcurrentHashMap<>(); + + public AdasRecognizedResultDrawer() { + super(); + } + + private final Map mLastPositions = new ConcurrentHashMap<>(); + + public static AdasRecognizedResultDrawer getInstance() { + if (sInstance == null) { + synchronized (AdasRecognizedResultDrawer.class) { + if (sInstance == null) { + sInstance = new AdasRecognizedResultDrawer(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + private Object readResolve() { + // 阻止反序列化,必须实现 Serializable 接口 + return sInstance; + } + + public boolean hasCached(String uniqueKey) { + return mMarkersCaches.containsKey(uniqueKey); + } + + /** + * 渲染 adas 识别的数据 + * + * @param resultList adas感知融合数据 + */ + public void renderAdasRecognizedResult(List resultList) { + + final long start = System.nanoTime(); + if (resultList == null || resultList.isEmpty() || !DebugConfig.isUseAdasRecognize()) { + clearOldMarker(); + Log.w("ADAS数据延时绘制", "resultList==>" + resultList + " DebugConfig.isUseAdasRecognize()==>" + DebugConfig.isUseAdasRecognize()); + return; + } + + if (!MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + clearOldMarker(); + Log.w("ADAS数据延时绘制", "当前不是VR模式"); + return; + } + +// List allDatumsList = new ArrayList<>(); +// prepareData(resultList, allDatumsList); + + Map newAdasRecognizedMarkersCaches = new ConcurrentHashMap<>(); + List newDiffSet = new ArrayList<>(); + for (TrafficData recognizedListResult : resultList) { + + if (isUselessValue(recognizedListResult)) { + continue; + } + // 复用之前存在的 marker + String uniqueKey = recognizedListResult.getUuid(); + IMogoMarker marker = mMarkersCaches.remove(uniqueKey); + if (marker != null && !marker.isDestroyed()) { +// Log.d(TAG, "发现缓存marker id : " + uniqueKey); + updateCacheMarkerRes(marker, recognizedListResult); + renderAdasOneFrame(marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches); + } else { + // 新增添加进差集 + newDiffSet.add(recognizedListResult); + } + } + removeUselessMarker(mMarkersCaches); + removeUselessLastRecord(); + int newDiffSetSize = newDiffSet.size(); +// Log.d(TAG, "原数据量 : " + resultList.size() + " 新增marker数量 : " + newDiffSetSize); + // 复用过期 marker + if (newDiffSetSize > 0) { + for (int i = 0; i < newDiffSetSize; i++) { + TrafficData recognizedListResult = newDiffSet.get(i); + String uniqueKey = recognizedListResult.getUuid(); + IMogoMarker marker = drawAdasRecognizedDataMarker(recognizedListResult); + if (marker == null) { + continue; + } +// Log.d(TAG, "新增marker id : " + uniqueKey); + renderAdasOneFrame(marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches); + } + } + sendMessage(MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches); + mMarkersCaches.clear(); + mMarkersCaches = newAdasRecognizedMarkersCaches; + Log.d("ADAS数据延时绘制", "render 接收数据 -> 处理结束 " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start)) + "ms"); + } + + /** + * 对数据补点 + * + * @param in + * @param out + */ + private void prepareData(List in, List out) { +// foreCastPoint(in); + out.addAll(in); + } + + private final static String FORECAST = "adasForecast"; + + /** + * 基于工控机识别的数据点速度预测当前位置和距离自车距离 + * + * @param in 数据源 + */ + private void foreCastPoint(List in) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + for (TrafficData adasResult : in) { + Log.d(FORECAST, "ready to foreCast current uuid : " + adasResult.getUuid()); + long internal = getCurSatelliteTime() - adasResult.getSatelliteTime(); + if (internal <= 0) { + Log.d(FORECAST, "time internal less than 0 , uuid : " + adasResult.getUuid()); + continue; + } + long startTime = System.currentTimeMillis(); + // 预测点 + Log.d(FORECAST, "time internal : " + internal + " speed : " + adasResult.getSpeed()); + double foreCastDistance = adasResult.getSpeed() * internal / 1000; + Log.d(FORECAST, "foreCastDistance : " + foreCastDistance); + MogoLatLng mogoLatLng = new MogoLatLng(adasResult.getLat(), adasResult.getLon()); + MogoLatLng foreCastMogoLatLon = Trigonometric.getNewLocation(mogoLatLng, foreCastDistance, adasResult.getHeading()); + + // 计算与自车距离 + float distanceFromSelf = CoordinateUtils.calculateLineDistance(getCurCoordinates()[0], getCurCoordinates()[1] + , foreCastMogoLatLon.getLon(), foreCastMogoLatLon.getLat()); + + long foreCastInternal = System.currentTimeMillis() - startTime; + Log.d(FORECAST, "foreCastInternal :" + foreCastInternal); //todo 耗时1~2毫秒 需要测试是否由于补点算法造成 + + adasResult.setLat(foreCastMogoLatLon.getLat()); + adasResult.setLon(foreCastMogoLatLon.getLon()); + adasResult.setSatelliteTime((getCurSatelliteTime() - foreCastInternal)); + adasResult.setDistance(distanceFromSelf); + } + } + } + + /** + * todo 后面涉及到此类变化的数据均改动 + * + * @param marker + * @param recognizedListResult + */ + private void updateCacheMarkerRes(IMogoMarker marker, TrafficData recognizedListResult) { + String resIdVal; + int resId = getModelRes(recognizedListResult.getType().getType()); + resIdVal = resId + ""; + String resName = mMarkerCachesResMd5Values.get(resIdVal); + if (!TextUtils.isEmpty(resName)) { + if (!TextUtils.equals(resName, marker.getMarkerResName())) { + marker.use3DResource(resName); + } + } else { + resName = marker.use3DResource(resId); + mMarkerCachesResMd5Values.put(resIdVal, resName); + } + } + + private void removeUselessLastRecord() { // todo 最好重新设计一个数据结构,用于多线程数据过期失效的场景,参见redis数据过期 + if (mLastPositions.isEmpty()) { + return; + } + Iterator iterator = mLastPositions.values().iterator(); + while (iterator.hasNext()) { + TrafficData result = iterator.next(); + long internal = result.getSatelliteTime() - getCurSatelliteTime(); + if (internal > 3000) { //防止帧率过低导致误删除上一个节点对象,从而出现跳跃现象 + iterator.remove(); + } + } + } + + /** + * 过滤无用数据 + * + * @param recognizedListResult {@link TrafficData} + * @return useless + */ + private boolean isUselessValue(TrafficData recognizedListResult) { + if (recognizedListResult == null) { + return true; + } + if (nonRenderType(recognizedListResult.getType().getType())) { + return true; + } + String uniqueKey = recognizedListResult.getUuid(); + return TextUtils.isEmpty(uniqueKey); + } + + /** + * 绘制某个物体的一个数据 + * + * @param recognizedListResult {@link TrafficData} + * @param newAdasRecognizedMarkersCaches 缓存集合 + */ + private void renderAdasOneFrame(IMogoMarker marker, + String uniqueKey, + TrafficData recognizedListResult, + Map newAdasRecognizedMarkersCaches) { + final long start = System.nanoTime(); +// Log.d(TAG, "renderAdasOneFrame uuid : " + uniqueKey + " type : " + recognizedListResult.type + " heading : " + recognizedListResult.heading); + TrafficData lastPosition = mLastPositions.remove(uniqueKey); + // 道路吸附 +// double lastLon = -1; +// double lastLat = -1; +// if (lastPosition != null) { +// lastLon = lastPosition.lon; +// lastLat = lastPosition.lat; +// } +// double[] matchLonLat = getMatchLonLat(recognizedListResult.uuid, recognizedListResult.lon, recognizedListResult.lat, recognizedListResult.heading, lastLon, lastLat); +// +// recognizedListResult.lon = matchLonLat[0]; +// recognizedListResult.lat = matchLonLat[1]; +// Log.d( "matchRoad", "cost = %s", System.currentTimeMillis() - start ); + + mLastPositions.put(uniqueKey, recognizedListResult); +// Log.d(TAG, "使用缓存 id : " + uniqueKey); + long interval = 45; + if (lastPosition != null) { + interval = computeAnimDuration(lastPosition.getSatelliteTime(), recognizedListResult.getSatelliteTime()); + } + final MogoLatLng renderLoc = new MogoLatLng(recognizedListResult.getLat(), recognizedListResult.getLon()); + long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); + //Log.d("ADAS动画数据", "cost : " + cost); + final long intervalRef = interval - cost; + //Log.d("ADAS动画数据", "最终赋值 : " + intervalRef + " 两帧间隔 : " + interval + " uuid : " + recognizedListResult.getUuid()); + marker.addDynamicAnchorPosition(renderLoc, (float) recognizedListResult.getHeading(), intervalRef); + String carColor = getModelRenderColor(recognizedListResult.getType().getType(), FROM_ADAS, recognizedListResult.getThreatLevel()); + marker.setAnchorColor(carColor); + + newAdasRecognizedMarkersCaches.put(uniqueKey, marker); + +// if (shouldShowSpeed(recognizedListResult.type)) { +// Message msg = mRenderThreadHandler.obtainMessage(); +// msg.obj = new SpeedData(marker +// , recognizedListResult.speed +// , recognizedListResult.uuid +// , recognizedListResult.type +// , recognizedListResult.heading +// , MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()); +// msg.what = MSG_DISPLAY_SPEED; +// msg.sendToTarget(); +// } + Log.d("ADAS数据延时", "render 刷新一台车 cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); + } + + /** + * 绘制 marker + * + * @param recognizedListResult {@link TrafficData} + * @return {@link IMogoMarker} + */ + private IMogoMarker drawAdasRecognizedDataMarker(TrafficData recognizedListResult) { + long start = System.nanoTime(); + if (recognizedListResult == null) { + return null; + } + + int resId = getModelRes(recognizedListResult.getType().getType()); + String resIdVal = resId + ""; + + String carColor = getModelRenderColor(recognizedListResult.getType().getType(), FROM_ADAS, recognizedListResult.getThreatLevel()); + MogoMarkerOptions options = new MogoMarkerOptions() + .owner(DataTypes.TYPE_MARKER_ADAS) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .gps(true) + .anchorColor(carColor) + .controlAngle(true) + .resName(mMarkerCachesResMd5Values.get(resIdVal)) + .icon3DRes(resId) + .rotate((float) recognizedListResult.getHeading()) + .position(new MogoLatLng(recognizedListResult.getLat(), recognizedListResult.getLon())); + IMogoMarker marker = MogoMarkerManager.getInstance(mContext).addMarker(DataTypes.TYPE_MARKER_ADAS, options); + cacheMarkerIconResMd5Val(resIdVal, marker); + Log.d("ADAS数据延时", "创建一个新 marker cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); + return marker; + } + + /** + * vr 模式切换 + */ + public void notifyVrModeChanged() { + clearOldMarker(); + } + + /** + * 清除旧的 marker 数据 + */ + public void clearOldMarker() { + if (mMarkersCaches != null) { + mMarkersCaches.clear(); + } + mLastPositions.clear(); + sendMessage(MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_ADAS); + } +} diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java index 22be83ab23..60e29e4d97 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java @@ -8,6 +8,7 @@ import com.mogo.eagle.core.data.enums.TrafficTypeEnum; import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMarkerManager; import com.mogo.module.common.MogoApisHandler; import java.util.ArrayList; @@ -109,9 +110,7 @@ public class IdentifyDataDrawer { // } // 绘制新数据 - MogoApisHandler.getInstance().getApis() - .getMapServiceApi() - .getMarkerManager(mContext) + MogoMarkerManager.getInstance(mContext) .updateBatchMarkerPosition(filterTrafficData(resultList)); } @@ -140,9 +139,7 @@ public class IdentifyDataDrawer { */ public void clearOldMarker() { for (String uuid : trafficDataUuidList) { - MogoApisHandler.getInstance().getApis() - .getMapServiceApi() - .getMarkerManager(mContext) + MogoMarkerManager.getInstance(mContext) .removeMarker(uuid); } trafficDataUuidList.clear(); @@ -172,9 +169,7 @@ public class IdentifyDataDrawer { * @param s */ private void addPreVehicleModelWeiZhi(TrafficTypeEnum typeTrafficIdWeiZhi, String s) { - String preVehicleStrWeiZhi = MogoApisHandler.getInstance().getApis() - .getMapServiceApi() - .getMarkerManager(mContext) + String preVehicleStrWeiZhi = MogoMarkerManager.getInstance(mContext) .addPreVehicleModel(typeTrafficIdWeiZhi.getType(), typeTrafficIdWeiZhi.getTraffic3DIconId()); CallerLogger.INSTANCE.d(TAG, s + preVehicleStrWeiZhi); diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java index 8ad3349e4e..eb90dc70dc 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/MarkerDrawer.java @@ -5,6 +5,7 @@ import android.text.TextUtils; import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.MogoMarkerOptions; @@ -110,7 +111,7 @@ class MarkerDrawer { options.icon(markerView.getBitmap(0)); } - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).addMarker(markerShowEntity.getMarkerType(), options); + IMogoMarker marker = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).addMarker(markerShowEntity.getMarkerType(), options); if (marker != null) { marker.setOwner(markerShowEntity.getMarkerType()); markerView.setMarker(marker); @@ -129,7 +130,7 @@ class MarkerDrawer { */ public Map purgeMarkerData(List newList, String markerType) { Map existMap = new HashMap<>(); - List allCarsList = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).getMarkers(markerType); + List allCarsList = MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).getMarkers(markerType); if (allCarsList == null || allCarsList.isEmpty()) { return existMap; } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/RoadConditionDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/RoadConditionDrawer.java index 02d08f9bba..1049fdf654 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/RoadConditionDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/RoadConditionDrawer.java @@ -4,6 +4,7 @@ import android.view.animation.LinearInterpolator; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.anim.OnMarkerAnimationListener; @@ -60,7 +61,7 @@ class RoadConditionDrawer { public void drawRoadConditionMarker( List< MarkerExploreWay > exploreWayList, int maxAmount, IMogoMarkerClickListener listener ) { // 将数据同步给探路,避免探路每次 perform 的时候去拉取,造成消耗 if ( exploreWayList == null || exploreWayList.isEmpty() ) { - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager( AbsMogoApplication.getApp() ).removeMarkers( ModuleNames.CARD_TYPE_ROAD_CONDITION ); + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers( ModuleNames.CARD_TYPE_ROAD_CONDITION ); return; } int size = MarkerDrawer.getInstance().getAppropriateSize( maxAmount, exploreWayList ); diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java index b1a812336d..2f3e6a9c13 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java @@ -15,6 +15,7 @@ import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ViewUtils; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.MogoMarkerOptions; @@ -407,7 +408,7 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic options.icon(view); resIdVal = view.getId() + ""; } - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(TYPE_MARKER_CLOUD_DATA, options); + IMogoMarker marker = MogoMarkerManager.getInstance(mContext).addMarker(TYPE_MARKER_CLOUD_DATA, options); cacheMarkerIconResMd5Val(resIdVal, marker); if (!TextUtils.isEmpty(data.getSn())) { diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/TrafficMarkerDrawer.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/TrafficMarkerDrawer.kt index 9e4083f26d..629f16813f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/TrafficMarkerDrawer.kt +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/TrafficMarkerDrawer.kt @@ -13,6 +13,7 @@ import com.mogo.eagle.core.data.traffic.TrafficData import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler +import com.mogo.map.MogoMarkerManager import java.util.concurrent.ConcurrentHashMap /** @@ -197,11 +198,7 @@ object TrafficMarkerDrawer { } } } - - val marker = MogoApisHandler.getInstance().apis - .mapServiceApi - .getMarkerManager(mContext) - .addMarker(DataTypes.TYPE_MARKER_OBU_DATA, options) + val marker = MogoMarkerManager.getInstance(mContext).addMarker(DataTypes.TYPE_MARKER_OBU_DATA, options) // 缓存3D资源 mMarkerCachesResMd5Values[resIdVal] = marker.markerResName diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/V2XWarnDataDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/V2XWarnDataDrawer.java index 9eca458d44..c30c8cf2ea 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/V2XWarnDataDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/V2XWarnDataDrawer.java @@ -6,6 +6,8 @@ import static com.mogo.module.common.constants.DataTypes.TYPE_MARKER_CLOUD_WARN_ import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.eagle.core.utilcode.util.ViewUtils; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.module.common.MogoApisHandler; @@ -105,7 +107,7 @@ public class V2XWarnDataDrawer extends BaseDrawer implements IMogoStatusChangedL IMarkerView iMarkerView = MapMarkerAdapter.getMarkerView(mContext, markerShowEntity, options); options.icon3DRes(getModelRes(modeResType)); //TODO options.anchorColor("#FB3C3CFF"); - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(markerShowEntity.getMarkerType(), options); + IMogoMarker marker = MogoMarkerManager.getInstance(mContext).addMarker(markerShowEntity.getMarkerType(), options); iMarkerView.setMarker(marker); marker.setToTop(); @@ -122,7 +124,7 @@ public class V2XWarnDataDrawer extends BaseDrawer implements IMogoStatusChangedL .icon3DRes(getModelRes(type)) .anchorColor("#FB3C3CFF") .flat(true); - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(markerType, options); + IMogoMarker marker = MogoMarkerManager.getInstance(mContext).addMarker(markerType, options); marker.setRotateAngle(rotate); } @@ -155,7 +157,7 @@ public class V2XWarnDataDrawer extends BaseDrawer implements IMogoStatusChangedL IMarkerView iMarkerView = MapMarkerAdapter.getMarkerView(mContext, markerShowEntity, options); options.icon3DRes(getModelRes(9)); options.anchorColor("#FB3C3CFF"); - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(markerShowEntity.getMarkerType(), options); + IMogoMarker marker = MogoMarkerManager.getInstance(mContext).addMarker(markerShowEntity.getMarkerType(), options); iMarkerView.setMarker(marker); marker.setToTop(); return marker; diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java index 8830e4f793..93aa5832ec 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MarkerServiceHandler.java @@ -6,16 +6,14 @@ import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerManager; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoApisHandler; -import com.mogo.module.common.drawer.MarkerDrawer; -import com.mogo.module.common.entity.MarkerResponse; -import com.mogo.module.common.entity.MarkerShowEntity; import com.mogo.module.service.marker.MapMarkerManager; import com.mogo.service.IMogoServiceApis; import com.mogo.service.analytics.IMogoAnalytics; +import com.mogo.service.cloud.socket.IMogoSocketManager; import com.mogo.service.datamanager.IMogoDataManager; import com.mogo.service.fragmentmanager.IMogoFragmentManager; +import com.mogo.service.imageloader.IMogoImageloader; import com.mogo.service.intent.IMogoIntentManager; -import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.statusmanager.IMogoStatusManager; @@ -31,9 +29,7 @@ public class MarkerServiceHandler { private static final String TAG = "MarkerServiceHandler"; private static IMogoServiceApis sApis; - private static IMogoMapService sMapService; - private static IMogoMarkerManager sMarkerManager; - private static IMogoMapUIController sMapUIController; + private static IMogoStatusManager sMogoStatusManager; private static IMogoAnalytics sMogoAnalytics; private static IMogoRegisterCenter sRegisterCenter; @@ -44,11 +40,8 @@ public class MarkerServiceHandler { public static synchronized void init(final Context context) { sApis = MogoApisHandler.getInstance().getApis(); - sMapService = sApis.getMapServiceApi(); sMogoStatusManager = sApis.getStatusManagerApi(); sMogoAnalytics = sApis.getAnalyticsApi(); - sMarkerManager = sMapService.getMarkerManager(context); - sMapUIController = sMapService.getMapUIController(); sRegisterCenter = sApis.getRegisterCenterApi(); sActionManager = sApis.getActionManagerApi(); sDataManager = sApis.getDataManagerApi(); @@ -61,18 +54,6 @@ public class MarkerServiceHandler { return sApis; } - public static IMogoMapService getMapService() { - return sMapService; - } - - public static IMogoMarkerManager getMarkerManager() { - return sMarkerManager; - } - - public static IMogoMapUIController getMapUIController() { - return sMapUIController; - } - public static IMogoStatusManager getMogoStatusManager() { return sMogoStatusManager; } @@ -81,10 +62,6 @@ public class MarkerServiceHandler { return sMogoAnalytics; } - public static MapMarkerManager getMapMarkerManager() { - return MapMarkerManager.getInstance(); - } - public static IMogoRegisterCenter getRegisterCenter() { return sRegisterCenter; } @@ -104,36 +81,4 @@ public class MarkerServiceHandler { public static IMogoDataManager getDataManager() { return sDataManager; } - - //TODO -------------以下方法是临时过度使用的,后面统一使用,getMapMarkerManager进行调用 - - /** - * 绘制Marker - * 建议使用 - * - * @see MapMarkerManager#drawMapMarker(MarkerResponse) - */ - @Deprecated - public static void drawMapMarker(MarkerResponse response) { - getMapMarkerManager().drawMapMarker(response); - } - - /** - * 绘制Marker - * 建议使用 - * - * @see MapMarkerManager#drawMapMarker(MarkerShowEntity, int) - */ - @Deprecated - public static IMogoMarker drawMapMarker(MarkerShowEntity markerShowEntity) { - return getMapMarkerManager().drawMapMarker(markerShowEntity, MarkerDrawer.MARKER_Z_INDEX_HIGH); - } - - /** - * 对指定类型高亮处理 - * 建议使用 - */ - @Deprecated - public static void highlightedMarker(String typeTag) { - } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index ef09c2f548..1f45b9bfdc 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -22,12 +22,13 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.map.IDestroyable; +import com.mogo.map.MogoMapUIController; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.map.uicontroller.EnumMapUI; -import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; @@ -47,7 +48,6 @@ import com.mogo.service.fragmentmanager.FragmentStackTransactionListener; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.intent.IMogoIntentManager; -import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.module.MogoAction; @@ -105,8 +105,6 @@ public class MogoServices implements IMogoMapListener, private MogoLatLng mLastAutoRefreshLocation = null; - private IMogoMapUIController mUiController; - /** * 是否已计算出地图显示状态 */ @@ -125,7 +123,6 @@ public class MogoServices implements IMogoMapListener, // 上次手动操作的中心点坐标 private MogoLatLng mLastCustomRefreshCenterLocation; - private IMogoMapService mMogoMapService; private IMogoStatusManager mStatusManager; private IMogoIntentManager mIntentManager; private IMogoActionManager mActionManager; @@ -187,13 +184,13 @@ public class MogoServices implements IMogoMapListener, private void invokeAutoRefresh() { if (mStatusManager.isSearchUIShow() || mStatusManager.isV2XShow()) { mStatusManager.setUserInteractionStatus(TAG, true, false); - mUiController.recoverLockMode(); + MogoMapUIController.getInstance().recoverLockMode(); return; } mStatusManager.setUserInteractionStatus(ServiceConst.TYPE, true, false); - mUiController.changeZoom(ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL); + MogoMapUIController.getInstance().changeZoom(ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL); mStatusManager.setUserInteractionStatus(TAG, true, false); - mUiController.recoverLockMode(); + MogoMapUIController.getInstance().recoverLockMode(); notifyRefreshData(mLastAutoRefreshLocation, ServiceConst.DEFAULT_AUTO_REFRESH_DATA_RADIUS, mAutoRefreshCallback); } @@ -275,10 +272,7 @@ public class MogoServices implements IMogoMapListener, public void preInit(Context context) { mContext = context; - mRefreshModel = new RefreshModel(context); - mMogoMapService = MarkerServiceHandler.getMapService(); - mUiController = mMogoMapService.getMapUIController(); - + mRefreshModel = new RefreshModel( context ); mStatusManager = MarkerServiceHandler.getMogoStatusManager(); mStatusManager.registerStatusChangedListener(ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, statusChangedListener); mStatusManager.registerStatusChangedListener(ServiceConst.TYPE, StatusDescriptor.SEARCH_UI, statusChangedListener); @@ -445,7 +439,7 @@ public class MogoServices implements IMogoMapListener, switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: if (mLastZoomLevel == 0) { - mLastZoomLevel = mUiController.getZoomLevel(); + mLastZoomLevel = MogoMapUIController.getInstance().getZoomLevel(); } break; case MotionEvent.ACTION_UP: @@ -480,8 +474,6 @@ public class MogoServices implements IMogoMapListener, MapMarkerManager.getInstance().syncLocation(latLng.lon, latLng.lat); - CallerLogger.INSTANCE.d(M_OLD_OTHER + TAG, "zoom = " + zoom); - if (mIsCameraInited) { mLastZoomLevel = zoom; mLastCustomRefreshCenterLocation = latLng; @@ -530,8 +522,8 @@ public class MogoServices implements IMogoMapListener, } private int getQueryRadius() { - mCameraSouthWestPosition = mUiController.getCameraSouthWestPosition(); - mCameraNorthEastPosition = mUiController.getCameraNorthEastPosition(); + mCameraSouthWestPosition = MogoMapUIController.getInstance().getCameraSouthWestPosition(); + mCameraNorthEastPosition = MogoMapUIController.getInstance().getCameraNorthEastPosition(); int radius; if (mIsVertical) { radius = ((int) (getMapCameraFactWidth() / 2)); @@ -596,12 +588,12 @@ public class MogoServices implements IMogoMapListener, startFirstLocationRequest(point); return; } - float distance = Utils.calculateLineDistance(mLastAutoRefreshLocation, point); - if (distance > mAutoRefreshStrategy.getDistance()) { - mStatusManager.setUserInteractionStatus(ServiceConst.TYPE, true, false); - mUiController.recoverLockMode(); - mStatusManager.setUserInteractionStatus(TAG, true, false); - mUiController.changeZoom(ServiceConst.DEFAULT_ZOOM_LEVEL); + float distance = Utils.calculateLineDistance( mLastAutoRefreshLocation, point ); + if ( distance > mAutoRefreshStrategy.getDistance() ) { + mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false ); + MogoMapUIController.getInstance().recoverLockMode(); + mStatusManager.setUserInteractionStatus( TAG, true, false ); + MogoMapUIController.getInstance().changeZoom( ServiceConst.DEFAULT_ZOOM_LEVEL ); mLastAutoRefreshLocation = point; notifyRefreshData(mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback); } @@ -661,8 +653,8 @@ public class MogoServices implements IMogoMapListener, public void clearAllData() { try { - MarkerServiceHandler.getMapService().getMarkerManager(mContext).removeMarkers(); - } catch (Exception e) { + MogoMarkerManager.getInstance(mContext).removeMarkers(); + } catch ( Exception e ) { e.printStackTrace(); } } @@ -686,9 +678,9 @@ public class MogoServices implements IMogoMapListener, } public void refreshStrategy() { - mStatusManager.setUserInteractionStatus(ServiceConst.TYPE, true, false); - mUiController.recoverLockMode();// 锁车代替移到中心点 - restartAutoRefreshAtTime(0); + mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false ); + MogoMapUIController.getInstance().recoverLockMode();// 锁车代替移到中心点 + restartAutoRefreshAtTime( 0 ); } @@ -731,14 +723,14 @@ public class MogoServices implements IMogoMapListener, } @Override - public void onCmdSelected(String cmd) { - if (TextUtils.equals(ServiceConst.CMD_UN_WAKE_PREV, cmd)) { - onActionDone(MogoAction.Prev); - } else if (TextUtils.equals(ServiceConst.CMD_UN_WAKE_NEXT, cmd)) { - onActionDone(MogoAction.Next); - } else if (TextUtils.equals(ServiceConst.CMD_UN_WAKEUP_MY_LOCATION, cmd)) { - if (mStatusManager.isMainPageOnResume()) { - mUiController.recoverLockMode(); + public void onCmdSelected( String cmd ) { + if ( TextUtils.equals( ServiceConst.CMD_UN_WAKE_PREV, cmd ) ) { + onActionDone( MogoAction.Prev ); + } else if ( TextUtils.equals( ServiceConst.CMD_UN_WAKE_NEXT, cmd ) ) { + onActionDone( MogoAction.Next ); + } else if ( TextUtils.equals( ServiceConst.CMD_UN_WAKEUP_MY_LOCATION, cmd ) ) { + if ( mStatusManager.isMainPageOnResume() ) { + MogoMapUIController.getInstance().recoverLockMode(); } } else if (TextUtils.equals(ServiceConst.CMD_BACK, cmd)) { mFragmentManager.clearAll(); @@ -759,17 +751,17 @@ public class MogoServices implements IMogoMapListener, } @Override - public void onTransaction(int size) { - if (size == 0) { - mUiController.showMyLocation(true); - AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ServiceConst.CMD_BACK); - if (mStatusManager.isSearchUIShow()) { - mStatusManager.setSearchUIShow(TAG, false); + public void onTransaction( int size ) { + if ( size == 0 ) { + MogoMapUIController.getInstance().showMyLocation( true ); + AIAssist.getInstance( mContext ).unregisterUnWakeupCommand( ServiceConst.CMD_BACK ); + if ( mStatusManager.isSearchUIShow() ) { + mStatusManager.setSearchUIShow( TAG, false ); } - mUiController.recoverLockMode(); + MogoMapUIController.getInstance().recoverLockMode(); } else { - mUiController.showMyLocation(false); - AIAssist.getInstance(mContext).registerUnWakeupCommand(ServiceConst.CMD_BACK, ServiceConst.CMD_BACK_WORDS, this); + MogoMapUIController.getInstance().showMyLocation( false ); + AIAssist.getInstance( mContext ).registerUnWakeupCommand( ServiceConst.CMD_BACK, ServiceConst.CMD_BACK_WORDS, this ); } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/StatusChangedAdapter.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/StatusChangedAdapter.java index a559412815..5da99f4035 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/StatusChangedAdapter.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/StatusChangedAdapter.java @@ -5,6 +5,8 @@ import android.content.Intent; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoLocationClient; +import com.mogo.map.MogoMarkerManager; import com.mogo.module.service.launchercard.LauncherCardRefresher; import com.mogo.module.service.marker.MapMarkerManager; import com.mogo.service.statusmanager.IMogoStatusChangedListener; @@ -131,14 +133,14 @@ abstract class StatusChangedAdapter implements IMogoStatusChangedListener { mIsFirstAccOn = false; return; } - MarkerServiceHandler.getApis().getMapServiceApi().getSingletonLocationClient(AbsMogoApplication.getApp()).start(); - MarkerServiceHandler.getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(); + MogoLocationClient.getInstance(AbsMogoApplication.getApp()).start(); + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(); UiThreadHandler.postDelayed(() -> { MogoServices.getInstance().refreshStrategy(); }, 3_000L); } else { - MarkerServiceHandler.getApis().getMapServiceApi().getSingletonLocationClient(AbsMogoApplication.getApp()).stop(); - MarkerServiceHandler.getApis().getMapServiceApi().getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(); + MogoLocationClient.getInstance(AbsMogoApplication.getApp()).stop(); + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()).removeMarkers(); } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/handler/RefreshWorkThreadHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/handler/RefreshWorkThreadHandler.java index 902c7251af..04e1cc8ae6 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/handler/RefreshWorkThreadHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/handler/RefreshWorkThreadHandler.java @@ -5,6 +5,7 @@ import android.os.Looper; import android.os.Message; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.map.MogoMapUIController; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.service.ServiceConst; @@ -58,7 +59,7 @@ abstract class RefreshWorkThreadHandler extends Handler { if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { return; } - MogoApisHandler.getInstance().getApis().getStatusManagerApi().setUserInteractionStatus(TAG, true, false); - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().recoverLockMode(); + MogoApisHandler.getInstance().getApis().getStatusManagerApi().setUserInteractionStatus( TAG, true, false ); + MogoMapUIController.getInstance().recoverLockMode(); } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java index e37f9be844..9dee9fd091 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java @@ -16,14 +16,20 @@ import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; +import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.data.traffic.TrafficData; +import com.mogo.eagle.core.function.api.map.IMogoMapFrameController; +import com.mogo.eagle.core.function.call.base.CallerBase; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.AppStateManager; import com.mogo.eagle.core.utilcode.util.ToastUtils; +import com.mogo.map.MogoMapUIController; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.search.geo.IMogoGeoSearch; @@ -31,7 +37,6 @@ import com.mogo.map.search.geo.IMogoGeoSearchListener; import com.mogo.map.search.geo.MogoGeocodeResult; import com.mogo.map.search.geo.MogoRegeocodeResult; import com.mogo.map.search.geo.query.MogoRegeocodeQuery; -import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.constants.DataTypes; import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; import com.mogo.module.common.dialog.WMDialog; @@ -70,7 +75,7 @@ public class MockIntentHandler implements IntentHandler { switch (oper) { case 1: // 展示自车位置 - MarkerServiceHandler.getMapUIController().showMyLocation(intent.getBooleanExtra("status", true)); + MogoMapUIController.getInstance().showMyLocation(intent.getBooleanExtra("status", true)); break; case 2: // 发起求助 @@ -89,7 +94,7 @@ public class MockIntentHandler implements IntentHandler { break; case 8:// 测试修改车头角度 float bearing = intent.getFloatExtra("bearing", 0); - MarkerServiceHandler.getMapUIController().changeBearing(bearing); + MogoMapUIController.getInstance().changeBearing(bearing); break; case 9:// 测试弹窗 Activity activity = AppStateManager.INSTANCE.currentActivity(); @@ -103,7 +108,7 @@ public class MockIntentHandler implements IntentHandler { } break; case 10://测试GEO查询 - IMogoGeoSearch geoSearch = MarkerServiceHandler.getMapService().getGeoSearch(context); + IMogoGeoSearch geoSearch = CallerMapUIServiceManager.INSTANCE.getGeoSearch(context); geoSearch.setGeoSearchListener(new IMogoGeoSearchListener() { @Override public void onRegeocodeSearched(MogoRegeocodeResult regeocodeResult) { @@ -235,10 +240,10 @@ public class MockIntentHandler implements IntentHandler { .owner(TAG) .autoManager(false); int duration = intent.getIntExtra("duration", 30); - IMogoMarker marker = MarkerServiceHandler.getMarkerManager().addMarker(TAG, options); + IMogoMarker marker = MogoMarkerManager.getInstance(context).addMarker(TAG, options); MarkerServiceHandler.getMogoStatusManager().setUserInteractionStatus(TAG, true, false); if (!MarkerServiceHandler.getApis().getStatusManagerApi().isVrMode()) { - MarkerServiceHandler.getMapUIController().moveToCenter(mogoLatLngs.get(0)); + MogoMapUIController.getInstance().moveToCenter(mogoLatLngs.get(0)); } WorkThreadHandler.getInstance().post(() -> marker.startSmooth(mogoLatLngs, duration)); break; @@ -251,7 +256,7 @@ public class MockIntentHandler implements IntentHandler { SharedPrefsMgr.getInstance(context).putBoolean("useCustomMap", intent.getBooleanExtra("useCustomMap", false)); break; case 30:// 强制刷新地图 - MarkerServiceHandler.getMapService().getMapUIController().forceRender(); + MogoMapUIController.getInstance().forceRender(); break; case 31:// Intent intent3 = new Intent(); @@ -261,7 +266,7 @@ public class MockIntentHandler implements IntentHandler { context.sendBroadcast(intent3); break; case 32:// 控制实时路况 - MarkerServiceHandler.getMapService().getMapUIController().setTrafficEnabled(true); + MogoMapUIController.getInstance().setTrafficEnabled(true); break; case 33:// 测试小智语音 AIAssist.getInstance(context).speakTTSVoice("庞帆说这个是一个 hard coding."); @@ -269,17 +274,15 @@ public class MockIntentHandler implements IntentHandler { case 34:// 修改地图模式VR OR 2D int type = intent.getIntExtra("type", 0); if (type != 0) { - MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().changeToVRMode(); + CallerBase.getApiInstance(IMogoMapFrameController.class, MogoServicePaths.PATH_MAP_FRAME_CONTROLLER).changeToVRMode(); } else { - MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().changeTo2dMode(); + CallerBase.getApiInstance(IMogoMapFrameController.class, MogoServicePaths.PATH_MAP_FRAME_CONTROLLER).changeTo2dMode(); } break; case 36:// 测试打点功能 - MogoLatLng center = MogoApisHandler.getInstance().getApis() - .getMapServiceApi().getMapUIController() + MogoLatLng center = MogoMapUIController.getInstance() .getWindowCenterLocation(); - centerMarker = MogoApisHandler.getInstance().getApis() - .getMapServiceApi().getMarkerManager(context) + centerMarker = MogoMarkerManager.getInstance(context) .addMarker(TAG, new MogoMarkerOptions() .position(center) .icon(BitmapFactory.decodeResource(context.getResources(), R.drawable.bg_map_marker_red))); @@ -290,7 +293,7 @@ public class MockIntentHandler implements IntentHandler { } break; case 38:// 控制RTK - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController() + MogoMapUIController.getInstance() .rtkEnable(false); break; case 40: @@ -404,10 +407,7 @@ public class MockIntentHandler implements IntentHandler { }); break; case 45:// 测试开启鹰眼模式 - MogoApisHandler.getInstance() - .getApis() - .getMapServiceApi() - .getMapUIController() + MogoMapUIController.getInstance() .openVrMode(false); break; case 46:// 模拟鹰眼模式下绘制车辆周边的数据 @@ -423,7 +423,7 @@ public class MockIntentHandler implements IntentHandler { .controlAngle(true) .icon3DRes(R.raw.special_vehicle) .rotate((float) 358.526123); - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options); + IMogoMarker marker = MogoMarkerManager.getInstance(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options); List latLngs = new ArrayList<>(); latLngs.add(new MogoLatLng(39.981971055705, 116.41150648393)); latLngs.add(new MogoLatLng(39.981990561932, 116.412893641626)); @@ -441,7 +441,7 @@ public class MockIntentHandler implements IntentHandler { .controlAngle(false) .icon(BitmapFactory.decodeResource(context.getResources(), R.drawable.sy)) .rotate((float) 358.526123); - IMogoMarker marker1 = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options1); + IMogoMarker marker1 = MogoMarkerManager.getInstance(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options1); MogoMarkerOptions options2 = new MogoMarkerOptions() .owner(DataTypes.TYPE_MARKER_ADAS) .anchor(0.5f, 0.5f) @@ -451,7 +451,7 @@ public class MockIntentHandler implements IntentHandler { .controlAngle(false) .icon(BitmapFactory.decodeResource(context.getResources(), R.drawable.sr)) .rotate((float) 358.526123); - IMogoMarker marker2 = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options2); + IMogoMarker marker2 = MogoMarkerManager.getInstance(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options2); MogoMarkerOptions options3 = new MogoMarkerOptions() .owner(DataTypes.TYPE_MARKER_ADAS) .anchor(0.5f, 0.5f) @@ -461,7 +461,7 @@ public class MockIntentHandler implements IntentHandler { .controlAngle(false) .icon(BitmapFactory.decodeResource(context.getResources(), R.drawable.bg_map_marker_red)) .rotate((float) 358.526123); - IMogoMarker marker3 = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options3); + IMogoMarker marker3 = MogoMarkerManager.getInstance(context).addMarker(DataTypes.TYPE_MARKER_ADAS, options3); break; case 51:// 模拟路口车辆移动 // mLocationMockHandler.sendEmptyMessageDelayed(100, 0L); @@ -499,7 +499,7 @@ public class MockIntentHandler implements IntentHandler { locJo.put("satelliteTime", System.currentTimeMillis()); locJo.put("systemTime", System.currentTimeMillis()); } - MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map(locJo); + MogoMapUIController.getInstance().syncLocation2Map(locJo); mLocationMockHandler.sendEmptyMessageDelayed(100, 50L); } @@ -540,7 +540,7 @@ public class MockIntentHandler implements IntentHandler { data.putOpt("heading", stateInfo.getValues().getHeading()); data.putOpt("acceleration", stateInfo.getValues().getAcceleration()); data.putOpt("yawRate", stateInfo.getValues().getYaw_rate()); - MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map(data); + MogoMapUIController.getInstance().syncLocation2Map(data); // SnapshotUploadInTime.getInstance().syncAdasLocationInfo( data ); } catch (Exception e) { e.printStackTrace(); @@ -711,7 +711,7 @@ public class MockIntentHandler implements IntentHandler { } JSONObject jo = new JSONObject(line); //改变rtk定位数据,触发自车移动 - MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map(jo); + MogoMapUIController.getInstance().syncLocation2Map(jo); SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo(jo); return true; } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MyLocationHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MyLocationHandler.java index 6da893ac9c..efa65cd510 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MyLocationHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MyLocationHandler.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.MogoMapUIController; import com.mogo.module.service.MarkerServiceHandler; /** @@ -20,10 +21,10 @@ public class MyLocationHandler implements IntentHandler { return; } if ( MarkerServiceHandler.getMogoStatusManager().isMainPageOnResume() ) { - MarkerServiceHandler.getMapUIController().recoverLockMode(); + MogoMapUIController.getInstance().recoverLockMode(); } else { UiThreadHandler.postDelayed( () -> { - MarkerServiceHandler.getMapUIController().recoverLockMode(); + MogoMapUIController.getInstance().recoverLockMode(); }, 2_000L ); } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/NetworkChangedIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/NetworkChangedIntentHandler.java index e71b8d0efe..9273eed4ef 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/NetworkChangedIntentHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/NetworkChangedIntentHandler.java @@ -4,7 +4,7 @@ import android.content.Context; import android.content.Intent; import com.mogo.eagle.core.utilcode.util.NetworkUtils; -import com.mogo.module.common.MogoApisHandler; +import com.mogo.map.MogoMapUIController; public /** @@ -21,10 +21,7 @@ class NetworkChangedIntentHandler implements IntentHandler { public void handle( Context context, Intent intent ) { if ( NetworkUtils.isConnected( context ) ) { try { - MogoApisHandler.getInstance() - .getApis() - .getMapServiceApi() - .getMapUIController() + MogoMapUIController.getInstance() .setTrafficEnabled( true ); } catch ( Exception e ) { e.printStackTrace(); diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/launchercard/LauncherCardRefresher.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/launchercard/LauncherCardRefresher.java index 4fed421d0a..f3232b65e1 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/launchercard/LauncherCardRefresher.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/launchercard/LauncherCardRefresher.java @@ -19,6 +19,7 @@ import com.mogo.eagle.core.network.utils.GsonUtil; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.AppUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; +import com.mogo.map.MogoLocationClient; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.service.MarkerServiceHandler; import com.mogo.module.service.R; @@ -180,10 +181,7 @@ class LauncherCardRefresher { } private void trtRequestNetworkConfigStrategy() { - if ( NetworkUtils.isConnected( mContext ) && MogoApisHandler.getInstance() - .getApis() - .getMapServiceApi() - .getSingletonLocationClient( mContext ) + if ( NetworkUtils.isConnected( mContext ) && MogoLocationClient.getInstance(mContext) .getLastKnowLocation() != null ) { mHandler.sendEmptyMessageDelayed( MSG_LOAD_NET_CONFIG, 0L ); mHandler.sendEmptyMessageDelayed( MSG_LOAD_NET_CONFIG2, 2 * ONE_MINUTE ); @@ -385,7 +383,7 @@ class LauncherCardRefresher { String name = SharedPrefsMgr.getInstance( mContext ).getString( KEY_LAST_LOAD_TTS_TYPE, LauncherCardRefreshType.Weather.name() ); LauncherCardRefreshType type = LauncherCardRefreshType.valueOf( name ); - MogoLocation location = MogoApisHandler.getInstance().getApis().getMapServiceApi().getSingletonLocationClient( mContext ).getLastKnowLocation(); + MogoLocation location = MogoLocationClient.getInstance(mContext).getLastKnowLocation(); TtsConfigBody body = new TtsConfigBody() .addType( LauncherCardRefreshType.NearRoads.getVal() ) .addType( LauncherCardRefreshType.News.getVal() ) diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index ffd03b7eec..47985d6f28 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -12,6 +12,8 @@ import com.mogo.eagle.core.utilcode.mogo.toast.ResourcesHelper; import com.mogo.eagle.core.utilcode.util.ThreadPoolService; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.eagle.core.utilcode.util.ViewUtils; +import com.mogo.map.MogoMapUIController; +import com.mogo.map.MogoMarkerManager; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.IMogoMarkerManager; @@ -235,7 +237,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } if (!MarkerServiceHandler.getApis().getStatusManagerApi().isVrMode()) { MarkerServiceHandler.getMogoStatusManager().setUserInteractionStatus(TAG, true, false); - MarkerServiceHandler.getMapUIController().moveToCenter(mogoMarker.getPosition(), true); + MogoMapUIController.getInstance().moveToCenter(mogoMarker.getPosition(), true); } } @@ -347,7 +349,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, return; } - if (MarkerServiceHandler.getMapUIController().getCurrentMapVisualAngle().isLongSight()) { + if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight()) { return; } @@ -601,7 +603,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, * 移除在线车辆 marker */ private void removeCarMarkers() { - MarkerServiceHandler.getMarkerManager().removeMarkers(ModuleNames.CARD_TYPE_USER_DATA); + MogoMarkerManager.getInstance(mContext).removeMarkers(ModuleNames.CARD_TYPE_USER_DATA); } /** @@ -614,7 +616,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, || MarkerServiceHandler.getMogoStatusManager().isV2XShow() || !MarkerServiceHandler.getMogoStatusManager().isMainPageLaunched() || !MarkerServiceHandler.getMogoStatusManager().isMainPageOnResume() - || MarkerServiceHandler.getMapUIController().getCurrentMapVisualAngle().isLongSight(); + || MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight(); } private void runOnTargetThread(Runnable runnable) { @@ -633,7 +635,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, if (data instanceof MarkerShowEntity && ((MarkerShowEntity) data).getMarker() != null) { switchMarkerOpenStatus(((MarkerShowEntity) data).getMarker()); } else { - IMogoMarkerManager markerManager = MarkerServiceHandler.getMarkerManager(); + IMogoMarkerManager markerManager = MogoMarkerManager.getInstance(mContext); List markers = markerManager.getMarkers(biz); if (markers != null) { try { @@ -661,7 +663,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, public void redrawMarkerByStyleChanged() { if (mLastDataResult != null) { runOnTargetThread(() -> { - MarkerServiceHandler.getMarkerManager().removeMarkers(ModuleNames.CARD_TYPE_ROAD_CONDITION); + MogoMarkerManager.getInstance(mContext).removeMarkers(ModuleNames.CARD_TYPE_ROAD_CONDITION); drawMarkerByCurrentType(mLastDataResult); mLastCheckMarker = null; }); 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 a194bf73d1..c45236b594 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 @@ -10,6 +10,9 @@ import android.graphics.Color; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ColorUtils; +import com.mogo.eagle.core.utilcode.util.ToastUtils; +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; @@ -49,7 +52,7 @@ public class RouteOverlayDrawer { // 引导线颜色, mPolylineColors = new ArrayList<>(); mContext = context; - mogoOverlayManager = MogoApisHandler.getInstance().getApis().getMapServiceApi().getOverlayManager(mContext); + mogoOverlayManager = MogoOverlayManager.getInstance(); endingBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_route_ending); } @@ -74,7 +77,6 @@ public class RouteOverlayDrawer { return sInstance; } - public void addEndingMarker(double lat, double lon) { if (endMarker != null) { return; @@ -92,7 +94,7 @@ public class RouteOverlayDrawer { } markderOptions.latitude(lat).longitude(lon); //CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"addEndingMarker-"+lat+":"+lon); - endMarker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(markerType, markderOptions); + endMarker = MogoMarkerManager.getInstance(mContext).addMarker(markerType, markderOptions); // if (DebugConfig.isDebug()){ // ToastUtils.showLong("绘制终点marker,"+lat+":"+lon); // } @@ -110,7 +112,7 @@ public class RouteOverlayDrawer { public void clearEndingMarker() { //CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"clearEndingMarker"); endMarker = null; - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).removeMarkers(markerType); + MogoMarkerManager.getInstance(mContext).removeMarkers(markerType); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java index 00ec962e84..eb72d214a9 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java @@ -12,10 +12,7 @@ import com.mogo.service.datamanager.IMogoDataManager; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.imageloader.IMogoImageloader; import com.mogo.service.intent.IMogoIntentManager; -import com.mogo.service.map.IMogoMapFrameController; -import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; -import com.mogo.service.module.IMogoMarkerService; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.network.IMogoNetwork; import com.mogo.service.statusmanager.IMogoStatusManager; @@ -74,13 +71,6 @@ public interface IMogoServiceApis extends IProvider { */ IMogoIntentManager getIntentManagerApi(); - /** - * 地图方服务接口 - * - * @return - */ - IMogoMapService getMapServiceApi(); - /** * 各业务回调接口注册接口 * @@ -139,13 +129,6 @@ public interface IMogoServiceApis extends IProvider { */ DisplayEffectsInterface getDisplayEffectsManager(); - /** - * 其他模块调用公共的marker打点 - * - * @return - */ - IMogoMarkerService getMarkerService(); - /** * 获取位置上报服务接口 * @@ -159,12 +142,4 @@ public interface IMogoServiceApis extends IProvider { * @return */ IMogoPassportManager getPassportManagerApi(); - - /** - * 地图图层控制接口 - * - * @return - */ - IMogoMapFrameController getMapFrameControllerApi(); - } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java index 1b037af306..f1b21b2ed8 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java @@ -21,10 +21,7 @@ import com.mogo.service.impl.imageloader.glide.GlideImageLoader; import com.mogo.service.impl.intent.IntentManager; import com.mogo.service.impl.singleton.SingletonsHolder; import com.mogo.service.intent.IMogoIntentManager; -import com.mogo.service.map.IMogoMapFrameController; -import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; -import com.mogo.service.module.IMogoMarkerService; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.network.IMogoNetwork; import com.mogo.service.statusmanager.IMogoStatusManager; @@ -71,11 +68,6 @@ public class MogoServiceApis implements IMogoServiceApis { return IntentManager.getInstance(); } - @Override - public IMogoMapService getMapServiceApi() { - return SingletonsHolder.get(IMogoMapService.class); - } - @Override public IMogoNetwork getNetworkApi() { return SingletonsHolder.get(IMogoNetwork.class); @@ -127,11 +119,6 @@ public class MogoServiceApis implements IMogoServiceApis { return getApiInstance(DisplayEffectsInterface.class, MogoServicePaths.PATH_MAIN_DISPLAY_EFFECTS_MANAGER); } - @Override - public IMogoMarkerService getMarkerService() { - return getApiInstance(IMogoMarkerService.class, MogoServicePaths.PATH_MARKER_SERVICE); - } - @Override public IMogoLocationInfoService getLocationInfoApi() { return getApiInstance(IMogoLocationInfoService.class, MogoServicePaths.PATH_LOCATION_INFO); @@ -142,11 +129,6 @@ public class MogoServiceApis implements IMogoServiceApis { return getApiInstance(IMogoPassportManager.class, MogoServicePaths.PATH_PASSPORT); } - @Override - public IMogoMapFrameController getMapFrameControllerApi() { - return getApiInstance(IMogoMapFrameController.class, MogoServicePaths.PATH_MAP_FRAME_CONTROLLER); - } - private static T getApiInstance(Class clazz, String path) { T inst = SingletonsHolder.get(clazz); if (inst == null) { diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/singleton/SingletonsHolder.java b/services/mogo-service/src/main/java/com/mogo/service/impl/singleton/SingletonsHolder.java index 331b20af6b..27e9d38f5e 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/singleton/SingletonsHolder.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/singleton/SingletonsHolder.java @@ -5,10 +5,8 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.service.datamanager.IMogoDataManager; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.impl.fragmentmanager.MogoFragmentManager; -import com.mogo.service.impl.map.MogoMapService; import com.mogo.service.impl.network.MogoNetWorkService; import com.mogo.service.impl.statusmanager.MogoStatusManager; -import com.mogo.service.map.IMogoMapService; import com.mogo.service.network.IMogoNetwork; import com.mogo.service.statusmanager.IMogoStatusManager; @@ -29,7 +27,6 @@ public class SingletonsHolder { static { sSingletons.put(IMogoFragmentManager.class, new MogoFragmentManager()); - sSingletons.put(IMogoMapService.class, new MogoMapService()); sSingletons.put(IMogoNetwork.class, new MogoNetWorkService()); sSingletons.put(IMogoStatusManager.class, new MogoStatusManager()); sSingletons.put(IMogoDataManager.class, ARouter.getInstance().navigation(IMogoDataManager.class)); diff --git a/settings.gradle b/settings.gradle index 2fe6044a80..a4e3c5175e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -58,7 +58,6 @@ include ':foudations:mogo-commons' // 基础库 include ':libraries:map-usbcamera' -include ':libraries:map-custom' include ':libraries:mogo-map-api' include ':libraries:mogo-map' include ':libraries:mogo-adas'