From df1e3086849c139a1d044bab9c738424049467d8 Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 15 Apr 2020 16:25:25 +0800 Subject: [PATCH 1/2] opt --- .../map/impl/amap/AMapNaviViewWrapper.java | 5 +- .../mogo/map/impl/amap/navi/NaviClient.java | 53 ++- .../impl/amap/navi/NaviListenerAdapter.java | 8 +- .../map/impl/amap/navi/NaviOverlayHelper.java | 29 +- .../amap/uicontroller/AMapUIController.java | 4 +- .../java/com/mogo/map/navi/IMogoNavi.java | 9 +- .../uicontroller/IMogoMapUIController.java | 4 +- .../com/mogo/map/MogoMapUIController.java | 4 +- .../src/main/java/com/mogo/map/MogoNavi.java | 11 +- .../extensions/entrance/EntranceFragment.java | 39 ++- .../entrance/EntrancePresenter.java | 319 +++++++++-------- .../extensions/entrance/EntranceView.java | 4 + .../com/mogo/module/main/MainActivity.java | 4 +- ...wHandler.java => FloatingViewHandler.java} | 104 +++--- .../main/windowview/MogoWindowManager.java | 34 +- .../com/mogo/module/map/MapPresenter.java | 47 ++- .../src/main/res/values-ldpi/dimens.xml | 14 +- .../src/main/res/values-xhdpi/dimens.xml | 14 +- .../src/main/res/values/dimens.xml | 14 +- .../mogo/module/navi/manager/NaviManager.kt | 2 - .../module/navi/manager/SettingManager.kt | 329 +++++++++--------- .../navi/ui/setting/NaviSettingFragment.kt | 25 +- .../main/res/layout/fragment_navi_setting.xml | 43 ++- .../res/layout/fragment_search_category.xml | 3 +- .../src/main/res/values/strings.xml | 3 + .../com/mogo/module/service/MogoServices.java | 9 +- .../com/mogo/module/service/ServiceConst.java | 2 +- .../service/marker/MapMarkerManager.java | 37 +- .../statusmanager/IMogoStatusManager.java | 19 +- .../statusmanager/StatusDescriptor.java | 7 +- .../windowview/IMogoWindowManager.java | 20 +- .../impl/statusmanager/MogoStatusManager.java | 12 + 32 files changed, 749 insertions(+), 482 deletions(-) rename modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/{WindowViewHandler.java => FloatingViewHandler.java} (50%) diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 99ccd4db65..582be511b8 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -601,11 +601,11 @@ public class AMapNaviViewWrapper implements IMogoMapView, } @Override - public void displayOverview() { + public void displayOverview( Rect bounds ) { if ( checkAMapView() ) { if ( NaviClient.getInstance( getContext() ).isNaviing() ) { loseLockMode(); - NaviClient.getInstance( getContext() ).displayOverview(); + NaviClient.getInstance( getContext() ).displayOverview(bounds); } } } @@ -633,6 +633,7 @@ public class AMapNaviViewWrapper implements IMogoMapView, if ( checkAMapView() ) { mMapView.setCarOverlayVisible( false ); showMyLocation( true ); + NaviClient.getInstance( getContext() ).startAimlessMode(); } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java index 5d6afc5cfe..64d0b14bc9 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviClient.java @@ -11,6 +11,7 @@ import com.amap.api.navi.enums.AimLessMode; import com.amap.api.navi.enums.NaviType; import com.amap.api.navi.model.NaviLatLng; import com.mogo.commons.AbsMogoApplication; +import com.mogo.commons.voice.AIAssist; import com.mogo.map.MogoLatLng; import com.mogo.map.impl.amap.AMapWrapper; import com.mogo.map.impl.amap.message.AMapMessageManager; @@ -22,6 +23,7 @@ import com.mogo.map.navi.MogoNaviConfig; import com.mogo.map.navi.MogoNaviListenerHandler; import com.mogo.map.navi.OnCalculatePathItemClickInteraction; import com.mogo.utils.logger.Logger; +import com.mogo.utils.storage.SharedPrefsMgr; import java.util.ArrayList; import java.util.Arrays; @@ -35,7 +37,13 @@ import java.util.List; */ public class NaviClient implements IMogoNavi { + /** + * 巡航状态控制 + */ + public static final String KEY_AIMLESS_STATUS = "KEY_AIMLESS_STATUS"; + private static final String TAG = "NaviClient"; + private final Context mContext; private AMapNavi mAMapNavi; private final NaviListenerAdapter mAMapNaviListener; @@ -55,16 +63,27 @@ public class NaviClient implements IMogoNavi { private Location mCarLocation; private IMogoCarLocationChangedListener mCarLocationChangedListener; private LocationSource.OnLocationChangedListener mOnLocationChangedListener; + /** + * 巡航模式配置状态 + */ + private boolean mAimlessModeStatus; + + /** + * 巡航状态 + */ + private boolean mAimlessStatus; private NaviClient( Context context ) { + mContext = context; mAMapNavi = AMapNavi.getInstance( context ); mAMapNavi.setEmulatorNaviSpeed( 120 ); - mAMapNavi.setUseInnerVoice( false, true ); + mAMapNavi.setUseInnerVoice( true, true ); mAMapNaviListener = new NaviListenerAdapter( context, mAMapNavi, this ); mAimlessModeListener = new AimlessModeListenerAdapter() { }; mAMapNavi.addAMapNaviListener( mAMapNaviListener ); mAMapNavi.addAimlessModeListener( mAimlessModeListener ); + mAimlessModeStatus = SharedPrefsMgr.getInstance( mContext ).getBoolean( KEY_AIMLESS_STATUS, false ); } public static NaviClient getInstance( Context context ) { @@ -151,7 +170,7 @@ public class NaviClient implements IMogoNavi { return; } mIsRealNavi = isRealNavi; - + stopAimlessMode(); boolean isNaving = isNaviing(); boolean result = mAMapNavi.startNavi( isRealNavi ? NaviType.GPS : NaviType.EMULATOR ); if ( isNaving && !result ) { @@ -274,18 +293,42 @@ public class NaviClient implements IMogoNavi { @Override public void startAimlessMode() { - mAMapNavi.startAimlessMode( AimLessMode.CAMERA_AND_SPECIALROAD_DETECTED ); + if ( mAimlessModeStatus && !isNaviing() ) { + mAMapNavi.startAimlessMode( AimLessMode.CAMERA_AND_SPECIALROAD_DETECTED ); + mAimlessStatus = true; + Logger.d( TAG, "开启巡航成功" ); + } else { + mAimlessStatus = false; + Logger.d( TAG, "开启巡航失败" ); + } } @Override public void stopAimlessMode() { mAMapNavi.stopAimlessMode(); + mAimlessStatus = false; + Logger.d( TAG, "关闭巡航成功" ); } @Override - public void displayOverview() { + public void setAimlessModeStatus( boolean open ) { + this.mAimlessModeStatus = open; + SharedPrefsMgr.getInstance( mContext ).putBoolean( KEY_AIMLESS_STATUS, open ); + if ( open ) { + if ( !mAimlessStatus ) { + startAimlessMode(); + } + } else { + if ( mAimlessStatus ) { + stopAimlessMode(); + } + } + } + + @Override + public void displayOverview( Rect bounds ) { if ( mAMapNaviListener != null ) { - mAMapNaviListener.displayOverview(); + mAMapNaviListener.displayOverview( bounds ); } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java index dfd56d70de..c402fdc0a4 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviListenerAdapter.java @@ -95,6 +95,7 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { @Override public void onInitNaviSuccess() { MogoNaviListenerHandler.getInstance().onInitNaviSuccess(); + NaviClient.getInstance( mContext ).startAimlessMode(); } @Override @@ -245,9 +246,10 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { public void handleClickedPolyline( Polyline polyline ) { if ( mNaviOverlayHelper != null ) { + mNaviOverlayHelper.handleClickedPolyline( polyline, isNaviing() ); mAMapNavi.selectRouteId( mNaviOverlayHelper.getSelectedPathId() ); - mNaviOverlayHelper.showBounds(); + mNaviOverlayHelper.showBoundsWithSettingBounds(); } } @@ -291,9 +293,9 @@ public class NaviListenerAdapter extends AMapNaviListenerAdapter { } } - public void displayOverview(){ + public void displayOverview( Rect bounds ) { if ( mNaviOverlayHelper != null ) { - mNaviOverlayHelper.displayOverview(); + mNaviOverlayHelper.displayOverview( bounds ); } } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java index 19cd0dabfb..9448f2b296 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/navi/NaviOverlayHelper.java @@ -99,7 +99,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { if ( after != null ) { after.run(); } - } ); + }, mBoundRect ); } private LatLngBounds getBounds() { @@ -169,25 +169,32 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { } } - public void showBounds() { + public void showBoundsWithSettingBounds() { + showBounds( mBoundRect ); + } + + public void showBounds( Rect bounds ) { Logger.d( TAG, "showBounds" ); - showPathsBound( getBounds(), null ); + showPathsBound( getBounds(), null, bounds ); } /** * 将规划好的路径显示在视野内 */ - private void showPathsBound( LatLngBounds bounds, Runnable after ) { + private void showPathsBound( LatLngBounds bounds, Runnable after, Rect rect ) { if ( bounds == null ) { return; } + if ( rect == null ) { + rect = new Rect(); + } checkAMapInstance(); mAMap.moveCamera( CameraUpdateFactory.newLatLngBoundsRect( bounds, - mBoundRect.left, - mBoundRect.right, - mBoundRect.top, - mBoundRect.bottom )); + rect.left, + rect.right, + rect.top, + rect.bottom ) ); if ( after != null ) { after.run(); } @@ -431,7 +438,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { public void onItemClicked( String tagId ) { handleClickedPolyline( tagId ); mAMapNavi.selectRouteId( getSelectedPathId() ); - showBounds(); + showBounds( mBoundRect ); } public OnCalculatePathItemClickInteraction getItemClickInteraction() { @@ -451,7 +458,7 @@ public class NaviOverlayHelper implements OnCalculatePathItemClickInteraction { /** * 展示全程 */ - public void displayOverview(){ - showBounds(); + public void displayOverview( Rect bounds ) { + showBounds( bounds ); } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java index 6e395ec1ba..b5f5c7da96 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java @@ -126,9 +126,9 @@ public class AMapUIController implements IMogoMapUIController { } @Override - public void displayOverview() { + public void displayOverview( Rect bounds ) { if (mClient != null) { - mClient.displayOverview(); + mClient.displayOverview(bounds); } } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java index 4a780f8b61..40914d49b0 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/navi/IMogoNavi.java @@ -161,10 +161,17 @@ public interface IMogoNavi { */ void stopAimlessMode(); + /** + * 设置巡航模式状态 + * + * @param open + */ + void setAimlessModeStatus( boolean open ); + /** * 查看全程 */ - void displayOverview(); + void displayOverview( Rect bounds ); /** * 设置使用外部定位源 diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index 053ae1b848..a9dd283213 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -88,8 +88,10 @@ public interface IMogoMapUIController { /** * 预览全程 + * + * @param bounds 显示范围 */ - void displayOverview(); + void displayOverview( Rect bounds ); /** * 获取比例尺数据 diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index e430a33b65..286b7aec12 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -120,9 +120,9 @@ public class MogoMapUIController implements IMogoMapUIController { } @Override - public void displayOverview() { + public void displayOverview( Rect bounds ) { if (mDelegate != null) { - mDelegate.displayOverview(); + mDelegate.displayOverview(bounds); } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java index b3d7c0c75c..2e9ff0a525 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoNavi.java @@ -197,9 +197,16 @@ public class MogoNavi implements IMogoNavi { } @Override - public void displayOverview() { + public void setAimlessModeStatus( boolean open ) { if ( mDelegate != null ) { - mDelegate.displayOverview(); + mDelegate.setAimlessModeStatus( open ); + } + } + + @Override + public void displayOverview( Rect bounds ) { + if ( mDelegate != null ) { + mDelegate.displayOverview(bounds); } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 3cb221d814..1ba191e0cf 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -24,8 +24,6 @@ import com.mogo.map.navi.IMogoNaviListener; import com.mogo.map.navi.MogoCongestionInfo; import com.mogo.map.navi.MogoNaviInfo; import com.mogo.map.navi.MogoTraffic; -import com.mogo.map.overlay.IMogoPolyline; -import com.mogo.map.uicontroller.CarCursorOption; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.authorize.authprovider.invoke.AuthorizeConstant; @@ -47,6 +45,7 @@ import com.mogo.service.map.IMogoMapService; import com.mogo.service.module.IMogoAddressManager; import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.statusmanager.IMogoStatusManager; +import com.mogo.utils.logger.Logger; import java.util.HashMap; import java.util.Map; @@ -303,6 +302,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent @Override public void onStartNavi() { + mSearch.setVisibility( View.GONE ); mCommonAddress.setVisibility( View.GONE ); mNaviInfo.setVisibility( View.VISIBLE ); mCameraMode.setVisibility( View.VISIBLE ); @@ -315,6 +315,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent @Override public void onStopNavi() { + mSearch.setVisibility( View.VISIBLE ); mCommonAddress.setVisibility( View.VISIBLE ); mNaviInfo.setVisibility( View.GONE ); mCameraMode.setVisibility( View.GONE ); @@ -345,7 +346,8 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mSpeedLimit.setVisibility( View.INVISIBLE ); mSpeedLimitValue.setText( "--" ); } else { - mSpeedLimit.setVisibility( View.VISIBLE ); + // 暂时不显示限速,等有好的显示方案在放开 + mSpeedLimit.setVisibility( View.INVISIBLE ); mSpeedLimitValue.setText( String.valueOf( traffic.getSpeedLimit() ) ); } } @@ -380,6 +382,9 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mIsLock = isLock; if ( isLock ) { mExitNavi.setText( R.string.module_ext_str_exit_navi ); + if ( mMogoStatusManager.isDisplayOverview() ) { + mMogoStatusManager.setDisplayOverview( TAG, false ); + } } else { mExitNavi.setText( R.string.module_ext_str_continue_navi ); } @@ -400,4 +405,32 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent properties.put( "from", from ); mAnalytics.track( "Launcher_Share_Click", properties ); } + + @Override + public void showNaviPanelWidgets() { + if ( !mMogoNavi.isNaviing() ) { + return; + } + mNaviInfo.setVisibility( View.VISIBLE ); + mCameraMode.setVisibility( View.VISIBLE ); + try { + mApis.getWindowManagerApi().showAll(); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + } + + @Override + public void hideNaviPanelWidgets() { + if ( !mMogoNavi.isNaviing() ) { + return; + } + mNaviInfo.setVisibility( View.GONE ); + mCameraMode.setVisibility( View.GONE ); + try { + mApis.getWindowManagerApi().hideAll(); + } catch ( Exception e ) { + Logger.e( TAG, e, "error." ); + } + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java index c998dcc7ab..7662f0ac2a 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntrancePresenter.java @@ -6,6 +6,9 @@ import android.net.Uri; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; + import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; @@ -14,10 +17,14 @@ import com.mogo.module.authorize.authprovider.invoke.AuthorizeInvokerConstant; import com.mogo.module.authorize.authprovider.module.IMogoAuthorizeModuleManager; import com.mogo.module.extensions.ExtensionsModuleConst; import com.mogo.module.share.ShareControl; +import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.analytics.IMogoAnalytics; import com.mogo.service.intent.IMogoIntentListener; import com.mogo.service.intent.IMogoIntentManager; +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 org.json.JSONObject; @@ -33,7 +40,7 @@ import static com.mogo.module.authorize.authprovider.invoke.AuthorizeInvokerCons *

* 描述 */ -public class EntrancePresenter extends Presenter { +public class EntrancePresenter extends Presenter< EntranceView > implements IMogoStatusChangedListener { private Context mContext; private IMogoAnalytics mAnalytics; @@ -42,32 +49,28 @@ public class EntrancePresenter extends Presenter { private IMogoAuthorizeModuleManager mIMogoAuthorizeModuleManager; private String mVoiceCmdType; //一级命令 private String mVoiceCmdShareType; //对某些一级命令里面细分的类型做处理 + private IMogoStatusManager mStatusManager; - public EntrancePresenter(Context context, EntranceView view, IMogoAuthorizeModuleManager authorizeModuleManager) { - super(view); + public EntrancePresenter( Context context, EntranceView view, IMogoAuthorizeModuleManager authorizeModuleManager ) { + super( view ); mContext = context; - mAnalytics = (IMogoAnalytics) ARouter.getInstance().build(MogoServicePaths.PATH_UTILS_ANALYTICS).navigation(getContext()); - mogoIntentManager = (IMogoIntentManager) ARouter.getInstance().build(MogoServicePaths.PATH_INTENT_MANAGER).navigation(getContext()); + IMogoServiceApis apis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( mContext ); + mAnalytics = apis.getAnalyticsApi(); + mogoIntentManager = apis.getIntentManagerApi(); mIMogoAuthorizeModuleManager = authorizeModuleManager; - + mStatusManager = apis.getStatusManagerApi(); registerUnWake(); registerAwakeVoice(); } - private void registerUnWake() { - AIAssist.getInstance(mContext).registerUnWakeupCommand(ExtensionsModuleConst.CLOSE, - ExtensionsModuleConst.CMD_CLOSE, mogoVoiceListener); - AIAssist.getInstance(mContext).registerUnWakeupCommand(ExtensionsModuleConst.CANCLE_SHARE, - ExtensionsModuleConst.CMD_CANCLE_SHARE, mogoVoiceListener); + AIAssist.getInstance( mContext ).registerUnWakeupCommand( ExtensionsModuleConst.CLOSE, ExtensionsModuleConst.CMD_CLOSE, mogoVoiceListener ); + AIAssist.getInstance( mContext ).registerUnWakeupCommand( ExtensionsModuleConst.CANCLE_SHARE, ExtensionsModuleConst.CMD_CANCLE_SHARE, mogoVoiceListener ); //探路相关上报 - AIAssist.getInstance(mContext).registerUnWakeupCommand(ExtensionsModuleConst.UPLOAD_ROAD_BLOCK, - ExtensionsModuleConst.CMD_UPLOAD_BLOCK, mogoVoiceListener); - AIAssist.getInstance(mContext).registerUnWakeupCommand(ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK, - ExtensionsModuleConst.CMD_TRAFFIC_CHECK, mogoVoiceListener); - AIAssist.getInstance(mContext).registerUnWakeupCommand(ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE, - ExtensionsModuleConst.CMD_ROAD_CLOSURE, mogoVoiceListener); + AIAssist.getInstance( mContext ).registerUnWakeupCommand( ExtensionsModuleConst.UPLOAD_ROAD_BLOCK, ExtensionsModuleConst.CMD_UPLOAD_BLOCK, mogoVoiceListener ); + AIAssist.getInstance( mContext ).registerUnWakeupCommand( ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK, ExtensionsModuleConst.CMD_TRAFFIC_CHECK, mogoVoiceListener ); + AIAssist.getInstance( mContext ).registerUnWakeupCommand( ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE, ExtensionsModuleConst.CMD_ROAD_CLOSURE, mogoVoiceListener ); } /** @@ -75,31 +78,31 @@ public class EntrancePresenter extends Presenter { */ private IMogoVoiceCmdCallBack mogoVoiceListener = new IMogoVoiceCmdCallBack() { @Override - public void onCmdSelected(String cmd) { - Log.d(TAG, "免唤醒 mogoVoiceListener needAuthorize = " + mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE) + " >>>cmd = " + cmd); + public void onCmdSelected( String cmd ) { + Log.d( TAG, "免唤醒 mogoVoiceListener needAuthorize = " + mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) + " >>>cmd = " + cmd ); mVoiceCmdType = cmd; - if (cmd.equals(ExtensionsModuleConst.CANCLE_SHARE) - || cmd.equals(ExtensionsModuleConst.CLOSE)) { //取消分享,关闭页面 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + if ( cmd.equals( ExtensionsModuleConst.CANCLE_SHARE ) + || cmd.equals( ExtensionsModuleConst.CLOSE ) ) { //取消分享,关闭页面 + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - ShareControl.getInstance(mContext).dismissDialog(); + ShareControl.getInstance( mContext ).dismissDialog(); } - } else if (cmd.equals(ExtensionsModuleConst.UPLOAD_ROAD_BLOCK)) { //上报拥堵 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( cmd.equals( ExtensionsModuleConst.UPLOAD_ROAD_BLOCK ) ) { //上报拥堵 + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { uploadRoadCondition(); } - } else if (cmd.equals(ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK)) { //上报交通检查 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( cmd.equals( ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK ) ) { //上报交通检查 + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { uploadTrfficCheck(); } - } else if (cmd.equals(ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE)) { //上报封路 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( cmd.equals( ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE ) ) { //上报封路 + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { uploadRoadClosed(); } @@ -107,32 +110,38 @@ public class EntrancePresenter extends Presenter { } @Override - public void onCmdAction(String speakText) { + public void onCmdAction( String speakText ) { } @Override - public void onCmdCancel(String speakText) { + public void onCmdCancel( String speakText ) { } @Override - public void onSpeakEnd(String speakText) { + public void onSpeakEnd( String speakText ) { } @Override - public void onSpeakSelectTimeOut(String speakText) { + public void onSpeakSelectTimeOut( String speakText ) { } }; + @Override + public void onCreate( @NonNull LifecycleOwner owner ) { + super.onCreate( owner ); + mStatusManager.registerStatusChangedListener( TAG, StatusDescriptor.DISPLAY_OVERVIEW, this ); + } + /** * 注册唤醒命令 */ private void registerAwakeVoice() { - mogoIntentManager.registerIntentListener(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION, mogoIntentListener); + mogoIntentManager.registerIntentListener( ExtensionsModuleConst.UPLOAD_ROAD_CONDITION, mogoIntentListener ); - mogoIntentManager.registerIntentListener(ExtensionsModuleConst.GO_TO_SHARE, mogoIntentListener); - mogoIntentManager.registerIntentListener(ExtensionsModuleConst.SHARE_DIALOG_CLOSE, mogoIntentListener); - mogoIntentManager.registerIntentListener(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION_AWAKEN, mogoIntentListener); - mogoIntentManager.registerIntentListener(ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE, mogoIntentListener); + mogoIntentManager.registerIntentListener( ExtensionsModuleConst.GO_TO_SHARE, mogoIntentListener ); + mogoIntentManager.registerIntentListener( ExtensionsModuleConst.SHARE_DIALOG_CLOSE, mogoIntentListener ); + mogoIntentManager.registerIntentListener( ExtensionsModuleConst.UPLOAD_ROAD_CONDITION_AWAKEN, mogoIntentListener ); + mogoIntentManager.registerIntentListener( ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE, mogoIntentListener ); } /** @@ -140,81 +149,81 @@ public class EntrancePresenter extends Presenter { */ private IMogoIntentListener mogoIntentListener = new IMogoIntentListener() { @Override - public void onIntentReceived(String intentStr, Intent intent) { + public void onIntentReceived( String intentStr, Intent intent ) { mVoiceCmdType = intentStr; EntranceFragment.isClickShare = false; - String data = intent.getStringExtra("data"); - Log.d(TAG, "唤醒 mogoIntentListener intentStr =" + intentStr + ">>data =" + data + " >>> needAuthorize = " + mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)); - if (intentStr.equals(ExtensionsModuleConst.GO_TO_SHARE)) { //我要分享 --ok - String conditionData = intent.getStringExtra("data"); - Log.d(TAG, "唤醒 mogoIntentListener intentStr =" + intentStr + ">>conditionData =" + conditionData); + String data = intent.getStringExtra( "data" ); + Log.d( TAG, "唤醒 mogoIntentListener intentStr =" + intentStr + ">>data =" + data + " >>> needAuthorize = " + mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ); + if ( intentStr.equals( ExtensionsModuleConst.GO_TO_SHARE ) ) { //我要分享 --ok + String conditionData = intent.getStringExtra( "data" ); + Log.d( TAG, "唤醒 mogoIntentListener intentStr =" + intentStr + ">>conditionData =" + conditionData ); try { - JSONObject jsonObject = new JSONObject(data); - String typeString = jsonObject.get("ob").toString(); - Log.d(TAG, "mogoIntentListener specified typeString = " + typeString); + JSONObject jsonObject = new JSONObject( data ); + String typeString = jsonObject.get( "ob" ).toString(); + Log.d( TAG, "mogoIntentListener specified typeString = " + typeString ); mVoiceCmdShareType = typeString; - if (!TextUtils.isEmpty(typeString)) { - if (typeString.equals("封路")) { - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + if ( !TextUtils.isEmpty( typeString ) ) { + if ( typeString.equals( "封路" ) ) { + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - Log.d(TAG, "mogoIntentListener 封路 -------> "); + Log.d( TAG, "mogoIntentListener 封路 -------> " ); uploadRoadClosed(); } - } else if (typeString.equals("油价")) { - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( typeString.equals( "油价" ) ) { + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - Log.d(TAG, "mogoIntentListener 油价 -------> "); + Log.d( TAG, "mogoIntentListener 油价 -------> " ); shareOilPrice(); } - } else if (typeString.equals("交通检查")) { - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( typeString.equals( "交通检查" ) ) { + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - Log.d(TAG, "mogoIntentListener 交通检查 -------> "); + Log.d( TAG, "mogoIntentListener 交通检查 -------> " ); uploadTrfficCheck(); } } } else { - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - ShareControl.getInstance(mContext).showDialog(); - Log.d(TAG, "mogoIntentListener 我要分享 ----> "); - traceData("2"); + ShareControl.getInstance( mContext ).showDialog(); + Log.d( TAG, "mogoIntentListener 我要分享 ----> " ); + traceData( "2" ); } } - } catch (Exception e) { + } catch ( Exception e ) { e.printStackTrace(); } - } else if (intentStr.equals(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION_AWAKEN)) { + } else if ( intentStr.equals( ExtensionsModuleConst.UPLOAD_ROAD_CONDITION_AWAKEN ) ) { //分享路况/上报路况/上报拥堵 唤醒 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { uploadRoadCondition(); - Log.d(TAG, "mogoIntentListener 分享路况 唤醒 ----> "); + Log.d( TAG, "mogoIntentListener 分享路况 唤醒 ----> " ); } - } else if (intentStr.equals(ExtensionsModuleConst.SHARE_DIALOG_CLOSE)) { //关闭分享框 唤醒 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( intentStr.equals( ExtensionsModuleConst.SHARE_DIALOG_CLOSE ) ) { //关闭分享框 唤醒 + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - ShareControl.getInstance(mContext).dismissDialog(); - Log.d(TAG, "mogoIntentListener 关闭分享框 唤醒 ----> "); + ShareControl.getInstance( mContext ).dismissDialog(); + Log.d( TAG, "mogoIntentListener 关闭分享框 唤醒 ----> " ); } - } else if (intentStr.equals(ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE)) { + } else if ( intentStr.equals( ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE ) ) { // 两次未回复关闭对话框 - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { - ShareControl.getInstance(mContext).dismissDialog(); - Logger.d(TAG, "mogoIntentListener 两次未回复关闭对话框"); + ShareControl.getInstance( mContext ).dismissDialog(); + Logger.d( TAG, "mogoIntentListener 两次未回复关闭对话框" ); } - } else if (intentStr.equals(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION)) { //上报路况 免唤醒 --ok - if (mIMogoAuthorizeModuleManager.needAuthorize(AUTHORIZE_TYPE_LAUNCHER_SHARE)) { - mIMogoAuthorizeModuleManager.invokeAuthorization(AUTHORIZE_TYPE_LAUNCHER_SHARE); + } else if ( intentStr.equals( ExtensionsModuleConst.UPLOAD_ROAD_CONDITION ) ) { //上报路况 免唤醒 --ok + if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { + mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); } else { uploadRoadCondition(); } @@ -227,65 +236,65 @@ public class EntrancePresenter extends Presenter { * 处理需要授权的命令 TODO */ public void handleNeedAuthorizeCmd() { - Log.e(TAG, "handleNeedAuthorizeCmd mVoiceCmdType = " + mVoiceCmdType + " >>> mVoiceCmdShareType = " + mVoiceCmdShareType); - if (!TextUtils.isEmpty(mVoiceCmdType)) { - if (mVoiceCmdType.equals(ExtensionsModuleConst.CANCLE_SHARE) || mVoiceCmdType.equals(ExtensionsModuleConst.CLOSE) - || mVoiceCmdType.equals(ExtensionsModuleConst.SHARE_DIALOG_CLOSE) || mVoiceCmdType.equals(ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE)) { //关闭分享弹框 - ShareControl.getInstance(mContext).dismissDialog(); - } else if (mVoiceCmdType.equals(ExtensionsModuleConst.GO_TO_SHARE)) { //打开分享弹框 - if (!TextUtils.isEmpty(mVoiceCmdShareType)) { - if (mVoiceCmdShareType.equals("封路")) { - Log.d(TAG, "handleNeedAuthorizeCmd 封路 -------> "); + Log.e( TAG, "handleNeedAuthorizeCmd mVoiceCmdType = " + mVoiceCmdType + " >>> mVoiceCmdShareType = " + mVoiceCmdShareType ); + if ( !TextUtils.isEmpty( mVoiceCmdType ) ) { + if ( mVoiceCmdType.equals( ExtensionsModuleConst.CANCLE_SHARE ) || mVoiceCmdType.equals( ExtensionsModuleConst.CLOSE ) + || mVoiceCmdType.equals( ExtensionsModuleConst.SHARE_DIALOG_CLOSE ) || mVoiceCmdType.equals( ExtensionsModuleConst.NO_REPLY_SHARE_DIALOG_CLOSE ) ) { //关闭分享弹框 + ShareControl.getInstance( mContext ).dismissDialog(); + } else if ( mVoiceCmdType.equals( ExtensionsModuleConst.GO_TO_SHARE ) ) { //打开分享弹框 + if ( !TextUtils.isEmpty( mVoiceCmdShareType ) ) { + if ( mVoiceCmdShareType.equals( "封路" ) ) { + Log.d( TAG, "handleNeedAuthorizeCmd 封路 -------> " ); uploadRoadClosed(); - } else if (mVoiceCmdShareType.equals("油价")) { - Log.d(TAG, "handleNeedAuthorizeCmd 油价 -------> "); + } else if ( mVoiceCmdShareType.equals( "油价" ) ) { + Log.d( TAG, "handleNeedAuthorizeCmd 油价 -------> " ); shareOilPrice(); - } else if (mVoiceCmdShareType.equals("交通检查")) { - Log.d(TAG, "handleNeedAuthorizeCmd 交通检查 -------> "); + } else if ( mVoiceCmdShareType.equals( "交通检查" ) ) { + Log.d( TAG, "handleNeedAuthorizeCmd 交通检查 -------> " ); uploadTrfficCheck(); } } else { - ShareControl.getInstance(mContext).showDialog(); - Log.d(TAG, "handleNeedAuthorizeCmd 我要分享 ----> "); - traceData("2"); + ShareControl.getInstance( mContext ).showDialog(); + Log.d( TAG, "handleNeedAuthorizeCmd 我要分享 ----> " ); + traceData( "2" ); } - } else if (mVoiceCmdType.equals(ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK)) { //上报交通检查 - Log.d(TAG, "handleNeedAuthorizeCmd 上报交通检查 ----> "); + } else if ( mVoiceCmdType.equals( ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK ) ) { //上报交通检查 + Log.d( TAG, "handleNeedAuthorizeCmd 上报交通检查 ----> " ); uploadTrfficCheck(); - } else if (mVoiceCmdType.equals(ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE)) { //上报封路 - Log.d(TAG, "handleNeedAuthorizeCmd 上报封路 ----> "); + } else if ( mVoiceCmdType.equals( ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE ) ) { //上报封路 + Log.d( TAG, "handleNeedAuthorizeCmd 上报封路 ----> " ); uploadRoadClosed(); - } else if (mVoiceCmdType.equals(ExtensionsModuleConst.UPLOAD_ROAD_BLOCK) - || mVoiceCmdType.equals(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION_AWAKEN) - || mVoiceCmdType.equals(ExtensionsModuleConst.UPLOAD_ROAD_CONDITION)) { //上报拥堵, 分享路况, 上报路况 - Log.d(TAG, "handleNeedAuthorizeCmd 上报路况 ----> "); + } else if ( mVoiceCmdType.equals( ExtensionsModuleConst.UPLOAD_ROAD_BLOCK ) + || mVoiceCmdType.equals( ExtensionsModuleConst.UPLOAD_ROAD_CONDITION_AWAKEN ) + || mVoiceCmdType.equals( ExtensionsModuleConst.UPLOAD_ROAD_CONDITION ) ) { //上报拥堵, 分享路况, 上报路况 + Log.d( TAG, "handleNeedAuthorizeCmd 上报路况 ----> " ); uploadRoadCondition(); } } else { - Log.e(TAG, "handleNeedAuthorizeCmd mVoiceCmdType == null "); + Log.e( TAG, "handleNeedAuthorizeCmd mVoiceCmdType == null " ); } } private void uploadRoadCondition() { - traceTanluData("2"); - sendShareReceiver("1"); - Logger.d("EntrancePresenter", "mogoIntentListener 上报路况 ----> "); - traceTypeData("1"); - ShareControl.getInstance(mContext).dismissDialog(); + traceTanluData( "2" ); + sendShareReceiver( "1" ); + Logger.d( "EntrancePresenter", "mogoIntentListener 上报路况 ----> " ); + traceTypeData( "1" ); + ShareControl.getInstance( mContext ).dismissDialog(); } private void uploadTrfficCheck() { - sendShareReceiver("2"); - Logger.d("EntrancePresenter", "mogoIntentListener 分享交通检查 ----> "); - traceTypeData("3"); - ShareControl.getInstance(mContext).dismissDialog(); + sendShareReceiver( "2" ); + Logger.d( "EntrancePresenter", "mogoIntentListener 分享交通检查 ----> " ); + traceTypeData( "3" ); + ShareControl.getInstance( mContext ).dismissDialog(); } private void uploadRoadClosed() { - sendShareReceiver("3"); - Logger.d("EntrancePresenter", "mogoIntentListener 分享封路 ----> "); - traceTypeData("4"); - ShareControl.getInstance(mContext).dismissDialog(); + sendShareReceiver( "3" ); + Logger.d( "EntrancePresenter", "mogoIntentListener 分享封路 ----> " ); + traceTypeData( "4" ); + ShareControl.getInstance( mContext ).dismissDialog(); } /** @@ -293,10 +302,10 @@ public class EntrancePresenter extends Presenter { * * @param from */ - private void traceData(String from) { - Map properties = new HashMap<>(); - properties.put("from", from); - mAnalytics.track(ExtensionsModuleConst.LAUNCHER_SHARE_CLICK, properties); + private void traceData( String from ) { + Map< String, Object > properties = new HashMap<>(); + properties.put( "from", from ); + mAnalytics.track( ExtensionsModuleConst.LAUNCHER_SHARE_CLICK, properties ); } private void shareOilPrice() { @@ -310,14 +319,14 @@ public class EntrancePresenter extends Presenter { /** * 发送广播 1拥堵,2交通检查,3封路 */ - private void sendShareReceiver(String type) { - Logger.d("EntrancePresenter", "TanluCardViewFragment sendShareReceiver ---->"); + private void sendShareReceiver( String type ) { + Logger.d( "EntrancePresenter", "TanluCardViewFragment sendShareReceiver ---->" ); Intent intent = new Intent(); - intent.setAction("com.zhidao.roadcondition.share"); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - intent.putExtra("type", type); - getContext().sendBroadcast(intent); + intent.setAction( "com.zhidao.roadcondition.share" ); + intent.addFlags( Intent.FLAG_RECEIVER_FOREGROUND ); + intent.addFlags( Intent.FLAG_INCLUDE_STOPPED_PACKAGES ); + intent.putExtra( "type", type ); + getContext().sendBroadcast( intent ); } /** @@ -331,27 +340,35 @@ public class EntrancePresenter extends Presenter { * * @param type */ - private void traceTypeData(String type) { - Map properties = new HashMap<>(); - properties.put("type", type); - mAnalytics.track(ExtensionsModuleConst.LAUNCHER_SHARE_TYPE, properties); + private void traceTypeData( String type ) { + Map< String, Object > properties = new HashMap<>(); + properties.put( "type", type ); + mAnalytics.track( ExtensionsModuleConst.LAUNCHER_SHARE_TYPE, properties ); } - private void traceTanluData(String type) { - Map properties = new HashMap<>(); - properties.put("type", type); - mAnalytics.track(ExtensionsModuleConst.CARNET_USER_UPLOAD, properties); + private void traceTanluData( String type ) { + Map< String, Object > properties = new HashMap<>(); + properties.put( "type", type ); + mAnalytics.track( ExtensionsModuleConst.CARNET_USER_UPLOAD, properties ); } public void unregisterUnWake() { - AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.CANCLE_SHARE); - AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.CLOSE); - - AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.UPLOAD_ROAD_BLOCK); - AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK); - AIAssist.getInstance(mContext).unregisterUnWakeupCommand(ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE); - + AIAssist.getInstance( mContext ).unregisterUnWakeupCommand( ExtensionsModuleConst.CANCLE_SHARE ); + AIAssist.getInstance( mContext ).unregisterUnWakeupCommand( ExtensionsModuleConst.CLOSE ); + AIAssist.getInstance( mContext ).unregisterUnWakeupCommand( ExtensionsModuleConst.UPLOAD_ROAD_BLOCK ); + AIAssist.getInstance( mContext ).unregisterUnWakeupCommand( ExtensionsModuleConst.UPLOAD_TRAFFIC_CHECK ); + AIAssist.getInstance( mContext ).unregisterUnWakeupCommand( ExtensionsModuleConst.UPLOAD_ROAD_CLOSURE ); } + @Override + public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) { + if ( descriptor == StatusDescriptor.DISPLAY_OVERVIEW ) { + if ( isTrue ) { + mView.hideNaviPanelWidgets(); + } else { + mView.showNaviPanelWidgets(); + } + } + } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java index 9ea2e13101..6309e1b02c 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceView.java @@ -9,4 +9,8 @@ import com.mogo.commons.mvp.IView; * 描述 */ public interface EntranceView extends IView { + + void showNaviPanelWidgets(); + + void hideNaviPanelWidgets(); } 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 9e9a8846fe..6cfa8e244b 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 @@ -30,7 +30,7 @@ import com.mogo.module.main.cards.MogoModulesHandler; 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.windowview.WindowViewHandler; +import com.mogo.module.main.windowview.FloatingViewHandler; import com.mogo.module.service.ServiceConst; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; @@ -192,7 +192,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme // 避免事件穿透导致地图被滑动 mLeftShadowFrame.setOnClickListener( view -> { } ); - WindowViewHandler.init( mFloatingLayout ); + FloatingViewHandler.init( mFloatingLayout ); } // 隐藏布局 diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/WindowViewHandler.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/FloatingViewHandler.java similarity index 50% rename from modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/WindowViewHandler.java rename to modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/FloatingViewHandler.java index 1b37bea1c9..5485f4778d 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/WindowViewHandler.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/FloatingViewHandler.java @@ -13,7 +13,7 @@ import com.mogo.utils.logger.Logger; *

* 描述 */ -public class WindowViewHandler { +public class FloatingViewHandler { private static final String TAG = "WindowViewHandler"; @@ -35,9 +35,9 @@ public class WindowViewHandler { */ private static boolean sMovable = false; - public static FrameLayout sFloatingLayout = null; + private static FrameLayout sFloatingLayout = null; - public static void init(FrameLayout frameLayout) { + public static void init( FrameLayout frameLayout ) { sFloatingLayout = frameLayout; } @@ -49,20 +49,20 @@ public class WindowViewHandler { * @param y * @param movable */ - public static void addView(View view, int x, int y, boolean movable) { - if (view == null) { + public static void addView( View view, int x, int y, boolean movable ) { + if ( view == null ) { return; } - if (sFloatingLayout == null) { - Logger.e(TAG, "no floating frame. "); + if ( sFloatingLayout == null ) { + Logger.e( TAG, "no floating frame. " ); return; } - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); params.leftMargin = x; params.topMargin = y; - sFloatingLayout.addView(view, params); + sFloatingLayout.addView( view, params ); } /** @@ -72,16 +72,16 @@ public class WindowViewHandler { * @param params * @param movable */ - public static void addView(View view, FrameLayout.LayoutParams params, boolean movable) { - if (view == null) { + public static void addView( View view, FrameLayout.LayoutParams params, boolean movable ) { + if ( view == null ) { return; } - if (sFloatingLayout == null) { - Logger.e(TAG, "no floating frame. "); + if ( sFloatingLayout == null ) { + Logger.e( TAG, "no floating frame. " ); return; } - sFloatingLayout.addView(view, params); + sFloatingLayout.addView( view, params ); } /** @@ -93,27 +93,27 @@ public class WindowViewHandler { * @param y * @param movable */ - public static void addView(View view, int priority, int x, int y, boolean movable) { - if (view == null) { + public static void addView( View view, int priority, int x, int y, boolean movable ) { + if ( view == null ) { return; } - if (sFloatingLayout == null) { - Logger.e(TAG, "no floating frame. "); + if ( sFloatingLayout == null ) { + Logger.e( TAG, "no floating frame. " ); return; } - if (sView == view) { - Logger.w(TAG, "改布局已添加且没有移除,不操作"); + if ( sView == view ) { + Logger.w( TAG, "改布局已添加且没有移除,不操作" ); return; } - if (sView != null) { - if (priority < sPriority) { - Logger.w(TAG, "过滤低优先级布局"); + if ( sView != null ) { + if ( priority < sPriority ) { + Logger.w( TAG, "过滤低优先级布局" ); return; } - sFloatingLayout.removeView(sView); + sFloatingLayout.removeView( sView ); } sView = view; sMovable = movable; @@ -131,27 +131,27 @@ public class WindowViewHandler { * @param params * @param movable */ - public static void addView(View view, int priority, FrameLayout.LayoutParams params, boolean movable) { - if (view == null) { + public static void addView( View view, int priority, FrameLayout.LayoutParams params, boolean movable ) { + if ( view == null ) { return; } - if (sFloatingLayout == null) { - Logger.e(TAG, "no floating frame. "); + if ( sFloatingLayout == null ) { + Logger.e( TAG, "no floating frame. " ); return; } - if (sView == view) { - Logger.w(TAG, "改布局已添加且没有移除,不操作"); + if ( sView == view ) { + Logger.w( TAG, "改布局已添加且没有移除,不操作" ); return; } - if (sView != null) { - if (priority < sPriority) { - Logger.w(TAG, "过滤低优先级布局"); + if ( sView != null ) { + if ( priority < sPriority ) { + Logger.w( TAG, "过滤低优先级布局" ); return; } - sFloatingLayout.removeView(sView); + sFloatingLayout.removeView( sView ); } sView = view; sMovable = movable; @@ -160,15 +160,15 @@ public class WindowViewHandler { addView(); } - public static void removeView(View view) { - if (sFloatingLayout == null) { + public static void removeView( View view ) { + if ( sFloatingLayout == null ) { return; } - if (view == null) { + if ( view == null ) { return; } - sFloatingLayout.removeView(view); - if (sView == view) { + sFloatingLayout.removeView( view ); + if ( sView == view ) { sView = null; sPriority = Integer.MIN_VALUE; sMovable = false; @@ -177,29 +177,35 @@ public class WindowViewHandler { } private static void addView() { - if (sView == null) { + if ( sView == null ) { return; } FrameLayout.LayoutParams params = sParams; - if (params == null) { - params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + if ( params == null ) { + params = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); params.leftMargin = sX; params.topMargin = sY; } - sFloatingLayout.addView(sView, params); + sFloatingLayout.addView( sView, params ); } - public static void attachMovementEvent(View view, WindowManager.LayoutParams params) { - if (view == null) { + public static void attachMovementEvent( View view, WindowManager.LayoutParams params ) { + if ( view == null ) { return; } - view.setOnTouchListener((v, event) -> { + view.setOnTouchListener( ( v, event ) -> { DispatchTouchEventWrapper.getInstance() - .attach(view, params) - .handle(event); + .attach( view, params ) + .handle( event ); return false; - }); + } ); + } + + public static void setVisible( boolean visible ) { + if ( sFloatingLayout != null ) { + sFloatingLayout.setVisibility( visible ? View.VISIBLE : View.INVISIBLE ); + } } } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java index 2357701d68..f7b69a8dd2 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java @@ -14,36 +14,46 @@ import com.mogo.service.windowview.IMogoWindowManager; *

* 根据优先级控制显示 window view. */ -@Route(path = MogoServicePaths.PATH_WINDOW_MANAGER) +@Route( path = MogoServicePaths.PATH_WINDOW_MANAGER ) public class MogoWindowManager implements IMogoWindowManager { @Override - public void addView(View view, int x, int y, boolean movable) { - WindowViewHandler.addView(view, x, y, movable); + public void addView( View view, int x, int y, boolean movable ) { + FloatingViewHandler.addView( view, x, y, movable ); } @Override - public void addView(View view, FrameLayout.LayoutParams params, boolean movable) { - WindowViewHandler.addView(view, params, movable); + public void addView( View view, FrameLayout.LayoutParams params, boolean movable ) { + FloatingViewHandler.addView( view, params, movable ); } @Override - public void addView(int priority, View view, int x, int y, boolean movable) { - WindowViewHandler.addView(view, priority, x, y, movable); + public void addView( int priority, View view, int x, int y, boolean movable ) { + FloatingViewHandler.addView( view, priority, x, y, movable ); } @Override - public void addView(int priority, View view, FrameLayout.LayoutParams params, boolean movable) { - WindowViewHandler.addView(view, priority, params, movable); + public void addView( int priority, View view, FrameLayout.LayoutParams params, boolean movable ) { + FloatingViewHandler.addView( view, priority, params, movable ); } @Override - public void removeView(View view) { - WindowViewHandler.removeView(view); + public void removeView( View view ) { + FloatingViewHandler.removeView( view ); } @Override - public void init(Context context) { + public void hideAll() { + FloatingViewHandler.setVisible( false ); + } + + @Override + public void showAll() { + FloatingViewHandler.setVisible( true ); + } + + @Override + public void init( Context context ) { } } diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java index cc2ca88ad3..ff82c148d7 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java @@ -21,7 +21,8 @@ import com.mogo.map.navi.MogoNaviInfo; import com.mogo.map.navi.MogoTraffic; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.MapControlResult; -import com.mogo.module.common.MogoModulePaths; +import com.mogo.module.common.map.MapCenterPointStrategy; +import com.mogo.module.common.map.Scene; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; import com.mogo.service.intent.IMogoIntentListener; @@ -32,12 +33,8 @@ import com.mogo.service.module.IMogoRegisterCenter; import com.mogo.service.module.IMogoSearchManager; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.strategy.IMogoRefreshStrategyController; -import com.mogo.service.voice.IMogoVoiceListener; -import com.mogo.service.voice.IMogoVoiceManager; -import com.mogo.utils.AppUtils; import com.mogo.utils.ResourcesHelper; import com.mogo.utils.UiThreadHandler; -import com.mogo.utils.WindowUtils; import com.mogo.utils.logger.Logger; import java.util.Map; @@ -62,6 +59,7 @@ public class MapPresenter extends Presenter< MapView > implements private IMogoStatusManager mStatusManager; private IMogoRegisterCenter mRegisterCenter; private IMogoLauncher mLauncher; + private Rect mDisplayOverviewBounds; public MapPresenter( MapView view ) { super( view ); @@ -99,11 +97,8 @@ public class MapPresenter extends Presenter< MapView > implements mView.getUIController().changeMapMode( EnumMapUI.CarUp_2D ); } else if ( opera_type == 1 ) { mView.getUIController().changeMapMode( EnumMapUI.NorthUP_2D ); - //AIAssist.getInstance(getContext()).speakTTSVoice("已切换", null); - } else if ( opera_type == 2 ) { mView.getUIController().changeMapMode( EnumMapUI.CarUp_3D ); - //AIAssist.getInstance(getContext()).speakTTSVoice("已切换", null); } } @@ -123,18 +118,14 @@ public class MapPresenter extends Presenter< MapView > implements //intent.putExtra("EXTRA_ENDURANCE_DATA", continueNavi); //继续导航 } else if ( key_type == 10049 ) { - boolean extra_endurance_data = - intent.getBooleanExtra( "EXTRA_ENDURANCE_DATA", false ); + boolean extra_endurance_data = intent.getBooleanExtra( "EXTRA_ENDURANCE_DATA", false ); if ( extra_endurance_data ) { onContinueNavigation(); } } else if ( key_type == 10006 ) { - int extra_is_show = intent.getIntExtra( "EXTRA_IS_SHOW", 0 ); - if ( extra_is_show == 0 ) { - mStatusManager.setUserInteractionStatus( TAG, true, false ); - mView.getUIController().displayOverview(); + onDisplayOverview(); } else { onContinueNavigation(); } @@ -173,13 +164,16 @@ public class MapPresenter extends Presenter< MapView > implements /** * 继续导航 */ - private void onContinueNavigation(){ + private void onContinueNavigation() { + if ( mStatusManager.isMainPageOnResume() ) { + mStatusManager.setDisplayOverview( TAG, false ); mView.getUIController().recoverLockMode(); } else { mLauncher.backToLauncher( getContext() ); UiThreadHandler.postDelayed( () -> { try { + mStatusManager.setDisplayOverview( TAG, false ); mView.getUIController().recoverLockMode(); } catch ( Exception e ) { e.printStackTrace(); @@ -188,6 +182,16 @@ public class MapPresenter extends Presenter< MapView > implements } } + private void onDisplayOverview() { + if ( !mMogoMapService.getNavi( getContext() ).isNaviing() ) { + Logger.d( TAG, "未开始导航." ); + return; + } + mStatusManager.setUserInteractionStatus( TAG, true, false ); + mStatusManager.setDisplayOverview( TAG, true ); + mView.getUIController().displayOverview( mDisplayOverviewBounds ); + } + private void zoomMap( boolean zoomIn ) { boolean isLocked = mMogoMapService.getMapUIController().isCarLocked(); MapControlResult result = mView.getUIController().changeZoom( zoomIn ); @@ -229,11 +233,18 @@ public class MapPresenter extends Presenter< MapView > implements IMogoNavi mogoNavi = mMogoMapService.getNavi( getContext() ); mogoNavi.setCalculatePathDisplayBounds( new Rect( + ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_calculate_path_display_overview_left_margin ), + ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_calculate_path_display_overview_top_margin ), + ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_calculate_path_display_overview_right_margin ), + ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_calculate_path_display_overview_bottom_margin ) + ) ); + + mDisplayOverviewBounds = new Rect( ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_display_overview_left_margin ), ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_display_overview_top_margin ), ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_display_overview_right_margin ), ResourcesHelper.getDimensionPixelSize( getContext(), R.dimen.module_map_display_overview_bottom_margin ) - ) ); + ); } @Override @@ -314,12 +325,10 @@ public class MapPresenter extends Presenter< MapView > implements case VoiceConstants.CMD_MAP_NORTH_UP_MODE_UN_WAKEUP: case VoiceConstants.CMD_MAP_NORTH_UP_MODE: mView.getUIController().changeMapMode( EnumMapUI.NorthUP_2D ); - AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null ); break; case VoiceConstants.CMD_MAP_3D_UN_WAKEUP: case VoiceConstants.CMD_MAP_3D: mView.getUIController().changeMapMode( EnumMapUI.CarUp_3D ); - AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null ); break; case VoiceConstants.CMD_MAP_DAY_TIME_MODE_UN_WAKEUP: @@ -359,7 +368,7 @@ public class MapPresenter extends Presenter< MapView > implements AIAssist.getInstance( getContext() ).speakTTSVoice( "已切换", null ); break; case VoiceConstants.CMD_MAP_DISPLAY_OVERVIEW_MODE: - mView.getUIController().displayOverview(); + onDisplayOverview(); break; case VoiceConstants.CMD_MAP_CONTINUE_NAVI_MODE: onContinueNavigation(); diff --git a/modules/mogo-module-map/src/main/res/values-ldpi/dimens.xml b/modules/mogo-module-map/src/main/res/values-ldpi/dimens.xml index 7f51191319..bcf618205a 100644 --- a/modules/mogo-module-map/src/main/res/values-ldpi/dimens.xml +++ b/modules/mogo-module-map/src/main/res/values-ldpi/dimens.xml @@ -1,7 +1,13 @@ - 558px - 174px - 32px - 80px + 558px + 174px + 32px + 80px + + + 534px + 100px + 68px + 32px \ No newline at end of file diff --git a/modules/mogo-module-map/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-map/src/main/res/values-xhdpi/dimens.xml index 275b7ffcd1..2d58420a11 100644 --- a/modules/mogo-module-map/src/main/res/values-xhdpi/dimens.xml +++ b/modules/mogo-module-map/src/main/res/values-xhdpi/dimens.xml @@ -1,7 +1,13 @@ - 977px - 249px - 61px - 80px + 977px + 249px + 61px + 80px + + + 952px + 170px + 122px + 61px \ No newline at end of file diff --git a/modules/mogo-module-map/src/main/res/values/dimens.xml b/modules/mogo-module-map/src/main/res/values/dimens.xml index 275b7ffcd1..4cf55c67a5 100644 --- a/modules/mogo-module-map/src/main/res/values/dimens.xml +++ b/modules/mogo-module-map/src/main/res/values/dimens.xml @@ -1,7 +1,13 @@ - 977px - 249px - 61px - 80px + + 977px + 249px + 61px + 80px + + 952px + 170px + 122px + 61px \ No newline at end of file diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt index e67b538fc0..13428466a1 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/NaviManager.kt @@ -36,8 +36,6 @@ object NaviManager { SearchServiceHolder.getNavi().stopNavi() } else if (key_type == 20009) { SearchServiceHolder.mogoLauncher.backToLauncher(context) - gotoSearch() - } else if (key_type == 10005) { // * 仅在导航场景下,⽀持第三⽅进⾏路线偏好的重新选择。 diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt index 66c998b9f9..4237428e43 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/manager/SettingManager.kt @@ -12,186 +12,195 @@ import com.mogo.service.module.IMogoSettingManager * 2020-01-12. */ object SettingManager : IMogoSettingManager { - private val KEY_PAHT_PREFER = "keyPath" - private val KEY_VOLUME = "keyVolume" - private val KEY_VOICE_STYLE = "keyVoice" - private val KEY_MAP_TYPE = "keyMapType" - private lateinit var settings: SharedPreferences + private val KEY_PAHT_PREFER = "keyPath" + private val KEY_VOLUME = "keyVolume" + private val KEY_VOICE_STYLE = "keyVoice" + private val KEY_MAP_TYPE = "keyMapType" + private val KEY_AIMLESS_MODE_TYPE = "keyAimlessModeType" + private lateinit var settings: SharedPreferences - /** - * 是否躲避拥堵 - */ - private var congestion = false + /** + * 是否躲避拥堵 + */ + private var congestion = false - /** - * 不走高速 - */ - private var avoidSpeed = false + /** + * 不走高速 + */ + private var avoidSpeed = false - /** - * 避免收费 - */ - private var cost = false + /** + * 避免收费 + */ + private var cost = false - /** - * 高速优先 - */ - private var highSpeed = false - /** - * 模拟导航 - */ - private var isMonitor: Boolean = false + /** + * 高速优先 + */ + private var highSpeed = false + /** + * 模拟导航 + */ + private var isMonitor: Boolean = false - /** - * GPS 模拟 - */ - private var isGpsSimulator: Boolean = false + /** + * GPS 模拟 + */ + private var isGpsSimulator: Boolean = false - override fun getPathPrefer(): Int { - return settings!!.getInt(KEY_PAHT_PREFER, 0) - } - - override fun getVolume(): Int { - return settings!!.getInt(KEY_VOLUME, 0) - } - - override fun getVoiceStyle(): Int { - return settings!!.getInt(KEY_VOICE_STYLE, R.id.rb_navi_detail) - } - - override fun getMapType(): Int { - return settings!!.getInt(KEY_MAP_TYPE, R.id.rb_navi_day) - } - - fun setPathPrefer(type: Int) { - settings!!.edit() - .putInt(KEY_PAHT_PREFER, type) - .apply() - } - - fun setVolume(type: Int) { - settings!!.edit() - .putInt(KEY_VOLUME, type) - .apply() - } - - fun setVoiceStyle(type: Int) { - settings!!.edit() - .putInt(KEY_VOICE_STYLE, type) - .apply() - } - - fun setMapType(type: Int) { - settings!!.edit() - .putInt(KEY_MAP_TYPE, type) - .apply() - } - - fun setMonitor(type: Boolean) { - isMonitor = type - } - - fun isMonitor(): Boolean { - return isMonitor - } - - fun setGpsSimulator(type:Boolean){ - isGpsSimulator = type - } - - fun isGpsSimulator(): Boolean { - return isGpsSimulator - } - - /** - * 是否躲避拥堵 - */ - fun congestion(congestion: Boolean) { - this.congestion = congestion - save() - } - - /** - * 不走高速 - */ - fun avoidSpeed(avoidSpeed: Boolean) { - this.avoidSpeed = avoidSpeed - if (avoidSpeed) { - this.highSpeed = false + override fun getPathPrefer(): Int { + return settings!!.getInt(KEY_PAHT_PREFER, 0) } - save() - } - - /** - * 避免收费 - */ - fun cost(cost: Boolean) { - this.cost = cost - if (cost) { - this.highSpeed = false + override fun getVolume(): Int { + return settings!!.getInt(KEY_VOLUME, 0) } - save() - } - - /** - * 高速优先 - */ - fun highSpeed(highSpeed: Boolean) { - this.highSpeed = highSpeed - if (highSpeed) { - this.avoidSpeed = false - this.cost = false + override fun getVoiceStyle(): Int { + return settings!!.getInt(KEY_VOICE_STYLE, R.id.rb_navi_detail) } - save() - } + override fun getMapType(): Int { + return settings!!.getInt(KEY_MAP_TYPE, R.id.rb_navi_day) + } - fun isCongestion(): Boolean { - return congestion - } + fun setPathPrefer(type: Int) { + settings!!.edit() + .putInt(KEY_PAHT_PREFER, type) + .apply() + } - fun isAvoidSpeed(): Boolean { - return avoidSpeed - } + fun setVolume(type: Int) { + settings!!.edit() + .putInt(KEY_VOLUME, type) + .apply() + } - fun isCost(): Boolean { - return cost - } + fun setVoiceStyle(type: Int) { + settings!!.edit() + .putInt(KEY_VOICE_STYLE, type) + .apply() + } - fun isHighSpeed(): Boolean { - return highSpeed - } + fun setMapType(type: Int) { + settings!!.edit() + .putInt(KEY_MAP_TYPE, type) + .apply() + } - private fun save() { - settings.edit() - .putBoolean("congestion", congestion) - .putBoolean("avoidSpeed", avoidSpeed) - .putBoolean("cost", cost) - .putBoolean("highSpeed", highSpeed) - .apply() - updateConfig() + fun setMonitor(type: Boolean) { + isMonitor = type + } - } + fun isMonitor(): Boolean { + return isMonitor + } - override fun init(context: Context) { - settings = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + fun setGpsSimulator(type: Boolean) { + isGpsSimulator = type + } - congestion = settings.getBoolean("congestion", false) - avoidSpeed = settings.getBoolean("avoidSpeed", false) - cost = settings.getBoolean("cost", false) - highSpeed = settings.getBoolean("highSpeed", false) - updateConfig() - } + fun isGpsSimulator(): Boolean { + return isGpsSimulator + } - private fun updateConfig() { - SearchServiceHolder.getNavi() - .naviConfig - .cost(cost) - .avoidSpeed(avoidSpeed) - .highSpeed(highSpeed) - .congestion(congestion) - } + /** + * 是否躲避拥堵 + */ + fun congestion(congestion: Boolean) { + this.congestion = congestion + save() + } + + /** + * 不走高速 + */ + fun avoidSpeed(avoidSpeed: Boolean) { + this.avoidSpeed = avoidSpeed + if (avoidSpeed) { + this.highSpeed = false + } + save() + + } + + /** + * 避免收费 + */ + fun cost(cost: Boolean) { + this.cost = cost + if (cost) { + this.highSpeed = false + } + save() + + } + + /** + * 高速优先 + */ + fun highSpeed(highSpeed: Boolean) { + this.highSpeed = highSpeed + if (highSpeed) { + this.avoidSpeed = false + this.cost = false + } + save() + + } + + fun isCongestion(): Boolean { + return congestion + } + + fun isAvoidSpeed(): Boolean { + return avoidSpeed + } + + fun isCost(): Boolean { + return cost + } + + fun isHighSpeed(): Boolean { + return highSpeed + } + + private fun save() { + settings.edit() + .putBoolean("congestion", congestion) + .putBoolean("avoidSpeed", avoidSpeed) + .putBoolean("cost", cost) + .putBoolean("highSpeed", highSpeed) + .apply() + updateConfig() + + } + + override fun init(context: Context) { + settings = context.getSharedPreferences("settings", Context.MODE_PRIVATE) + + congestion = settings.getBoolean("congestion", false) + avoidSpeed = settings.getBoolean("avoidSpeed", false) + cost = settings.getBoolean("cost", false) + highSpeed = settings.getBoolean("highSpeed", false) + updateConfig() + } + + private fun updateConfig() { + SearchServiceHolder.getNavi() + .naviConfig + .cost(cost) + .avoidSpeed(avoidSpeed) + .highSpeed(highSpeed) + .congestion(congestion) + } + + fun setAimlessMode(type: Int){ + settings.edit().putInt(KEY_AIMLESS_MODE_TYPE, type).apply() + } + + fun getAimlessMode():Int { + return settings.getInt(KEY_AIMLESS_MODE_TYPE, R.id.aimlessModeClose) + } } diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt index 07d9b1c445..ac06e82a34 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/NaviSettingFragment.kt @@ -9,6 +9,7 @@ import android.widget.SeekBar import android.widget.SeekBar.OnSeekBarChangeListener import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.voice.AIAssist import com.mogo.map.constants.BroadcastMode import com.mogo.map.uicontroller.EnumMapUI import com.mogo.module.common.MogoModulePaths @@ -79,9 +80,6 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - iv_back.setOnClickListener { - SearchServiceHolder.fragmentManager.pop() - } initViews() initEvent() EventBus.getDefault().register(this) @@ -101,7 +99,8 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { rb_navi_auto.isChecked = SettingManager.mapType == R.id.rb_navi_auto rb_navi_detail.isChecked = SettingManager.voiceStyle == R.id.rb_navi_detail rb_navi_draft.isChecked = SettingManager.voiceStyle == R.id.rb_navi_draft - + aimlessModeClose.isChecked = SettingManager.getAimlessMode() == aimlessModeClose.id + aimlessModeOpen.isChecked = SettingManager.getAimlessMode() == aimlessModeOpen.id updateHome() updateCompany() @@ -109,6 +108,9 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { } private fun initEvent() { + rl_navi_setting_title.setOnClickListener { + SearchServiceHolder.fragmentManager.pop() + } iv_sound_plus.setOnClickListener { VolumeManager.getInstance(context).incVolume() sb_navi_volume_progress.progress = sb_navi_volume_progress.progress.plus(10) @@ -177,6 +179,21 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener { } } + aimlessModeGroup.setOnCheckedChangeListener { group, checkedId -> + + SettingManager.setAimlessMode(checkedId) + when (checkedId){ + R.id.aimlessModeClose -> { + SearchServiceHolder.getNavi().setAimlessModeStatus(false) + AIAssist.getInstance(mContext).speakTTSVoice("已为您关闭巡航模式") + } + R.id.aimlessModeOpen -> { + SearchServiceHolder.getNavi().setAimlessModeStatus(true) + AIAssist.getInstance(mContext).speakTTSVoice("已为您开启巡航模式") + } + } + } + tv_navi_clear_home_address.setOnClickListener { AddressManager.deleteHome(context!!) diff --git a/modules/mogo-module-search/src/main/res/layout/fragment_navi_setting.xml b/modules/mogo-module-search/src/main/res/layout/fragment_navi_setting.xml index 1c4a00bfa9..821c7aafa5 100644 --- a/modules/mogo-module-search/src/main/res/layout/fragment_navi_setting.xml +++ b/modules/mogo-module-search/src/main/res/layout/fragment_navi_setting.xml @@ -313,6 +313,47 @@ + + + + + + + + + + + diff --git a/modules/mogo-module-search/src/main/res/layout/fragment_search_category.xml b/modules/mogo-module-search/src/main/res/layout/fragment_search_category.xml index 1b2b1d6786..10e1904bb2 100644 --- a/modules/mogo-module-search/src/main/res/layout/fragment_search_category.xml +++ b/modules/mogo-module-search/src/main/res/layout/fragment_search_category.xml @@ -125,7 +125,8 @@ android:layout_height="wrap_content" android:layout_weight="1" android:ellipsize="end" - + android:enabled="false" + android:inputType="none" android:textSize="@dimen/module_search_et_text_size" android:imeOptions="actionDone" android:hint="@string/hint_map_search" diff --git a/modules/mogo-module-search/src/main/res/values/strings.xml b/modules/mogo-module-search/src/main/res/values/strings.xml index 7ecb774534..469b899192 100644 --- a/modules/mogo-module-search/src/main/res/values/strings.xml +++ b/modules/mogo-module-search/src/main/res/values/strings.xml @@ -42,4 +42,7 @@ 日夜模式 设置刷新帧率 清空历史记录,确定还是取消 + 巡航播报设置 + 开启 + 关闭 diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index 5595cbabe8..9f01b0e2b7 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -207,8 +207,7 @@ public class MogoServices implements IMogoMapListener, mUiController.setLockZoom( ServiceConst.DEFAULT_LOCK_CAR_ZOOM_LEVEL ); mStatusManager.setUserInteractionStatus( TAG, true, false ); mUiController.recoverLockMode(); - notifyRefreshData( mLastAutoRefreshLocation, - ServiceConst.DEFAULT_AUTO_REFRESH_DATA_RADIUS, mAutoRefreshCallback ); + notifyRefreshData( mLastAutoRefreshLocation, ServiceConst.DEFAULT_AUTO_REFRESH_DATA_RADIUS, mAutoRefreshCallback ); } }; private Context mContext; @@ -505,6 +504,8 @@ public class MogoServices implements IMogoMapListener, return; } + Logger.d( TAG, "mLastZoomLevel = %s, zoom = %s", mLastZoomLevel, zoom ); + // 手动刷新触发 if ( mLastZoomLevel - zoom > mCustomRefreshStrategy.getZoomOutLevel() ) { // 缩放级别缩小 @@ -519,6 +520,7 @@ public class MogoServices implements IMogoMapListener, msg.what = ServiceConst.MSG_MAP_CHANGED; msg.obj = new RefreshObject( mCustomRefreshCallback, getQueryRadius(), latLng, 0 ); mThreadHandler.sendMessage( msg ); + Logger.d( TAG, "平移触发" ); } } @@ -536,7 +538,6 @@ public class MogoServices implements IMogoMapListener, */ private boolean invokeRefreshWhenTranslationByUser( MogoLatLng latLng ) { try { - Trace.beginSection( "timer.invokeRefreshWhenTranslationByUser" ); float factor = 0.0f; if ( mIsVertical ) { factor = getMapCameraFactWidth(); @@ -547,7 +548,7 @@ public class MogoServices implements IMogoMapListener, return false; } float distance = Utils.calculateLineDistance( latLng, mLastCustomRefreshCenterLocation ); - Trace.endSection(); + Logger.d( TAG, "move distance = %s, factor = %s", distance, factor ); return distance > factor; } catch ( Exception e ) { Logger.e( TAG, e, "warming. " ); diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java index 10250b21ab..967f8e7155 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/ServiceConst.java @@ -78,7 +78,7 @@ public class ServiceConst { public static final int DEFAULT_LOCK_CAR_ZOOM_LEVEL = 16; /** - * 自动酸辛默认半径 + * 自动刷新默认半径 */ public static final int DEFAULT_AUTO_REFRESH_DATA_RADIUS = 2_000; 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 2828c1b12c..dede957aa0 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 @@ -606,18 +606,18 @@ public class MapMarkerManager implements IMogoMarkerClickListener, if ( markerCardResult == null ) { return; } - JSONArray array = new JSONArray(); + final Map< String, Object > properties = new HashMap<>(); List< MarkerOnlineCar > onlineCarList = markerCardResult.getOnlineCar(); List< MarkerExploreWay > exploreWayList = markerCardResult.getExploreWay(); List< MarkerShareMusic > shareMusicList = markerCardResult.getShareMusic(); List< MarkerNoveltyInfo > noveltyInfoList = markerCardResult.getNoveltyInfo(); int size = onlineCarList == null ? 0 : onlineCarList.size(); - fillNumberTrackEventBody( array, 3, size ); + fillNumberTrackEventBody( properties, 3, size ); size = exploreWayList == null ? 0 : exploreWayList.size(); - fillNumberTrackEventBody( array, 1, size ); + fillNumberTrackEventBody( properties, 1, size ); size = shareMusicList == null ? 0 : shareMusicList.size(); - fillNumberTrackEventBody( array, 4, size ); + fillNumberTrackEventBody( properties, 4, size ); int num_gas_station = 0; int num_traffic_check = 0; @@ -650,18 +650,13 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } } - fillNumberTrackEventBody( array, 2, num_gas_station ); - fillNumberTrackEventBody( array, 6, num_road_closed ); - fillNumberTrackEventBody( array, 5, num_traffic_check ); - fillNumberTrackEventBody( array, 7, num_shop_discount ); - fillNumberTrackEventBody( array, 8, num_fours_shop ); + fillNumberTrackEventBody( properties, 2, num_gas_station ); + fillNumberTrackEventBody( properties, 6, num_road_closed ); + fillNumberTrackEventBody( properties, 5, num_traffic_check ); + fillNumberTrackEventBody( properties, 7, num_shop_discount ); + fillNumberTrackEventBody( properties, 8, num_fours_shop ); try { - if ( array.length() == 0 ) { - return; - } - final Map< String, Object > properties = new HashMap<>(); - properties.put( "data", array.toString() ); MarkerServiceHandler.getMogoAnalytics().track( "Launcher_Data_Get", properties ); } catch ( Exception e ) { e.printStackTrace(); @@ -706,17 +701,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener, /** * 统计埋点 */ - private synchronized static void fillNumberTrackEventBody( JSONArray arr, int type, int size ) { - JSONObject object = new JSONObject(); - try { - object.put( "type", type ); - object.put( "num", size ); - if ( arr != null ) { - arr.put( object ); - } - } catch ( JSONException e ) { - e.printStackTrace(); - } + private synchronized static void fillNumberTrackEventBody( Map< String, Object > properties, int type, int size ) { + properties.put( "type" + type, type ); + properties.put( "num" + type, size ); } /** diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java index 06105ec2f5..b5abb42654 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/IMogoStatusManager.java @@ -86,10 +86,18 @@ public interface IMogoStatusManager extends IProvider { /** * 求助状态 + * * @return */ boolean isSeekHelping(); + /** + * 是否在查看全程状态 + * + * @return + */ + boolean isDisplayOverview(); + /** * 设置小智语音UI状态 * @@ -174,10 +182,19 @@ public interface IMogoStatusManager extends IProvider { /** * 设置求助状态 + * * @param tag * @param seekHelping */ - void setSeekHelping(String tag, boolean seekHelping); + void setSeekHelping( String tag, boolean seekHelping ); + + /** + * 设置展示全程状态 + * + * @param tag + * @param display + */ + void setDisplayOverview( String tag, boolean display ); /** * 注册监听 diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java index 5dc6262546..f6f078d542 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/statusmanager/StatusDescriptor.java @@ -64,5 +64,10 @@ public enum StatusDescriptor { /** * 求助状态 */ - SEEK_HELPING; + SEEK_HELPING, + + /** + * 展示全程 + */ + DISPLAY_OVERVIEW; } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java index e3d86b0ae3..6ef9929854 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java @@ -22,7 +22,7 @@ public interface IMogoWindowManager extends IProvider { * @param y 左上角y坐标 * @param movable 是否可移动(无效) */ - void addView(View view, int x, int y, boolean movable); + void addView( View view, int x, int y, boolean movable ); /** @@ -32,7 +32,7 @@ public interface IMogoWindowManager extends IProvider { * @param params 布局参数 * @param movable 是否可移动(无效) */ - void addView(View view, FrameLayout.LayoutParams params, boolean movable); + void addView( View view, FrameLayout.LayoutParams params, boolean movable ); /** * 向window中添加指定的布局,优先级大的展示 @@ -43,7 +43,7 @@ public interface IMogoWindowManager extends IProvider { * @param y 左上角y坐标 * @param movable 是否可移动(无效) */ - void addView(int priority, View view, int x, int y, boolean movable); + void addView( int priority, View view, int x, int y, boolean movable ); /** * 向window中添加指定的布局,优先级大的展示 @@ -53,12 +53,22 @@ public interface IMogoWindowManager extends IProvider { * @param params 布局参数 * @param movable 是否可移动(无效) */ - void addView(int priority, View view, FrameLayout.LayoutParams params, boolean movable); + void addView( int priority, View view, FrameLayout.LayoutParams params, boolean movable ); /** * 移除对应的 view * * @param view */ - void removeView(View view); + void removeView( View view ); + + /** + * 隐藏所有 + */ + void hideAll(); + + /** + * 显示所有 + */ + void showAll(); } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java index 117f11db27..47202f552c 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/statusmanager/MogoStatusManager.java @@ -105,6 +105,11 @@ public class MogoStatusManager implements IMogoStatusManager { return get_bool_val( StatusDescriptor.SEEK_HELPING ); } + @Override + public boolean isDisplayOverview() { + return get_bool_val( StatusDescriptor.DISPLAY_OVERVIEW ); + } + private boolean get_bool_val( StatusDescriptor descriptor ) { Boolean val = mStatus.get( descriptor ); return val == null ? false : val; @@ -190,6 +195,13 @@ public class MogoStatusManager implements IMogoStatusManager { recordStatusModifier( tag, StatusDescriptor.SEEK_HELPING ); } + @Override + public void setDisplayOverview( String tag, boolean display ) { + mStatus.put( StatusDescriptor.DISPLAY_OVERVIEW, display ); + invokeStatusChangedListener( StatusDescriptor.DISPLAY_OVERVIEW, display ); + recordStatusModifier( tag, StatusDescriptor.DISPLAY_OVERVIEW ); + } + private void invokeStatusChangedListener( StatusDescriptor descriptor, boolean status ) { if ( mListeners.containsKey( descriptor ) ) { Iterator< IMogoStatusChangedListener > iterator = mListeners.get( descriptor ).iterator(); From aa78e07ce7a252a7382aefc1e469d7a21c0e665c Mon Sep 17 00:00:00 2001 From: wangcongtao Date: Wed, 15 Apr 2020 20:45:43 +0800 Subject: [PATCH 2/2] opt --- .../com/mogo/commons/AbsMogoApplication.java | 40 ++++++++++++++++-- .../res/drawable/module_commons_toast_bkg.xml | 8 ++++ .../layout/module_commons_layout_toast.xml | 26 ++++++++++++ .../src/main/res/values-ldpi/dimens.xml | 11 +++++ .../src/main/res/values-xhdpi/dimens.xml | 13 ++++++ .../src/main/res/values/dimens.xml | 13 ++++++ .../main/java/com/mogo/utils/TipToast.java | 12 ++++-- .../map/impl/amap/AMapNaviViewWrapper.java | 20 ++++++--- .../uicontroller/IMogoMapUIController.java | 5 ++- .../com/mogo/module/map/MapPresenter.java | 5 +-- .../com/mogo/module/service/MogoServices.java | 20 +++++++-- .../module_service_ic_seek_helping.png | Bin 0 -> 24582 bytes .../module_service_ic_seek_helping.png | Bin 0 -> 63120 bytes 13 files changed, 149 insertions(+), 24 deletions(-) create mode 100644 foudations/mogo-commons/src/main/res/drawable/module_commons_toast_bkg.xml create mode 100644 foudations/mogo-commons/src/main/res/layout/module_commons_layout_toast.xml create mode 100644 foudations/mogo-commons/src/main/res/values-ldpi/dimens.xml create mode 100644 foudations/mogo-commons/src/main/res/values-xhdpi/dimens.xml create mode 100644 foudations/mogo-commons/src/main/res/values/dimens.xml create mode 100755 modules/mogo-module-service/src/main/res/drawable-ldpi/module_service_ic_seek_helping.png create mode 100755 modules/mogo-module-service/src/main/res/drawable-xhdpi/module_service_ic_seek_helping.png diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java index 785c282c6c..f12e737695 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java @@ -1,6 +1,12 @@ package com.mogo.commons; import android.app.Application; +import android.content.Context; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; import com.alibaba.android.arouter.launcher.ARouter; import com.elegant.analytics.Analytics; @@ -57,13 +63,40 @@ public class AbsMogoApplication extends Application { asyncInit(); } - private void syncInit(){ + private void syncInit() { // 初始化 arouter if ( DebugConfig.isDebug() ) { ARouter.openDebug(); ARouter.openLog(); } ARouter.init( sApp ); + TipToast.init( this, new TipToast.ToastViewGenerator() { + @Override + public View make( Context context, String message ) { + if ( TextUtils.isEmpty( message ) ) { + return null; + } + View contentView = LayoutInflater.from( context ).inflate( R.layout.module_commons_layout_toast, null ); + TextView txt = contentView.findViewById( R.id.module_commons_toast_msg ); + txt.setText( message ); + return contentView; + } + + @Override + public int gravity() { + return Gravity.TOP | Gravity.CENTER_HORIZONTAL; + } + + @Override + public int yOffset() { + return sApp.getResources().getDimensionPixelSize( R.dimen.module_commons_toast_y_offset ); + } + + @Override + public int xOffset() { + return 0; + } + } ); } /** @@ -79,12 +112,11 @@ public class AbsMogoApplication extends Application { return sc; } - private void asyncInit(){ - ThreadPoolService.execute( ()->{ + private void asyncInit() { + ThreadPoolService.execute( () -> { initNetConfig(); initAccountSdk(); // 初始化toast - TipToast.init( sApp, null ); // 初始化埋点 Analytics.getInstance().start( sApp ); Analytics.getInstance().setAppKey( "6bbe7e0e1ecd8e2f8dc336e1678a2791" ); diff --git a/foudations/mogo-commons/src/main/res/drawable/module_commons_toast_bkg.xml b/foudations/mogo-commons/src/main/res/drawable/module_commons_toast_bkg.xml new file mode 100644 index 0000000000..ccf2eaa4d0 --- /dev/null +++ b/foudations/mogo-commons/src/main/res/drawable/module_commons_toast_bkg.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/res/layout/module_commons_layout_toast.xml b/foudations/mogo-commons/src/main/res/layout/module_commons_layout_toast.xml new file mode 100644 index 0000000000..efe4b588cc --- /dev/null +++ b/foudations/mogo-commons/src/main/res/layout/module_commons_layout_toast.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/res/values-ldpi/dimens.xml b/foudations/mogo-commons/src/main/res/values-ldpi/dimens.xml new file mode 100644 index 0000000000..619981847d --- /dev/null +++ b/foudations/mogo-commons/src/main/res/values-ldpi/dimens.xml @@ -0,0 +1,11 @@ + + + 30px + 30px + 16px + 16px + 22px + 75px + 500px + 108px + \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/res/values-xhdpi/dimens.xml b/foudations/mogo-commons/src/main/res/values-xhdpi/dimens.xml new file mode 100644 index 0000000000..8e64c9541c --- /dev/null +++ b/foudations/mogo-commons/src/main/res/values-xhdpi/dimens.xml @@ -0,0 +1,13 @@ + + + 50px + 50px + 32px + 32px + 40px + 150px + 900px + 172px + + + diff --git a/foudations/mogo-commons/src/main/res/values/dimens.xml b/foudations/mogo-commons/src/main/res/values/dimens.xml new file mode 100644 index 0000000000..8e64c9541c --- /dev/null +++ b/foudations/mogo-commons/src/main/res/values/dimens.xml @@ -0,0 +1,13 @@ + + + 50px + 50px + 32px + 32px + 40px + 150px + 900px + 172px + + + diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/TipToast.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/TipToast.java index 93af03bbae..540fa45017 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/TipToast.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/TipToast.java @@ -9,6 +9,7 @@ package com.mogo.utils; import android.content.Context; import android.os.Handler; import android.text.TextUtils; +import android.view.Gravity; import android.view.View; import android.widget.Toast; @@ -144,10 +145,6 @@ public final class TipToast { sToast.cancel(); } - if ( sGenerator == null ) { - sToast = Toast.makeText( context, msg, duration ); - } - if ( sGenerator == null ) { sToast = Toast.makeText( context, msg, duration ); } else { @@ -155,6 +152,7 @@ public final class TipToast { final View view = sGenerator.make( context, msg ); if ( view != null ) { sToast.setView( view ); + sToast.setGravity( sGenerator.gravity(), sGenerator.xOffset(), sGenerator.yOffset() ); sToast.setDuration( duration ); } else { sToast = Toast.makeText( context, msg, duration ); @@ -171,6 +169,12 @@ public final class TipToast { public interface ToastViewGenerator { View make( Context context, String message ); + + int gravity(); + + int yOffset(); + + int xOffset(); } } diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 582be511b8..26f0836020 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -605,7 +605,7 @@ public class AMapNaviViewWrapper implements IMogoMapView, if ( checkAMapView() ) { if ( NaviClient.getInstance( getContext() ).isNaviing() ) { loseLockMode(); - NaviClient.getInstance( getContext() ).displayOverview(bounds); + NaviClient.getInstance( getContext() ).displayOverview( bounds ); } } } @@ -824,12 +824,16 @@ public class AMapNaviViewWrapper implements IMogoMapView, @Override public void setCarCursorOption( CarCursorOption option ) { - if ( mCarCursorOption != null ) { + if ( mCarCursorOption != null && mCarCursorOption != DEFAULT_OPTION ) { mCarCursorOption.destroy(); } - try { - mCarCursorOption = option.clone(); - } catch ( CloneNotSupportedException e ) { + if ( option != null ) { + try { + mCarCursorOption = option.clone(); + } catch ( Exception e ) { + mCarCursorOption = DEFAULT_OPTION; + } + } else { mCarCursorOption = DEFAULT_OPTION; } if ( !checkAMapView() ) { @@ -838,8 +842,10 @@ public class AMapNaviViewWrapper implements IMogoMapView, AMapNaviViewOptions options = mMapView.getViewOptions(); if ( options != null && mCarCursorOption.getNaviCursorRes() != 0 ) { options.setCarBitmap( BitmapFactory.decodeResource( getContext().getResources(), mCarCursorOption.getNaviCursorRes() ) ); - mMapView.setViewOptions( options ); + } else { + options.setCarBitmap( BitmapFactory.decodeResource( getContext().getResources(), DEFAULT_OPTION.getNaviCursorRes() ) ); } + mMapView.setViewOptions( options ); if ( mMapView.getMap() == null ) { return; @@ -850,6 +856,8 @@ public class AMapNaviViewWrapper implements IMogoMapView, } else { if ( mCarCursorOption.getCarCursorRes() != 0 ) { style.myLocationIcon( BitmapDescriptorFactory.fromResource( mCarCursorOption.getCarCursorRes() ) ); + } else { + style.myLocationIcon( BitmapDescriptorFactory.fromResource( DEFAULT_OPTION.getCarCursorRes() ) ); } } mMapView.getMap().setMyLocationStyle( style ); diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index a9dd283213..e8a557dd79 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -7,6 +7,7 @@ import android.view.View; import android.view.animation.Interpolator; import androidx.annotation.DrawableRes; +import androidx.annotation.Nullable; import com.mogo.map.MogoLatLng; import com.mogo.map.marker.IMogoMarker; @@ -194,7 +195,7 @@ public interface IMogoMapUIController { /** * 配置自车图标样式 * - * @param option + * @param option 为空时使用默认配置 */ - void setCarCursorOption( CarCursorOption option ); + void setCarCursorOption( @Nullable CarCursorOption option ); } diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java index ff82c148d7..d5db0d506d 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapPresenter.java @@ -270,8 +270,7 @@ public class MapPresenter extends Presenter< MapView > implements private void registerVoiceCmd() { for ( Map.Entry< String, String[] > entry : VoiceConstants.sVoiceCmds.entrySet() ) { - AIAssist.getInstance( getContext() ) - .registerUnWakeupCommand( entry.getKey(), entry.getValue(), this ); + AIAssist.getInstance( getContext() ).registerUnWakeupCommand( entry.getKey(), entry.getValue(), this ); } for ( String cmd : VoiceConstants.sCmds ) { @@ -304,12 +303,10 @@ public class MapPresenter extends Presenter< MapView > implements switch ( cmd ) { case VoiceConstants.CMD_MAP_TRAFFIC_MODE_UN_WAKEUP: case VoiceConstants.CMD_MAP_TRAFFIC_MODE: - AIAssist.getInstance( getContext() ).speakTTSVoice( "已打开", null ); mView.getUIController().setTrafficEnabled( true ); break; case VoiceConstants.CMD_MAP_UN_TRAFFIC_MODE_UN_WAKEUP: case VoiceConstants.CMD_MAP_UN_TRAFFIC_MODE: - AIAssist.getInstance( getContext() ).speakTTSVoice( "已关闭", null ); mView.getUIController().setTrafficEnabled( false ); break; case VoiceConstants.CMD_MAP_ZOOM_IN_UN_WAKEUP: diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index 9f01b0e2b7..d4927ae776 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -30,6 +30,7 @@ import com.mogo.map.navi.IMogoNaviListener; import com.mogo.map.navi.MogoCongestionInfo; import com.mogo.map.navi.MogoNaviInfo; import com.mogo.map.navi.MogoTraffic; +import com.mogo.map.uicontroller.CarCursorOption; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.module.common.MogoModule; @@ -667,6 +668,11 @@ public class MogoServices implements IMogoMapListener, } break; case SEEK_HELPING: + if ( isTrue ) { + mUiController.setCarCursorOption( new CarCursorOption.Builder().carCursorRes( R.drawable.module_service_ic_seek_helping ).build() ); + } else { + mUiController.setCarCursorOption( null ); + } notifySeekHelpingStatusChanged( isTrue ); break; } @@ -785,13 +791,11 @@ public class MogoServices implements IMogoMapListener, } } else if ( ServiceConst.COMMAND_NEXT.equals( command ) ) { if ( mStatusManager.isMainPageOnResume() ) { - mActionManager.invoke( MapMarkerManager.getInstance().getCurrentModuleName(), - MogoAction.Next ); + mActionManager.invoke( MapMarkerManager.getInstance().getCurrentModuleName(), MogoAction.Next ); } } else if ( ServiceConst.COMMAND_PREVIOUS.equals( command ) ) { if ( mStatusManager.isMainPageOnResume() ) { - mActionManager.invoke( MapMarkerManager.getInstance().getCurrentModuleName(), - MogoAction.Prev ); + mActionManager.invoke( MapMarkerManager.getInstance().getCurrentModuleName(), MogoAction.Prev ); } } else if ( ServiceConst.COMMAND_SWITCH_CARD.equals( command ) ) { String data = intent.getStringExtra( "data" ); @@ -850,6 +854,11 @@ public class MogoServices implements IMogoMapListener, } if ( mStatusManager.isMainPageOnResume() ) { mUiController.recoverLockMode(); + } else { + mLauncher.backToLauncher( mContext ); + UiThreadHandler.postDelayed( () -> { + mUiController.recoverLockMode(); + }, 2_000L ); } } else if ( MogoReceiver.ACTION_MOCK.equals( command ) ) { final int oper = intent.getIntExtra( "oper", -1 ); @@ -857,6 +866,9 @@ public class MogoServices implements IMogoMapListener, case 1: mUiController.showMyLocation( true ); break; + case 2: + mStatusManager.setSeekHelping( TAG, false ); + break; } } } diff --git a/modules/mogo-module-service/src/main/res/drawable-ldpi/module_service_ic_seek_helping.png b/modules/mogo-module-service/src/main/res/drawable-ldpi/module_service_ic_seek_helping.png new file mode 100755 index 0000000000000000000000000000000000000000..ed3ff999dd5b2eeaa5c1120d8e3da088fb98cee2 GIT binary patch literal 24582 zcmV)fK&8KlP)Pyg07*naRCodHz5BCmS#{sHU*~nt?fdA*y$v*=ZeATEDA6DxMFK>GWK*Ikhm>5Y zl5JJl<&-OOe#$TTCCM+zUy!6yPL=aRl8QuOhl(sLTZIKemJ}h>V9^L9TF~#N-`)3d z?m7GHN4}pi*4T5d*M6OSZg<0-r`DNsjycAdukRXbthwe|yW6=HPCNqBPN#bkB@&j3 zTVb6M=&d7kOXk)Hyk17&M3&?A(uq~uaZ-!9YJE4G|3}H9-?G3r8(p{R+vo`VP+8y~ zcFVe{ng3z3(6=n`rciN9&ucOQZ#WD52D7r&@qJydHoOrn^DPVfn%Iq7m2PSTsup5X zdN-!$4Q6qx{jQGh>)HZW8=vQ2uhw~xH}Xe3T?N}|4998I@rFGqHZj0IDgZtW;A~?2 zH=$#hzWvaGe3{N~Vvv{CaY`=3Y4mfGI!_y58`rPSZ(QfnAjueiR4j1T<&7k{`Q0v# z9mR|zG>(2ln#rE%7#DFheIz=^ad9ZR6_y!+OZ|c+W;fY}ljv%b1)zI6h~ogH z)c{D_4tUYuc2J%NfPAPUfPJ7e;BN}lxo$X#Y^hFlY-74giWg+sCT)S(=8DzpO}61A zxN3`I=%508JYRC#m}+vR-@f zUk%-uu9D&fnS6j2ux_SUz1&2dtLm7?PZ?mn&EoCt1lVr(xRZ`H3%HqqY1Y#1Os9j+ zWU{4rODu!Va2Pr_d}n9pLSfN#I(3ISjyk;_AZQAUbT-MH2CWW^>9nVQ z?8rjnn>(0$z3ZLBL%@7hM_tBS)<*Zz^8ZzM%aTP-19)N`jfzFQDU+ktpQN5uWZQVL zws+~kx7DrK&d7k<>v8E_G`MX#P1Q~OH@}_kYU~Km+j28#GyE?VNA+qlUst(PtMHa3 zi<}yBVjYc&MLgBXQL9g)e;L{NJh$Jz-?@JMk|uT62B6!$AxnEC@a7XbU&nMhzr1Z^ zH%;$$7l9y^PbS;eXZM?BoBJ#(|Q1&ud}%wUSHe)RRA11+$!&xRfaYk z;#$0*qYC7vaY3RftioH8*PyH|TT+x|77cX9x_nZtTu1LBnMLKD&YgFj>0G^fcQIiT zv$lY@tv$RVJ^)i=v) zK-ZR?DJc@CGC6A9I(iq$%q!>4{BBuXmcjsTSlsAuv+U^rxVf%qNs3pU#Krt=01m)7 zkk9A@=caEei~OwOms68UsYUfIDlaL^Ga8_^Wph2G)0$_sWR1L9g`>9Y1V#<;&y#5{ z|J7gB>g{b81>AQSc)Q)h&S3D0Szg!avH-Q|@D_yrwm90^6gSDh*F?{0Z9GkN1TB|u zN(&a1euiYU2Y~nc*LA$AqKU@rZr#w{EB|=6!&sI>wT^OW=uC07yfwcjP8#*m$c=?H zz)RhW+R#>hMuY#R!d)0?Qm$n;XJwiBmbT36qXA9bncKD|IhQ`!f9h=u(WWMzI&G0f zo=kS-TCg(H)%d;AxpCt;rQ6(!y8d!27nPT}tcW z)k~ex=yr_(H)z*&w5{R#pmFJ3F64FQ>E)#7pD1-5?EtIuCQ1&JJe@cq)$PXP=AhJL z+6;)@t(bJqoqMA5@sA&LKKHpguT$FUY@@g70W>SiRF$nhNmUKXs}<|$StL^~2f%;w zC)=IppTEZjn}-iv4x21x9Y|$e-iIa{CC&8Ex$7%(uA=t8S+>SDBa|obkcE;;Xa{*& z*2Su{YTmi(I;R@bL1#SX9-`OT+Im6DkIz?H64_>*QMv*sHCT&uC9N%~RR_FLjasp+ zo@M!{C+F>U&Y!h zE9uBG04G1Z=ofyW+u7T@EbzWXgo)jNxXV!IP0I2z($!EcPd9mqv(B^lBuLUHPtC8N zD}rAYn)s+a=y^J)rz-o6E12-UNPV%-VqltSCH> zzo~3XH)?OqTn2Vu)%oJ`?v07^h?|;NFAE*JyY;dr4X-ur@X)PSvZ8s5yey}rbd*hX z(;Mk1P5IoV7z|$2CL&ylR9;Spd^OJbt7Wsi27D>LnLw5}(PXLCRpi@vo9Xx5v)y^_ zxgS$o`?3hQ4CNcO0GxLw*Fl;AsnSH1)rydO*+h%7JkDjDKA%6AO>J0qg4+4&U@O-| zpYfra`EtE6HpDr-=v@YC`aYTLn@iE}U+H}6Q%^PA+|_lITehft#;t)}nm2@2nT(K` z#j0%;`8M7vo&2sYUvE>)^3D}a3Vv9bF98dBxlDvg@bX+H0l30i$tIa7SkCQ2F2Izh zLrZ%clNhmchOTxwy~ANQf%7eEk`Mh6x79P1Ukr$M&9yi@d{T_agj~c)b2+uBe8#Ow zTADY67EOHcm15PhtlT`l=CX?y&*~2Nt*Q`z7x4O0P#s9L2^~#(oE9<(tWCV=(a_DT zbCsu>cmAgTJ9@wsU`_hUoB;9gFoC;VIxiQK8?p1w2e$L38@|vForAvR`aIpFGuDiG zSoF?!KHl&cI@c5R5Vz5Do>E$kT3TlL$;qma_GRVf@#STaJ}=ArCROD(YYtv7s{;ah z$YrgwWLahzzc%Sl7IqOBtF;1P4{h!8(mJ3*t~mx!(H6!g4^3dp%Sj&{m1Wui0&tov zI9jH1C)j&@Rz~GmIv*1)HqW~pT=lRt7(-Npx3tXsfeww8SlSoK%`0yz>vqnbyGO4!d8rNl-CYMy)ZV;gSCLB;#gzwnK-zA# zb6HQffx3L-7jh9-TUw@vPF`=COjs`-cP?FewDaVX>}<<<^Ynb3)zTub!JMa~B$cd9 ziG0&D=MB7^*@MBWGvBej82~1ZcCO`0SdQ{>0I>Oiyq85?#5XIXI+ttTs_lxtq6{+@mkZW^>2hfIy0*^fKJVDT8!buJGUty{V(4BL zyj52r=)sqy%R1o;OB-OR%eX~u(~;;^zP!ZKVa@6#P?Gg2^Eo}y{8Ha+nL|faCTetg zJo(FY=Jh*w=<;0f`ZC)&8JnSe;z#8Zax0ToFzRr8ERmvqPCNL(by)JZh z^?)PSnWtl7Q62P%tvbmDPdv@ad7Y=)j%wbyPV>KmC-;S|mDxIN(Nc?i{M;%Z)!wpi z))lP}-#F=q-(`ZQnvePN8@qj5tAFspCmPm?(NNVDTHEMWu1T9)4pVtzLv2eeZHxHZ z%B%D(tv1}NYI^2R`8#UPGao4MINx#r=B-^{vPyb+sk2%aJSpq_>F-OV4V2^6D~aQUkQ1FL?7+4rnn3v4RnNAy)@5CDfDZDyKCHvlEGRVs^9b z*<9YZ@k~W7bP-oWuD@EwM9(cpz$daMnh4UckY|pbx-5Ge{^U>YRfl&n@T#eHIi%vc zj5i0mmjwVL@8#%-o6@8My>0$&suK+^lXQgEa-7R-Z--2(ugtw%&cVPN5{W+nB+)$O zlbT!RI&b2kEcwX+h$xSI)KPt!M|qtG?rNP5Vje&}+xg@tUs}=Xo;)3O)var}j`B#Q zvYejUn^T)6r3wb;_sOf4#g};!Jxy|z7I`c(Y1-*DUl)$@)V?Z!DM5d#BhpQ>qY)p9 z8R*9R`<-W>ZTe(Et|xR8HwF!0mA}T$-EFw_1*lWO>ooW^tniuQObRx<2@}w$jpC$fdX}v$a*ur#_YGF(K8-KR&Kb zR5huT~ni}f!H zi8muE*+!pnX&@VUZr&;co6&tgFApl3ca_bWYbOK^1^`tMB(4OML?aadEmJ)gWw~tb z%jWdDe1JYLftKegb*lsmV74Dp71;oEexe4+EV|Mn}HKO8#B zGA_B+|4>*HRt>FX8FL#?nSSQXWqXHh{14u_K& zu!F~2TX#WXg`%t@=7>123oV`xfB4Qjzt?&C>FT4R%$=cE+l zEYse`lhe=WY<#;0jCa_Q>rkHT;Ex#KhF=@id6~-vUl~;C)2P9l{8)Drf?k%-`x@;E zup<|=Ccd!H(aMOEOi(;dKq%9XwWXk5=930JRw%+EJ8zoQ$cK(Hkjpo10N6tg*wB^g z3?Ab2)GlP9mSvzs`xw9R_=567ZT!I>&O^xMG}3K!z}Q$;1xZ!ms(FAB;ON+^D7^Yk z<^BR@lfJTy%O@Rqz6}&CXSwxtUGU{cT?gf?5z~LKEBLv2;{dqH`qJ()pZ6r{ab2M^ z^yc|yTFBSi9r``?wnUp~m$x_C?|Iq?Jq6br{f|B}UOr|R3eAqmgj~d-C3LKo2gtlJ z&c_Bjor@v7ZY=cbEY7f1C~EbA*R7}|_iz5qMe6{rL-QGw4^DO9N~*GnaTx|ZtW8W@ zdGc@*$~w#C<+9L0tvTOh(zID6m#u;(Z+Fgz-n>jT&WfWT2+42tcERhGj}syF+ge*F zr5&MjYA0aS7WIS`N2iBqdtQH}Lwfy~Wm5JLcRH7K@a^KZZ%(XT$7uq1pi2kaBS$(D zS)q@?ipDaCF_6$aoxqdIoEG_r1EA>jCvIgOiO;QH4$Npvw`66h$3Yh5TGbr5p3o6> zL@y?jR8O@mcvh^%|4$RZcdJD_ zD(1{vKO{gW9f{^ZOL^y6WO<#xSvDp+4RQ>2#QBL3ZHlspgT5$E6G)pJw60@@wVCf1 z^fHiXugg_InCCqms_(1C_e4S{~}{ z@p|B?mU$g+$td&kft~wZt*-3q2IsAspv$^kUea-w+QDMJe{7oA_aN|HV(!L?U(!|S z1&z&fs_z+nHsDFou!>XZQ>3^KA_qrU#KafYR4v0zlq@S2kw#muSH5(or+F?5FM9n! zN79FEegA~F!!5C=sWXL?&igPLUC@mvo%^1S;E6b-tNEbMVhw(Y=X5MEpE#xCTt1pZ z0zz|nmFl1gKvqjr-uafv2iOCUA(PWd$0Xz@(!s%flkxaH-SPO{0xRFENcDER`1@C; z-R^;80qamaoH*RfY<2x70qzsf-)mq6G}o^Wr@h{zy?*}@xisI>jn#9KNkF0v=!mvR zQ5K@^u%2Gz?uJix^eM@QOj6@Kt|O?<4{r%HQLH%1LSGx7e*(;ZOy`2++P;XHsa`G_ z70)^H=A_}#ya$HSC+S;QJ%O>TXe zjB>ZQO_rB3mcXK(;0^r_n(nCIcT;g9DFp*m*+y4%en5b(q6aoCcP}Hx$Z>sHYR??C)$R*?uKly1a&^5 zTwa!^;jHGNSrAxCWjXMSL8UcXA)7~4o;-iAz_g`HBVPkg^Z<&}5fs_C>}0GJ$k2X4fJLEmH;&|J0*VCRvz5a{}q?j9Z8*F8M^MFH&HhJtSQc>(oX z0@!z_+uQi}rQa)1ex;BtaZFX$rQY%J{c=a%D<%8t#8?3SGXeQas*B&dAm}4znnVW& zTN%Sr`@{x4`bs<+xeJki8Zvyf-2sc{TsAfUL8rb{rx98JoOnsOKIiAZzfX5ob^bs( z@DZT|N)fC1;A3J+WlU5lsI*2aF?goR<9U9Q;@Y*h71p=>W%M=x2gu?sx6DUv3BWn{ zfSmaD-eAS~VYhvsi;| zJe&1_`9T#F`)B=Um7O3FAdyzHx=pGQPXbk$KLNKUKMD{RvH}e!;e)bl4~Y4A((iwD zytDI=ETKI`lqpL_v)AL!E9#Hf>HyTW%0wu@8b!u~4q01XTW3;y^0u}fmy7dQZ#23* z7!H4WIv#&OH^%SNiS$Li!TkpsV?oufGy&w$=`r;Oc;Jh4nQKvw_63;obemlCIb`a5 zjtzdp1UKwtD^yYt70xPB%{5w4*hJ51d<^c#3hQg1h{-^g^P!Hs(~@i8`2@DGyv`r= z09?da;Bpyjw}344p~qc{a2Y(`Edbzr{eDlsuklm5j6W#Z9r?B29`Ejc1>g#_J>7iu z{W?r@Y(>7OzIsOg3m`ioqt6&fOlHQ*CRoff0>%AFV(7)?UcFOiCW7nT{iCB#s2!ID z#^=Xp&V07FxA%ljv{|#vA|n^F>G8C?9LL9AUzF#o6IfuUC-(%3q0Yg0j$tpjj7RT4&W$9 z1`v22`2cu;Fo5fid4sR~AR~NU?^n1A@le8n8}&$^Ft9r~IQWdf@RM=|ULJ36fAM&0 z>j_!A?qoD#E!)~Fq*#5EXp8bQ^oXONv*XTdF8{}0Mc%>d6KiSMB;j=8qO1=#^?*Y+ zd6ZfC_R-P%(b9 zt9+u$JH5eRA|N9-4ZeXM3JeYpA5{M?cXg#0oj?DZ;^&^j_-23(3tP3saZ~3_!{uWG zIyrA&06xkAVY0-D$IJbHyDv<6$aqYiFYNm_h#$+;M0rLkWOItr8erqyln>0pJqzY( z*~|!Q|4RT!CxM!5plmKnRi*NvxehEZWp;4W);~Oan_Px}q>d%FUkIGt~nVx4humfvIg- z)1IyplcT-8FAt86UK|`B|I*<4_1_rZcH93p(sG+Dv{Xp9_$aAx zyu-oaUyLl%qO3U%aIzK92RFbQame|^h0og=O(yPFi*A+|@E#uix+dwWtnR-&-rjyi z4Z*Y-fJ?wF06POVU=?T$qyjCm(1Cueb+n+X8f$&)iP0G3(;BBBCN@yp#ibCS0iMkJ zWD1yZ8KlIP>Bce+TH(V$KyuL0hp{r%sRPkTd!xCstki7AcM1<=HRRM;y( zTP&SnaVK4s8BlQ=z3qm;LeAQd{gbGJ374RtE0&MYndtJR3e_6LDiwHjKFE=fKEST3 zrURvM3GmNZcI%q&3f{N3|3()1^IJzppXpz{`d^Iq_x~4NWex_u)TaCDVt>bI4Fw?RWvW>PS!PzqYEt zUQocP+bGSlu%>zi+MY}!;Ie=$Y2*r0N0OWE&N@%6Tc#N;vbGKT=-|=!NPUu zdtr&mrVtzU0XD6w13B^5-=|Au$`f^M}J zyXz1G|b?U~>>fYJ;E0vuYj7A?HT)Fa}9^ZD`Z`q0jV-(va zskk}NUXHXG-d84aZZCIAp3Zsl^n4ypL|y{L2zEOB$YS&<*D*J}tOcead5ApUiPaER ze!n8;ET?np=p_uU2QRDMyfLVW2hPYxT!F1`-a9zBES(SZZ`^ofboT5+;^nDbXTZZ6fX~{tgN1ri1AYA9p_@^_IKx97Il%IC z=s>28u9BiC)k*yrzkMCJ5pBB{Ra6erWbIoPz-8%_!vYtp<%zgNDh4N5^L$D(paII@ z^f>Y41D&P0Y{IIzJGgf3gL)MEle!D~=15CrcF7g5TUi4fGiC?i1uqU(0adQ4?$vEZ zM_Lo+CJJ6zS&KC%#?OowWmL-)rx zf|km2I%$@Jh~r2bbX-=q?b_RLRyP)()?~dr+THzqyFpWF0bb&gB7YTp?31n2!K7ycp5uoX8{1!dM~IzjnJpF zMLQzYMwx$o{{>4Z_dq(dr&F90>QH^EPFwTM;%bFOc{{({C!S8nBmCl>oqx4`c=-4F z2M7Pz@ws#VYq2WP)r8x*M%xq^+o_EsvA?>HLdsMV|J6Lt8*%nz)HnHfIehua;CcSL z4pMC)+U|RW*(kMAI0=Bcd!*ruEHEAS&YM8vzf{hEHHA7o@m0zI94d&nu3h_-MsZg@ z?{8~jWuNT91Ylz(4WNqEiN36^0HX9r22o%#mjSDbpNz$IzZdH(AJh(|aZM%TH+9^K z;V*lC0d(FK083s(mJxJ`kOLxw=!^j*!oEy0CS589Vla0^K-Ox4`MnhM)kHo-rR`~5 zEU|*ER~J69Hmmiiv#WLO7j(t>s!oKT(UZmxboTcjDuIl)c>Ac^+J&+u19gNOH5F2u^ZP6A-u2UTglmnB>NmoMqYi(7=b3?OYq&tFAfK2**=B$W?8m$|f;dk*)GC#$loLQc@b7O8hkr*;9)C{TFn`mRGrIT ztALvTc*inSaw!DXZeJ$RWRKr)xNFz`UX2F1sPHYq5hLbX`` zc|gsLm{udSlqRQ^N5*OrH*fMKWQ`}?E&Kw35p{AdK&=5=)e2>*)f{3pvrr;6oScP~ z1lE*jXWjR-IsRGQ3w(4m8vXnJVBnj6e5`0+8L&Riz7oM$qtBPq!cv#{spRAVot%JN z)mQR^*99<}Fz8$W*s`zjzZ@*x-r?aVG%BOv_V(AYkODP;H|t9~0k3Y8l*bpAB`v^< z&x_>+yj-RQ#{S5yt~zU*eB@H#2jfbZ8zHa)WIvhAs&iu{9zdK2%%_&g)GTdr5Qm^S z7L!&V1ZKfnH(Fi!IOv{i$s(gcKCh&NdeL+qxibvN)Lz!&bmrh>(0(bmn@(F>))j}f z;t98a+NkuWz2WfFI;lV0Id|^MlBM#zX`Xhv6wQKHKFh9^h>CK(O^U$M%6{;=0LB6{ zU>fTs1B0_}D9fV9CouFenNG8^$>HH8P29U=eZQgOy7|8139D-$695GZS=LTZtD@a; zPd9O9dGUp@yf~u*u?~PMfb~c2E|502fxTgFeU+CddTu&7bI)Y*6L(Ig@7$Yq_w@?$ zwg#9bxrts+9_pF(tIzd1-~N8L|J@_4f9jO#^@TIpR*7TeCqi^rH)p!KjmION25!j< z5RS+4*A1a`la&WGN%&P-zO#@jCt}-9Pl*e~7-ZXHN}szri67ZLK7LvL&POyJUr|5( zy*fS(0FdKJ9Qz=s0ISQ_Fp2BI=P~wa$IG8FM=k?T$P!1ot_{k*JO}kxuW*s$?d@e& zw%}cRGYe&!vv4DKs)AKQv>1IyX`$_lGcyj6f$@p*Gt|v;W*ZWb- zJ?#)s`}z@yy))C!-W}u4-S6p)e&P9U_o@HT>wQrl54+Cu;BMc%7FkSL{mEz|Yb>W& zEtVw~BDs^)Nux`Gx+B2q?2^^iii0Yn?bIqzvW9K@C!|iREvV%oiAr@c{Dp4tKGwZ{ z{T`NG5{tzkBuMD@5=^wSzZG#>E5w+>6&F`K~B5yetJCm^yO*i&734$0}lkU7u1aFQgE!MNtYg} z$*c$n7u4+AmERF6?wn5V`A^2@U{npn9{jYFCC#%XfH9d?_lX*rb0AiVRhevBf z1HN1xtkVLrpLFb{kWtoud~9iuwFbPDbJ7CO$@ccQ^;*(LyTjp!v{LZhV*CQ2VkyQ~ zZbvbu&|*$}ydBI=x5A>li5}(U*ymJQ%Vg!eUdRA=>9CFq0U%^lco?*Dhz^8c$|pcZ zS$jN(SKn^9SCey2;QewaC@e3NX*XkGeKBRg1dFWBDD5|L8eMZM*6npYQ4i4FE3hh(9jD17E*2>|xlH@I#pwg%NEVvj_ig*BtH(K5v~) zf8y-%=*nq%dquu6;zx0q!ZfufiJJx z)K8&V;yN@@Hpbdwc_6F&m`?7Wkb5!E$->%ebMWy+t`4+jiIY*izNpLH($|KOtCMDh0W%gDYb@}d|L}PH_q9oJ_fTN^j*f4uo7Vv^7Xg{X3Abjf zB?v;?(#c+HACF?C*?jyTG+p1 zI#mEuR{)sGPA3F7d4Lh$Icu&dp9JF&>fR|+bwzI`T(yZ4sI@lAY|VHz=>n2ZcvxRy z3Ae&6vV+EaW0uLZJ3%_+lVZ8#Hhf?-{=4|K*QN5?vam1f(33GOVF{#m2(%HiEmJ_o z>QA*=OS#+4e&-qFRWWYH-n4V(fzjyi$hz|OGy5;N3fRLI%ge>VACD)0cCvBOsb7Fv zfGti+^2VU>(dgYocEngyuqePA$0A$GQ2e} zz%c2oJQUU!0637`@>2f(@#sN)b$ItkbNM~#=XP0;Vf|Gx*4Kf2tX&5qrH=({J?V1` zEFN3o)v(*(DX)*HnOh;!I!YX|-H$o??m5WCt z3+NGmpU~O*R*k6|p>fU13pS7HW$nBr!4qX@K0#Jyxu7nu9FW;Gcvo&jlYra@z67pI zb^iroO_*+a9E_aWOel0fYDd)u86`^j|0U`x9B#sFE(5&rDdd0r#R##lA5_wMoN zBj$rE%ZE}U4M+{B&PUtL?NQc36|g~9JFVa3^?-xD&^@h2+!5tPTszrkeDmVK)zY{OYdTM9wQO|&*U#pplSjzhu5&CK$^(ZKgC$d_Z}TeXCMI4I zM5#@T7;HcT#CB;_owBfY`IXhS4LTAa4>%RGu4R|$-tMG(M(eoe0WD_-z}32(Szj!& z*17}^fmreG-FJ81|7(A@bLai<>YTarj?T;9f2{NLpFPz1&gVX_*FlctY|Fq1ioB^d zVP}v|1|AeYtJb_px!b3ccM6)ILmtKaZv+|PY&r-N{kk*PUbyR5;mbuxGJyif>-lL+X*7!g%n0_?z zY@CK4D2MhgP0lqP$MSh;r&(Gm(}Zf$F~~}5c+>&A^lDYWZhq8S1FrZCymBaX*2Uv&n1yR$*M^yB|ghvUaS_Vb-T z_;3G*&e3zv2)MG=I)Svbr6pgXPFT3ArQo~NHo52hi~4BEE8X7HXcorx=$Tz_))uv| zCkMsfxud;+m8(UhMY6!j2EcPP=<4Jrw_mNkX>J7Iu7k1AGABYVVIfb?5t>^RxXPP6 zS72$zObaqmQAS=f>4RXvG7Z&ysBNQ1xniM>cdKe2jMFLv4+)I3SUw}egj>DE#8WO) zXE#E{y@6Z^Zt?`8b9y|?dauq7^a^5{%TSzX?0*oSg89Loa zKGo#1gT_NHK86eb+)zwDXQEj)2Zlh!<`+rE5p*GEAKH;5LOFvV*TXLV__Obm+c4N; zpOan53ry!Ld#p$+4=z{s!KEo7!V(>X#p(8&d~yw3}FB z25jWGkrPb-B{wJd_ZVc%r?Hwehxw)#`5v}V>!P&?1Oa>~4% zHhS>iBx`*`nh6e8V%&owAF%=2%D7|;s|Fx2+nsD-8STbPRyBach#RD3jqkc&zc?UG zF$-Sid81ibw{z!v?>EbhoRB09Dxd|@D_6*L3x{^XNV>Qh7zf=2*3RO$CWmF?8t|$ zq!8X|=auh2>eA5=P6&z$Akzue*Se*!?V~9Ys|ETSL>}f8X<}-8!-sVM%&^Bmyxs-? z_o30Z(`=dTT(`k`r_6p}*ny@25bRmgU~PawB>(i+^xk9v3jj^p2g*TBo)>|h`SWk6 zOf(TFHy-^%2AvGBcCyu8F-P3m-*VyySR*#xrhoXq`~(`ob-CUq-kVFap-`2a!%KyE z0H#xMy(h#QCjGHFg9rN8yr&vy=)mZmMmW-51e8-5j2TqJSl3Q#(f%c=AkEZG*oWavEdg_X_A@^E$sf7azo~O5VJD z0Jz+-IrYy2aGMy)qoOvRP1DO0*slFZKxwqVYA_dj*2rv~ELUMPJvD$PzI>u*Y_D{> z-}O=D2Hp?O2(3XF5cQl*kIjxcU;6L<$IcJFp$|p^&g{VQKKz^iqVui)>$k+u3B_%e zG+MQCOK?q8GZTVC^8BFxomu6Tg!TtpUvhHOL>7IW^+(&^lmAI5@RJEXe6GnK{;5x_3VQ!4EoL z`fvXG&gBn%Ku_Y{-PynE4*9%~ncHyvvB$L=LXRQTDz?`EaI7#ETTa+}%`-=jj4;G*j2zm2?K>;kqVehL0{%89A-^ar7sKdU0 zqaKCzWM6~o)o%1rXCOUWljF{|jvZO&Ei5iH#e>3iF#i|JOI>mZ(1$(O-r(aO4EkTE zZWZ!|v7JbI4sPwSwu`lxIB;*{%4}msDR{x@1;d;H31K2JOXtki~ zHx^!J0Nz-?<|@)wbN`54>`D{2O(v5bl9jYsGeBU#5U5ETXq2|slVyb^YxJR32CnD} zH^2@j)Ga9QTnH-yE>@4vJ#86)0kSqwPKKSW@lap}yrK!FdI8Vf2)pNl z^IzMUF?d3L=~QpqKBe4HF2q}P!@^mt-HJZQ05mSEyf3eQ>#ZN&(gBFG8$3&6oy8Am zC$fwNXm;HKs%Hj+KhhfQix@gC_c$N;w73YivVavfkP6T$)7K>xJ75jC23}-1=o)T= zKYe?(*ZnJdiPlu(zCf7lrE#aaGNPGremu%Z&V<$DBvHg_d7l?T2 z0-ouUTU);^G~K}G9Twc-PsTbCsM8KkBx{TMtO>)l5hC4{pzQ``b|KLh9f|?8T}4Po(03u;F5XUe zYl|@=tOicTJPwzi|KI1R&eN`gX$k{bmusM$Hh>vS8_@$l*X;9u!Y zof18-Nw&Y*{tXU`^jFq&x#vzN?)v)e>`fCp$aO>6eI}*0-MC zE4hCkvKkpCoE^Msw|-ValPx5gr4?%UT&eD**mA3_=>n}BWV75RCpZ9THIUbm_11-c z6jV?a^Z4aK|Dl&Vy@&4@Pkwf5GQLk8>hnPpY%BgP!8)llv?2_zc6$%MGU)$>05>ww zYB!`TwY+m#UjY@G-lf)ew(SHGaLq5blS*3cBpeu6@ss^#PBK=3+H6;xqAsItjYfB9 zeDBhaA$}vt58dL=Zt44nQvF z)`si1CKev8Mtn{0e0_R*IDG4k?d>O+P#mj5zbw@3rbrm$7D=!72-|XRxejxQmdO>q zRi?FDj3J*b<7H)e2GnC9mIJO2ovK_2I(k9h9Mh{zU)h~bF7NBRY+A=XFF@&wQc}_B z9_ct3PP;E&>G%IiKFL);$n#vSaoG1&%;;V1s)?8d%U2BdhOW9dkl=CVP8-E}ap4j6LV$7$w!1xpBQ-5B{R%R8NILob4v8GBoAawZNPu=X3z1d5vnSGp8XNVDz*P6g*89IR?th9Plph zX#r7S-P`*{e>nUV`Fs!b1z_P(DC6~c(4yCTHIF*@%&uU-JrUMTfKbv_FT{rxmL&wz z!j&FiF@Jc;5(4n}w8wym7deG|#>i2#iZX}{_B

TTRO)mkWzC^D8uIs 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 literal 0 HcmV?d00001 diff --git a/modules/mogo-module-service/src/main/res/drawable-xhdpi/module_service_ic_seek_helping.png b/modules/mogo-module-service/src/main/res/drawable-xhdpi/module_service_ic_seek_helping.png new file mode 100755 index 0000000000000000000000000000000000000000..aa6eb75043030ff8a0c158c5a08435ac4232a463 GIT binary patch literal 63120 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 vX8Pes_V&}WhU>E8A0Z&#miMq}Pu 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 Ym<$o)Wd>OO#=CposOhLyDqDQ{f7-t)od5s; literal 0 HcmV?d00001