From 2c1605a60fbfcffacaf09620c705f841f11fe4ec Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Sun, 25 Oct 2020 11:05:29 +0800 Subject: [PATCH 1/7] opt ui --- .../java/com/mogo/module/tanlu/fragment/TanluListWindow.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/mogo-module-tanlu/src/main/java/com/mogo/module/tanlu/fragment/TanluListWindow.java b/modules/mogo-module-tanlu/src/main/java/com/mogo/module/tanlu/fragment/TanluListWindow.java index ae0c326c62..129a869cee 100644 --- a/modules/mogo-module-tanlu/src/main/java/com/mogo/module/tanlu/fragment/TanluListWindow.java +++ b/modules/mogo-module-tanlu/src/main/java/com/mogo/module/tanlu/fragment/TanluListWindow.java @@ -106,6 +106,7 @@ import com.mogo.utils.TipToast; import com.mogo.utils.WorkThreadHandler; import com.mogo.utils.logger.Logger; import com.shuyu.gsyvideoplayer.GSYVideoManager; +import com.shuyu.gsyvideoplayer.utils.GSYVideoType; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -128,6 +129,7 @@ import static com.mogo.module.tanlu.constant.TanluConstants.PLAY_VIDEO_AWAKEN; import static com.mogo.module.tanlu.constant.TanluConstants.SPECIFIEDROAD_SEARCH; import static com.mogo.module.tanlu.constant.TanluConstants.TXZ_SPECIFIEDROAD_SEARCH; import static com.mogo.module.tanlu.video.VideoInitKt.initVideo; +import static com.shuyu.gsyvideoplayer.utils.GSYVideoType.SCREEN_MATCH_FULL; /** * @author lixiaopeng @@ -205,6 +207,7 @@ public class TanluListWindow extends RelativeLayout implements IMogoMarkerClickL protected void initViews() { LayoutInflater.from(mContext).inflate(R.layout.tanlu_main_media_recycler_new, this); initVideo(); + GSYVideoType.setShowType(SCREEN_MATCH_FULL); mLoopRecyclerView = findViewById(R.id.tanlu_rloop_recycleview); mLoopRecyclerView.setHasFixedSize(true); mLoopRecyclerView.setOverScrollMode(OVER_SCROLL_NEVER); From 771e5eed13af64dee425a4b2008f951f42daf43e Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Sun, 25 Oct 2020 11:08:46 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + config.gradle | 4 +- .../mogo/map/impl/amap/AMapViewHandler.java | 6 +- .../impl/amap/location/ALocationClient.java | 31 ++----- .../mogo/map/impl/amap/navi/NaviClient.java | 13 ++- .../impl/amap/navi/NaviListenerAdapter.java | 6 -- .../map/impl/amap/navi/NaviOverlayHelper.java | 10 +-- .../map/impl/automap/navi/AutoNaviClient.java | 3 +- libraries/map-custom/build.gradle | 2 +- .../mogo/map/impl/custom/AMapViewWrapper.java | 6 +- ...MapBaseMapView.java => CustomMapView.java} | 12 +-- .../impl/custom/location/ALocationClient.java | 35 ++------ .../mogo/map/impl/custom/navi/NaviClient.java | 12 ++- .../java/com/mogo/map/MogoBaseMapView.java | 38 +++----- .../map/location/IMogoLocationClient.java | 16 +--- .../IMogoLocationListenerRegister.java | 24 +++++ .../MogoLocationListenerRegister.java | 75 ++++++++++++++++ ...ogoCarLocationChangedListenerRegister.java | 18 ++++ .../java/com/mogo/map/navi/IMogoNavi.java | 15 +--- .../navi/IMogoOperationListenerRegister.java | 17 ++++ ...ogoCarLocationChangedListenerRegister.java | 50 +++++++++++ .../navi/MogoOperationListenerRegister.java | 47 ++++++++++ .../java/com/mogo/map/MogoLocationClient.java | 10 +-- .../com/mogo/map/MogoMapDelegateFactory.java | 20 ----- .../com/mogo/map/MogoMapUIController.java | 8 ++ .../main/java/com/mogo/map/MogoMapView.java | 71 ++++++++++++--- .../src/main/java/com/mogo/map/MogoNavi.java | 10 +-- .../mogo/module/main/EventDispatchCenter.java | 6 ++ .../java/com/mogo/module/map/MapFragment.java | 47 +++++++++- .../mogo/module/map/MapFrameController.java | 51 +++++++++++ .../autopilot/AutoPilotRemoteController.java | 11 +-- .../service/intent/MockIntentHandler.java | 9 ++ .../com/mogo/service/IMogoServiceApis.java | 16 ++++ .../com/mogo/service/MogoServicePaths.java | 7 +- .../service/adas/IMogoADASController.java | 17 +++- .../service/adas/IMogoAdasDataCallback.java | 14 +++ .../adas/IMogoAdasRecognizedDataCallback.java | 14 +++ .../RemoteControlAutoPilotParameters.java | 4 +- .../service/map/IMogoMapFrameController.java | 26 ++++++ services/mogo-service/build.gradle | 1 + .../mogo/service/impl/MogoServiceApis.java | 20 +++-- .../adas/AdasControlCommandParameter.java | 19 ++++ .../service/impl/adas/MogoADASController.java | 89 ++++++++++++++++--- .../impl/adas/OnAdasListenerAdapter.java | 60 +++++++++++++ 44 files changed, 740 insertions(+), 231 deletions(-) rename libraries/map-custom/src/main/java/com/mogo/map/impl/custom/{AMapBaseMapView.java => CustomMapView.java} (71%) create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationListenerRegister.java create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/location/MogoLocationListenerRegister.java create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoCarLocationChangedListenerRegister.java create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoOperationListenerRegister.java create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCarLocationChangedListenerRegister.java create mode 100644 libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoOperationListenerRegister.java create mode 100644 modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFrameController.java create mode 100644 services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java create mode 100644 services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasRecognizedDataCallback.java rename modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotParameters.java => services/mogo-service-api/src/main/java/com/mogo/service/adas/RemoteControlAutoPilotParameters.java (83%) create mode 100644 services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java create mode 100644 services/mogo-service/src/main/java/com/mogo/service/impl/adas/AdasControlCommandParameter.java create mode 100644 services/mogo-service/src/main/java/com/mogo/service/impl/adas/OnAdasListenerAdapter.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd500f64d8..bb9630b495 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_shell_name" + android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme.App" android:resizeableActivity="false" diff --git a/config.gradle b/config.gradle index 19335a59b4..b3b1a3ddf0 100644 --- a/config.gradle +++ b/config.gradle @@ -156,8 +156,8 @@ targetSdkVersion : 22, gpssimulatordebug : "com.mogo.module:module-gps-simulator-debug:${MOGO_MODULE_GPS_SIMULATOR_DEBUG_VERSION}", gpssimulatornoop : "com.mogo.module:module-gps-simulator-noop:${MOGO_MODULE_GPS_SIMULATOR_NOOP_VERSION}", - adasapi : "com.zhidao.autopilot.support:adas:1.0.5", - adasconfigapi : "com.zhidao.adasconfig:adasconfig:1.1.5", + adasapi : "com.zhidao.autopilot.support:adas:1.0.6.2", + adasconfigapi : "com.zhidao.adasconfig:adasconfig:1.1.4", // 个人中心的SDK personalsdk : "com.zhidaoauto.person.info:data:1.0.1", diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewHandler.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewHandler.java index a3135b59d6..c9b216944c 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewHandler.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewHandler.java @@ -19,11 +19,7 @@ class AMapViewHandler { private static IMogoMapView sMapView; public static void createMapView( Context context ) { - if ( DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE ) { - sMapView = new AMapNaviViewWrapper( new AMapNaviView( context ) ); - } else { - sMapView = new AMapNaviViewWrapper( new AMapNaviView( context ) ); - } + sMapView = new AMapNaviViewWrapper( new AMapNaviView( context ) ); } public static IMogoMapView getMapView() { diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java index daa049b376..2a907e54d5 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/location/ALocationClient.java @@ -11,6 +11,7 @@ import com.mogo.map.impl.amap.utils.ObjectUtils; import com.mogo.map.location.IMogoLocationClient; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.location.MogoLocation; +import com.mogo.map.location.MogoLocationListenerRegister; import com.mogo.utils.logger.Logger; import java.util.HashSet; @@ -28,7 +29,6 @@ public class ALocationClient implements IMogoLocationClient { private static final String TAG = "LocationClient"; private final Context mContext; - private Set< IMogoLocationListener > sListeners = new HashSet<>( 10 ); private MogoLocation mLastLocation; private AMapLocationListener mListener = new InternalLocationListener(); @@ -76,28 +76,12 @@ public class ALocationClient implements IMogoLocationClient { @Override public void addLocationListener( IMogoLocationListener listener ) { - if ( mIsDestroyed ) { - destroyWarming(); - return; - } - if ( listener != null ) { - synchronized ( sListeners ) { - sListeners.add( listener ); - } - } + // do not impl. } @Override public void removeLocationListener( IMogoLocationListener listener ) { - if ( mIsDestroyed ) { - destroyWarming(); - return; - } - if ( listener != null ) { - synchronized ( sListeners ) { - sListeners.remove( listener ); - } - } + // do not impl. } @Override @@ -115,10 +99,6 @@ public class ALocationClient implements IMogoLocationClient { @Override public synchronized void destroy() { mIsDestroyed = true; - if ( sListeners != null ) { - sListeners.clear(); - } - sListeners = null; if ( mClient != null ) { mClient.unRegisterLocationListener( mListener ); mClient.stopLocation(); @@ -142,8 +122,9 @@ public class ALocationClient implements IMogoLocationClient { } Trace.beginSection( "timer.onLocationChanged" ); mLastLocation = ObjectUtils.fromAMap( aMapLocation ); - synchronized ( sListeners ) { - Iterator< IMogoLocationListener > listenerIterator = sListeners.iterator(); + Set listeners = MogoLocationListenerRegister.getInstance().getListeners(); + synchronized ( listeners ) { + Iterator< IMogoLocationListener > listenerIterator = listeners.iterator(); while ( listenerIterator.hasNext() ) { listenerIterator.next().onLocationChanged( mLastLocation ); } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java index 4e7382f89f..fc7d305075 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java @@ -22,6 +22,7 @@ import com.mogo.map.navi.IMogoCarLocationChangedListener; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.map.navi.IMogoNavi; import com.mogo.map.navi.MogoCalculatePath; +import com.mogo.map.navi.MogoCarLocationChangedListenerRegister; import com.mogo.map.navi.MogoNaviConfig; import com.mogo.map.navi.MogoNaviListenerHandler; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; @@ -64,7 +65,6 @@ public class NaviClient implements IMogoNavi { private boolean mIsRealNavi; private Location mCarLocation; - private IMogoCarLocationChangedListener2 mCarLocationChangedListener; private LocationSource.OnLocationChangedListener mOnLocationChangedListener; /** * 巡航模式配置状态 @@ -249,9 +249,7 @@ public class NaviClient implements IMogoNavi { @Override public void setLineClickInteraction( OnCalculatePathItemClickInteraction lineClickInteraction ) { - if ( mAMapNaviListener != null ) { - mAMapNaviListener.setLineClickInteraction( lineClickInteraction ); - } + // do not impl } @Override @@ -303,15 +301,16 @@ public class NaviClient implements IMogoNavi { @Override public void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ) { - mCarLocationChangedListener = listener; + // do not impl. } // -- end public void syncCarLocation( Location location ) { mCarLocation = location; - if ( mCarLocationChangedListener != null ) { - mCarLocationChangedListener.onCarLocationChanged2( mCarLocation ); + mCarLocation = location; + if ( MogoCarLocationChangedListenerRegister.getInstance().getListener() != null ) { + MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2( location ); } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java index 9aa69c5daa..d7efa99215 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java @@ -267,12 +267,6 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { return null; } - public void setLineClickInteraction( OnCalculatePathItemClickInteraction lineClickInteraction ) { - if ( mNaviOverlayHelper != null ) { - mNaviOverlayHelper.setLineClickInteraction( lineClickInteraction ); - } - } - public void clearCalculatePaths() { if ( mNaviOverlayHelper != null ) { mNaviOverlayHelper.clearCalculatedOverlay(); diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java index 4da21b2f24..1e4b63ed3e 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java @@ -24,6 +24,7 @@ import com.mogo.map.impl.amap.R; import com.mogo.map.impl.amap.overlay.RouteOverLayWrapper; import com.mogo.map.marker.MogoMarkersHandler; import com.mogo.map.navi.MogoCalculatePath; +import com.mogo.map.navi.MogoOperationListenerRegister; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; import com.mogo.utils.WindowUtils; import com.mogo.utils.logger.Logger; @@ -64,7 +65,6 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { private int mSelectedPathId; private CalculatePathItem mSelectedCalculatePathItem; - private OnCalculatePathItemClickInteraction mLineClickInteraction; /** * 起点终点marker @@ -299,8 +299,8 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { if ( mPaths != null && !mPaths.isEmpty() ) { for ( MogoCalculatePath path : mPaths ) { if ( TextUtils.equals( path.getTagId(), polyline.getId() ) ) { - if ( mLineClickInteraction != null ) { - mLineClickInteraction.onItemClicked( path.getTagId() ); + if ( MogoOperationListenerRegister.getInstance().getItemClickInteraction() != null ) { + MogoOperationListenerRegister.getInstance().getItemClickInteraction().onItemClicked( path.getTagId() ); break; } } @@ -440,10 +440,6 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { return this; } - public void setLineClickInteraction( OnCalculatePathItemClickInteraction lineClickInteraction ) { - mLineClickInteraction = lineClickInteraction; - } - public void setCalculatePathDisplayBounds( Rect bounds ) { if ( bounds != null ) { mBoundRect = bounds; diff --git a/libraries/map-autonavi/src/main/java/com/mogo/map/impl/automap/navi/AutoNaviClient.java b/libraries/map-autonavi/src/main/java/com/mogo/map/impl/automap/navi/AutoNaviClient.java index 9a8e553254..2dc7cac0f0 100644 --- a/libraries/map-autonavi/src/main/java/com/mogo/map/impl/automap/navi/AutoNaviClient.java +++ b/libraries/map-autonavi/src/main/java/com/mogo/map/impl/automap/navi/AutoNaviClient.java @@ -10,6 +10,7 @@ import com.mogo.map.impl.amap.navi.NaviClient; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.map.navi.IMogoNavi; import com.mogo.map.navi.MogoCalculatePath; +import com.mogo.map.navi.MogoCarLocationChangedListenerRegister; import com.mogo.map.navi.MogoNaviConfig; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; import com.mogo.utils.logger.Logger; @@ -195,7 +196,7 @@ public class AutoNaviClient implements IMogoNavi { @Override public void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ) { - NaviClient.getInstance( mContext ).registerCarLocationChangedListener( listener ); + //do not impl } @Override diff --git a/libraries/map-custom/build.gradle b/libraries/map-custom/build.gradle index 8bf9bfe3fc..38cc3cd161 100644 --- a/libraries/map-custom/build.gradle +++ b/libraries/map-custom/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation project(':foudations:mogo-commons') } - implementation 'com.zhidaoauto.machine:map:1.0.0-online-9' + implementation 'com.zhidaoauto.machine:map:1.0.0-online-12' } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 98f4faf9ec..6ba0993cdf 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -203,7 +203,7 @@ public class AMapViewWrapper implements IMogoMapView, IMogoMapUIController, Loca @Override public void onResume() { if (mMapView != null) { -// mMapView.onResume(); + mMapView.onResume(); Logger.d(TAG, "map onResume"); } } @@ -211,7 +211,7 @@ public class AMapViewWrapper implements IMogoMapView, IMogoMapUIController, Loca @Override public void onPause() { if (mMapView != null) { -// mMapView.onPause(); + mMapView.onPause(); Logger.d(TAG, "map onPause"); } } @@ -240,7 +240,7 @@ public class AMapViewWrapper implements IMogoMapView, IMogoMapUIController, Loca @Override public void setTrafficEnabled(boolean visible) { if (checkAMapView()) { - mMapView.getMapAutoViewHelper().setTraffic(visible); + //mMapView.getMapAutoViewHelper().setTraffic(visible); } } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapBaseMapView.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapView.java similarity index 71% rename from libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapBaseMapView.java rename to libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapView.java index d90544f445..83adcb164d 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapBaseMapView.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/CustomMapView.java @@ -2,6 +2,7 @@ package com.mogo.map.impl.custom; import android.content.Context; +import com.mogo.commons.debug.DebugConfig; import com.mogo.map.IMogoMapView; import com.mogo.map.IMogoMapViewCreator; import com.zhidaoauto.map.sdk.open.MapAutoApi; @@ -14,21 +15,22 @@ import com.zhidaoauto.map.sdk.open.view.MapAutoView; *

* 描述 */ -public class AMapBaseMapView implements IMogoMapViewCreator { +public class CustomMapView implements IMogoMapViewCreator { private static final String TAG = "AMapBaseMapView"; - private MapAutoView mapAutoView; + private static IMogoMapView mapView; @Override public IMogoMapView create( Context context ) { - MapAutoApi.INSTANCE.init( context, MapParams.Companion.init().setDebugMode( false ) + MapAutoApi.INSTANCE.init( context, MapParams.Companion.init().setDebugMode( DebugConfig.isDebug() ) .setCoordinateType( MapParams.COORDINATETYPE_GCJ02 ) .setPerspectiveMode( MapParams.MAP_PERSPECTIVE_2D ) .setZoom( 16 ) .setPointToCenter( 0.5f, 0.5f ) .setStyleMode( MapParams.MAP_STYLE_NIGHT ) ); - mapAutoView = new MapAutoView( context ); - return new AMapViewWrapper( mapAutoView ); + MapAutoView mapAutoView = new MapAutoView( context ); + mapView = new AMapViewWrapper( mapAutoView ); + return mapView; } } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/location/ALocationClient.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/location/ALocationClient.java index c36becd865..0ddfa645ad 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/location/ALocationClient.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/location/ALocationClient.java @@ -7,6 +7,7 @@ import com.mogo.map.impl.custom.utils.ObjectUtils; import com.mogo.map.location.IMogoLocationClient; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.location.MogoLocation; +import com.mogo.map.location.MogoLocationListenerRegister; import com.mogo.utils.logger.Logger; import com.zhidaoauto.map.sdk.open.location.LocationClient; import com.zhidaoauto.map.sdk.open.location.LocationListener; @@ -27,7 +28,6 @@ public class ALocationClient implements IMogoLocationClient { private static final String TAG = "LocationClient"; - private Set< IMogoLocationListener > sListeners = new HashSet<>( 10 ); private MogoLocation mLastLocation; private LocationListener mListener = new InternalLocationListener(); @@ -79,28 +79,12 @@ public class ALocationClient implements IMogoLocationClient { @Override public void addLocationListener( IMogoLocationListener listener ) { - if ( mIsDestroyed ) { - destroyWarming(); - return; - } - if ( listener != null ) { - synchronized ( sListeners ) { - sListeners.add( listener ); - } - } + // do not impl. } @Override public void removeLocationListener( IMogoLocationListener listener ) { - if ( mIsDestroyed ) { - destroyWarming(); - return; - } - if ( listener != null ) { - synchronized ( sListeners ) { - sListeners.remove( listener ); - } - } + // do not impl. } @Override @@ -115,10 +99,6 @@ public class ALocationClient implements IMogoLocationClient { @Override public synchronized void destroy() { mIsDestroyed = true; - if ( sListeners != null ) { - sListeners.clear(); - } - sListeners = null; if ( mClient != null ) { mClient.unRegisterListener( mListener ); mClient.destory(); @@ -130,7 +110,7 @@ public class ALocationClient implements IMogoLocationClient { private class InternalLocationListener implements LocationListener { @Override - public void onLocationChanged(@NotNull com.zhidaoauto.map.sdk.open.location.MogoLocation location) { + public void onLocationChanged( @NotNull com.zhidaoauto.map.sdk.open.location.MogoLocation location ) { if ( mIsDestroyed ) { destroyWarming(); return; @@ -140,10 +120,11 @@ public class ALocationClient implements IMogoLocationClient { location.getLon() == 0.0D ) { return; } - Trace.beginSection("timer.onLocationChanged"); + Trace.beginSection( "timer.onLocationChanged" ); mLastLocation = ObjectUtils.fromLocation( location ); - synchronized ( sListeners ) { - Iterator< IMogoLocationListener > listenerIterator = sListeners.iterator(); + Set< IMogoLocationListener > listeners = MogoLocationListenerRegister.getInstance().getListeners(); + synchronized ( listeners ) { + Iterator< IMogoLocationListener > listenerIterator = listeners.iterator(); while ( listenerIterator.hasNext() ) { listenerIterator.next().onLocationChanged( mLastLocation.clone() ); } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/navi/NaviClient.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/navi/NaviClient.java index 1720ebe907..b5ca09f758 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/navi/NaviClient.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/navi/NaviClient.java @@ -18,6 +18,7 @@ import com.mogo.map.impl.custom.utils.ObjectUtils; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.map.navi.IMogoNavi; import com.mogo.map.navi.MogoCalculatePath; +import com.mogo.map.navi.MogoCarLocationChangedListenerRegister; import com.mogo.map.navi.MogoNaviConfig; import com.mogo.map.navi.MogoNaviListenerHandler; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; @@ -62,7 +63,6 @@ public class NaviClient implements IMogoNavi { private boolean mIsRealNavi; private Location mCarLocation = new Location("GPS"); - private IMogoCarLocationChangedListener2 mCarLocationChangedListener; /** * 巡航模式配置状态 */ @@ -217,9 +217,7 @@ public class NaviClient implements IMogoNavi { @Override public void setLineClickInteraction( OnCalculatePathItemClickInteraction lineClickInteraction ) { -// if ( mAMapNaviListener != null ) { -// mAMapNaviListener.setLineClickInteraction( lineClickInteraction ); -// } + // do not impl. } @Override @@ -268,15 +266,15 @@ public class NaviClient implements IMogoNavi { @Override public void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ) { - mCarLocationChangedListener = listener; + // do not impl. } // -- end public void syncCarLocation( Location location ) { mCarLocation = location; - if ( mCarLocationChangedListener != null ) { - mCarLocationChangedListener.onCarLocationChanged2( mCarLocation ); + if ( MogoCarLocationChangedListenerRegister.getInstance().getListener() != null ) { + MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2( location ); } } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java index 1243deecbc..f246b62a0e 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/MogoBaseMapView.java @@ -3,14 +3,10 @@ package com.mogo.map; import android.content.Context; import android.os.Bundle; import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.Nullable; -import com.mogo.utils.logger.Logger; - /** * @author congtaowang @@ -22,7 +18,10 @@ public abstract class MogoBaseMapView extends FrameLayout implements ILifeCycle private static final String TAG = "MogoBaseMapView"; - private IMogoMapView mMapView; + protected IMogoMapView mMapView; + + protected IMogoMapView mAMapView; + protected IMogoMapView mCustomMapView; public MogoBaseMapView( Context context ) { this( context, null ); @@ -38,27 +37,14 @@ public abstract class MogoBaseMapView extends FrameLayout implements ILifeCycle } private void init( Context context ) { - mMapView = createMapView( context ); - if ( mMapView != null ) { - final View mapView = mMapView.getMapView(); - if ( mapView != null ) { - addView( mapView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) ); - MogoMap.getInstance().init( context, getMap() ); - } else { - Logger.e( TAG, "create MapView instance failed." ); - } - } else { - Logger.e( TAG, "create IMogoMapView instance failed." ); - } + addDleMaps(); } - /** - * 创建地图实例 - * - * @param context - * @return - */ - protected abstract IMogoMapView createMapView( Context context ); + protected abstract void addDleMaps(); + + public abstract void display2DMap( boolean invokeCreateAuto, boolean invokeResumeAuto ); + + public abstract void displayVRMap( boolean invokeCreateAuto, boolean invokeResumeAuto ); @Override public void onCreate( Bundle bundle ) { @@ -109,8 +95,4 @@ public abstract class MogoBaseMapView extends FrameLayout implements ILifeCycle } return null; } - - public IMogoMapView getMapView() { - return mMapView; - } } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java index 0c724f645e..f1ed4f645e 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationClient.java @@ -6,7 +6,7 @@ package com.mogo.map.location; *

* 定位接口 */ -public interface IMogoLocationClient { +public interface IMogoLocationClient extends IMogoLocationListenerRegister { /** * 开始定位 @@ -25,20 +25,6 @@ public interface IMogoLocationClient { */ void stop(); - /** - * 注册定位回调 - * - * @param listener - */ - void addLocationListener( IMogoLocationListener listener ); - - /** - * 注销定位回调 - * - * @param listener - */ - void removeLocationListener( IMogoLocationListener listener ); - /** * 返回上一次有效定位 * diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationListenerRegister.java new file mode 100644 index 0000000000..3fd36903af --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/IMogoLocationListenerRegister.java @@ -0,0 +1,24 @@ +package com.mogo.map.location; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * 地图监听注册管理 + */ +public interface IMogoLocationListenerRegister { + + /** + * 注册定位回调 + * + * @param listener + */ + void addLocationListener( IMogoLocationListener listener ); + + /** + * 注销定位回调 + * + * @param listener + */ + void removeLocationListener( IMogoLocationListener listener ); +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/location/MogoLocationListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/MogoLocationListenerRegister.java new file mode 100644 index 0000000000..39dffb4d7e --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/location/MogoLocationListenerRegister.java @@ -0,0 +1,75 @@ +package com.mogo.map.location; + +import java.sql.ClientInfoStatus; +import java.util.HashSet; +import java.util.Set; + +/** + * @author congtaowang + * @since 2019-12-24 + *

+ * 地图监听注册管理 + */ +public class MogoLocationListenerRegister implements IMogoLocationListenerRegister { + + private static volatile MogoLocationListenerRegister sInstance; + + private MogoLocationListenerRegister() { + } + + public static MogoLocationListenerRegister getInstance() { + if ( sInstance == null ) { + synchronized ( MogoLocationListenerRegister.class ) { + if ( sInstance == null ) { + sInstance = new MogoLocationListenerRegister(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + private Object readResolve() { + // 阻止反序列化,必须实现 Serializable 接口 + return sInstance; + } + + private Set< IMogoLocationListener > sListeners = new HashSet<>( 10 ); + + /** + * 注册定位回调 + * + * @param listener + */ + @Override + public void addLocationListener( IMogoLocationListener listener ) { + if ( listener == null ) { + return; + } + synchronized ( sListeners ) { + sListeners.add( listener ); + } + } + + /** + * 注销定位回调 + * + * @param listener + */ + @Override + public void removeLocationListener( IMogoLocationListener listener ) { + if ( listener == null ) { + return; + } + synchronized ( sListeners ) { + sListeners.remove( listener ); + } + } + + public Set< IMogoLocationListener > getListeners() { + return sListeners; + } +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoCarLocationChangedListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoCarLocationChangedListenerRegister.java new file mode 100644 index 0000000000..58dc1cbada --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoCarLocationChangedListenerRegister.java @@ -0,0 +1,18 @@ +package com.mogo.map.navi; + +public +/** + * @author congtaowang + * @since 2020/10/23 + * + * 描述 + */ +interface IMogoCarLocationChangedListenerRegister { + + /** + * 注册车辆位置变化监听,非业务使用 + * + * @param listener + */ + void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ); +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java index de314483b5..c53bdbb124 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java @@ -14,7 +14,7 @@ import java.util.List; *

* 导航操作 */ -public interface IMogoNavi { +public interface IMogoNavi extends IMogoCarLocationChangedListenerRegister, IMogoOperationListenerRegister{ /** * 开启路径规划并导航 @@ -97,12 +97,6 @@ public interface IMogoNavi { */ OnCalculatePathItemClickInteraction getItemClickInteraction(); - - /** - * 设置线条点击回调 - */ - void setLineClickInteraction( OnCalculatePathItemClickInteraction itemClickInteraction ); - /** * 清除规划的路线 */ @@ -151,13 +145,6 @@ public interface IMogoNavi { */ Location getCarLocation2(); - /** - * 注册车辆位置变化监听,非业务使用 - * - * @param listener - */ - void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ); - /** * 打开巡航模式 */ diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoOperationListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoOperationListenerRegister.java new file mode 100644 index 0000000000..4d9b47eae7 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoOperationListenerRegister.java @@ -0,0 +1,17 @@ +package com.mogo.map.navi; + +public +/** + * @author congtaowang + * @since 2020/10/23 + * + * 描述 + */ +interface IMogoOperationListenerRegister { + + /** + * 设置线条点击回调 + */ + void setLineClickInteraction( OnCalculatePathItemClickInteraction itemClickInteraction ); + +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCarLocationChangedListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCarLocationChangedListenerRegister.java new file mode 100644 index 0000000000..baa3b2f579 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoCarLocationChangedListenerRegister.java @@ -0,0 +1,50 @@ +package com.mogo.map.navi; + +public +/** + * @author congtaowang + * @since 2020/10/23 + * + * 描述 + */ +class MogoCarLocationChangedListenerRegister implements IMogoCarLocationChangedListenerRegister { + + private static volatile MogoCarLocationChangedListenerRegister sInstance; + private IMogoCarLocationChangedListener2 listener; + + private MogoCarLocationChangedListenerRegister(){} + + public static MogoCarLocationChangedListenerRegister getInstance(){ + if( sInstance == null ){ + synchronized( MogoCarLocationChangedListenerRegister.class ) { + if( sInstance == null ){ + sInstance = new MogoCarLocationChangedListenerRegister(); + } + } + } + return sInstance; + } + + public synchronized void release(){ + sInstance = null; + } + + private Object readResolve() { + // 阻止反序列化,必须实现 Serializable 接口 + return sInstance; + } + + /** + * 注册车辆位置变化监听,非业务使用 + * + * @param listener + */ + @Override + public void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ) { + this.listener = listener; + } + + public IMogoCarLocationChangedListener2 getListener() { + return listener; + } +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoOperationListenerRegister.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoOperationListenerRegister.java new file mode 100644 index 0000000000..ec4cf7a1b8 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/MogoOperationListenerRegister.java @@ -0,0 +1,47 @@ +package com.mogo.map.navi; + +public +/** + * @author congtaowang + * @since 2020/10/23 + * + * 描述 + */ +class MogoOperationListenerRegister implements IMogoOperationListenerRegister { + + private static volatile MogoOperationListenerRegister sInstance; + private OnCalculatePathItemClickInteraction itemClickInteraction; + + private MogoOperationListenerRegister(){} + + public static MogoOperationListenerRegister getInstance(){ + if( sInstance == null ){ + synchronized( MogoOperationListenerRegister.class ) { + if( sInstance == null ){ + sInstance = new MogoOperationListenerRegister(); + } + } + } + return sInstance; + } + + public synchronized void release(){ + sInstance = null; + } + + private Object readResolve() { + // 阻止反序列化,必须实现 Serializable 接口 + return sInstance; + } + + /** + * 设置线条点击回调 + */ + public void setLineClickInteraction( OnCalculatePathItemClickInteraction itemClickInteraction ) { + this.itemClickInteraction = itemClickInteraction; + } + + public OnCalculatePathItemClickInteraction getItemClickInteraction() { + return itemClickInteraction; + } +} diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java index 383dafe849..93ea5ea25a 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoLocationClient.java @@ -3,9 +3,11 @@ package com.mogo.map; import android.content.Context; import com.mogo.map.impl.amap.location.ALocationClient; +import com.mogo.map.listener.MogoHosListenerRegister; import com.mogo.map.location.IMogoLocationClient; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.location.MogoLocation; +import com.mogo.map.location.MogoLocationListenerRegister; /** * @author congtaowang @@ -56,16 +58,12 @@ public class MogoLocationClient implements IMogoLocationClient { @Override public void addLocationListener( IMogoLocationListener listener ) { - if ( mDelegate != null ) { - mDelegate.addLocationListener( listener ); - } + MogoLocationListenerRegister.getInstance().addLocationListener( listener ); } @Override public void removeLocationListener( IMogoLocationListener listener ) { - if ( mDelegate != null ) { - mDelegate.removeLocationListener( listener ); - } + MogoLocationListenerRegister.getInstance().removeLocationListener( listener ); } @Override diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapDelegateFactory.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapDelegateFactory.java index 1e51771abd..6d1fffb39f 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapDelegateFactory.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapDelegateFactory.java @@ -3,7 +3,6 @@ package com.mogo.map; import android.content.Context; import com.mogo.commons.debug.DebugConfig; -import com.mogo.map.impl.amap.AMapBaseMapView; import com.mogo.map.impl.amap.location.ALocationClient; import com.mogo.map.impl.amap.navi.NaviClient; import com.mogo.map.impl.amap.search.GeocodeSearchClient; @@ -66,25 +65,6 @@ class MogoMapDelegateFactory { return AMapUIController.getInstance(); } - private static IMogoMapView sMapView; - - public static void createMapView( Context context ) { - if ( DebugConfig.isUseCustomMap() ) { - Logger.d( TAG, "use custom IMogoMapViewCreator" ); - sMapView = new com.mogo.map.impl.custom.AMapBaseMapView().create( context ); - } else { - sMapView = new AMapBaseMapView().create( context ); - } - } - - public static void destroy() { - sMapView = null; - } - - public static IMogoMapView getMapView() { - return sMapView; - } - public static IMogoNavi getNaviDelegate( Context context ) { if ( DebugConfig.isUseCustomNavi() ) { diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index bdab17aad5..3efca6c33d 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -13,6 +13,7 @@ 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.utils.logger.Logger; import java.util.List; @@ -23,6 +24,8 @@ import java.util.List; * 描述 */ public class MogoMapUIController implements IMogoMapUIController { + + private static final String TAG = "MogoMapUIController"; private IMogoMapUIController mDelegate; @@ -43,6 +46,10 @@ public class MogoMapUIController implements IMogoMapUIController { return sInstance; } + public void setDelegate( IMogoMapUIController mDelegate ) { + this.mDelegate = mDelegate; + } + public synchronized void release() { sInstance = null; } @@ -73,6 +80,7 @@ public class MogoMapUIController implements IMogoMapUIController { @Override public void changeMapMode(EnumMapUI mode) { if (mDelegate != null) { + Logger.d( TAG, "set type: %s", mode.name() ); mDelegate.changeMapMode(mode); } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.java index 7f203e56a8..f27df648db 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapView.java @@ -3,9 +3,15 @@ package com.mogo.map; import android.content.Context; import android.os.Bundle; import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; import androidx.annotation.Nullable; +import com.mogo.map.impl.amap.AMapBaseMapView; +import com.mogo.map.impl.amap.uicontroller.AMapUIController; +import com.mogo.map.impl.custom.CustomMapView; import com.mogo.utils.logger.Logger; /** @@ -30,15 +36,63 @@ public class MogoMapView extends MogoBaseMapView implements ILifeCycle { super( context, attrs, defStyleAttr ); } + private boolean mIsFirstDisplayVRMode = true; + @Override - public IMogoMap getMap() { - return super.getMap(); + protected void addDleMaps() { + mAMapView = new AMapBaseMapView().create( getContext() ); + mCustomMapView = new CustomMapView().create( getContext() ); + + if ( mAMapView != null ) { + final View mapView = mAMapView.getMapView(); + if ( mapView != null ) { + addView( mapView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) ); + } else { + Logger.e( TAG, "create MapView instance failed." ); + } + } else { + Logger.e( TAG, "create IMogoMapView instance failed." ); + } + +// if ( mCustomMapView != null ) { +// final View mapView = mCustomMapView.getMapView(); +// if ( mapView != null ) { +// addView( mapView, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) ); +// } else { +// Logger.e( TAG, "create MapView instance failed." ); +// } +// } else { +// Logger.e( TAG, "create IMogoMapView instance failed." ); +// } + + mMapView = mAMapView; + MogoMap.getInstance().init( getContext(), mMapView.getMap() ); } @Override - protected IMogoMapView createMapView( Context context ) { - MogoMapDelegateFactory.createMapView( context ); - return MogoMapDelegateFactory.getMapView(); + public void display2DMap( boolean invokeCreateAuto, boolean invokeResumeAuto ) { + MogoMap.getInstance().init( getContext(), mAMapView.getMap() ); + MogoMapUIController.getInstance().setDelegate( AMapUIController.getInstance() ); + MogoMarkerManager.getInstance( getContext() ).removeMarkers(); + mCustomMapView.onPause(); + mCustomMapView.getMapView().setVisibility( View.GONE ); + mAMapView.onResume(); + mAMapView.getMapView().setVisibility( View.VISIBLE ); + } + + @Override + public void displayVRMap( boolean invokeCreateAuto, boolean invokeResumeAuto ) { + if ( mIsFirstDisplayVRMode ) { + mCustomMapView.onCreate( null ); + mIsFirstDisplayVRMode = false; + } + MogoMap.getInstance().init( getContext(), mCustomMapView.getMap() ); + MogoMapUIController.getInstance().setDelegate( com.mogo.map.impl.custom.uicontroller.AMapUIController.getInstance() ); + MogoMarkerManager.getInstance( getContext() ).removeMarkers(); + mCustomMapView.onResume(); + mCustomMapView.getMapView().setVisibility( View.VISIBLE ); + mAMapView.onPause(); + mAMapView.getMapView().setVisibility( View.GONE ); } @Override @@ -57,14 +111,12 @@ public class MogoMapView extends MogoBaseMapView implements ILifeCycle { public void onPause() { super.onPause(); Logger.d( TAG, "onPause" ); - } @Override public void onDestroy() { super.onDestroy(); Logger.d( TAG, "onDestroy" ); - } @Override @@ -76,9 +128,4 @@ public class MogoMapView extends MogoBaseMapView implements ILifeCycle { public void onLowMemory() { super.onLowMemory(); } - - @Override - public IMogoMapView getMapView() { - return super.getMapView(); - } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java index 7f85a556a2..cd4b3f6a99 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java @@ -12,7 +12,9 @@ import com.mogo.map.impl.automap.navi.AutoNaviClient; import com.mogo.map.navi.IMogoCarLocationChangedListener2; import com.mogo.map.navi.IMogoNavi; import com.mogo.map.navi.MogoCalculatePath; +import com.mogo.map.navi.MogoCarLocationChangedListenerRegister; import com.mogo.map.navi.MogoNaviConfig; +import com.mogo.map.navi.MogoOperationListenerRegister; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; import com.mogo.utils.AppUtils; @@ -132,9 +134,7 @@ public class MogoNavi implements IMogoNavi { @Override public void setLineClickInteraction( OnCalculatePathItemClickInteraction itemClickInteraction ) { - if ( mDelegate != null ) { - mDelegate.setLineClickInteraction( itemClickInteraction ); - } + MogoOperationListenerRegister.getInstance().setLineClickInteraction( itemClickInteraction ); } @Override @@ -193,9 +193,7 @@ public class MogoNavi implements IMogoNavi { @Override public void registerCarLocationChangedListener( IMogoCarLocationChangedListener2 listener ) { - if ( mDelegate != null ) { - mDelegate.registerCarLocationChangedListener( listener ); - } + MogoCarLocationChangedListenerRegister.getInstance().registerCarLocationChangedListener( listener ); } @Override diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/EventDispatchCenter.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/EventDispatchCenter.java index 5320407166..c1b2202e07 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/EventDispatchCenter.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/EventDispatchCenter.java @@ -157,8 +157,14 @@ public class EventDispatchCenter implements this.mMapLoadedCallback = callback; } + private boolean mIsMapLoaded = false; + @Override public void onMapLoaded() { + if ( mIsMapLoaded ) { + return; + } + mIsMapLoaded = true; if ( mMapLoadedCallback != null ) { mMapLoadedCallback.run(); mMapLoadedCallback = null; diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java index 0ad88b5e6e..9d7d8b7f2c 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java @@ -1,5 +1,6 @@ package com.mogo.module.map; +import android.content.Context; import android.os.Bundle; import androidx.annotation.NonNull; @@ -12,7 +13,9 @@ 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.MogoServicePaths; +import com.mogo.service.map.IMogoMapFrameController; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.statusmanager.StatusDescriptor; @@ -24,7 +27,7 @@ import com.mogo.utils.logger.Logger; *

* 地图图层,地图操作都在这个图层完成 */ -public class MapFragment extends MvpFragment< MapView, MapPresenter > implements MapView { +public class MapFragment extends MvpFragment< MapView, MapPresenter > implements MapView, IMogoMapFrameController { private static final String TAG = "MapFragment"; @@ -33,6 +36,8 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements private boolean mIsControllerByOthersStatus = false; + private boolean mIsFirstLoadCustomMap = true; + @Override protected int getLayoutId() { return R.layout.module_map_fragment_map; @@ -40,6 +45,30 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements @Override protected void initViews() { + MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().initDelegate( this ); + } + + @Override + public void initDelegate( IMogoMapFrameController controller ) { + // do not implement + } + + @Override + public void changeTo2dMode() { + mMogoMapView.display2DMap( false, true ); + } + + @Override + public void changeToVRMode() { + mMogoMapView.displayVRMap( mIsFirstLoadCustomMap, true ); + if ( mIsFirstLoadCustomMap ) { + mIsFirstLoadCustomMap = false; + } + } + + @Override + public void init( Context context ) { + // do not implement } @Override @@ -48,8 +77,10 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements mMogoMapView = findViewById( R.id.module_map_id_map ); mMogoMapView.onCreate( savedInstanceState ); mMogoMap = mMogoMapView.getMap(); - mMogoMap.getUIController().showMyLocation( true ); - mMogoMap.getUIController().recoverLockMode();// 启动锁车 + if ( mMogoMap.getUIController() != null ) { + mMogoMap.getUIController().showMyLocation( true ); + mMogoMap.getUIController().recoverLockMode();// 启动锁车 + } } @NonNull @@ -129,11 +160,18 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements uiSettings.setZoomControlsEnabled( false ); //设置双指缩放手势是否可用。 uiSettings.setZoomGesturesEnabled( true ); - mMogoMap.getUIController().changeMapMode( EnumMapUI.NorthUP_2D ); + if ( mMogoMap.getUIController() != null ) { + mMogoMap.getUIController().changeMapMode( EnumMapUI.NorthUP_2D ); + } } } } + @Override + public void destroy() { + MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().destroy(); + } + @Override public IMogoMapUIController getUIController() { return mMogoMap.getUIController(); @@ -146,5 +184,6 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements mMogoMapView.onDestroy(); } MapBroadCastHelper.getInstance( getContext() ).release(); + destroy(); } } diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFrameController.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFrameController.java new file mode 100644 index 0000000000..76970d36aa --- /dev/null +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFrameController.java @@ -0,0 +1,51 @@ +package com.mogo.module.map; + +import android.content.Context; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.google.gson.internal.$Gson$Preconditions; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.map.IMogoMapFrameController; + +public +/** + * @author congtaowang + * @since 2020/10/23 + * + * 描述 + */ + +@Route( path = MogoServicePaths.PATH_MAP_FRAME_CONTROLLER ) +class MapFrameController implements IMogoMapFrameController { + + private IMogoMapFrameController mController; + + @Override + public void initDelegate( IMogoMapFrameController controller ) { + mController = controller; + } + + @Override + public void changeTo2dMode() { + if ( mController != null ) { + mController.changeTo2dMode(); + } + } + + @Override + public void changeToVRMode() { + if ( mController != null ) { + mController.changeToVRMode(); + } + } + + @Override + public void init( Context context ) { + + } + + @Override + public void destroy() { + mController = null; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotRemoteController.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotRemoteController.java index 3fae17a77c..c07f329b04 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotRemoteController.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotRemoteController.java @@ -2,6 +2,7 @@ package com.mogo.module.service.autopilot; import com.mogo.commons.AbsMogoApplication; import com.mogo.module.common.MogoApisHandler; +import com.mogo.service.adas.RemoteControlAutoPilotParameters; import com.mogo.service.connection.IMogoOnMessageListener; import com.mogo.service.connection.IMogoSocketManager; import com.mogo.utils.logger.Logger; @@ -22,21 +23,21 @@ class AutoPilotRemoteController { private IMogoSocketManager mMogoSocketManager; - private IMogoOnMessageListener< AutoPilotParameters > mParametersListener = new IMogoOnMessageListener< AutoPilotParameters >() { + private IMogoOnMessageListener< RemoteControlAutoPilotParameters > mParametersListener = new IMogoOnMessageListener< RemoteControlAutoPilotParameters >() { @Override - public Class< AutoPilotParameters > target() { - return AutoPilotParameters.class; + public Class< RemoteControlAutoPilotParameters > target() { + return RemoteControlAutoPilotParameters.class; } @Override - public void onMsgReceived( AutoPilotParameters obj ) { + public void onMsgReceived( RemoteControlAutoPilotParameters obj ) { if ( obj == null ) { Logger.e( TAG, "远端控制参数为null", new NullPointerException() ); return; } String json = GsonUtil.jsonFromObject( obj ); Logger.d( TAG, json ); - MogoApisHandler.getInstance().getApis().getAdasControllerApi().aiCloudToAdasData( json ); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().aiCloudToAdasData( obj ); } }; 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 7fc7289236..4f017330d2 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 @@ -24,6 +24,7 @@ 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.dialog.WMDialog; import com.mogo.module.service.MarkerServiceHandler; import com.mogo.module.service.MogoServiceProvider; @@ -357,6 +358,14 @@ public class MockIntentHandler implements IntentHandler { case 33: AIAssist.getInstance( context ).speakTTSVoice( "庞帆说这个是一个 hard coding." ); break; + case 34: + int type = intent.getIntExtra( "type", 0 ); + if ( type != 0 ) { + MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().changeToVRMode(); + } else { + MogoApisHandler.getInstance().getApis().getMapFrameControllerApi().changeTo2dMode(); + } + break; } } 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 f6e0f9ee03..e30b340448 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 @@ -16,6 +16,7 @@ import com.mogo.service.imageloader.IMogoImageloader; import com.mogo.service.intent.IMogoIntentManager; import com.mogo.service.launcher.IMogoLauncher; import com.mogo.service.locationinfo.IMogoLocationInfoService; +import com.mogo.service.map.IMogoMapFrameController; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoAddressManager; @@ -239,42 +240,57 @@ public interface IMogoServiceApis extends IProvider { /** * 获取授权服务 + * * @return */ IMogoAuthManager getAuthManagerApi(); /** * 获取探路服务 + * * @return */ IMogoTanluProvider getTanluApi(); /** * 获取Monitor相关api + * * @return */ IMogoMonitorProvider getMogoMonitorApi(); + /** * 获取探路ui服务 + * * @return */ IMogoTanluUiProvider getTanluUiApi(); /** * 皮肤管理接口 + * * @return */ IMogoSkinSupportInstaller getSkinSupportInstallerApi(); /** * 获取crashWarnProvider + * * @return */ IMogoCrashWarnProvider getCrashWarnProvider(); /** * 在线车辆面板 + * * @return */ IMogoOnlineCarListPanelProvider getOnlineCarPanelApi(); + + /** + * 地图图层控制接口 + * + * @return + */ + IMogoMapFrameController getMapFrameControllerApi(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java index 8184350abf..b03d77832d 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java @@ -225,7 +225,7 @@ public class MogoServicePaths { * 授权服务 */ @Deprecated - public static final String PATH_AGREEMENT = "/agreement/showFragment"; + public static final String PATH_AGREEMENT = "/agreement/showFragment"; /** * 日志上传 @@ -266,4 +266,9 @@ public class MogoServicePaths { * 在线好友面板 */ public static final String PATH_ONLINE_CAR_PANEL = "/onlinecar/panel"; + + /** + * 自研地图和高德地图切换 + */ + public static final String PATH_MAP_FRAME_CONTROLLER = "/mapframe/controller"; } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java index a51931a0e1..48e0a41449 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java @@ -72,7 +72,20 @@ public interface IMogoADASController extends IProvider { /** * 给adas传递数据 * - * @param json + * @param result */ - void aiCloudToAdasData( String json ); + void aiCloudToAdasData( RemoteControlAutoPilotParameters result ); + + + /** + * 添加adas数据回调接口 + * @param callback 回调接口 + */ + void addAdasDataCallback(IMogoAdasDataCallback callback); + + /** + * 移除adas数据回调接口 + * @param callback 待移除的callback + */ + void removeAdasDataCallback(IMogoAdasDataCallback callback); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java new file mode 100644 index 0000000000..d34a3f9f23 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java @@ -0,0 +1,14 @@ +package com.mogo.service.adas; + +/** + * adas 数据回调接口 + * + * @author tongchenfei + */ +public interface IMogoAdasDataCallback { + /** + * adas 数据回调 + * @param msg 具体数据 + */ + void onAdasDataCallback(String msg); +} \ No newline at end of file diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasRecognizedDataCallback.java b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasRecognizedDataCallback.java new file mode 100644 index 0000000000..49c32d34f9 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasRecognizedDataCallback.java @@ -0,0 +1,14 @@ +package com.mogo.service.adas; + +/** + * adas 物体识别数据回调接口 + * + * @author tongchenfei + */ +public interface IMogoAdasRecognizedDataCallback { + /** + * adas 数据回调 + * @param msg 具体数据 + */ + void onAdasDataCallback( String msg ); +} \ No newline at end of file diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotParameters.java b/services/mogo-service-api/src/main/java/com/mogo/service/adas/RemoteControlAutoPilotParameters.java similarity index 83% rename from modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotParameters.java rename to services/mogo-service-api/src/main/java/com/mogo/service/adas/RemoteControlAutoPilotParameters.java index 9e40ca6454..9deb76e3f6 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/autopilot/AutoPilotParameters.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/adas/RemoteControlAutoPilotParameters.java @@ -1,4 +1,4 @@ -package com.mogo.module.service.autopilot; +package com.mogo.service.adas; import java.util.List; @@ -9,7 +9,7 @@ public * * 自动驾驶参数 */ -class AutoPilotParameters { +class RemoteControlAutoPilotParameters { public AutoPilotLonLat startLatLon; public List< AutoPilotLonLat > wayLatLons; diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java new file mode 100644 index 0000000000..6bc08593b5 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/map/IMogoMapFrameController.java @@ -0,0 +1,26 @@ +package com.mogo.service.map; + +import com.alibaba.android.arouter.facade.template.IProvider; +import com.mogo.map.IDestroyable; + +public +/** + * @author congtaowang + * @since 2020/10/23 + * + * 地图图层切换:高德地图 <-> 自研地图,过渡期使用 + */ +interface IMogoMapFrameController extends IProvider, IDestroyable { + + void initDelegate( IMogoMapFrameController controller ); + + /** + * 切换到高德2D + */ + void changeTo2dMode(); + + /** + * 切换到自研vr + */ + void changeToVRMode(); +} diff --git a/services/mogo-service/build.gradle b/services/mogo-service/build.gradle index 6da98cf88e..ce79eb0acb 100644 --- a/services/mogo-service/build.gradle +++ b/services/mogo-service/build.gradle @@ -42,6 +42,7 @@ dependencies { annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.adasapi implementation rootProject.ext.dependencies.adasconfigapi + implementation "com.zhidao.support.adas:high:1.1.4.4" if (Boolean.valueOf(RELEASE)) { api rootProject.ext.dependencies.mogomap implementation rootProject.ext.dependencies.mogomapapi 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 36f61a534f..200015118f 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 @@ -24,6 +24,7 @@ import com.mogo.service.impl.singleton.SingletonsHolder; import com.mogo.service.intent.IMogoIntentManager; import com.mogo.service.launcher.IMogoLauncher; import com.mogo.service.locationinfo.IMogoLocationInfoService; +import com.mogo.service.map.IMogoMapFrameController; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoActionManager; import com.mogo.service.module.IMogoAddressManager; @@ -210,32 +211,37 @@ public class MogoServiceApis implements IMogoServiceApis { @Override public IMogoTanluProvider getTanluApi() { - return getApiInstance(IMogoTanluProvider.class, MogoServicePaths.PATH_TANLU_API); + return getApiInstance( IMogoTanluProvider.class, MogoServicePaths.PATH_TANLU_API ); } @Override public IMogoMonitorProvider getMogoMonitorApi() { - return getApiInstance(IMogoMonitorProvider.class,MogoServicePaths.PATH_MOGO_MONITOR); + return getApiInstance( IMogoMonitorProvider.class, MogoServicePaths.PATH_MOGO_MONITOR ); } @Override - public IMogoTanluUiProvider getTanluUiApi(){ - return getApiInstance(IMogoTanluUiProvider.class, MogoServicePaths.PATH_TANLU_UI_API); + public IMogoTanluUiProvider getTanluUiApi() { + return getApiInstance( IMogoTanluUiProvider.class, MogoServicePaths.PATH_TANLU_UI_API ); } @Override public IMogoSkinSupportInstaller getSkinSupportInstallerApi() { - return getApiInstance( IMogoSkinSupportInstaller.class, SkinSupportInstallerConstants.PATH); + return getApiInstance( IMogoSkinSupportInstaller.class, SkinSupportInstallerConstants.PATH ); } @Override public IMogoCrashWarnProvider getCrashWarnProvider() { - return getApiInstance(IMogoCrashWarnProvider.class, MogoServicePaths.PATH_CRASH_WARNING); + return getApiInstance( IMogoCrashWarnProvider.class, MogoServicePaths.PATH_CRASH_WARNING ); } @Override public IMogoOnlineCarListPanelProvider getOnlineCarPanelApi() { - return getApiInstance( IMogoOnlineCarListPanelProvider.class, MogoServicePaths.PATH_ONLINE_CAR_PANEL); + return getApiInstance( IMogoOnlineCarListPanelProvider.class, MogoServicePaths.PATH_ONLINE_CAR_PANEL ); + } + + @Override + public IMogoMapFrameController getMapFrameControllerApi() { + return getApiInstance( IMogoMapFrameController.class, MogoServicePaths.PATH_MAP_FRAME_CONTROLLER ); } private static < T extends IProvider > T getApiInstance( Class< T > clazz, String path ) { diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/AdasControlCommandParameter.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/AdasControlCommandParameter.java new file mode 100644 index 0000000000..391b8fcb72 --- /dev/null +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/AdasControlCommandParameter.java @@ -0,0 +1,19 @@ +package com.mogo.service.impl.adas; + +public +/** + * @author congtaowang + * @since 2020/10/22 + * + * 描述 + */ +class AdasControlCommandParameter { + + public String action; + public Object result; + + public AdasControlCommandParameter( String action, Object result ) { + this.action = action; + this.result = result; + } +} diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java index c2fdf21450..4cb272b3d3 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java @@ -1,10 +1,9 @@ package com.mogo.service.impl.adas; -import android.app.ActivityManager; import android.app.Application; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; +import android.text.TextUtils; import android.util.Log; import com.alibaba.android.arouter.facade.annotation.Route; @@ -13,10 +12,13 @@ import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.module.common.utils.CarSeries; import com.mogo.service.MogoServicePaths; import com.mogo.service.adas.IMogoADASController; +import com.mogo.service.adas.IMogoAdasDataCallback; +import com.mogo.service.adas.RemoteControlAutoPilotParameters; import com.mogo.service.impl.singleton.SingletonsHolder; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.utils.UiThreadHandler; import com.mogo.utils.logger.Logger; +import com.mogo.utils.network.utils.GsonUtil; import com.mogo.utils.storage.SharedPrefsMgr; import com.zhidao.adasconfig.api.AdasConfigApiController; import com.zhidao.adasconfig.common.config.EnumCarChatIncognitoMode; @@ -24,9 +26,16 @@ import com.zhidao.adasconfig.common.config.EnumCarHeading; import com.zhidao.adasconfig.common.config.EnumSkinStyle; import com.zhidao.autopilot.support.api.AutopilotServiceManage; import com.zhidao.autopilot.support.api.IAutopilotServiceStatusListener; +import com.zhidao.autopilot.support.api.IAutopolitDataCallBack; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.bean.RectInfo; +import com.zhidao.support.adas.high.bean.WarnMessageInfo; +import com.zhidao.support.adas.high.msg.MyMessageFactory; +import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; import java.util.List; import static com.mogo.module.common.utils.SPConst.getSpGuide; @@ -56,6 +65,50 @@ public class MogoADASController implements IMogoADASController { private boolean mIsReleased = true; + private List< IMogoAdasDataCallback > mAdasDataCallbackList = new ArrayList<>(); + + private OnAdasListener mOnAdasListener = new OnAdasListenerAdapter() { + + @Override + public void onRectData( RectInfo rectInfo ) { + // 物体识别返回 + Logger.d( TAG, "onRectData = %s", rectInfo.toString() ); + } + + @Override + public void onWarnMessage( WarnMessageInfo warnMessageInfo ) { + // 警告消息 + Logger.d( TAG, "onWarnMessage = %s", warnMessageInfo.toString() ); + } + }; + + + private MyMessageFactory mAdasMessageFactory; + private IAutopolitDataCallBack mAutoPilotDataCallBack = new IAutopolitDataCallBack() { + @Override + public void sendMsg( String msg ) { + Logger.d( TAG, "收到adas数据回调: " + msg ); + for ( IMogoAdasDataCallback callback : mAdasDataCallbackList ) { + callback.onAdasDataCallback( msg ); + } + } + + @Override + public void cameraEyeDetectResult( String detectResult ) { + try { + JSONObject jsonObjectWs = new JSONObject( detectResult ); + String action = jsonObjectWs.optString( "action" ); + if ( TextUtils.isEmpty( action ) ) { + Logger.w( TAG, "--->action is null" ); + return; + } + mAdasMessageFactory.createMessage( action ).handlerMsg( GsonUtil.getGson(), mOnAdasListener, detectResult ); + } catch ( JSONException e ) { + e.printStackTrace(); + } + } + }; + @Override public void openADAS() { showADAS(); @@ -89,7 +142,7 @@ public class MogoADASController implements IMogoADASController { } } ); invokeShowADASOperation(); - + AutopilotServiceManage.getInstance().registerAutopilotDataListener( mAutoPilotDataCallBack ); } private void invokeShowADASOperation() { @@ -157,6 +210,7 @@ public class MogoADASController implements IMogoADASController { public void init( Context context ) { AutopilotServiceManage.getInstance().init( context ); mIsReleased = false; + mAdasMessageFactory = new MyMessageFactory(); } @Override @@ -212,25 +266,23 @@ public class MogoADASController implements IMogoADASController { } @Override - public void aiCloudToAdasData( String json ) { + public void aiCloudToAdasData( RemoteControlAutoPilotParameters result ) { try { - syncControlCmdToADAS( "aiCloudToStartAutopilot", json ); + syncControlCmdToADAS( "aiCloudToStartAutopilot", result ); } catch ( Exception e ) { - Logger.e( TAG, e, "notifyAdas" ); + Logger.e( TAG, e, "aiCloudToAdasData" ); } } /** - * @param action 操作执行 - * @param json 指令数据 + * @param action + * @param result */ - private void syncControlCmdToADAS( String action, String json ) { - JSONObject jsonObject = new JSONObject(); + private void syncControlCmdToADAS( String action, Object result ) { + AdasControlCommandParameter parameter = new AdasControlCommandParameter( action, result ); //位置信息 action是aiCloudToStartAutopilot try { - jsonObject.put( "action", action ); - jsonObject.put( "result", json ); - AutopilotServiceManage.getInstance().aiCloudToAdasData( jsonObject.toString() ); + AutopilotServiceManage.getInstance().aiCloudToAdasData( GsonUtil.jsonFromObject( parameter ) ); } catch ( Exception e ) { e.printStackTrace(); } @@ -239,6 +291,17 @@ public class MogoADASController implements IMogoADASController { @Override public void release() { mIsReleased = true; + AutopilotServiceManage.getInstance().unRegisterAutopilotDataListener( mAutoPilotDataCallBack ); AutopilotServiceManage.getInstance().release(); } + + @Override + public void addAdasDataCallback( IMogoAdasDataCallback callback ) { + + } + + @Override + public void removeAdasDataCallback( IMogoAdasDataCallback callback ) { + + } } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/OnAdasListenerAdapter.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/OnAdasListenerAdapter.java new file mode 100644 index 0000000000..b8a1badc36 --- /dev/null +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/OnAdasListenerAdapter.java @@ -0,0 +1,60 @@ +package com.mogo.service.impl.adas; + +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.bean.AutopilotStatus; +import com.zhidao.support.adas.high.bean.CarLaneInfo; +import com.zhidao.support.adas.high.bean.CarStateInfo; +import com.zhidao.support.adas.high.bean.LightStatueInfo; +import com.zhidao.support.adas.high.bean.ObstaclesInfo; +import com.zhidao.support.adas.high.bean.RectInfo; +import com.zhidao.support.adas.high.bean.WarnMessageInfo; + +public +/** + * @author congtaowang + * @since 2020/10/22 + * + * 描述 + */ +abstract class OnAdasListenerAdapter implements OnAdasListener { + + @Override + public void onWarnMessage( WarnMessageInfo warnMessageInfo ) { + + } + + @Override + public void onVideoSize( int width, int height ) { + + } + + @Override + public void onRectData( RectInfo rectInfo ) { + + } + + @Override + public void onCarStateData( CarStateInfo carStateInfo ) { + + } + + @Override + public void onLightStateData( LightStatueInfo lightStatueInfo ) { + + } + + @Override + public void onObstaclesInfo( ObstaclesInfo obstaclesInfo ) { + + } + + @Override + public void onCarLaneInfo( CarLaneInfo carLaneInfo ) { + + } + + @Override + public void autopilotStatus( AutopilotStatus autopilotStatus ) { + + } +} From 3fad15ff4cb3a6efd010022a9b3cd5f012465122 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Sun, 25 Oct 2020 15:53:22 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0entrance=20=E5=B7=A6?= =?UTF-8?q?=E4=BE=A7=E6=8F=90=E7=A4=BA=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extensions/entrance/EntranceFragment.java | 9 +++ .../MogoEntranceButtonControllerImpl.java | 10 +++ .../extensions/utils/AdasNoticeHelper.java | 57 ++++++++++++++++++ .../extensions/utils/EntranceViewHolder.java | 38 ++++++++++++ .../module_ext_accident_warn.png | Bin 0 -> 10405 bytes .../module_ext_illegal_overtake.png | Bin 0 -> 8104 bytes .../drawable-xhdpi/module_ext_people_warn.png | Bin 0 -> 11373 bytes .../module_ext_suddenly_break.png | Bin 0 -> 9841 bytes .../res/drawable-xhdpi/module_ext_vip.png | Bin 0 -> 7595 bytes .../module_ext_left_notice_content_bg.xml | 19 ++++++ .../module_ext_left_notice_icon_red_bg.xml | 17 ++++++ .../main/res/layout/item_vr_left_notice.xml | 22 +++++++ .../res/layout/module_ext_layout_entrance.xml | 6 ++ .../src/main/res/values/colors.xml | 2 + .../src/main/res/values/dimens.xml | 8 +++ .../IMogoEntranceButtonController.java | 12 ++++ 16 files changed, 200 insertions(+) create mode 100644 modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_accident_warn.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_illegal_overtake.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_people_warn.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_suddenly_break.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_vip.png create mode 100644 modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_content_bg.xml create mode 100644 modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_icon_red_bg.xml create mode 100644 modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 0472822c92..51e3721352 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -47,6 +47,7 @@ import com.mogo.module.extensions.ExtensionsModuleConst; import com.mogo.module.extensions.R; import com.mogo.module.extensions.navi.NaviInfoView; import com.mogo.module.extensions.userinfo.UserInfo; +import com.mogo.module.extensions.utils.AdasNoticeHelper; import com.mogo.module.extensions.utils.EntranceViewHolder; import com.mogo.module.extensions.utils.TopViewAnimHelper; import com.mogo.module.share.manager.ServiceApisManager; @@ -189,6 +190,8 @@ public class EntranceFragment extends MvpFragment preAddView = new ArrayList<>(); + + private View preAddLeftNoticeView = null; + private EntranceViewHolder(){} private volatile static EntranceViewHolder instance = null; public static EntranceViewHolder getInstance(){ @@ -32,11 +36,15 @@ public class EntranceViewHolder { return instance; } private ViewGroup rootViewGroup = null; + private ViewGroup leftNoticeContainer = null; + public void initRootViewGroup(View rootView) { Logger.i(TAG, "initRootViewGroup=="); if(rootView instanceof ViewGroup) { Logger.d(TAG, "initRootViewGroup 赋值"); rootViewGroup = (ViewGroup) rootView.getParent(); + leftNoticeContainer = + rootView.findViewById(R.id.module_ext_vr_mode_left_notice_container); if (!preAddView.isEmpty()) { Logger.d(TAG, "initRootViewGroup 增加底层view: " + preAddView.size()); Iterator iterator = preAddView.iterator(); @@ -46,6 +54,9 @@ public class EntranceViewHolder { iterator.remove(); } } + if (preAddLeftNoticeView != null) { + realShowLeftNoticeView(preAddLeftNoticeView); + } } } @@ -107,6 +118,33 @@ public class EntranceViewHolder { } } + public void showLeftNoticeView(View view) { + if (leftNoticeContainer != null) { + realShowLeftNoticeView(view); + }else{ + preAddLeftNoticeView = view; + } + } + + public void hideLeftNoticeView(View view) { + if (preAddLeftNoticeView != null && preAddLeftNoticeView == view) { + preAddLeftNoticeView = null; + } + if (leftNoticeContainer != null) { + realHideLeftNoticeView(view); + } + } + + private void realShowLeftNoticeView(View view){ + leftNoticeContainer.removeAllViews(); + leftNoticeContainer.addView(view); + preAddLeftNoticeView = null; + } + + private void realHideLeftNoticeView(View view) { + leftNoticeContainer.removeView(view); + } + public void release(){ rootViewGroup = null; } diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_accident_warn.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_accident_warn.png new file mode 100644 index 0000000000000000000000000000000000000000..f28134a5ff118064a2739c4708334ae3bd53c116 GIT binary patch literal 10405 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⪻W0$E(>uquf1b@b!jZ|BbuIjG=`WuoD z!*%Svqi0o`D@8S6q8RME60J3C$NepjRk=d=3)teo1JO*TTiiV!rpJMf#e-$c3XF3G{S+~8Z~G}?VNhDkZ4La+Orhk=2SHcns;idu7bU$C3G zvd2yKTc=5{RolsVzVcDBZ1a1}^0;Of&yto0O5;IP{=Pu0bndlH*C)xlmNfg6HY~C< zx4WHqRYq3E7MyA}!7vl};GRwV?c@YZPN#y*a9hu6>e@_7ECj}(twjcxi1j(q4y_(D zp)M>2sdtya4j6C8=R8}|up{tg`!SQH(9}g$=S|{pl6G~M{^#?Zc-m`)9g$k^9q8X; zp5NjE%suyqye$~5X?V|enfe`ezwcCquf|(9=Xqw~T>w;x-Ki$X*f;pUYiv&=}~F4O=+{>zpbbGI)dRcL^UnGPfMI8uMjVYd^MJ4n5oO3vu2HEBm9VyN(GEM%G4PEpVs z2D{j5jmP6O0tTPJGN_!Bm&nB1@Oo7^A8EHl$@K;1gKc#=!qir)0wdk2K7XgYSovLk zM_|GwAvp5|hRvdx9o8;~uhIIpLFvjdR$h&Z1x3M;x-oN9d8v-NkD69~i&OgH zVP)u52VqcJ*tlW0+Dh~rYA7Rn{yXz>Qoj(_wjG5#6UIwZc`soL^E9W3#jJ7V;Ip(F znKkljg(u6X1YSg?GHQ6ePrG`LiJ~Fh%Y&O84$7rZOEwyHMTVuEK9iDfJarmPmhU6kW z=LzLwGrf&WFDjc2rt9prLwO;B~z)5y0qu9*Y1Ba_@!-g(KskAA?%mRmA=_!)zOJ;^u7 zHMY4m_ue=5dQo9aeI7~_P*(&MtHiYHkmgHg)CoY)P3c6!fmOLx!D)1e;F%*iKu2lR#HOK{z^03 zfj)ShV7vkaOfXT2CYG(t9tWPBEWj#1>9R0Tl}n5rJC=THIAs8lm7jiw?U{`{_u$@{ z!R8p+1{lV?Gb0hDBSqfwsR+xwza3)Lv|?wh1JZwCl!ITVvuWs?*tGEDQ7Ry`mC#S1 z$2svU2P9a<>QS>Pjx8L^qSz({Q)HrbJ``p^Zd|_$r-P7dKvYl605of%*B6%00typ5 zmn28u2qb4!VK+vKsOo~H;j;N3a3-8c?#?M1Y@@#*lez?9kcK%u-Wz;Fc&>ejIsP81 z10_&V3>kXv`u9j_Q99aQeLp-a>bPxp_g&NGi+VSZ`%+0_N!hZqg}AMf+<=WrJL(}9 zJ2M5YO{JlfL8w;Wb^%{I=#h2|21Fy8cvMV&1z?&noUfsv$F~fVdw(nh2FOBJ73XR4 zbsII_^DR3U!;NRTmtZiP~I+0h$0jXuyY0z<)3F?$}np9pt}Mu7X(k*&WZ`E$S}k>4V@L?N3(q{ zRtJ`Bk=u14l_Nh?IyA2T%p#31Es%IL1J|txX4phPXY$Oz9i{&CeoOBO)<9(&n~aDn9Uu9W%j4s}3@tkPDZQ<(m`k$e3bZzS01X-;AHy(G*sH|rKX`X3y_p@5z?Lgk&!Uo&kq8cMVLH`4Qu&N~h literal 0 HcmV?d00001 diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_illegal_overtake.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_illegal_overtake.png new file mode 100644 index 0000000000000000000000000000000000000000..05d5853b914ff47da57c1e463641b682950a7e56 GIT binary patch literal 8104 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 literal 0 HcmV?d00001 diff --git a/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_vip.png b/modules/mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_vip.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0eb6e1cc77120ed3b01ede97f0bfa9e3133d29 GIT binary patch literal 7595 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 U^+jgrzeTB%oVsl72eZ)s0b}r;9smFU literal 0 HcmV?d00001 diff --git a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_content_bg.xml b/modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_content_bg.xml new file mode 100644 index 0000000000..2ac3e00cf5 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_content_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_icon_red_bg.xml b/modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_icon_red_bg.xml new file mode 100644 index 0000000000..3d7b109e99 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_icon_red_bg.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml b/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml new file mode 100644 index 0000000000..61ad51fab4 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml index 4baeb97ccd..30d7774864 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml @@ -218,6 +218,12 @@ android:visibility="gone" tools:visibility="visible" /> + + diff --git a/modules/mogo-module-extensions/src/main/res/values/colors.xml b/modules/mogo-module-extensions/src/main/res/values/colors.xml index 615814606a..090cf78c05 100644 --- a/modules/mogo-module-extensions/src/main/res/values/colors.xml +++ b/modules/mogo-module-extensions/src/main/res/values/colors.xml @@ -3,4 +3,6 @@ #FFFFFF #BF30334C #fff + #f1f1f1 + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values/dimens.xml b/modules/mogo-module-extensions/src/main/res/values/dimens.xml index 795e8fb1ef..2992eaad58 100644 --- a/modules/mogo-module-extensions/src/main/res/values/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values/dimens.xml @@ -167,4 +167,12 @@ 30px 120px 170px + + 460px + 120px + 120px + + 40px + 32px + 40px \ No newline at end of file diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/entrance/IMogoEntranceButtonController.java b/services/mogo-service-api/src/main/java/com/mogo/service/entrance/IMogoEntranceButtonController.java index e57e039459..087108862d 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/entrance/IMogoEntranceButtonController.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/entrance/IMogoEntranceButtonController.java @@ -41,4 +41,16 @@ public interface IMogoEntranceButtonController extends IProvider { * @param view 待移除view */ void removeBottomLayerView(View view); + + /** + * 设置vr模式下,左下角提示view + * @param view 目前是adas提示和求助 + */ + void showLeftNoticeView(View view); + + /** + * 隐藏vr模式下,左下角提示view + * @param view 待隐藏view + */ + void hideLeftNoticeView(View view); } From d83fb24b4e2ef37cf7f286d36fd5483918bb1768 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Sun, 25 Oct 2020 16:45:20 +0800 Subject: [PATCH 4/7] opt left notice --- .../extensions/entrance/EntranceFragment.java | 1 + .../MogoEntranceButtonControllerImpl.java | 10 +++ .../extensions/utils/EntranceViewHolder.java | 70 ++++++++++++++++-- .../module_ext_left_notice_icon_orange_bg.xml | 17 +++++ .../main/res/layout/item_vr_left_notice.xml | 1 + .../com/mogo/module/v2x/V2XObuManager.java | 8 +- .../module_v2x_suddenly_break.png} | Bin .../res/drawable-xhdpi/module_v2x_vip.png} | Bin .../IMogoEntranceButtonController.java | 59 ++++++++++++++- 9 files changed, 155 insertions(+), 11 deletions(-) create mode 100644 modules/mogo-module-extensions/src/main/res/drawable/module_ext_left_notice_icon_orange_bg.xml rename modules/{mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_suddenly_break.png => mogo-module-v2x/src/main/res/drawable-xhdpi/module_v2x_suddenly_break.png} (100%) rename modules/{mogo-module-extensions/src/main/res/drawable-xhdpi/module_ext_vip.png => mogo-module-v2x/src/main/res/drawable-xhdpi/module_v2x_vip.png} (100%) diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 51e3721352..3b22ee2826 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -427,6 +427,7 @@ public class EntranceFragment extends MvpFragment + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml b/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml index 61ad51fab4..2e9798fd59 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml @@ -9,6 +9,7 @@ android:layout_width="@dimen/module_ext_vr_mode_left_notice_icon_width" android:layout_height="@dimen/module_ext_vr_mode_left_notice_height" android:id="@+id/module_ext_iv_left_notice_icon" + android:src="@drawable/module_ext_accident_warn" android:background="@drawable/module_ext_left_notice_icon_red_bg"/> Date: Sun, 25 Oct 2020 17:28:54 +0800 Subject: [PATCH 5/7] opt left notice --- .idea/misc.xml | 2 +- .../extensions/utils/AdasNoticeHelper.java | 31 ++++++++++++++++-- .../extensions/utils/EntranceViewHolder.java | 2 ++ .../res/layout/module_ext_layout_entrance.xml | 16 ++++----- .../scene/help/V2XCarForHelpScenario.java | 4 +++ .../scene/seek/V2XSeekHelpScenario.java | 1 + .../module_v2x_left_notice_seek_help.png | Bin 0 -> 7025 bytes 7 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi/module_v2x_left_notice_seek_help.png diff --git a/.idea/misc.xml b/.idea/misc.xml index 2db9aab721..47f1a4e1d4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java index 13f5e84d6f..c38b718165 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java @@ -9,14 +9,19 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import com.mogo.module.common.MogoApisHandler; import com.mogo.module.extensions.R; +import com.mogo.service.adas.IMogoAdasWarnMessageCallback; +import com.mogo.service.adas.MogoADASWarnType; +import com.mogo.service.adas.entity.ADASWarnMessage; +import com.mogo.service.entrance.IMogoEntranceButtonController; /** * vr模式下,adas左侧提示框帮助类 * * @author tongchenfei */ -public class AdasNoticeHelper { +public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback { private Context context; private AdasNoticeReceiver adasReceiver = new AdasNoticeReceiver(); @@ -27,11 +32,20 @@ public class AdasNoticeHelper { public void enterVrMode(){ IntentFilter filter = new IntentFilter("com.mogo.launcher.adas.app.biz"); context.registerReceiver(adasReceiver, filter); - // todo 注册adas事件回调 + MogoApisHandler.getInstance().getApis().getAdasControllerApi().addAdasWarnMessageCallback(this); } public void exitVrMode(){ context.unregisterReceiver(adasReceiver); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().removeAdasWarnMessageCallback(this); + } + + @Override + public void onReceiveData(ADASWarnMessage msg) { + // 处理adas识别的时间,主要是行人碰撞预警 + if (msg.type == MogoADASWarnType.ADAS_WARNING_PERSON) { + MogoApisHandler.getInstance().getApis().getEntranceButtonController().showLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_PEOPLE_WARN, R.drawable.module_ext_people_warn, "前方注意行人"); + } } /** @@ -43,6 +57,19 @@ public class AdasNoticeHelper { @Override public void onReceive(Context context, Intent intent) { // todo 处理发给adas的事件, 主要处理逆向超车和obu行人碰撞 + String id = intent.getStringExtra("v2x_warning_type"); + if (id != null) { + switch (id) { + case "100003": + MogoApisHandler.getInstance().getApis().getEntranceButtonController().showLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_PEOPLE_WARN, R.drawable.module_ext_people_warn, "前方注意行人"); + break; + case "": + + break; + default: + break; + } + } } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java index 064bf60460..07f63a0c3e 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java @@ -192,6 +192,7 @@ public class EntranceViewHolder { } private void realShowLeftNoticeView(View view){ + leftNoticeContainer.setVisibility(View.VISIBLE); leftNoticeContainer.removeAllViews(); leftNoticeContainer.addView(view); preAddLeftNoticeView = null; @@ -199,6 +200,7 @@ public class EntranceViewHolder { private void realHideLeftNoticeView(View view) { leftNoticeContainer.removeView(view); + leftNoticeContainer.setVisibility(View.GONE); } public void release(){ diff --git a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml index 30d7774864..35021ce021 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml @@ -137,7 +137,13 @@ android:textColor="#fff" android:gravity="center" /> - + + app:layout_constraintLeft_toRightOf="@+id/module_ext_vr_mode_left_notice_container"> - - diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/help/V2XCarForHelpScenario.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/help/V2XCarForHelpScenario.java index ffce83b1a0..f8469eb617 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/help/V2XCarForHelpScenario.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/help/V2XCarForHelpScenario.java @@ -7,6 +7,7 @@ import android.widget.TextView; import androidx.annotation.Nullable; import com.mogo.module.common.entity.V2XMessageEntity; +import com.mogo.module.v2x.R; import com.mogo.module.v2x.V2XConst; import com.mogo.module.v2x.V2XServiceManager; import com.mogo.module.v2x.scenario.impl.AbsV2XScenario; @@ -15,6 +16,7 @@ import com.mogo.module.v2x.voice.V2XVoiceCallbackListener; import com.mogo.module.v2x.voice.V2XVoiceConstants; import com.mogo.module.v2x.voice.V2XVoiceManager; import com.mogo.service.entrance.ButtonIndex; +import com.mogo.service.entrance.IMogoEntranceButtonController; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; import com.mogo.utils.logger.Logger; @@ -109,6 +111,7 @@ public class V2XCarForHelpScenario extends AbsV2XScenario implements IM if (getV2XButton() != null) { getV2XButton().setOnActionListener(this::showDialog); getV2XButton().show(); + V2XServiceManager.getMogoEntranceButtonController().showLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_SEEK_HELP, R.drawable.module_v2x_left_notice_seek_help, "正在发起求助..."); } }); } @@ -117,6 +120,7 @@ public class V2XCarForHelpScenario extends AbsV2XScenario implements IM public void closeButton() { if (V2XServiceManager.getMoGoStatusManager().isSeekHelping()) { Logger.d(TAG, "关闭自车求助按钮!"); + V2XServiceManager.getMogoEntranceButtonController().hideLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_SEEK_HELP); V2XServiceManager.getMoGoStatusManager().setSeekHelping(TAG, false); if (getV2XButton() != null) { getV2XButton().close(); diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/seek/V2XSeekHelpScenario.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/seek/V2XSeekHelpScenario.java index 10da5513fe..be9df8a6fe 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/seek/V2XSeekHelpScenario.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/seek/V2XSeekHelpScenario.java @@ -15,6 +15,7 @@ import com.mogo.module.v2x.entity.net.V2XSpecialCarRes.V2XMarkerEntity; import com.mogo.module.v2x.scenario.impl.AbsV2XScenario; import com.mogo.module.v2x.utils.ADASUtils; import com.mogo.module.v2x.utils.V2XUtils; +import com.mogo.service.entrance.IMogoEntranceButtonController; import com.mogo.service.windowview.IMogoTopViewStatusListener; import com.mogo.utils.logger.Logger; diff --git a/modules/mogo-module-v2x/src/main/res/drawable-xhdpi/module_v2x_left_notice_seek_help.png b/modules/mogo-module-v2x/src/main/res/drawable-xhdpi/module_v2x_left_notice_seek_help.png new file mode 100644 index 0000000000000000000000000000000000000000..00c0cab6db5ac1a4a23e4284905d096dabeaa16d GIT binary patch literal 7025 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 literal 0 HcmV?d00001 From a978851062a3d3c3caf14789d8d03efedd8b5e66 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 26 Oct 2020 10:17:11 +0800 Subject: [PATCH 6/7] bug fix --- .../com/mogo/module/extensions/utils/EntranceViewHolder.java | 2 +- .../src/main/res/layout/item_vr_left_notice.xml | 4 +++- .../src/main/res/layout/module_ext_layout_entrance.xml | 3 ++- modules/mogo-module-extensions/src/main/res/values/dimens.xml | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java index 07f63a0c3e..bb89540f36 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/EntranceViewHolder.java @@ -186,7 +186,7 @@ public class EntranceViewHolder { icon.setBackgroundResource(R.drawable.module_ext_left_notice_icon_red_bg); } icon.setImageResource(iconRes); - TextView tvContent = view.findViewById(R.id.module_ext_vr_mode_left_notice_container); + TextView tvContent = view.findViewById(R.id.module_ext_tv_left_notice_content); tvContent.setText(content); return view; } diff --git a/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml b/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml index 2e9798fd59..7dcdca8dfb 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/item_vr_left_notice.xml @@ -3,7 +3,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal"> + android:orientation="horizontal" + android:layout_marginBottom="@dimen/module_common_shadow_width_pos"> diff --git a/modules/mogo-module-extensions/src/main/res/values/dimens.xml b/modules/mogo-module-extensions/src/main/res/values/dimens.xml index 2992eaad58..9c8fa00258 100644 --- a/modules/mogo-module-extensions/src/main/res/values/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values/dimens.xml @@ -175,4 +175,5 @@ 40px 32px 40px + 50px \ No newline at end of file From 8e883853eb983b5d411f829c2ebfffacaea44f49 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Mon, 26 Oct 2020 11:01:12 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=8E=BB=E6=8E=89vip=E5=B7=A6=E4=B8=8B?= =?UTF-8?q?=E8=A7=92=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/extensions/utils/AdasNoticeHelper.java | 11 ++--------- .../main/java/com/mogo/module/v2x/V2XObuManager.java | 1 - 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java index c38b718165..fa42040659 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java @@ -59,15 +59,8 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback { // todo 处理发给adas的事件, 主要处理逆向超车和obu行人碰撞 String id = intent.getStringExtra("v2x_warning_type"); if (id != null) { - switch (id) { - case "100003": - MogoApisHandler.getInstance().getApis().getEntranceButtonController().showLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_PEOPLE_WARN, R.drawable.module_ext_people_warn, "前方注意行人"); - break; - case "": - - break; - default: - break; + if ("100003".equals(id)) {// 行人碰撞 + MogoApisHandler.getInstance().getApis().getEntranceButtonController().showLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_PEOPLE_WARN, R.drawable.module_ext_people_warn, "前方注意行人"); } } } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java index 661e059e8d..e0e58bf260 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java @@ -230,7 +230,6 @@ public class V2XObuManager implements IObuCallback, Handler.Callback { changeLightEvent.setDesc(info.getDescribe()); messageEntity.setContent(changeLightEvent); V2XObuEventScenario.getInstance().init(messageEntity); - V2XServiceManager.getMogoEntranceButtonController().showLeftNoticeByType(IMogoEntranceButtonController.NOTICE_TYPE_VIP, R.drawable.module_v2x_suddenly_break, "将为您变灯,vip车辆可优先通行"); break; case ObuConstant.TYPE_RUSH_RED_LIGHT: // 闯红灯预警