From ea3518b676b4a19c3792dcf307ccaf8ee062f094 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Tue, 22 Dec 2020 11:21:53 +0800 Subject: [PATCH] opt --- .../main/java/com/mogo/utils/ViewUtils.java | 8 ++- .../map/impl/amap/AMapMarkerClickHandler.java | 5 +- libraries/map-custom/build.gradle | 2 +- .../impl/custom/AMapMarkerClickHandler.java | 24 ++++--- .../mogo/map/impl/custom/AMapViewWrapper.java | 6 +- .../impl/custom/marker/AMapMarkerWrapper.java | 1 + .../map/impl/custom/utils/ObjectUtils.java | 14 ++-- .../mogo/map/marker/MogoMarkersHandler.java | 2 +- .../com/mogo/module/apps/AppsFragment.java | 2 +- .../common/constants/AdasRecognizedType.java | 2 +- .../drawer/AdasRecognizedResultDrawer.java | 7 ++ .../mogo/module/common/drawer/BaseDrawer.java | 11 ++++ .../common/drawer/SnapshotSetDataDrawer.java | 62 ++++++++++++++++-- .../module/common/map/MyLocationUtil.java | 5 ++ .../module_services_marker_bkg.png | Bin 9325 -> 14062 bytes .../src/main/res/values-xhdpi/dimens.xml | 2 +- .../live/ExtensionServiceManager.java | 3 +- .../java/com/mogo/module/map/MapFragment.java | 2 +- .../service/location/MogoRTKLocation.java | 1 + .../uploadintime/SnapshotUploadInTime.java | 6 ++ .../module_services_marker_bkg.png | Bin 5835 -> 0 bytes .../module_services_marker_bkg.png | Bin 5835 -> 0 bytes .../service/impl/adas/MogoADASController.java | 2 +- 23 files changed, 130 insertions(+), 37 deletions(-) delete mode 100644 modules/mogo-module-service/src/main/res/drawable-ldpi/module_services_marker_bkg.png delete mode 100644 modules/mogo-module-service/src/main/res/drawable-mdpi/module_services_marker_bkg.png diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java index 6cb7fec5de..dfd92bd7e1 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/ViewUtils.java @@ -1,6 +1,7 @@ package com.mogo.utils; import android.graphics.Bitmap; +import android.graphics.Canvas; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -19,8 +20,11 @@ public class ViewUtils { view.destroyDrawingCache(); view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); - Bitmap bitmap = null; - return (bitmap = view.getDrawingCache()) != null ? bitmap.copy(Bitmap.Config.ARGB_8888, false) : null; + Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas( bitmap ); + view.draw( canvas ); + return bitmap; +// return (bitmap = view.getDrawingCache()) != null ? bitmap.copy(Bitmap.Config.ARGB_8888, false) : null; } public static void processChildView(View view) { diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapMarkerClickHandler.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapMarkerClickHandler.java index bdec4be752..12ba116c43 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapMarkerClickHandler.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapMarkerClickHandler.java @@ -23,7 +23,10 @@ public class AMapMarkerClickHandler { final IMogoMarkerClickListener listener = mogoMarker.getOnMarkerClickListener(); Logger.d( "AMapMarkerWrapper", "marker 点击回调:%s -> %s", mogoMarker, marker ); if ( listener != null ) { - listener.onMarkerClicked( mogoMarker ); + boolean result = listener.onMarkerClicked( mogoMarker ); + if ( result ) { + return true; + } } return MogoMarkersHandler.getInstance().onMarkerClicked( mogoMarker ); } diff --git a/libraries/map-custom/build.gradle b/libraries/map-custom/build.gradle index 873947c869..843fd2d9b1 100644 --- a/libraries/map-custom/build.gradle +++ b/libraries/map-custom/build.gradle @@ -67,7 +67,7 @@ dependencies { implementation project(':foudations:mogo-commons') } - implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.3.3' + implementation 'com.zhidaoauto.machine:map:1.0.0-vr-7.4.1' } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapMarkerClickHandler.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapMarkerClickHandler.java index f2775c4894..74ab766cd3 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapMarkerClickHandler.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapMarkerClickHandler.java @@ -21,12 +21,13 @@ public class AMapMarkerClickHandler { private static volatile AMapMarkerClickHandler sInstance; - private AMapMarkerClickHandler(){} + private AMapMarkerClickHandler() { + } - public static AMapMarkerClickHandler getInstance(){ - if( sInstance == null ){ - synchronized( AMapMarkerClickHandler.class ) { - if( sInstance == null ){ + public static AMapMarkerClickHandler getInstance() { + if ( sInstance == null ) { + synchronized ( AMapMarkerClickHandler.class ) { + if ( sInstance == null ) { sInstance = new AMapMarkerClickHandler(); } } @@ -34,7 +35,7 @@ public class AMapMarkerClickHandler { return sInstance; } - public synchronized void release(){ + public synchronized void release() { sInstance = null; } @@ -47,13 +48,16 @@ public class AMapMarkerClickHandler { if ( marker == null ) { return false; } - Map mogoMarkerMap = MarkerWrapperClickHelper.getInstance().getMogoMarkerMap(); - if ( mogoMarkerMap.containsKey(marker.getId())) { - IMogoMarker mogoMarker = mogoMarkerMap.get(marker.getId()); + Map< String, IMogoMarker > mogoMarkerMap = MarkerWrapperClickHelper.getInstance().getMogoMarkerMap(); + if ( mogoMarkerMap.containsKey( marker.getId() ) ) { + IMogoMarker mogoMarker = mogoMarkerMap.get( marker.getId() ); final IMogoMarkerClickListener listener = mogoMarker.getOnMarkerClickListener(); Logger.d( "AMapMarkerWrapper", "marker 点击回调:%s -> %s", mogoMarker, marker ); if ( listener != null ) { - listener.onMarkerClicked( mogoMarker ); + boolean result = listener.onMarkerClicked( mogoMarker ); + if ( result ) { + return true; + } } return MogoMarkersHandler.getInstance().onMarkerClicked( mogoMarker ); } 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 5a903d4115..1f13c10622 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 @@ -339,13 +339,11 @@ public class AMapViewWrapper implements IMogoMapView, if ( mMapView.getMapAutoViewHelper() != null ) { switch ( ui ) { case CarUp_2D: - mMapView.getMapAutoViewHelper().setMapViewPerspective( MapAutoApi.MAP_PERSPECTIVE_2D ); - break; case CarUp_3D: - mMapView.getMapAutoViewHelper().setMapViewPerspective( MapAutoApi.MAP_PERSPECTIVE_3D ); + mMapView.getMapAutoViewHelper().setMapViewPerspective( MapAutoApi.MAP_PERSPECTIVE_UP_CAR ); break; case NorthUP_2D: - mMapView.getMapAutoViewHelper().setRotateGesturesEnabled( false ); + mMapView.getMapAutoViewHelper().setMapViewPerspective( MapAutoApi.MAP_PERSPECTIVE_UP_NORTH ); break; } } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java index 361fb1c8f4..b29924d0e8 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/marker/AMapMarkerWrapper.java @@ -59,6 +59,7 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer { marker.setMObject( this ); MarkerWrapperClickHelper.getInstance().setMogoMarkerMap( marker.getId(), this ); } + marker.setSaveBitmapEnable( true ); setObject( mogoMarkerOptions.getObject() ); this.mMogoMarkerOptions = mogoMarkerOptions; mMogoMarkerOptions.addObserver( this ); diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/ObjectUtils.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/ObjectUtils.java index b7a9a9586d..5f198a34d4 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/ObjectUtils.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/ObjectUtils.java @@ -126,15 +126,15 @@ public class ObjectUtils { location.setLongitude( aLocation.getLon() ); location.setAltitude( aLocation.getAltitude() ); // location.setTime( aLocation.getTime() ); -// location.setBearing( aLocation.getBearing() ); + location.setBearing( aLocation.getHeading() ); // location.setAccuracy( aLocation.getAccuracy() ); -// location.setCityCode( aLocation.getCityCode() ); -// location.setCityName( aLocation.getCity() ); + location.setCityCode( aLocation.getCityCode() ); + location.setCityName( aLocation.getCity() ); location.setProvider( aLocation.getProvider() ); -// location.setAddress( aLocation.getAddress() ); -// location.setDistrict( aLocation.getDistrict() ); -// location.setProvince( aLocation.getProvince() ); -// location.setAdCode( aLocation.getAdCode() ); + location.setAddress( aLocation.getAddress() ); + location.setDistrict( aLocation.getDistrict() ); + location.setProvince( aLocation.getProvince() ); + location.setAdCode( aLocation.getAdCode() ); // location.setLocationDetail( aLocation.getLocationDetail() ); // location.setPoiName( aLocation.getPoiName() ); // location.setAoiName( aLocation.getAoiName() ); diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java index 387f8f58c5..a6e5f8f14c 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/MogoMarkersHandler.java @@ -78,7 +78,7 @@ public class MogoMarkersHandler implements IMogoMarkerClickListener, IMogoMarker } - public synchronized Map< String, List< IMogoMarker > > getAllMarkers() { + public synchronized Map< String, List< IMogoMarker > > getAllMarkers() { return mServicesMarkers; } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java index c14b9675aa..446a9f8d90 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java @@ -54,7 +54,7 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme mIndicator = findViewById( R.id.module_apps_id_indicator ); mIndicator.setOpenPadding( true ); - ViewPagerSpeedScroller.attach(getContext(), mAppsPager, 1000); +// ViewPagerSpeedScroller.attach(getContext(), mAppsPager, 1000); } @NonNull diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/AdasRecognizedType.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/AdasRecognizedType.java index 4e1cf1166a..818c69960b 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/AdasRecognizedType.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/constants/AdasRecognizedType.java @@ -22,7 +22,7 @@ enum AdasRecognizedType { classIdTrafficSign( "traffic_sign", 5 ), //bus classIdTrafficBus( "traffic_bus", 6 ), - //track + //truck classIdTrafficTruck( "traffic_truck", 8 ); AdasRecognizedType( int code ) { diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java index 8fcb4d7a54..2026a34c70 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java @@ -13,6 +13,7 @@ import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.R; +import com.mogo.module.common.constants.AdasRecognizedType; import com.mogo.module.common.constants.DataTypes; import com.mogo.service.adas.entity.ADASRecognizedListResult; import com.mogo.utils.ViewUtils; @@ -79,6 +80,12 @@ class AdasRecognizedResultDrawer extends BaseDrawer { if ( recognizedListResult == null ) { continue; } + + // 暂时只显示车辆 + if ( isCarType( recognizedListResult.type ) ) { + continue; + } + IMogoMarker marker = null; String uniqueKey = recognizedListResult.uuid; if ( TextUtils.isEmpty( uniqueKey ) ) { diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java index 1e4297d218..122ea5ab73 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java @@ -2,6 +2,7 @@ package com.mogo.module.common.drawer; import com.mogo.map.CoordinatesTransformer; import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.constants.AdasRecognizedType; import com.mogo.module.common.constants.CarModelType; import com.mogo.module.common.constants.SafeType; @@ -83,4 +84,14 @@ class BaseDrawer { } return mTransformer.transform( lat, lon ); } + + protected boolean isCarType( int type ) { + AdasRecognizedType recognizedType = AdasRecognizedType.valueFrom( type ); + if ( recognizedType != AdasRecognizedType.classIdCar + || recognizedType != AdasRecognizedType.classIdTrafficBus + || recognizedType != AdasRecognizedType.classIdTrafficTruck ) { + return false; + } + return true; + } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java index 1fb911a3b8..000b8ddc32 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java @@ -10,14 +10,18 @@ import android.widget.ImageView; import com.mogo.commons.AbsMogoApplication; import com.mogo.map.MogoLatLng; import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.R; +import com.mogo.module.common.api.CallChatApi; import com.mogo.module.common.constants.DataTypes; import com.mogo.module.common.entity.CloudRoadData; import com.mogo.module.common.entity.MogoSnapshotSetData; import com.mogo.utils.ViewUtils; import com.mogo.utils.logger.Logger; +import com.zhidao.carchattingprovider.ICarsChattingProvider; +import com.zhidao.carchattingprovider.MogoDriverInfo; import java.util.ArrayList; import java.util.HashMap; @@ -32,7 +36,7 @@ public * * 云端数据绘制 */ -class SnapshotSetDataDrawer extends BaseDrawer { +class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClickListener { private static final String TAG = "SnapshotSetDataDrawer"; @@ -84,8 +88,7 @@ class SnapshotSetDataDrawer extends BaseDrawer { boolean machineVision ) { if ( data == null || ( ( data.getAllList() == null || data.getAllList().isEmpty() ) && - ( data.getNearList() == null || data.getNearList().isEmpty() ) - ) ) { + ( data.getNearList() == null || data.getNearList().isEmpty() ) ) ) { MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager( AbsMogoApplication.getApp() ).removeMarkers( DataTypes.TYPE_MARKER_CLOUD_DATA ); return; } @@ -101,12 +104,21 @@ class SnapshotSetDataDrawer extends BaseDrawer { mPurseCounter++; if ( mPurseCounter >= 100 ) { mPurseCounter = 0; - purgeCloudSnapshotData( allDatumsList ); } + purgeCloudSnapshotData( allDatumsList ); for ( CloudRoadData cloudRoadData : allDatumsList ) { if ( cloudRoadData == null ) { continue; } + + // 暂时只显示车辆 + if ( TextUtils.isEmpty( cloudRoadData.getSn() ) ) { + if ( isCarType( cloudRoadData.getType() ) ) { + continue; + } + } + + IMogoMarker marker = null; String uniqueKey = cloudRoadData.getUniqueKey(); if ( TextUtils.isEmpty( uniqueKey ) ) { @@ -121,6 +133,9 @@ class SnapshotSetDataDrawer extends BaseDrawer { if ( marker == null ) { continue; } + if ( !TextUtils.isEmpty( cloudRoadData.getSn() ) ) { + bindClickListener( marker ); + } mCloudSnapshotMarkersCaches.put( uniqueKey, marker ); } else { if ( mIsVrMode != MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { @@ -128,6 +143,7 @@ class SnapshotSetDataDrawer extends BaseDrawer { if ( mIsVrMode ) { marker.use3DResource( getVrModel( cloudRoadData ) ); } else { + marker.getMogoMarkerOptions().set3DMode( false ); marker.setIcon( ViewUtils.fromView( inflateView( cloudRoadData, machineVision, 0 ) ) ); } } @@ -142,7 +158,7 @@ class SnapshotSetDataDrawer extends BaseDrawer { List< MogoLatLng > points = new ArrayList<>(); points.add( new MogoLatLng( lastPosition.lat, lastPosition.lon ) ); points.add( new MogoLatLng( target.lat, target.lon ) ); - marker.startSmoothInMs( points, SystemClock.elapsedRealtime() - mLastReceiveTime ); + marker.startSmoothInMs( points, 500L ); } } else { marker.setRotateAngle( 360 - ( float ) cloudRoadData.getHeading() ); @@ -154,6 +170,13 @@ class SnapshotSetDataDrawer extends BaseDrawer { } } + private void bindClickListener( IMogoMarker marker ) { + if ( marker == null || marker.isDestroyed() ) { + return; + } + marker.setOnMarkerClickListener( this ); + } + /** * 过滤本次数据中,不存在的 marker * @@ -206,6 +229,7 @@ class SnapshotSetDataDrawer extends BaseDrawer { .owner( DataTypes.TYPE_MARKER_CLOUD_DATA ) .anchor( 0.5f, 0.5f ) .rotate( ( float ) data.getHeading() ) + .object( data ) // .position( new MogoLatLng( coor[POS_LAT], coor[POS_LON] ) ); .position( new MogoLatLng( data.getLat(), data.getLon() ) ); if ( mIsVrMode = MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { @@ -256,4 +280,32 @@ class SnapshotSetDataDrawer extends BaseDrawer { return R.drawable.icon_map_marker_car_gray; } } + + @Override + public boolean onMarkerClicked( IMogoMarker marker ) { + if ( marker != null && !marker.isDestroyed() ) { + if ( marker.getObject() instanceof CloudRoadData ) { + showCarCallPanel( ( ( CloudRoadData ) marker.getObject() ) ); + } + } + return true; + } + + private void showCarCallPanel( CloudRoadData data ) { + + MogoDriverInfo driverInfo = new MogoDriverInfo(); + driverInfo.setLat( data.getLat() ); + driverInfo.setLon( data.getLon() ); + driverInfo.setSn( data.getSn() ); + + ICarsChattingProvider carChatting = CallChatApi.getInstance().getApiProvider(); + + if ( carChatting != null ) { + try { + carChatting.showUserWindow( TAG, driverInfo, mContext ); + } catch ( Exception e ) { + Logger.e( TAG, e, "showCarCallPanel" ); + } + } + } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MyLocationUtil.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MyLocationUtil.java index b6919646fa..6f766975cd 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MyLocationUtil.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/map/MyLocationUtil.java @@ -22,6 +22,7 @@ import com.mogo.module.common.R; import com.mogo.utils.UiThreadHandler; import com.mogo.utils.ViewUtils; import com.mogo.utils.glide.GlideApp; +import com.mogo.utils.storage.SharedPrefsMgr; /** * 自车图标工具类 @@ -44,6 +45,10 @@ public class MyLocationUtil { private static final CarCursorOption DEFAULT_OPTION = new CarCursorOption.Builder() .build(); + public static void setMyLocationIconUrl(Context context){ + setMyLocationIconUrl( context, SharedPrefsMgr.getInstance( context ).getString( "MY_LOCATION_CONFIG", "" ) ); + } + public static void setMyLocationIconUrl(Context context, String url) { if (url == null || url.isEmpty()) { return; diff --git a/modules/mogo-module-common/src/main/res/drawable-xhdpi/module_services_marker_bkg.png b/modules/mogo-module-common/src/main/res/drawable-xhdpi/module_services_marker_bkg.png index acdb4d70634f3face2d0addd87485a2007668275..8dc909a58da20b382ec3dcc50aeb60d4a62fd6e0 100644 GIT binary patch literal 14062 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 literal 9325 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 100px 55px - 117px + 130px 69px 60px 60px diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java index 4084b0bd6a..97e7d160ec 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/ExtensionServiceManager.java @@ -9,6 +9,7 @@ import com.mogo.map.navi.IMogoNavi; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.search.geo.IMogoGeoSearch; import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.module.common.MogoApisHandler; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.analytics.IMogoAnalytics; @@ -75,7 +76,7 @@ public class ExtensionServiceManager { isInit = true; mContext = context; - mMogoServiceApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context); + mMogoServiceApis = MogoApisHandler.getInstance().getApis(); mMapService = mMogoServiceApis.getMapServiceApi(); mImageLoader = mMogoServiceApis.getImageLoaderApi(); 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 4b0b2ae39d..4e12cf2ceb 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 @@ -72,7 +72,7 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements mMogoMap.getUIController().recoverLockMode();// 启动锁车 } // 根据本地配置设置自车图标 - MyLocationUtil.setMyLocationIconUrl( getContext(), SharedPrefsMgr.getInstance( getContext() ).getString( "MY_LOCATION_CONFIG", "" ) ); + MyLocationUtil.setMyLocationIconUrl( getContext() ); } @NonNull diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java index a7b18542ef..445672c2f8 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java @@ -59,6 +59,7 @@ public class MogoRTKLocation { } private void sendLocationData() { + if (rtkLocationListener != null) { List list = new ArrayList<>(cacheList); rtkLocationListener.onLocationChanged(list); diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/uploadintime/SnapshotUploadInTime.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/uploadintime/SnapshotUploadInTime.java index 4b6d2f185b..8a07f5d1c4 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/uploadintime/SnapshotUploadInTime.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/uploadintime/SnapshotUploadInTime.java @@ -102,6 +102,12 @@ class SnapshotUploadInTime implements MogoRTKLocation.RTKLocationListener { content.self = locationResult; content.adas = recognizedResults; + if ( content.self == null && + ( content.adas == null || content.adas.isEmpty() ) ) { + return; + } + + MarkerServiceHandler.getApis().getWebSocketManagerApi( mContext ).sendMsg( content, new IMogoOnWebSocketMessageListener() { @Override public WebSocketMsgType getDownLinkType() { diff --git a/modules/mogo-module-service/src/main/res/drawable-ldpi/module_services_marker_bkg.png b/modules/mogo-module-service/src/main/res/drawable-ldpi/module_services_marker_bkg.png deleted file mode 100644 index 79d163824decc9931e699f4191c48c2ba46c66b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5835 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