diff --git a/gradle.properties b/gradle.properties index 2f04173372..8ff3f22afd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,7 +24,7 @@ SNAPSHOT_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-snapshots/ USERNAME=xintai PASSWORD=xintai2018 # 编译模式: false - 依赖本地版本, true - 依赖 maven 版本 -RELEASE=false +RELEASE=true # 模块版本 ## 工程内模块 MOGO_MODULE_SHARE_VERSION=1.0.2-SNAPSHOT diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java index 40fa8bfdae..10755e1ff9 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainActivity.java @@ -1,9 +1,6 @@ package com.mogo.module.main; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; import android.util.Log; import android.view.View; import android.widget.FrameLayout; @@ -30,20 +27,16 @@ import com.mogo.module.main.cards.MogoModulesManager; import com.mogo.module.main.cards.OnPageChangeListenerAdapter; import com.mogo.module.main.cards.OrientedViewPager; import com.mogo.module.main.cards.VerticalStackTransformer; -import com.mogo.module.main.constants.MainConstants; import com.mogo.module.main.windowview.WindowViewHandler; import com.mogo.module.service.ServiceConst; import com.mogo.service.MogoServicePaths; -import com.mogo.service.analytics.IMogoAnalytics; import com.mogo.service.cardmanager.IMogoCardManager; import com.mogo.service.fragmentmanager.IMogoFragmentManager; import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoModuleProvider; import com.mogo.utils.logger.Logger; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * @author congtaowang @@ -64,7 +57,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme private IMogoFragmentManager mMogoFragmentManager; private OrientedViewPager mCardsContainer; - private VerticalStackTransformer transformer; + private VerticalStackTransformer mTransformer; private CardModulesAdapter mCardModulesAdapter; private View mHeader; @@ -83,38 +76,6 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme private IMogoLocationClient mLocationClient; private int mCurrentPosition = 0; - private long mCardStartShowTime = 0; - - // 埋点接口 - private IMogoAnalytics mAnalytics; - - private Handler mMsgHandler = new Handler( Looper.getMainLooper() ) { - @Override - public void handleMessage( Message msg ) { - super.handleMessage( msg ); - switch ( msg.what ) { - case MainConstants.MSG_LOAD_CARD_MODULES: - loadCardModules(); - mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT, 1_000L ); - break; - case MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT: - if ( mOnPageChangeListener != null ) { - // 默认触发第一个卡片 - mOnPageChangeListener.onPageSelected( 0 ); - } - break; - case MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT: - trackLastCardShowEvent( ( IMogoModuleProvider ) msg.obj ); - break; - case MainConstants.MSG_TRACK_CARD_FLIP_EVENT: - trackCardFlipEvent(( IMogoModuleProvider ) msg.obj); - break; - case MainConstants.MSG_HIDE_MAP_COVER_FRAME: - mCoverUpLayout.setVisibility( View.GONE ); - break; - } - } - }; private ViewPager.OnPageChangeListener mOnPageChangeListener; @@ -127,7 +88,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme protected void initViews() { mCardsContainer = findViewById( R.id.module_main_id_cards_container ); mCardsContainer.setOrientation( OrientedViewPager.Orientation.VERTICAL ); - transformer = new VerticalStackTransformer( this ); + mTransformer = new VerticalStackTransformer( this ); mCardsContainer.setOnPageChangeListener( mOnPageChangeListener = new OnPageChangeListenerAdapter() { private boolean mIsLast = true; private boolean mCardFlipStatus = false; @@ -137,11 +98,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme final long start = System.currentTimeMillis(); try { IMogoModuleProvider provider = mCardModulesAdapter.getProvider( mCurrentPosition ); - Message msg = Message.obtain(); - msg.what = MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT; - msg.obj = provider; - mMsgHandler.sendMessage( msg ); - + mPresenter.postTrackLastCardShowEvent( provider ); mCurrentPosition = position; provider = mCardModulesAdapter.getProvider( mCurrentPosition ); mMogoModuleHandler.setModuleEnable( provider.getModuleName() ); @@ -149,7 +106,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme } catch ( Exception e ) { e.printStackTrace(); } - Log.i( TAG, "onPageSelected cost " + ( System.currentTimeMillis() - start ) + "ms" ); + Logger.i( TAG, "onPageSelected cost " + ( System.currentTimeMillis() - start ) + "ms" ); } @Override @@ -160,14 +117,11 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme if ( !mCardFlipStatus ) { mCardFlipStatus = true; final IMogoModuleProvider provider = mCardModulesAdapter.getProvider( mCurrentPosition ); - Message msg = Message.obtain(); - msg.what = MainConstants.MSG_TRACK_CARD_FLIP_EVENT; - msg.obj = provider; - mMsgHandler.sendMessage( msg ); + mPresenter.postTrackCardFlipEvent(provider); } } else if ( state == ViewPager.SCROLL_STATE_IDLE ) { mCardFlipStatus = false; - transformer.resetOffsetScroll(); + mTransformer.resetOffsetScroll(); } int cardSize = mCardModulesAdapter.getCount(); @@ -184,26 +138,17 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme } else { mIsLast = true; } - Log.i( TAG, "onPageScrollStateChanged cost " + ( System.currentTimeMillis() - start ) + "ms" ); + Logger.i( TAG, "onPageScrollStateChanged cost " + ( System.currentTimeMillis() - start ) + "ms" ); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { super.onPageScrolled(position, positionOffset, positionOffsetPixels); Logger.d(TAG,"pageScrolled : offset --- " + positionOffset); - transformer.offsetScrollChanged(positionOffset); + mTransformer.offsetScrollChanged(positionOffset); } } ); - mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( this ); - mMogoFragmentManager.init( this, R.id.module_main_id_search_fragment ); - mMogoFragmentManager.registerMainFragmentStackTransactionListener( ( size ) -> { - if ( size == 0 ) { - showLayout(); - } else if ( size == 1 ) { - hideLayout(); - } - } ); mHeader = findViewById( R.id.module_main_id_header_fragment_container ); mCards = findViewById( R.id.module_main_id_cards_container ); mApps = findViewById( R.id.module_main_id_apps_fragment_container ); @@ -217,38 +162,6 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme WindowViewHandler.init( mFloatingLayout ); } - /** - * 卡片展示时长埋点 - * - * @param provider - */ - private void trackLastCardShowEvent( IMogoModuleProvider provider ) { - if ( provider == null ) { - return; - } - Map< String, Object > properties = new HashMap<>(); - properties.put( "appname", provider.getAppName() ); - properties.put( "packagename", provider.getAppPackage() ); - properties.put( "activeTime", System.currentTimeMillis() - mCardStartShowTime ); - properties.put( "type", provider.getModuleName() ); - mAnalytics.track( "Launcher_Card_Show", properties ); - mCardStartShowTime = System.currentTimeMillis(); - } - - /** - * 卡片滑动埋点,WTF - */ - private void trackCardFlipEvent( IMogoModuleProvider provider ) { - if ( provider == null ) { - return; - } - Map< String, Object > properties = new HashMap<>(); - properties.put( "appname", provider.getAppName() ); - properties.put( "packagename", provider.getAppPackage() ); - properties.put( "type", provider.getModuleName() ); - mAnalytics.track( "Launcher_Card_Slide", properties ); - } - // 隐藏布局 private void hideLayout() { mHeader.setVisibility( View.GONE ); @@ -289,10 +202,9 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mMogoModuleHandler.setMapLoadedCallback( () -> { Logger.d( TAG, "map loaded." + Thread.currentThread().getName() ); // 加载地图,触发地图加载完毕回调,在初始化其他卡片模块,保证卡片模块可以正确获取地图相关服务。 - mMogoModuleHandler.loadModules(); loadContainerModules(); - mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_CARD_MODULES, 5_000L ); - mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_HIDE_MAP_COVER_FRAME, 1_000L ); + mMogoModuleHandler.loadModules(); + mPresenter.delayOperations(); // 显示左边遮罩 mLeftShadowFrame.setVisibility( View.VISIBLE ); @@ -308,8 +220,16 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mMogoModuleHandler.loadMapModule( R.id.module_main_id_map_fragment_container ); mMogoCardManager = ( IMogoCardManager ) ARouter.getInstance().build( MogoServicePaths.PATH_CARD_MANAGER ).navigation( this ); - mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( this ); + mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( this ); + mMogoFragmentManager.init( this, R.id.module_main_id_search_fragment ); + mMogoFragmentManager.registerMainFragmentStackTransactionListener( ( size ) -> { + if ( size == 0 ) { + showLayout(); + } else if ( size == 1 ) { + hideLayout(); + } + } ); Log.i("timer", "cost " + (System.currentTimeMillis() - start) + "ms"); } @@ -325,17 +245,29 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme mMogoModuleHandler.loadEntrancesModule( R.id.module_main_id_entrance_fragment_container ); } - private void loadCardModules() { + @Override + public void postPickFirstCardEvent() { + if ( mOnPageChangeListener != null ) { + // 默认触发第一个卡片 + mOnPageChangeListener.onPageSelected( 0 ); + } + } + + @Override + public void hideCoverUpLayout() { + mCoverUpLayout.setVisibility( View.GONE ); + } + + @Override + public void loadCardModules() { List< IMogoModuleProvider > providers = mMogoModuleHandler.loadCardsModule(); mCardModulesAdapter = new CardModulesAdapter( this, providers ); mCardsContainer.setOffscreenPageLimit( providers.size() ); - mCardsContainer.setPageTransformer( true, transformer ); + mCardsContainer.setPageTransformer( true, mTransformer ); mCardsContainer.setAdapter( mCardModulesAdapter ); mCardCoverUpBottomLayout.setVisibility(View.VISIBLE); - - mCardStartShowTime = System.currentTimeMillis(); } @@ -354,7 +286,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme @Override public boolean onMarkerClicked( IMogoMarker marker ) { - switch2( marker.getOwner() ); + switch2Card( marker.getOwner() ); if ( mMogoModuleHandler != null ) { mMogoModuleHandler.onMarkerClicked( marker ); } @@ -362,7 +294,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme } @Override - public void switch2( String cardType ) { + public void switch2Card( String cardType ) { if ( mCardModulesAdapter != null ) { int position = mCardModulesAdapter.getProviderPosition( cardType ); diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java index 0fe4ebc494..697570f560 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainPresenter.java @@ -1,13 +1,23 @@ package com.mogo.module.main; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.Observer; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.Presenter; +import com.mogo.module.main.constants.MainConstants; import com.mogo.module.main.livedata.CardSwitchLiveData; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.analytics.IMogoAnalytics; +import com.mogo.service.module.IMogoModuleProvider; + +import java.util.HashMap; +import java.util.Map; /** * @author congtaowang @@ -17,6 +27,36 @@ import com.mogo.module.main.livedata.CardSwitchLiveData; */ public class MainPresenter extends Presenter< MainView > { + // 埋点接口 + private IMogoAnalytics mAnalytics; + + private long mCardStartShowTime = 0; + + private Handler mMsgHandler = new Handler( Looper.getMainLooper() ) { + @Override + public void handleMessage( Message msg ) { + super.handleMessage( msg ); + switch ( msg.what ) { + case MainConstants.MSG_LOAD_CARD_MODULES: + mView.loadCardModules(); + mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT, 1_000L ); + break; + case MainConstants.MSG_LOAD_INVOKE_FIRST_CARD_PERFORM_EVENT: + mView.postPickFirstCardEvent(); + break; + case MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT: + trackLastCardShowEvent( ( IMogoModuleProvider ) msg.obj ); + break; + case MainConstants.MSG_TRACK_CARD_FLIP_EVENT: + trackCardFlipEvent( ( IMogoModuleProvider ) msg.obj ); + break; + case MainConstants.MSG_HIDE_MAP_COVER_FRAME: + mView.hideCoverUpLayout(); + break; + } + } + }; + public MainPresenter( MainView view ) { super( view ); } @@ -28,9 +68,63 @@ public class MainPresenter extends Presenter< MainView > { if ( TextUtils.isEmpty( to ) ) { return; } - mView.switch2( to ); + mView.switch2Card( to ); } ); + mAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() ); + mCardStartShowTime = System.currentTimeMillis(); } + /** + * 卡片展示时长埋点 + * + * @param provider + */ + public void trackLastCardShowEvent( IMogoModuleProvider provider ) { + if ( provider == null ) { + return; + } + Map< String, Object > properties = new HashMap<>(); + properties.put( "appname", provider.getAppName() ); + properties.put( "packagename", provider.getAppPackage() ); + properties.put( "activeTime", System.currentTimeMillis() - mCardStartShowTime ); + properties.put( "type", provider.getModuleName() ); + mAnalytics.track( "Launcher_Card_Show", properties ); + mCardStartShowTime = System.currentTimeMillis(); + } + /** + * 卡片滑动埋点,WTF + */ + public void trackCardFlipEvent( IMogoModuleProvider provider ) { + if ( provider == null ) { + return; + } + Map< String, Object > properties = new HashMap<>(); + properties.put( "appname", provider.getAppName() ); + properties.put( "packagename", provider.getAppPackage() ); + properties.put( "type", provider.getModuleName() ); + mAnalytics.track( "Launcher_Card_Slide", properties ); + } + + /** + * 延时操作 + */ + public void delayOperations() { + mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_LOAD_CARD_MODULES, 1_000L ); + mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_HIDE_MAP_COVER_FRAME, 1_500L ); + } + + public void postTrackLastCardShowEvent( IMogoModuleProvider provider ) { + Message msg = Message.obtain(); + msg.what = MainConstants.MSG_TRACK_LAST_CARD_DISPLAY_EVENT; + msg.obj = provider; + mMsgHandler.sendMessage( msg ); + } + + public void postTrackCardFlipEvent( IMogoModuleProvider provider ) { + Message msg = Message.obtain(); + msg.what = MainConstants.MSG_TRACK_CARD_FLIP_EVENT; + msg.obj = provider; + mMsgHandler.sendMessage( msg ); + } } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainView.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainView.java index 3803a0e42c..f61fa3cdab 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainView.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/MainView.java @@ -10,5 +10,25 @@ import com.mogo.commons.mvp.IView; */ public interface MainView extends IView { - void switch2( String cardType ); + /** + * 切换卡片 + * + * @param cardType + */ + void switch2Card( String cardType ); + + /** + * 加载卡片 + */ + void loadCardModules(); + + /** + * 触发第一张卡片选中 + */ + void postPickFirstCardEvent(); + + /** + * 隐藏背景 + */ + void hideCoverUpLayout(); } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java index a7b84ea098..b1584092cb 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java @@ -64,172 +64,33 @@ import java.util.List; * 4. 用户交互语音导致地图视图移动,缩放,不触发刷新 */ @Route( path = ServiceConst.PATH_REFRESH_STRATEGY ) -public class MogoServiceProvider implements IMogoModuleProvider, - IMogoMapListener, - IMogoLocationListener, - IMogoNaviListener, - IMogoStatusChangedListener, - IMogoIntentListener { +public class MogoServiceProvider implements IMogoModuleProvider{ private static final String TAG = "MogoRefreshStrategyProvider"; - /** - * 自动刷新策略 - */ - private AutoRefreshStrategy mAutoRefreshStrategy = new AutoRefreshStrategy(); - private MogoLatLng mLastAutoRefreshLocation = null; + @Override + public int getType() { + return ModuleType.TYPE_SERVICE; + } - private IMogoMarkerManager mMarkerManager; - private IMogoMapUIController mUiController; - - /** - * 是否已计算出地图显示状态 - */ - private boolean mIsMapStatusOk = false; - - /** - * 地图显示是横屏还是竖屏:根据地图右上角和左下角坐标计算 - */ - boolean mIsVertical = false; - - private MogoReceiver mAIAssistReceiver; - - /** - * 手动刷新策略 - */ - private CustomRefreshStrategy mCustomRefreshStrategy = new CustomRefreshStrategy(); - private float mLastZoomLevel = 0; - private RefreshModel mRefreshModel; - private long mRefreshRemainingTime = Long.MAX_VALUE; - // 上次手动操作的中心点坐标 - private MogoLatLng mLastCustomRefreshCenterLocation; - - private IMogoMapService mMogoMapService; - private IMogoStatusManager mStatusManager; - private IMogoIntentManager mIntentManager; - - /** - * 地图视图初始化 - */ - private boolean mIsCameraInited = true; - - /** - * 是否针对第一次请求失败的情况(开机请求、地库长时间没网络) - *
- * 说明:第一次地位成功,因为网络问题,导致请求失败,则在其他策略请求之前,尝试10s请求一次。 - */ - private boolean mLoopRequest = false; - - private Handler mHandler = new Handler( Looper.getMainLooper() ) { - @Override - public void handleMessage( @NonNull Message msg ) { - super.handleMessage( msg ); - switch ( msg.what ) { - case ServiceConst.MSG_TYPE_REFRESH_DECREASE: - if ( mStatusManager.isSearchUIShow() || mStatusManager.isADASShow() ) { - stopAutoRefreshStrategy(); - return; - } - mRefreshRemainingTime -= ServiceConst.DECREASE_INTERVAL; - if ( mRefreshRemainingTime == 0 ) { - Logger.d( TAG, "move to center and refresh data." ); - mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false ); - mUiController.recoverLockMode(); - mStatusManager.setUserInteractionStatus( TAG, true, false ); - mUiController.changeZoom( 16.0f ); - notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback ); - } else { - mHandler.sendEmptyMessageDelayed( msg.what, ServiceConst.DECREASE_INTERVAL ); - } - break; - case ServiceConst.MSG_LOOP_REQUEST: - if ( mStatusManager.isSearchUIShow() || mStatusManager.isADASShow() ) { - return; - } - if ( mLoopRequest ) { - Logger.d( TAG, "补偿刷新触发" ); - notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback ); - } - break; - } - } - }; - private Context mContext; - - /** - * 地图视图西南角坐标 - */ - private MogoLatLng mCameraSouthWestPosition; - - /** - * 地图视图东北角坐标 - */ - private MogoLatLng mCameraNorthEastPosition; - - /** - * 手动刷新回调 - */ - private RefreshCallback mCustomRefreshCallback = new RefreshCallback() { - @Override - public void onSuccess() { - mLoopRequest = false; - mRefreshRemainingTimeStatus = false; - // 用户手动操作地图刷新成功后,设置状态为 true,引发延时策略 - mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, true ); - } - - @Override - public void onFail() { - - } - }; - - /** - * 自动刷新回调 - */ - private RefreshCallback mAutoRefreshCallback = new RefreshCallback() { - @Override - public void onSuccess() { - mLoopRequest = false; - Logger.d( TAG, "request Success." ); - invokeAutoRefreshStrategy(); - } - - @Override - public void onFail() { - if ( mLoopRequest ) { - Logger.d( TAG, "onFail and loop" ); - mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_LOOP_REQUEST, ServiceConst.LOOP_INTERVAL ); - } else { - invokeAutoRefreshStrategy(); - } - } - - private void invokeAutoRefreshStrategy() { - if ( mStatusManager.isSearchUIShow() ) { - return; - } - mRefreshRemainingTime = mAutoRefreshStrategy.getInterval(); - mHandler.removeMessages( ServiceConst.MSG_TYPE_REFRESH_DECREASE ); - mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_TYPE_REFRESH_DECREASE, ServiceConst.DECREASE_INTERVAL ); - } - }; - - // 延时状态 - private boolean mRefreshRemainingTimeStatus = false; + @NonNull + @Override + public String getModuleName() { + return ServiceConst.TYPE; + } @Override - public final Fragment createFragment( Context context, Bundle data ) { + public Fragment createFragment( Context context, Bundle data ) { return null; } @Override - public final View createView( Context context ) { + public View createView( Context context ) { return null; } @Override - public final IMogoModuleLifecycle getCardLifecycle() { + public IMogoModuleLifecycle getCardLifecycle() { return null; } @@ -238,11 +99,6 @@ public class MogoServiceProvider implements IMogoModuleProvider, return null; } - @Override - public int getType() { - return ModuleType.TYPE_SERVICE; - } - @Override public IMogoNaviListener getNaviListener() { return null; @@ -253,434 +109,11 @@ public class MogoServiceProvider implements IMogoModuleProvider, return null; } - @NonNull @Override - public String getModuleName() { - return ServiceConst.TYPE; - } - - @Override - public void init( Context context ) { - mContext = context; - mRefreshModel = new RefreshModel( context ); - mMogoMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context ); - mMarkerManager = mMogoMapService.getMarkerManager( context ); - mUiController = mMogoMapService.getMapUIController(); - mStatusManager = ( IMogoStatusManager ) ARouter.getInstance().build( MogoServicePaths.PATH_STATUS_MANAGER ).navigation( context ); - mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, this ); - mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEARCH_UI, this ); - mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.V2X_UI, this ); - - //TODO 初始化地图地图绘制大而全的Marker - MarkerServiceHandler.init( mContext ); - registerAIReceiver( context ); - - IMogoRegisterCenter registerCenter = ( IMogoRegisterCenter ) ARouter.getInstance().build( MogoServicePaths.PATH_REGISTER_CENTER ).navigation( context ); - registerCenter.registerMogoLocationListener( getModuleName(), this ); - registerCenter.registerMogoNaviListener( getModuleName(), this ); - registerCenter.registerMogoMapListener( getModuleName(), this ); - - mIntentManager = ( IMogoIntentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_INTENT_MANAGER ).navigation( context ); - mIntentManager.registerIntentListener( MogoReceiver.ACTIION_ADAS, this ); - mIntentManager.registerIntentListener( Intent.ACTION_POWER_CONNECTED, this ); - mIntentManager.registerIntentListener( Intent.ACTION_POWER_DISCONNECTED, this ); - mIntentManager.registerIntentListener( MogoReceiver.ACTION_NWD_ACC, this ); - mIntentManager.registerIntentListener( MogoReceiver.ACTION_VOICE_UI, this ); - } - - private void registerAIReceiver( Context context ) { - if ( context == null ) { - return; - } - List< MogoModule > modules = MogoModulePaths.getModules(); - if ( modules.isEmpty() || modules == null ) { - return; - } - mAIAssistReceiver = new MogoReceiver( context ); - IntentFilter filter = new IntentFilter(); - if ( modules != null && !modules.isEmpty() ) { - for ( MogoModule module : modules ) { - if ( TextUtils.isEmpty( module.getBroadcastAction() ) ) { - continue; - } - filter.addAction( module.getBroadcastAction() ); - } - } - filter.addAction( MogoReceiver.VOICE_ACTION ); - filter.addAction( MogoReceiver.ACTIION_ADAS ); - filter.addAction( MogoReceiver.ACTION_NWD_ACC ); - // acc On - filter.addAction( Intent.ACTION_POWER_CONNECTED ); - filter.addAction( Intent.ACTION_POWER_DISCONNECTED ); - // 小智语音 - filter.addAction( MogoReceiver.ACTION_VOICE_UI ); - try { - context.getApplicationContext().registerReceiver( mAIAssistReceiver, filter ); - Logger.i( TAG, "register voice receiver." ); - } catch ( Exception e ) { - Logger.e( TAG, e, "error. " ); - } - } - - @Override - public void onMapLoaded() { - refreshCameraPosition(); - } - - private void initMapStatus() { - if ( mIsMapStatusOk ) { - return; - } - try { - float width = getMapCameraFactWidth(); - float height = getMapCameraFactHeight(); - mIsVertical = width < height; - Logger.i( TAG, "map status is vertical : " + mIsVertical ); - mIsMapStatusOk = true; - } catch ( Exception e ) { - e.printStackTrace(); - } - } - - /** - * 地图视图对应的实际宽度 - * - * @return - */ - private float getMapCameraFactWidth() { - try { - return Utils.calculateLineDistance( mCameraNorthEastPosition, new MogoLatLng( mCameraNorthEastPosition.lat, mCameraSouthWestPosition.lng ) ); - } catch ( Exception e ) { - return 1000f; - } - } - - /** - * 地图视图对应的实际高度 - * - * @return - */ - private float getMapCameraFactHeight() { - try { - return Utils.calculateLineDistance( mCameraSouthWestPosition, new MogoLatLng( mCameraNorthEastPosition.lat, mCameraSouthWestPosition.lng ) ); - } catch ( Exception e ) { - return 1000f; - } - } - - /** - * 刷新视图范围坐标 - */ - private void refreshCameraPosition() { - mCameraSouthWestPosition = mUiController.getCameraSouthWestPosition(); - mCameraNorthEastPosition = mUiController.getCameraNorthEastPosition(); - - initMapStatus(); - - if ( mIsVertical ) { - float width = getMapCameraFactWidth(); - Logger.i( TAG, "current zoom level width: %f m", width ); - } else { - float height = getMapCameraFactHeight(); - Logger.i( TAG, "current zoom level height: %f m", height ); - } - } - - @Override - public void onTouch( MotionEvent motionEvent ) { - switch ( motionEvent.getActionMasked() ) { - case MotionEvent.ACTION_DOWN: - if ( mLastZoomLevel == 0 ) { - mLastZoomLevel = mUiController.getZoomLevel(); - Logger.i( TAG, "初始化缩放级别 为:%f", mLastZoomLevel ); - } - break; - case MotionEvent.ACTION_UP: - break; - } - } - - private void stopAutoRefreshStrategy() { - Logger.d( TAG, "stop auto refresh strategy" ); - mHandler.removeMessages( ServiceConst.MSG_TYPE_REFRESH_DECREASE ); - } - - @Override - public void onPOIClick( MogoPoi poi ) { - - } - - @Override - public void onMapClick( MogoLatLng latLng ) { - - } - - @Override - public void onLockMap( boolean isLock ) { - - } - - @Override - public void onMapModeChanged( EnumMapUI ui ) { - - } - - @Override - public void onMapChanged( MogoLatLng latLng, float zoom, float tilt, float bearing ) { - - if ( mIsCameraInited ) { - mLastZoomLevel = zoom; - mLastCustomRefreshCenterLocation = latLng; - mIsCameraInited = false; - return; - } - - if ( mLastZoomLevel != zoom || mCameraNorthEastPosition == null ) { - refreshCameraPosition(); - } - - // 部分非用户操作导致地图视图变化:绘线、圈点等不触发用户刷新 - // 消费状态 - if ( mStatusManager.isUserInteracted() ) { - mLastCustomRefreshCenterLocation = latLng; - mLastZoomLevel = zoom; - refreshCameraPosition(); - return; - } - - // v2x // adas 状态下不做任何操作 - if ( mStatusManager.isADASShow() ) { - mLastCustomRefreshCenterLocation = latLng; - mLastZoomLevel = zoom; - refreshCameraPosition(); - return; - } - - // 手动刷新触发 - if ( mLastZoomLevel - zoom > mCustomRefreshStrategy.getZoomOutLevel() ) { - // 缩放级别缩小 - notifyRefreshData( latLng, getQueryRadius(), mCustomRefreshCallback ); - mLastCustomRefreshCenterLocation = latLng; - mLastZoomLevel = zoom; - } else if ( mLastZoomLevel - zoom < 0 ) { - mLastZoomLevel = zoom; - } else if ( mLastZoomLevel == zoom ) { - // 手动平移 - if ( invokeRefreshWhenTranslationByUser( latLng ) ) { - notifyRefreshData( latLng, getQueryRadius(), mCustomRefreshCallback ); - mLastCustomRefreshCenterLocation = latLng; - } - } - } - - private int getQueryRadius() { - if ( mIsVertical ) { - return ( ( int ) ( getMapCameraFactWidth() / 2 ) ); - } - return ( ( int ) ( getMapCameraFactHeight() / 2 ) ); - } - - /** - * 平移地图刷新策略 - * - * @return - */ - private boolean invokeRefreshWhenTranslationByUser( MogoLatLng latLng ) { - try { - float factor = 0.0f; - if ( mIsVertical ) { - factor = getMapCameraFactWidth(); - } else { - factor = getMapCameraFactHeight(); - } - if ( factor == 0.0f ) { - return false; - } - Logger.d( TAG, "invokeRefreshWhenTranslationByUser,mLastCustomRefreshCenterLocation = %s, latLng = %s", mLastCustomRefreshCenterLocation, latLng ); - float distance = Utils.calculateLineDistance( latLng, mLastCustomRefreshCenterLocation ); - return distance > factor; - } catch ( Exception e ) { - Logger.e( TAG, e, "warming. " ); - return false; - } - } - - @Override - public void onLocationChanged( MogoLocation location ) { - - if ( mStatusManager.isADASShow() ) { - return; - } - - if ( mStatusManager.isSearchUIShow() ) { - return; - } - - if ( location == null ) { - return; - } - - // 自动刷新触发 - final MogoLatLng point = new MogoLatLng( location.getLatitude(), location.getLongitude() ); - if ( mLastAutoRefreshLocation == null ) { - mLastAutoRefreshLocation = point; - mLoopRequest = true; - notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback ); - return; - } - float distance = Utils.calculateLineDistance( mLastAutoRefreshLocation, point ); - if ( distance > mAutoRefreshStrategy.getDistance() ) { - mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false ); - mUiController.recoverLockMode(); - mStatusManager.setUserInteractionStatus( TAG, true, false ); - mUiController.changeZoom( 16.0f ); - mLastAutoRefreshLocation = point; - notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback ); - } - } - - /** - * 刷新数据 - */ - private void notifyRefreshData( MogoLatLng latLng, int radius, RefreshCallback callback ) { - if ( mStatusManager.isSearchUIShow() ) { - return; - } - Logger.d( TAG, mAutoRefreshCallback == callback ? "触发自动刷新" : "触发手动刷新" ); - int amount = mLastZoomLevel >= 10 ? 5 : 10; - mRefreshModel.refreshData( latLng, radius, amount, callback ); - Logger.i( TAG, "刷新半径 = %d, 点 = %s, zoomLevel = %f, amount = %d", radius, latLng, mLastZoomLevel, amount ); - } - - @Override - public void onInitNaviFailure() { - - } - - @Override - public void onInitNaviSuccess() { - - } - - @Override - public void onNaviInfoUpdate( MogoNaviInfo naviinfo ) { - } - - @Override - public void onStartNavi() { - } - - @Override - public void onStopNavi() { - } - - @Override - public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) { - Logger.d( TAG, "状态发生改变---descriptor---" + descriptor + "----isTrue---" + isTrue ); - switch ( descriptor ) { - case USER_INTERACTED: - if ( isTrue && !mRefreshRemainingTimeStatus ) { - mRefreshRemainingTimeStatus = true; - mRefreshRemainingTime += mAutoRefreshStrategy.getInterruptInterval(); - Logger.i( TAG, "用户状态改变,自动刷新时间延时,%s ms后自动刷新", mRefreshRemainingTime ); - } - break; - case SEARCH_UI: - if ( isTrue ) { - // 搜索时,不在自动刷新打点策略 - stopAutoRefreshStrategy(); - } else { - // 搜索后,打开打点策略 - if ( mAutoRefreshCallback != null ) { - mAutoRefreshCallback.onSuccess(); - } - } - break; - case V2X_UI: - try { - if ( isTrue ) { - // V2X_UI时,不在自动刷新打点策略 - stopAutoRefreshStrategy(); - // 清除所有的打点信息记录 - MarkerServiceHandler.getMapMarkerManager().alreadySmallMarker.clear(); - } else { - // 主动刷新 - refreshStrategy(); - // V2X_UI后,打开打点策略 - if ( mAutoRefreshCallback != null ) { - mAutoRefreshCallback.onSuccess(); - } - } - } catch ( Exception e ) { - e.printStackTrace(); - } - break; - } - } - - public void refreshStrategy() { - Logger.d( TAG, "move to center and refresh data." ); - mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false ); - mUiController.recoverLockMode();// 锁车代替移到中心点 - notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback ); - } - - @Override - public void onCalculateSuccess() { - - } - - @Override - public void onoCalculateFailed() { - - } - - @Override - public void onUpdateTraffic( MogoTraffic traffic ) { - if ( traffic != null ) { - - Logger.i( TAG, "speed = %d, desc = %s", traffic.getSpeedLimit(), traffic.getDesc() ); - // 发送当前限速到 adas - Intent intent = new Intent( "com.mogo.launcher.adas" ); - intent.putExtra( "adas_speed_limit", traffic.getSpeedLimit() ); - mContext.sendBroadcast( intent ); - } - } - public IMogoMarkerClickListener getMarkerClickListener() { return null; } - @Override - public void onIntentReceived( String command, Intent intent ) { - if ( MogoReceiver.ACTIION_ADAS.equals( command ) ) { - if ( intent == null ) { - return; - } - int status = intent.getIntExtra( MogoReceiver.PARAM_ADAS_STATUS, 0 ); - if (status == 1 ){ - MarkerServiceHandler.getMapUIController().setLockZoom(15); - }else{ - MarkerServiceHandler.getMapUIController().setLockZoom(16); - } - mStatusManager.setADASUIShow( getModuleName(), status == 1 ); - } else if ( Intent.ACTION_POWER_CONNECTED.equals( command ) ) { - mStatusManager.setAccStatus( getModuleName(), true ); - } else if ( Intent.ACTION_POWER_DISCONNECTED.equals( command ) ) { - mStatusManager.setAccStatus( getModuleName(), false ); - } else if ( MogoReceiver.ACTION_NWD_ACC.equals( command ) ) { - int state = intent.getByteExtra( MogoReceiver.PARAM_ACC_STATUS, ( byte ) 0 ); - mStatusManager.setAccStatus( getModuleName(), state == 1 ); - } else if ( MogoReceiver.ACTION_VOICE_UI.equals( command ) ) { - String val = intent.getStringExtra( MogoReceiver.PARRAM_WAKE_STATUS ); - if ( TextUtils.equals( val, MogoReceiver.VALUE_DISMISS ) ) { - mStatusManager.setVoiceUIShow( TAG, false ); - } else if ( TextUtils.equals( val, MogoReceiver.VALUE_SHOW ) ) { - mStatusManager.setVoiceUIShow( TAG, true ); - } - } - } - @Override public String getAppPackage() { return null; @@ -690,4 +123,9 @@ public class MogoServiceProvider implements IMogoModuleProvider, public String getAppName() { return null; } + + @Override + public void init( Context context ) { + MogoServices.getInstance().init( context ); + } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java new file mode 100644 index 0000000000..8ce7bd82cd --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -0,0 +1,647 @@ +package com.mogo.module.service; + + +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.TextUtils; +import android.view.MotionEvent; + +import androidx.annotation.NonNull; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.map.MogoLatLng; +import com.mogo.map.listener.IMogoMapListener; +import com.mogo.map.location.IMogoLocationListener; +import com.mogo.map.location.MogoLocation; +import com.mogo.map.marker.IMogoMarkerClickListener; +import com.mogo.map.marker.IMogoMarkerManager; +import com.mogo.map.model.MogoPoi; +import com.mogo.map.navi.IMogoNaviListener; +import com.mogo.map.navi.MogoNaviInfo; +import com.mogo.map.navi.MogoTraffic; +import com.mogo.map.uicontroller.EnumMapUI; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.module.common.MogoModule; +import com.mogo.module.common.MogoModulePaths; +import com.mogo.module.service.network.RefreshCallback; +import com.mogo.module.service.network.RefreshModel; +import com.mogo.module.service.receiver.MogoReceiver; +import com.mogo.module.service.refresh.AutoRefreshStrategy; +import com.mogo.module.service.refresh.CustomRefreshStrategy; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.intent.IMogoIntentListener; +import com.mogo.service.intent.IMogoIntentManager; +import com.mogo.service.map.IMogoMapService; +import com.mogo.service.module.IMogoRegisterCenter; +import com.mogo.service.statusmanager.IMogoStatusChangedListener; +import com.mogo.service.statusmanager.IMogoStatusManager; +import com.mogo.service.statusmanager.StatusDescriptor; +import com.mogo.utils.logger.Logger; + +import java.util.List; + +/** + * @author congtaowang + * @since 2020-01-03 + *
+ * 数据刷新策略 + *
+ * 1. 位置移动触发刷新 + * 2. 用户手势交互导致地图视图移动跨过当前视图,延时 1 分钟,不累加 + * 3. 用户手势缩小比例尺级别达2级,延时 1 分钟,不累加 + * 4. 用户交互语音导致地图视图移动,缩放,不触发刷新 + */ +public class MogoServices implements IMogoMapListener, + IMogoLocationListener, + IMogoNaviListener, + IMogoStatusChangedListener, + IMogoIntentListener { + + private MogoServices(){ + // private constructor + } + + private static final class InstanceHolder{ + private static final MogoServices INSTANCE = new MogoServices(); + } + + public static MogoServices getInstance(){ + return InstanceHolder.INSTANCE; + } + + private Object readResolve(){ + // 阻止反序列化,必须实现 Serializable 接口 + return InstanceHolder.INSTANCE; + } + + private static final String TAG = "MogoServices"; + + /** + * 自动刷新策略 + */ + private AutoRefreshStrategy mAutoRefreshStrategy = new AutoRefreshStrategy(); + private MogoLatLng mLastAutoRefreshLocation = null; + + private IMogoMapUIController mUiController; + + /** + * 是否已计算出地图显示状态 + */ + private boolean mIsMapStatusOk = false; + + /** + * 地图显示是横屏还是竖屏:根据地图右上角和左下角坐标计算 + */ + private boolean mIsVertical = false; + + private MogoReceiver mAIAssistReceiver; + + /** + * 手动刷新策略 + */ + private CustomRefreshStrategy mCustomRefreshStrategy = new CustomRefreshStrategy(); + private float mLastZoomLevel = 0; + private RefreshModel mRefreshModel; + private long mRefreshRemainingTime = Long.MAX_VALUE; + // 上次手动操作的中心点坐标 + private MogoLatLng mLastCustomRefreshCenterLocation; + + private IMogoMapService mMogoMapService; + private IMogoStatusManager mStatusManager; + private IMogoIntentManager mIntentManager; + + /** + * 地图视图初始化 + */ + private boolean mIsCameraInited = true; + + /** + * 是否针对第一次请求失败的情况(开机请求、地库长时间没网络) + *
+ * 说明:第一次地位成功,因为网络问题,导致请求失败,则在其他策略请求之前,尝试10s请求一次。
+ */
+ private boolean mLoopRequest = false;
+
+ private Handler mHandler = new Handler( Looper.getMainLooper() ) {
+ @Override
+ public void handleMessage( @NonNull Message msg ) {
+ super.handleMessage( msg );
+ switch ( msg.what ) {
+ case ServiceConst.MSG_TYPE_REFRESH_DECREASE:
+ if ( mStatusManager.isSearchUIShow() || mStatusManager.isADASShow() ) {
+ stopAutoRefreshStrategy();
+ return;
+ }
+ mRefreshRemainingTime -= ServiceConst.DECREASE_INTERVAL;
+ if ( mRefreshRemainingTime == 0 ) {
+ Logger.d( TAG, "move to center and refresh data." );
+ mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false );
+ mUiController.recoverLockMode();
+ mStatusManager.setUserInteractionStatus( TAG, true, false );
+ mUiController.changeZoom( 16.0f );
+ notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
+ } else {
+ mHandler.sendEmptyMessageDelayed( msg.what, ServiceConst.DECREASE_INTERVAL );
+ }
+ break;
+ case ServiceConst.MSG_LOOP_REQUEST:
+ if ( mStatusManager.isSearchUIShow() || mStatusManager.isADASShow() ) {
+ return;
+ }
+ if ( mLoopRequest ) {
+ Logger.d( TAG, "补偿刷新触发" );
+ notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
+ }
+ break;
+ }
+ }
+ };
+ private Context mContext;
+
+ /**
+ * 地图视图西南角坐标
+ */
+ private MogoLatLng mCameraSouthWestPosition;
+
+ /**
+ * 地图视图东北角坐标
+ */
+ private MogoLatLng mCameraNorthEastPosition;
+
+ /**
+ * 手动刷新回调
+ */
+ private RefreshCallback mCustomRefreshCallback = new RefreshCallback() {
+ @Override
+ public void onSuccess() {
+ mLoopRequest = false;
+ mRefreshRemainingTimeStatus = false;
+ // 用户手动操作地图刷新成功后,设置状态为 true,引发延时策略
+ mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, true );
+ }
+
+ @Override
+ public void onFail() {
+
+ }
+ };
+
+ /**
+ * 自动刷新回调
+ */
+ private RefreshCallback mAutoRefreshCallback = new RefreshCallback() {
+ @Override
+ public void onSuccess() {
+ mLoopRequest = false;
+ Logger.d( TAG, "request Success." );
+ invokeAutoRefreshStrategy();
+ }
+
+ @Override
+ public void onFail() {
+ if ( mLoopRequest ) {
+ Logger.d( TAG, "onFail and loop" );
+ mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_LOOP_REQUEST, ServiceConst.LOOP_INTERVAL );
+ } else {
+ invokeAutoRefreshStrategy();
+ }
+ }
+
+ private void invokeAutoRefreshStrategy() {
+ if ( mStatusManager.isSearchUIShow() ) {
+ return;
+ }
+ mRefreshRemainingTime = mAutoRefreshStrategy.getInterval();
+ mHandler.removeMessages( ServiceConst.MSG_TYPE_REFRESH_DECREASE );
+ mHandler.sendEmptyMessageDelayed( ServiceConst.MSG_TYPE_REFRESH_DECREASE, ServiceConst.DECREASE_INTERVAL );
+ }
+ };
+
+ // 延时状态
+ private boolean mRefreshRemainingTimeStatus = false;
+
+ public void init( Context context ) {
+ mContext = context;
+ mRefreshModel = new RefreshModel( context );
+ mMogoMapService = ( IMogoMapService ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_MAP ).navigation( context );
+ mUiController = mMogoMapService.getMapUIController();
+ mStatusManager = ( IMogoStatusManager ) ARouter.getInstance().build( MogoServicePaths.PATH_STATUS_MANAGER ).navigation( context );
+ mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.USER_INTERACTED, this );
+ mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.SEARCH_UI, this );
+ mStatusManager.registerStatusChangedListener( ServiceConst.TYPE, StatusDescriptor.V2X_UI, this );
+
+ //TODO 初始化地图地图绘制大而全的Marker
+ MarkerServiceHandler.init( mContext );
+ registerAIReceiver( context );
+
+ IMogoRegisterCenter registerCenter = ( IMogoRegisterCenter ) ARouter.getInstance().build( MogoServicePaths.PATH_REGISTER_CENTER ).navigation( context );
+ registerCenter.registerMogoLocationListener( ServiceConst.TYPE, this );
+ registerCenter.registerMogoNaviListener( ServiceConst.TYPE, this );
+ registerCenter.registerMogoMapListener( ServiceConst.TYPE, this );
+
+ mIntentManager = ( IMogoIntentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_INTENT_MANAGER ).navigation( context );
+ mIntentManager.registerIntentListener( MogoReceiver.ACTIION_ADAS, this );
+ mIntentManager.registerIntentListener( Intent.ACTION_POWER_CONNECTED, this );
+ mIntentManager.registerIntentListener( Intent.ACTION_POWER_DISCONNECTED, this );
+ mIntentManager.registerIntentListener( MogoReceiver.ACTION_NWD_ACC, this );
+ mIntentManager.registerIntentListener( MogoReceiver.ACTION_VOICE_UI, this );
+ }
+
+ private void registerAIReceiver( Context context ) {
+ if ( context == null ) {
+ return;
+ }
+ List< MogoModule > modules = MogoModulePaths.getModules();
+ if ( modules.isEmpty() || modules == null ) {
+ return;
+ }
+ mAIAssistReceiver = new MogoReceiver( context );
+ IntentFilter filter = new IntentFilter();
+ if ( modules != null && !modules.isEmpty() ) {
+ for ( MogoModule module : modules ) {
+ if ( TextUtils.isEmpty( module.getBroadcastAction() ) ) {
+ continue;
+ }
+ filter.addAction( module.getBroadcastAction() );
+ }
+ }
+ filter.addAction( MogoReceiver.VOICE_ACTION );
+ filter.addAction( MogoReceiver.ACTIION_ADAS );
+ filter.addAction( MogoReceiver.ACTION_NWD_ACC );
+ // acc On
+ filter.addAction( Intent.ACTION_POWER_CONNECTED );
+ filter.addAction( Intent.ACTION_POWER_DISCONNECTED );
+ // 小智语音
+ filter.addAction( MogoReceiver.ACTION_VOICE_UI );
+ try {
+ context.getApplicationContext().registerReceiver( mAIAssistReceiver, filter );
+ Logger.i( TAG, "register voice receiver." );
+ } catch ( Exception e ) {
+ Logger.e( TAG, e, "error. " );
+ }
+ }
+
+ @Override
+ public void onMapLoaded() {
+ refreshCameraPosition();
+ }
+
+ private void initMapStatus() {
+ if ( mIsMapStatusOk ) {
+ return;
+ }
+ try {
+ float width = getMapCameraFactWidth();
+ float height = getMapCameraFactHeight();
+ mIsVertical = width < height;
+ Logger.i( TAG, "map status is vertical : " + mIsVertical );
+ mIsMapStatusOk = true;
+ } catch ( Exception e ) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 地图视图对应的实际宽度
+ *
+ * @return
+ */
+ private float getMapCameraFactWidth() {
+ try {
+ return Utils.calculateLineDistance( mCameraNorthEastPosition, new MogoLatLng( mCameraNorthEastPosition.lat, mCameraSouthWestPosition.lng ) );
+ } catch ( Exception e ) {
+ return 1000f;
+ }
+ }
+
+ /**
+ * 地图视图对应的实际高度
+ *
+ * @return
+ */
+ private float getMapCameraFactHeight() {
+ try {
+ return Utils.calculateLineDistance( mCameraSouthWestPosition, new MogoLatLng( mCameraNorthEastPosition.lat, mCameraSouthWestPosition.lng ) );
+ } catch ( Exception e ) {
+ return 1000f;
+ }
+ }
+
+ /**
+ * 刷新视图范围坐标
+ */
+ private void refreshCameraPosition() {
+ mCameraSouthWestPosition = mUiController.getCameraSouthWestPosition();
+ mCameraNorthEastPosition = mUiController.getCameraNorthEastPosition();
+
+ initMapStatus();
+
+ if ( mIsVertical ) {
+ float width = getMapCameraFactWidth();
+ Logger.i( TAG, "current zoom level width: %f m", width );
+ } else {
+ float height = getMapCameraFactHeight();
+ Logger.i( TAG, "current zoom level height: %f m", height );
+ }
+ }
+
+ @Override
+ public void onTouch( MotionEvent motionEvent ) {
+ switch ( motionEvent.getActionMasked() ) {
+ case MotionEvent.ACTION_DOWN:
+ if ( mLastZoomLevel == 0 ) {
+ mLastZoomLevel = mUiController.getZoomLevel();
+ Logger.i( TAG, "初始化缩放级别 为:%f", mLastZoomLevel );
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ break;
+ }
+ }
+
+ private void stopAutoRefreshStrategy() {
+ Logger.d( TAG, "stop auto refresh strategy" );
+ mHandler.removeMessages( ServiceConst.MSG_TYPE_REFRESH_DECREASE );
+ }
+
+ @Override
+ public void onPOIClick( MogoPoi poi ) {
+
+ }
+
+ @Override
+ public void onMapClick( MogoLatLng latLng ) {
+
+ }
+
+ @Override
+ public void onLockMap( boolean isLock ) {
+
+ }
+
+ @Override
+ public void onMapModeChanged( EnumMapUI ui ) {
+
+ }
+
+ @Override
+ public void onMapChanged( MogoLatLng latLng, float zoom, float tilt, float bearing ) {
+
+ if ( mIsCameraInited ) {
+ mLastZoomLevel = zoom;
+ mLastCustomRefreshCenterLocation = latLng;
+ mIsCameraInited = false;
+ return;
+ }
+
+ if ( mLastZoomLevel != zoom || mCameraNorthEastPosition == null ) {
+ refreshCameraPosition();
+ }
+
+ // 部分非用户操作导致地图视图变化:绘线、圈点等不触发用户刷新
+ // 消费状态
+ if ( mStatusManager.isUserInteracted() ) {
+ mLastCustomRefreshCenterLocation = latLng;
+ mLastZoomLevel = zoom;
+ refreshCameraPosition();
+ return;
+ }
+
+ // v2x // adas 状态下不做任何操作
+ if ( mStatusManager.isADASShow() ) {
+ mLastCustomRefreshCenterLocation = latLng;
+ mLastZoomLevel = zoom;
+ refreshCameraPosition();
+ return;
+ }
+
+ // 手动刷新触发
+ if ( mLastZoomLevel - zoom > mCustomRefreshStrategy.getZoomOutLevel() ) {
+ // 缩放级别缩小
+ notifyRefreshData( latLng, getQueryRadius(), mCustomRefreshCallback );
+ mLastCustomRefreshCenterLocation = latLng;
+ mLastZoomLevel = zoom;
+ } else if ( mLastZoomLevel - zoom < 0 ) {
+ mLastZoomLevel = zoom;
+ } else if ( mLastZoomLevel == zoom ) {
+ // 手动平移
+ if ( invokeRefreshWhenTranslationByUser( latLng ) ) {
+ notifyRefreshData( latLng, getQueryRadius(), mCustomRefreshCallback );
+ mLastCustomRefreshCenterLocation = latLng;
+ }
+ }
+ }
+
+ private int getQueryRadius() {
+ if ( mIsVertical ) {
+ return ( ( int ) ( getMapCameraFactWidth() / 2 ) );
+ }
+ return ( ( int ) ( getMapCameraFactHeight() / 2 ) );
+ }
+
+ /**
+ * 平移地图刷新策略
+ *
+ * @return
+ */
+ private boolean invokeRefreshWhenTranslationByUser( MogoLatLng latLng ) {
+ try {
+ float factor = 0.0f;
+ if ( mIsVertical ) {
+ factor = getMapCameraFactWidth();
+ } else {
+ factor = getMapCameraFactHeight();
+ }
+ if ( factor == 0.0f ) {
+ return false;
+ }
+ Logger.d( TAG, "invokeRefreshWhenTranslationByUser,mLastCustomRefreshCenterLocation = %s, latLng = %s", mLastCustomRefreshCenterLocation, latLng );
+ float distance = Utils.calculateLineDistance( latLng, mLastCustomRefreshCenterLocation );
+ return distance > factor;
+ } catch ( Exception e ) {
+ Logger.e( TAG, e, "warming. " );
+ return false;
+ }
+ }
+
+ @Override
+ public void onLocationChanged( MogoLocation location ) {
+
+ if ( mStatusManager.isADASShow() ) {
+ return;
+ }
+
+ if ( mStatusManager.isSearchUIShow() ) {
+ return;
+ }
+
+ if ( location == null ) {
+ return;
+ }
+
+ // 自动刷新触发
+ final MogoLatLng point = new MogoLatLng( location.getLatitude(), location.getLongitude() );
+ if ( mLastAutoRefreshLocation == null ) {
+ mLastAutoRefreshLocation = point;
+ mLoopRequest = true;
+ notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
+ return;
+ }
+ float distance = Utils.calculateLineDistance( mLastAutoRefreshLocation, point );
+ if ( distance > mAutoRefreshStrategy.getDistance() ) {
+ mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false );
+ mUiController.recoverLockMode();
+ mStatusManager.setUserInteractionStatus( TAG, true, false );
+ mUiController.changeZoom( 16.0f );
+ mLastAutoRefreshLocation = point;
+ notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
+ }
+ }
+
+ /**
+ * 刷新数据
+ */
+ private void notifyRefreshData( MogoLatLng latLng, int radius, RefreshCallback callback ) {
+ if ( mStatusManager.isSearchUIShow() ) {
+ return;
+ }
+ Logger.d( TAG, mAutoRefreshCallback == callback ? "触发自动刷新" : "触发手动刷新" );
+ int amount = mLastZoomLevel >= 10 ? 5 : 10;
+ mRefreshModel.refreshData( latLng, radius, amount, callback );
+ Logger.i( TAG, "刷新半径 = %d, 点 = %s, zoomLevel = %f, amount = %d", radius, latLng, mLastZoomLevel, amount );
+ }
+
+ @Override
+ public void onInitNaviFailure() {
+
+ }
+
+ @Override
+ public void onInitNaviSuccess() {
+
+ }
+
+ @Override
+ public void onNaviInfoUpdate( MogoNaviInfo naviinfo ) {
+ }
+
+ @Override
+ public void onStartNavi() {
+ }
+
+ @Override
+ public void onStopNavi() {
+ }
+
+ @Override
+ public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) {
+ Logger.d( TAG, "状态发生改变---descriptor---" + descriptor + "----isTrue---" + isTrue );
+ switch ( descriptor ) {
+ case USER_INTERACTED:
+ if ( isTrue && !mRefreshRemainingTimeStatus ) {
+ mRefreshRemainingTimeStatus = true;
+ mRefreshRemainingTime += mAutoRefreshStrategy.getInterruptInterval();
+ Logger.i( TAG, "用户状态改变,自动刷新时间延时,%s ms后自动刷新", mRefreshRemainingTime );
+ }
+ break;
+ case SEARCH_UI:
+ if ( isTrue ) {
+ // 搜索时,不在自动刷新打点策略
+ stopAutoRefreshStrategy();
+ } else {
+ // 搜索后,打开打点策略
+ if ( mAutoRefreshCallback != null ) {
+ mAutoRefreshCallback.onSuccess();
+ }
+ }
+ break;
+ case V2X_UI:
+ try {
+ if ( isTrue ) {
+ // V2X_UI时,不在自动刷新打点策略
+ stopAutoRefreshStrategy();
+ // 清除所有的打点信息记录
+ MarkerServiceHandler.getMapMarkerManager().alreadySmallMarker.clear();
+ } else {
+ // 主动刷新
+ refreshStrategy();
+ // V2X_UI后,打开打点策略
+ if ( mAutoRefreshCallback != null ) {
+ mAutoRefreshCallback.onSuccess();
+ }
+ }
+ } catch ( Exception e ) {
+ e.printStackTrace();
+ }
+ break;
+ }
+ }
+
+ public void refreshStrategy() {
+ Logger.d( TAG, "move to center and refresh data." );
+ mStatusManager.setUserInteractionStatus( ServiceConst.TYPE, true, false );
+ mUiController.recoverLockMode();// 锁车代替移到中心点
+ notifyRefreshData( mLastAutoRefreshLocation, getQueryRadius(), mAutoRefreshCallback );
+ }
+
+ @Override
+ public void onCalculateSuccess() {
+
+ }
+
+ @Override
+ public void onoCalculateFailed() {
+
+ }
+
+ @Override
+ public void onUpdateTraffic( MogoTraffic traffic ) {
+ if ( traffic != null ) {
+
+ Logger.i( TAG, "speed = %d, desc = %s", traffic.getSpeedLimit(), traffic.getDesc() );
+ // 发送当前限速到 adas
+ Intent intent = new Intent( "com.mogo.launcher.adas" );
+ intent.putExtra( "adas_speed_limit", traffic.getSpeedLimit() );
+ mContext.sendBroadcast( intent );
+ }
+ }
+
+ public IMogoMarkerClickListener getMarkerClickListener() {
+ return null;
+ }
+
+ @Override
+ public void onIntentReceived( String command, Intent intent ) {
+ if ( MogoReceiver.ACTIION_ADAS.equals( command ) ) {
+ if ( intent == null ) {
+ return;
+ }
+ int status = intent.getIntExtra( MogoReceiver.PARAM_ADAS_STATUS, 0 );
+ if (status == 1 ){
+ MarkerServiceHandler.getMapUIController().setLockZoom(15);
+ }else{
+ MarkerServiceHandler.getMapUIController().setLockZoom(16);
+ }
+ mStatusManager.setADASUIShow( ServiceConst.TYPE, status == 1 );
+ } else if ( Intent.ACTION_POWER_CONNECTED.equals( command ) ) {
+ mStatusManager.setAccStatus( ServiceConst.TYPE, true );
+ } else if ( Intent.ACTION_POWER_DISCONNECTED.equals( command ) ) {
+ mStatusManager.setAccStatus( ServiceConst.TYPE, false );
+ } else if ( MogoReceiver.ACTION_NWD_ACC.equals( command ) ) {
+ int state = intent.getByteExtra( MogoReceiver.PARAM_ACC_STATUS, ( byte ) 0 );
+ mStatusManager.setAccStatus( ServiceConst.TYPE, state == 1 );
+ } else if ( MogoReceiver.ACTION_VOICE_UI.equals( command ) ) {
+ String val = intent.getStringExtra( MogoReceiver.PARRAM_WAKE_STATUS );
+ if ( TextUtils.equals( val, MogoReceiver.VALUE_DISMISS ) ) {
+ mStatusManager.setVoiceUIShow( TAG, false );
+ } else if ( TextUtils.equals( val, MogoReceiver.VALUE_SHOW ) ) {
+ mStatusManager.setVoiceUIShow( TAG, true );
+ }
+ }
+ }
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java
index e1d7ab2be7..3704378e9c 100644
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java
@@ -25,12 +25,14 @@ import com.mogo.module.common.entity.MarkerShareMusic;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.MogoServiceProvider;
+import com.mogo.module.service.MogoServices;
import com.mogo.module.service.ServiceConst;
import com.mogo.module.service.Utils;
import com.mogo.module.service.datamanager.MogoDataHandler;
import com.mogo.module.service.utils.ViewUtils;
import com.mogo.service.cardmanager.IMogoCardChangedListener;
import com.mogo.service.connection.IMogoOnMessageListener;
+import com.mogo.utils.ThreadPoolService;
import com.mogo.utils.logger.Logger;
import org.json.JSONArray;
@@ -102,9 +104,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, IMogoOnMessag
mLastHighLightModule = moduleName;
if (!isACC_ON) {
isACC_ON = true;
- MogoServiceProvider mMogoServiceProvider = (MogoServiceProvider) ARouter.getInstance().build(ServiceConst.PATH_REFRESH_STRATEGY).navigation();
- // 刷新 Marker
- mMogoServiceProvider.refreshStrategy();
+ MogoServices.getInstance().refreshStrategy();
}
}
});
@@ -587,13 +587,12 @@ public class MapMarkerManager implements IMogoMarkerClickListener, IMogoOnMessag
public void onMsgReceived(final MarkerResponse response) {
Logger.d(TAG, "接收到了地图大而全数据");
if (!MarkerServiceHandler.getMogoStatusManager().isSearchUIShow() && isACC_ON) {
- Handler handler = new Handler(Looper.getMainLooper());
- handler.post(new Runnable() {
+ ThreadPoolService.execute( new Runnable() {
@Override
public void run() {
drawMapMarker(response);
}
- });
+ } );
}
}
}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java
index 9d0431d568..caffd2596e 100644
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/network/RefreshModel.java
@@ -56,7 +56,7 @@ public class RefreshModel {
if (mRefreshApiService != null) {
final Map