From b568e7946f513885180d3637dc62b15361bf2661 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 3 Mar 2021 16:56:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=98=BE=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/map/impl/custom/AMapViewWrapper.java | 3 +- modules/mogo-module-common/build.gradle | 6 + .../drawer/AdasRecognizedResultDrawer.java | 14 +- .../mogo/module/common/drawer/BaseDrawer.java | 19 +++ .../common/drawer/SnapshotSetDataDrawer.java | 140 +++++++++--------- .../com/mogo/module/common/kt/ScopeManager.kt | 26 ++++ .../service/intent/MockIntentHandler.java | 15 +- 7 files changed, 143 insertions(+), 80 deletions(-) create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/kt/ScopeManager.kt 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 27c9c34fe1..85c7509ef5 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 @@ -1038,8 +1038,7 @@ public class AMapViewWrapper implements IMogoMapView, .position( new LonLatPoint( matchedPoint[0], matchedPoint[1] ) ) .setGps( false ); mMapView.getMapAutoViewHelper().addMarker( options ); - MarkerOptions options2 - = new MarkerOptions(); + MarkerOptions options2 = new MarkerOptions(); options2.markerIcon( R.drawable.blue ) .position( new LonLatPoint( lon, lat ) ) .setGps( true ); diff --git a/modules/mogo-module-common/build.gradle b/modules/mogo-module-common/build.gradle index 4e2a0d0e54..991cf7dbfe 100644 --- a/modules/mogo-module-common/build.gradle +++ b/modules/mogo-module-common/build.gradle @@ -1,4 +1,6 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' android { compileSdkVersion rootProject.ext.android.compileSdkVersion @@ -36,6 +38,10 @@ dependencies { api rootProject.ext.dependencies.mogoaicloudrealtime + implementation rootProject.ext.dependencies.coroutinesandroid + implementation rootProject.ext.dependencies.coroutinescore + implementation rootProject.ext.dependencies.kotlinstdlibjdk7 + api "com.mogo.libs:hook:1.0" if (Boolean.valueOf(RELEASE)) { api rootProject.ext.dependencies.mogomap 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 5df87994ae..6d69d86953 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 @@ -2,10 +2,8 @@ package com.mogo.module.common.drawer; import android.content.Context; import android.text.TextUtils; -import android.util.Log; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; import com.mogo.map.MogoLatLng; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.MogoMarkerOptions; @@ -13,6 +11,7 @@ import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.R; import com.mogo.module.common.constants.DataTypes; import com.mogo.realtime.entity.ADASRecognizedResult; +import com.mogo.utils.logger.Logger; import java.util.List; import java.util.Map; @@ -27,6 +26,8 @@ public */ class AdasRecognizedResultDrawer extends BaseDrawer { + private static final String TAG = "AdasRecognizedResultDrawer"; + private static volatile AdasRecognizedResultDrawer sInstance; private final Context mContext; @@ -105,8 +106,8 @@ class AdasRecognizedResultDrawer extends BaseDrawer { // } IMogoMarker marker = mAdasRecognizedMarkersCaches.remove( uniqueKey ); - ADASRecognizedResult lastPosition = mLastPositions.put( uniqueKey, recognizedListResult ); + if ( marker == null || marker.isDestroyed() ) { marker = drawAdasRecognizedDataMarker( recognizedListResult ); if ( marker == null ) { @@ -116,12 +117,9 @@ class AdasRecognizedResultDrawer extends BaseDrawer { newAdasRecognizedMarkersCaches.put( uniqueKey, marker ); if ( lastPosition != null ) { MogoLatLng endLatLon = new MogoLatLng( recognizedListResult.lat, recognizedListResult.lon ); - long interval = recognizedListResult.systemTime - lastPosition.systemTime; - if ( interval < 45 ) { - interval = 45; - } - interval -= 25; + long interval = computeAnimDuration( lastPosition.systemTime, recognizedListResult.systemTime, lastPosition.satelliteTime, recognizedListResult.satelliteTime ); marker.addDynamicAnchorPosition( endLatLon, interval ); + Logger.d( TAG, "anim duration: %s", interval ); } else { marker.setRotateAngle( ( ( float ) recognizedListResult.heading ) ); marker.setPosition( recognizedListResult.lat, recognizedListResult.lon ); 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 7471f39dc0..20dc2362f8 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 @@ -196,4 +196,23 @@ class BaseDrawer { .getMapUIController() .matchRoad( lon, lat, angle, true, isRtk ); } + + /** + * 使用系统时间或卫星时间计算出动画的运动时间 + * + * @param lastSystemTime + * @param curSystemTime + * @param lastSatelliteTime + * @param curSatelliteTime + * @return + */ + protected long computeAnimDuration( long lastSystemTime, long curSystemTime, long lastSatelliteTime, long curSatelliteTime ) { + long systemTimeInterval = curSystemTime - lastSystemTime - 25; + long satelliteTimeInterval = curSatelliteTime - lastSatelliteTime - 25; + long interval = systemTimeInterval < satelliteTimeInterval || satelliteTimeInterval == 0 ? systemTimeInterval : satelliteTimeInterval; + if ( interval < 45 ) { + interval = 45; + } + return interval; + } } 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 fe277f792c..13c39060ef 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 @@ -7,7 +7,6 @@ import android.view.View; import android.widget.ImageView; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; import com.mogo.map.MogoLatLng; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; @@ -16,16 +15,17 @@ 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.kt.ScopeManager; import com.mogo.realtime.entity.CloudRoadData; import com.mogo.realtime.entity.MogoSnapshotSetData; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; -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; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -78,6 +78,8 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic private final Map< String, CloudRoadData > mLastPositions = new ConcurrentHashMap<>(); + private final Map< String, Long > mLastPositionExecutionTime = new HashMap<>(); + private boolean mIsVrMode = false; @Override @@ -142,23 +144,6 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic prepareData( data.getAllList(), allDatumsList ); Map< String, IMogoMarker > newAdasRecognizedMarkersCaches = new ConcurrentHashMap<>(); for ( CloudRoadData cloudRoadData : allDatumsList ) { - if ( cloudRoadData == null ) { - continue; - } - - // 暂时只显示车辆 - if ( TextUtils.isEmpty( cloudRoadData.getSn() ) ) { - if ( !isCarType( cloudRoadData.getType() ) ) { - continue; - } - } - - String uniqueKey = cloudRoadData.getUniqueKey(); - if ( TextUtils.isEmpty( uniqueKey ) - // 本地过滤重复下发的adas识别车辆 - || AdasRecognizedResultDrawer.getInstance().hasCached( uniqueKey ) ) { - continue; - } // double[] matchedPoint = matchRoad( cloudRoadData.getLon(), // cloudRoadData.getLat(), @@ -169,56 +154,75 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic // cloudRoadData.setLon( matchedPoint[0] ); // cloudRoadData.setLat( matchedPoint[1] ); // } - - IMogoMarker marker = mCloudSnapshotMarkersCaches.remove( uniqueKey ); - CloudRoadData lastPosition = mLastPositions.put( uniqueKey, cloudRoadData ); - if ( marker == null || marker.isDestroyed() ) { - - marker = drawSnapshotDataMarker( cloudRoadData ); - if ( marker == null ) { - continue; - } - if ( !TextUtils.isEmpty( cloudRoadData.getSn() ) ) { - bindClickListener( marker ); - } - } - - newAdasRecognizedMarkersCaches.put( uniqueKey, marker ); - - if ( mChangeCarModeStatus ) { - mIsVrMode = MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode(); - mChangeCarModeStatus = false; - if ( mIsVrMode ) { - marker.getMogoMarkerOptions().set3DMode( true ); - marker.use3DResource( getVrModelResId( cloudRoadData ) ); - } else { - marker.getMogoMarkerOptions().set3DMode( false ); - marker.setIcon( ViewUtils.fromView( inflateView( cloudRoadData ) ) ); - } - } - - if ( lastPosition != null ) { - if ( lastPosition.equals( cloudRoadData ) ) { - marker.setRotateAngle( ( float ) cloudRoadData.getHeading() ); - marker.setPosition( cloudRoadData.getLat(), cloudRoadData.getLon() ); - } else { - long interval = cloudRoadData.getSystemTime() - lastPosition.getSystemTime(); - long interval2 = cloudRoadData.getSatelliteTime() - lastPosition.getSatelliteTime(); - interval2 = interval < interval2 || interval2 == 0 ? interval : interval2; - if ( interval2 < 45 ) { - interval2 = 45; - } - interval2 -= 25; - marker.addDynamicAnchorPosition( new MogoLatLng( cloudRoadData.getLat(), cloudRoadData.getLon() ), interval2 ); - } - } else { - marker.setRotateAngle( ( float ) cloudRoadData.getHeading() ); - marker.setPosition( cloudRoadData.getLat(), cloudRoadData.getLon() ); - } - showSelfSpeed( mContext, marker, cloudRoadData.getSpeed(), MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ); + ScopeManager.INSTANCE.mainScope( () -> { + rendCarOneFrame( cloudRoadData, newAdasRecognizedMarkersCaches ); + } ); } - sendMessage( MSG_REMOVE_DIRTY_MARKERS, mCloudSnapshotMarkersCaches ); - mCloudSnapshotMarkersCaches = newAdasRecognizedMarkersCaches; + ScopeManager.INSTANCE.mainScope( () -> { + sendMessage( MSG_REMOVE_DIRTY_MARKERS, mCloudSnapshotMarkersCaches ); + mCloudSnapshotMarkersCaches = newAdasRecognizedMarkersCaches; + } ); + } + + private void rendCarOneFrame( CloudRoadData cloudRoadData, Map< String, IMogoMarker > newAdasRecognizedMarkersCaches ) { + + if ( cloudRoadData == null ) { + return; + } + + // 暂时只显示车辆 + if ( TextUtils.isEmpty( cloudRoadData.getSn() ) ) { + if ( !isCarType( cloudRoadData.getType() ) ) { + return; + } + } + + String uniqueKey = cloudRoadData.getUniqueKey(); + if ( TextUtils.isEmpty( uniqueKey ) + // 本地过滤重复下发的adas识别车辆 + || AdasRecognizedResultDrawer.getInstance().hasCached( uniqueKey ) ) { + return; + } + + IMogoMarker marker = mCloudSnapshotMarkersCaches.remove( uniqueKey ); + CloudRoadData lastPosition = mLastPositions.put( uniqueKey, cloudRoadData ); + + if ( marker == null || marker.isDestroyed() ) { + marker = drawSnapshotDataMarker( cloudRoadData ); + if ( marker == null ) { + return; + } + if ( !TextUtils.isEmpty( cloudRoadData.getSn() ) ) { + bindClickListener( marker ); + } + } + + newAdasRecognizedMarkersCaches.put( uniqueKey, marker ); +// +// if ( mChangeCarModeStatus ) { +// mIsVrMode = MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode(); +// mChangeCarModeStatus = false; +// if ( mIsVrMode ) { +// marker.getMogoMarkerOptions().set3DMode( true ); +// marker.use3DResource( getVrModelResId( cloudRoadData ) ); +// } else { +// marker.getMogoMarkerOptions().set3DMode( false ); +// marker.setIcon( ViewUtils.fromView( inflateView( cloudRoadData ) ) ); +// } +// } + + if ( lastPosition != null && !lastPosition.equals( cloudRoadData ) ) { + long interval = computeAnimDuration( lastPosition.getSystemTime(), cloudRoadData.getSystemTime(), lastPosition.getSatelliteTime(), cloudRoadData.getSatelliteTime() ); + interval = System.currentTimeMillis() - mLastPositionExecutionTime.get( uniqueKey ); + marker.addDynamicAnchorPosition( new MogoLatLng( cloudRoadData.getLat(), cloudRoadData.getLon() ), interval ); + Logger.d( TAG, "anim duration: %s", interval ); + } else { + marker.setRotateAngle( ( float ) cloudRoadData.getHeading() ); + marker.setPosition( cloudRoadData.getLat(), cloudRoadData.getLon() ); + Logger.d( TAG, "设置点位置" ); + } + mLastPositionExecutionTime.put( uniqueKey, System.currentTimeMillis() ); + showSelfSpeed( mContext, marker, cloudRoadData.getSpeed(), MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ); } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/kt/ScopeManager.kt b/modules/mogo-module-common/src/main/java/com/mogo/module/common/kt/ScopeManager.kt new file mode 100644 index 0000000000..9a6ba2cf40 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/kt/ScopeManager.kt @@ -0,0 +1,26 @@ +package com.mogo.module.common.kt + +import androidx.annotation.RestrictTo +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.launch + +/** + * @author congtaowang + * @since 2021/3/3 + * + * 描述 + */ +object ScopeManager { + + private var mScope = MainScope() + private var mThreadScope: RestrictTo.Scope? = null + + fun mainScope(runnable: Runnable?) { + mScope.launch(Dispatchers.Default) { + runnable?.apply { + run() + } + } + } +} \ No newline at end of file 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 b9e0b73525..05d2271b41 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 @@ -557,7 +557,7 @@ public class MockIntentHandler implements IntentHandler { break; case 47: mLocationMockHandler.sendEmptyMessageDelayed( 1, 200L ); - mLocationMockHandler2.sendEmptyMessageDelayed( 2, 0 ); + mLocationMockHandler.sendEmptyMessageDelayed( 2, 0 ); // mLocationMockHandler.sendEmptyMessageDelayed( 3, 300L ); break; } @@ -601,6 +601,17 @@ public class MockIntentHandler implements IntentHandler { } br = null; } + } else if ( msg.what == 2 ) { + try { + handleMockSnapshotIntent(); + } catch ( Exception e ) { + try { + br2.close(); + } catch ( IOException ex ) { + ex.printStackTrace(); + } + br2 = null; + } } } }; @@ -678,7 +689,7 @@ public class MockIntentHandler implements IntentHandler { final long start = System.currentTimeMillis(); SnapshotSetDataDrawer.getInstance().renderSnapshotData( data ); Log.i( "mock-timer-snapshot", "cost " + ( System.currentTimeMillis() - start ) + "ms" ); - mLocationMockHandler2.sendEmptyMessageDelayed( 2, 100L ); + mLocationMockHandler.sendEmptyMessageDelayed( 2, 100L ); return true; }