diff --git a/app/build.gradle b/app/build.gradle index e40891f0bf..6c342f9507 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,8 +61,8 @@ dependencies { // implementation rootProject.ext.dependencies.moduledemo // implementation rootProject.ext.dependencies.moduledemo2 -// implementation rootProject.ext.dependencies.modulechattingprovider -// implementation rootProject.ext.dependencies.modulechatting + implementation rootProject.ext.dependencies.modulechattingprovider + implementation rootProject.ext.dependencies.modulechatting implementation rootProject.ext.dependencies.moduleonlinecar diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index d2f1206eb8..597a420527 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -6,6 +6,7 @@ import androidx.multidex.MultiDex; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; +import com.mogo.module.carchatting.CallChatConstant; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; import com.mogo.module.onlinecar.OnLineCarConstants; @@ -27,8 +28,7 @@ public class MogoApplication extends AbsMogoApplication { DebugConfig.setNetMode( DebugConfig.NET_MODE_QA ); MogoModulePaths.addModule(new MogoModule(OnLineCarConstants.TAG, "CARD_TYPE_ROAD_ONLINECAR")); MogoModulePaths.addModule( new MogoModule( TanluConstants.TAG, "CARD_TYPE_ROAD_CODITION" ) ); - MogoModulePaths.addModule(new MogoModule( OnLineCarConstants.TAG, "CARD_TYPE_ROAD_ONLINECAR")); -// MogoModulePaths.addModule(new MogoModule( CallChatConstant.PROVIDER, CallChatConstant.MODULE_NAME)); + MogoModulePaths.addModule(new MogoModule( CallChatConstant.PROVIDER, CallChatConstant.MODULE_NAME)); } @Override diff --git a/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/SocketManager.java b/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/SocketManager.java index e5fe7f1b36..53dac19903 100644 --- a/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/SocketManager.java +++ b/foudations/mogo-connection/src/main/java/com/mogo/connection/socket/SocketManager.java @@ -88,7 +88,7 @@ public class SocketManager implements IMogoSocketManager, OnSocketReceiveCallbac listener.onMsgReceived( GsonUtil.objectFromJson( payload.getPayload().toStringUtf8(), listener.target() ) ); } } catch ( InvalidProtocolBufferException e ) { - Logger.e( TAG, "parse msg error.", e ); + Logger.e( TAG, e, "parse msg error." ); } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java index d0dcbdfe6a..42ef51dff1 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsFragment.java @@ -34,6 +34,8 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme private View mExit; private IMogoFragmentManager mMogoFragmentManager; + private View mLoadingView; + @Override protected int getLayoutId() { return R.layout.module_apps_fragment_apps; @@ -62,6 +64,8 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme // } // } ); // mBottomSheetBehavior.setState( BottomSheetBehavior.STATE_COLLAPSED ); + mLoadingView = findViewById( R.id.module_apps_id_loading ); + mLoadingView.setVisibility( View.VISIBLE ); } @NonNull @@ -78,6 +82,7 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme @Override public void renderApps( Map< Integer, List< AppInfo > > appInfos ) { + mLoadingView.setVisibility( View.GONE ); if ( mAppsPagerAdapter == null ) { mAppsPagerAdapter = new AppsPagerAdapter( appInfos ); mAppsPager.setAdapter( mAppsPagerAdapter ); @@ -88,5 +93,6 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme } else { mAppsPagerAdapter.setPagedApps( appInfos ); } + mLoadingView.setVisibility( View.GONE ); } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java index 9aade9ba5d..cf5ff4e31b 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPresenter.java @@ -1,26 +1,16 @@ package com.mogo.module.apps; import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.Observer; import com.mogo.commons.mvp.Presenter; import com.mogo.module.apps.model.AppInfo; +import com.mogo.module.apps.model.AppsModel; import com.mogo.utils.ThreadPoolService; import com.mogo.utils.TipToast; import com.mogo.utils.UiThreadHandler; -import com.mogo.utils.logger.Logger; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; /** * @author congtaowang @@ -32,13 +22,8 @@ public class AppsPresenter extends Presenter< AppsView > { private static final String TAG = "AppsPresenter"; - private AppFilter mAppFilter; - public AppsPresenter( AppsView view ) { super( view ); - RefreshAppsListLiveData.getInstance().observeForever( s -> { - renderAppsList(); - } ); } @Override @@ -49,45 +34,17 @@ public class AppsPresenter extends Presenter< AppsView > { private void renderAppsList() { ThreadPoolService.execute( () -> { - final Map< Integer, List< AppInfo > > appInfoList = loadAppsList(); - UiThreadHandler.post( () -> { - if ( mView != null ) { - mView.renderApps( appInfoList ); - } + AppsModel.getInstance( getContext() ).load( appInfoList -> { + UiThreadHandler.post( () -> { + if ( mView != null ) { + mView.renderApps( appInfoList ); + } + } ); } ); + } ); } - private Map< Integer, List< AppInfo > > loadAppsList() { - Logger.i( TAG, "load apps list." ); - if ( mAppFilter == null ) { - mAppFilter = new AppFilterImpl( getContext() ); - } - - final Map< Integer, List< AppInfo > > pagedApps = new HashMap<>(); - final PackageManager packageManager = getContext().getPackageManager(); - List< PackageInfo > packages = packageManager.getInstalledPackages( 0 ); - int counter = 0; - for ( int i = 0; i < packages.size(); ++i ) { - PackageInfo packageInfo = packages.get( i ); - if ( mAppFilter.filter( packageInfo ) ) { - continue; - } - int page = counter++ / AppsConst.TOTAL_SIZE_EACH_PAGE; - if ( !pagedApps.containsKey( page ) ) { - pagedApps.put( page, new ArrayList<>() ); - } - String appName = packageInfo.applicationInfo.loadLabel( packageManager ).toString(); - String packageName = packageInfo.packageName; - String versionName = packageInfo.versionName; - int versionCode = packageInfo.versionCode; - Drawable appIcon = packageInfo.applicationInfo.loadIcon( packageManager ); - AppInfo appInfo = new AppInfo( appName, packageName, versionName, versionCode, appIcon ); - pagedApps.get( page ).add( appInfo ); - } - return pagedApps; - } - public void launch( AppInfo appInfo ) { if ( appInfo == null ) { return; diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/RefreshAppsListLiveData.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/RefreshAppsListLiveData.java deleted file mode 100644 index 47ca92529a..0000000000 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/RefreshAppsListLiveData.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mogo.module.apps; - -import androidx.lifecycle.MutableLiveData; - -/** - * @author congtaowang - * @since 2019-12-30 - *
- * 刷新app列表 - */ -public class RefreshAppsListLiveData extends MutableLiveData< String > { - - private static volatile RefreshAppsListLiveData sInstance; - - private RefreshAppsListLiveData() { - } - - public static RefreshAppsListLiveData getInstance() { - if ( sInstance == null ) { - synchronized ( RefreshAppsListLiveData.class ) { - if ( sInstance == null ) { - sInstance = new RefreshAppsListLiveData(); - } - } - } - return sInstance; - } - - public synchronized void release() { - sInstance = null; - } -} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppLoadCallback.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppLoadCallback.java new file mode 100644 index 0000000000..af16816210 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppLoadCallback.java @@ -0,0 +1,15 @@ +package com.mogo.module.apps.model; + +import java.util.List; +import java.util.Map; + +/** + * @author congtaowang + * @since 2020-01-09 + *
+ * 描述 + */ +public interface AppLoadCallback { + + void onLoaded( Map< Integer, List< AppInfo > > appInfos ); +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppsModel.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppsModel.java new file mode 100644 index 0000000000..e637c40733 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppsModel.java @@ -0,0 +1,185 @@ +package com.mogo.module.apps.model; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; + +import com.mogo.module.apps.AppFilter; +import com.mogo.module.apps.AppFilterImpl; +import com.mogo.module.apps.AppsConst; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * @author congtaowang + * @since 2020-01-09 + *
+ * 加载并保存 app 列表
+ */
+public class AppsModel {
+
+ private static volatile AppsModel sInstance;
+ private final Context mContext;
+
+ private AppFilter mAppFilter;
+
+ private Map< Integer, List< AppInfo > > mPagedApps = new HashMap<>();
+
+ private AppsModel( Context context ) {
+ mContext = context;
+ mAppFilter = new AppFilterImpl( context );
+ }
+
+ public static AppsModel getInstance( Context context ) {
+ if ( sInstance == null ) {
+ synchronized ( AppsModel.class ) {
+ if ( sInstance == null ) {
+ sInstance = new AppsModel( context );
+ }
+ }
+ }
+ return sInstance;
+ }
+
+
+ private AtomicBoolean mIsLoaded = new AtomicBoolean( false );
+
+ public synchronized void release() {
+ sInstance = null;
+ }
+
+ public void load( AppLoadCallback callback ) {
+ if ( !mPagedApps.isEmpty() ) {
+ if ( callback != null ) {
+ callback.onLoaded( mPagedApps );
+ }
+ return;
+ }
+ final PackageManager packageManager = mContext.getPackageManager();
+ List< PackageInfo > packages = packageManager.getInstalledPackages( 0 );
+ int counter = 0;
+ for ( int i = 0; i < packages.size(); ++i ) {
+ PackageInfo packageInfo = packages.get( i );
+ if ( mAppFilter.filter( packageInfo ) ) {
+ continue;
+ }
+ int page = counter++ / AppsConst.TOTAL_SIZE_EACH_PAGE;
+ if ( !mPagedApps.containsKey( page ) ) {
+ mPagedApps.put( page, new ArrayList<>() );
+ }
+ String appName = packageInfo.applicationInfo.loadLabel( packageManager ).toString();
+ String packageName = packageInfo.packageName;
+ String versionName = packageInfo.versionName;
+ int versionCode = packageInfo.versionCode;
+ Drawable appIcon = packageInfo.applicationInfo.loadIcon( packageManager );
+ AppInfo appInfo = new AppInfo( appName, packageName, versionName, versionCode, appIcon );
+ mPagedApps.get( page ).add( appInfo );
+ }
+ if ( callback != null ) {
+ callback.onLoaded( mPagedApps );
+ }
+ mIsLoaded.set( true );
+ }
+
+ public void appAdded( String packageName ) {
+ if ( !mIsLoaded.get() ) {
+ return;
+ }
+ if ( TextUtils.isEmpty( packageName ) ) {
+ return;
+ }
+ if ( mPagedApps.isEmpty() ) {
+ return;
+ }
+ try {
+ final PackageManager packageManager = mContext.getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo( packageName, 0 );
+ if ( !mAppFilter.filter( packageInfo ) ) {
+ String appName = packageInfo.applicationInfo.loadLabel( packageManager ).toString();
+ String versionName = packageInfo.versionName;
+ int versionCode = packageInfo.versionCode;
+ Drawable appIcon = packageInfo.applicationInfo.loadIcon( packageManager );
+ AppInfo appInfo = new AppInfo( appName, packageName, versionName, versionCode, appIcon );
+ int pageIndex = getPageIndex( packageName, true );
+ if ( !mPagedApps.containsKey( pageIndex ) ) {
+ mPagedApps.put( pageIndex, new ArrayList<>() );
+ }
+ mPagedApps.get( pageIndex ).add( appInfo );
+ }
+ } catch ( PackageManager.NameNotFoundException e ) {
+ e.printStackTrace();
+ }
+ }
+
+ private int getPageIndex( String packageName, boolean add ) {
+ int totalPages = mPagedApps.size();
+ if ( add ) {
+ if ( totalPages == 0 ) {
+ return 0;
+ } else {
+ if ( mPagedApps.get( totalPages - 1 ).size() == AppsConst.TOTAL_SIZE_EACH_PAGE ) {
+ return totalPages + 1;
+ } else {
+ return totalPages;
+ }
+ }
+ } else {
+ if ( totalPages == 0 ) {
+ return -1;
+ }
+ int pageIndex = -1;
+ for ( int i = 0; i < totalPages; i++ ) {
+ for ( AppInfo appInfo : mPagedApps.get( i ) ) {
+ if ( TextUtils.equals( appInfo.getPackageName(), packageName ) ) {
+ pageIndex = i;
+ }
+ }
+ }
+ return pageIndex;
+ }
+ }
+
+ public void appRemoved( String packageName ) {
+ if ( !mIsLoaded.get() ) {
+ return;
+ }
+ if ( TextUtils.isEmpty( packageName ) ) {
+ return;
+ }
+ try {
+ final PackageManager packageManager = mContext.getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo( packageName, 0 );
+ if ( !mAppFilter.filter( packageInfo ) ) {
+ int pageIndex = getPageIndex( packageName, false );
+ if ( pageIndex == -1 ) {
+ return;
+ }
+ int totalPages = mPagedApps.size();
+ List< AppInfo > dynamicAppsList = new ArrayList<>();
+ for ( int i = pageIndex; i < totalPages; i++ ) {
+ dynamicAppsList.addAll( mPagedApps.remove( i ) );
+ }
+ int counter = 0;
+ for ( int i = 0; i < dynamicAppsList.size(); i++ ) {
+ AppInfo appInfo = dynamicAppsList.get( i );
+ if ( TextUtils.equals( appInfo.getPackageName(), packageName ) ) {
+ continue;
+ }
+ int page = counter++ / AppsConst.TOTAL_SIZE_EACH_PAGE + pageIndex;
+ if ( !mPagedApps.containsKey( page ) ) {
+ mPagedApps.put( page, new ArrayList<>() );
+ }
+ mPagedApps.get( page ).add( appInfo );
+ }
+ }
+ } catch ( PackageManager.NameNotFoundException e ) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java
index 218704c86a..e3e599243f 100644
--- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java
+++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/receiver/AppInstallReceiver.java
@@ -4,9 +4,8 @@ package com.mogo.module.apps.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
-import com.mogo.module.apps.RefreshAppsListLiveData;
+import com.mogo.module.apps.model.AppsModel;
public class AppInstallReceiver extends BroadcastReceiver {
@@ -14,31 +13,23 @@ public class AppInstallReceiver extends BroadcastReceiver {
public void onReceive( Context context, Intent intent ) {
if ( intent.getAction().equals( Intent.ACTION_PACKAGE_ADDED ) ) {
String packageName = intent.getData().getSchemeSpecificPart();
- notifyRefreshAppsList( packageName );
+ AppsModel.getInstance( context ).appAdded( packageName );
}
if ( intent.getAction().equals( Intent.ACTION_PACKAGE_REMOVED ) ) {
String packageName = intent.getData().getSchemeSpecificPart();
- notifyRefreshAppsList( packageName );
+ AppsModel.getInstance( context ).appRemoved( packageName );
}
if ( intent.getAction().equals( Intent.ACTION_PACKAGE_REPLACED ) ) {
String packageName = intent.getData().getSchemeSpecificPart();
- notifyRefreshAppsList( packageName );
}
if ( intent.getAction().equals( Intent.ACTION_PACKAGE_CHANGED ) ) {
String packageName = intent.getData().getSchemeSpecificPart();
- notifyRefreshAppsList( packageName );
}
if ( intent.getAction().equals( Intent.ACTION_PACKAGE_RESTARTED ) ) {
String packageName = intent.getData().getSchemeSpecificPart();
- notifyRefreshAppsList( packageName );
}
if ( intent.getAction().equals( Intent.ACTION_PACKAGE_DATA_CLEARED ) ) {
String packageName = intent.getData().getSchemeSpecificPart();
- notifyRefreshAppsList( packageName );
}
}
-
- private void notifyRefreshAppsList( String packageName ) {
- RefreshAppsListLiveData.getInstance().postValue( packageName );
- }
}
\ No newline at end of file
diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml
index 85340fa44d..86f95931b2 100644
--- a/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml
+++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_fragment_apps.xml
@@ -30,4 +30,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_210" />
+
+
* 描述
*/
-public class MapPresenter extends Presenter< MapView > {
+public class MapPresenter extends Presenter< MapView > implements IMogoVoiceListener, IMogoVoiceCmdCallBack {
+
public MapPresenter( MapView view ) {
super( view );
}
+ @Override
+ public void onCreate( @NonNull LifecycleOwner owner ) {
+ super.onCreate( owner );
+ registerUnWakeupCmd();
+ }
+ private void registerUnWakeupCmd() {
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_ZOOM_IN, VoiceConstants.CMD_MAP_ZOOM_IN_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_ZOOM_OUT, VoiceConstants.CMD_MAP_ZOOM_OUT_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_2D, VoiceConstants.CMD_MAP_2D_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_3D, VoiceConstants.CMD_MAP_3D_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_LIGHT_MODE, VoiceConstants.CMD_MAP_LIGHT_MODE_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_NIGHT_MODE, VoiceConstants.CMD_MAP_NIGHT_MODE_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_TRAFFIC_MODE, VoiceConstants.CMD_MAP_TRAFFIC_MODE_WAKE_UP_WORDS, this );
+ AIAssist.getInstance( getContext() ).registerUnWakeupCommand( VoiceConstants.CMD_MAP_UN_TRAFFIC_MODE, VoiceConstants.CMD_MAP_UN_TRAFFIC_MODE_WAKE_UP_WORDS, this );
+ }
+
+ @Override
+ public void onIntentReceived( String action, Intent intent ) {
+ if ( !TextUtils.equals( action, VoiceConstants.ACTION_GAODE_SDK_NAVI_RECV ) ) {
+ return;
+ }
+ int type = intent.getExtras().getInt( VoiceConstants.EXTRA_KEY_TYPE );
+ Bundle data = intent.getExtras();
+ switch ( type ) {
+ case VoiceConstants.TYPE_START_NAVI:
+// actions.onStartNavi();
+ break;
+ case VoiceConstants.TYPE_STOP_NAVI:
+// actions.onStopNavi();
+ break;
+ case VoiceConstants.TYPE_NAVI_GUIDE_INFO:
+// actions.onSpeakNaviGuideInfo();
+ break;
+ case VoiceConstants.TYPE_MAP_UI_SETTING:
+ final int actionType = data.getInt( VoiceConstants.EXTRA_TYPE, 0 );
+ final int operateAction = data.getInt( VoiceConstants.EXTRA_OPERA, 0 );
+ onMapUISetting( actionType, operateAction );
+ break;
+ case VoiceConstants.TYPE_NAVI_STRATEGY:
+// actions.onNaviStrategySetting( data.getInt( VoiceConstants.EXTRA_M, 1 ) );
+ break;
+ case VoiceConstants.TYPE_NAVI_OVERVIEW:
+ final int overview = data.getInt( VoiceConstants.EXTRA_IS_SHOW, -1 );
+// if ( overview == 0 ) {
+// actions.onNaviOverview();
+// } else {
+// actions.onNaviContinue();
+// }
+ break;
+ case VoiceConstants.TYPE_NAVI_SPEAK:
+// actions.onNaviSpeak( data.getInt( VoiceConstants.EXTRA_MUTE, 0 ) );
+ break;
+ case VoiceConstants.TYPE_COMMON_ADDRESS_SETTING:
+// actions.onAddressSetting();
+ break;
+ case VoiceConstants.TYPE_COMMON_ADDRESS_CHANGED:
+// actions.onAddressUpdate();
+ break;
+ case VoiceConstants.TYPE_NAVI_ADD_POINT:
+// final int updateType = intent.getIntExtra( "TYPE", -1 );
+// final String name = intent.getStringExtra( "POINAME" );
+// final String address = intent.getStringExtra( "ADDRESS" );
+// final double lat = intent.getDoubleExtra( "LAT", 0.0 );
+// final double lng = intent.getDoubleExtra( "LON", 0.0 );
+// actions.onUpdateNaviPoint( updateType, name, address, lat, lng );
+ break;
+ case VoiceConstants.TYPE_SPEAK_NAVI_INFO:
+// actions.onSpeakPathRetainDistanceInfo();
+ break;
+ case VoiceConstants.TYPE_SPEAK_SPEED_LIMIT_INFO:
+// actions.onSpeakSpeedLimitInfo();
+ break;
+
+ }
+ }
+
+ /**
+ * @param actionType 0 - 实时路况
+ * 1 - 地图缩放
+ * 2 - 视图模式
+ * 3 - 夜间模式
+ * @param action actionType = 0 -> 0 - 开、1 - 关
+ * actionType = 1 -> 0 - 放大地图、1 - 缩小地图
+ * actionType = 2 -> 0 - 切换到2D车头朝上、1 - 切换2D正北模式、2 - 切换3D车头朝上
+ * actionType = 3 -> 0 - 黑夜、1 - 正常
+ */
+ public void onMapUISetting( int actionType, int action ) {
+ switch ( actionType ) {
+ case 0:
+ if ( action == 0 ) {
+ mView.getUIController().setTrafficEnabled( true );
+ } else if ( action == 1 ) {
+ mView.getUIController().setTrafficEnabled( false );
+ }
+ break;
+ case 1:
+ if ( action == 0 ) {
+ mView.getUIController().changeZoom( true );
+ } else if ( action == 1 ) {
+ mView.getUIController().changeZoom( false );
+ }
+ break;
+ case 2:
+ if ( action == 0 ) {
+ // 车头朝上,2D
+ mView.getUIController().changeMapMode( EnumMapUI.CarUp_2D );
+ } else if ( action == 1 ) {
+ // 北朝上,2D
+ mView.getUIController().changeMapMode( EnumMapUI.NorthUP_2D );
+ } else if ( action == 2 ) {
+ // 车头朝上,3D
+ mView.getUIController().changeMapMode( EnumMapUI.CarUp_3D );
+ }
+ break;
+ case 3:
+ if ( action == 0 ) {
+ mView.getUIController().changeMapMode( EnumMapUI.Type_Night );
+ } else if ( action == 1 ) {
+ mView.getUIController().changeMapMode( EnumMapUI.Type_Light );
+ }
+ break;
+ }
+ }
+
+ @Override
+ public void onCmdSelected( String cmd ) {
+ switch ( cmd ) {
+ case VoiceConstants.CMD_MAP_TRAFFIC_MODE:
+ onMapUISetting( 0, 0 );
+ break;
+ case VoiceConstants.CMD_MAP_UN_TRAFFIC_MODE:
+ onMapUISetting( 0, 1 );
+ break;
+ case VoiceConstants.CMD_MAP_ZOOM_IN:
+ onMapUISetting( 1, 0 );
+ break;
+ case VoiceConstants.CMD_MAP_ZOOM_OUT:
+ onMapUISetting( 1, 1 );
+ break;
+ case VoiceConstants.CMD_MAP_2D:
+ onMapUISetting( 2, 1 );
+ break;
+ case VoiceConstants.CMD_MAP_3D:
+ onMapUISetting( 2, 2 );
+ break;
+ case VoiceConstants.CMD_MAP_LIGHT_MODE:
+ onMapUISetting( 3, 1 );
+ break;
+ case VoiceConstants.CMD_MAP_NIGHT_MODE:
+ onMapUISetting( 3, 0 );
+ break;
+ }
+ }
+
+ @Override
+ public void onCmdAction( String speakText ) {
+
+ }
+
+ @Override
+ public void onCmdCancel( String speakText ) {
+
+ }
+
+ @Override
+ public void onSpeakEnd( String speakText ) {
+
+ }
+
+ @Override
+ public void onSpeakSelectTimeOut( String speakText ) {
+
+ }
}
diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapView.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapView.java
index 52acc523c2..8bb8ae2a88 100644
--- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapView.java
+++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapView.java
@@ -1,6 +1,7 @@
package com.mogo.module.map;
import com.mogo.commons.mvp.IView;
+import com.mogo.map.uicontroller.IMogoMapUIController;
/**
* @author congtaowang
@@ -9,4 +10,11 @@ import com.mogo.commons.mvp.IView;
* 地图view
*/
public interface MapView extends IView {
+
+ /**
+ * 地图控制接口
+ *
+ * @return
+ */
+ IMogoMapUIController getUIController();
}
diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java
new file mode 100644
index 0000000000..2a34dd679f
--- /dev/null
+++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/VoiceConstants.java
@@ -0,0 +1,133 @@
+package com.mogo.module.map;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-09
+ *
+ * 描述
+ */
+public class VoiceConstants {
+
+ // 同行者Adapter接受action
+ public static final String ACTION_GAODE_SDK_NAVI_RECV = "ACTION_GAODE_SDK_NAVI_RECV";
+ // 同行者Adapter发送action
+ public static final String ACTION_GAODE_SDK_NAVI_SEND = "ACTION_GAODE_SDK_NAVI_SEND";
+
+ public static final String EXTRA_KEY_TYPE = "KEY_TYPE";
+ public static final String EXTRA_TYPE = "EXTRA_TYPE";//操作地图
+ public static final String EXTRA_OPERA = "EXTRA_OPERA";//操作地图
+ public static final String EXTRA_MUTE = "EXTRA_MUTE";
+ public static final String EXTRA_IS_SHOW = "EXTRA_IS_SHOW";//预览全路径还是继续导航
+ public static final String EXTRA_M = "EXTRA_M";// 导航策略:1(避免收费) 3(不走高速) 4(躲避拥堵) 20 (高速优先)
+
+ /**
+ * 直接导航
+ */
+ public static final int TYPE_START_NAVI = 110009;
+
+ /**
+ * 导航预览or继续导航
+ */
+ public static final int TYPE_NAVI_OVERVIEW = 110006;
+
+ /**
+ * 地图控制:缩放、路况、车头、2/3D
+ */
+ public static final int TYPE_MAP_UI_SETTING = 110027;
+
+ /**
+ * 重新计算导航策略
+ */
+ public static final int TYPE_NAVI_STRATEGY = 110032;
+
+ /**
+ * 提箱前方路线方案
+ *
+ * 未实现
+ */
+ public static final int TYPE_NAVI_GUIDE_INFO = 120004;
+
+ /**
+ * 播放当前剩余里程和时间
+ *
+ * 未实现
+ */
+ public static final int TYPE_SPEAK_NAVI_INFO = 120001;
+
+ /**
+ * 播放当前限速信息
+ *
+ * 未实现
+ */
+ public static final int TYPE_SPEAK_SPEED_LIMIT_INFO = 120002;
+
+ /**
+ * 停止导航,但是不退出地图
+ */
+ public static final int TYPE_STOP_NAVI = 110010;
+
+ /**
+ * 退出地图应用
+ */
+ @Deprecated
+ public static final int TYPE_EXIT_NAVI = 120003;
+
+ /**
+ * 插入途经点
+ */
+ public static final int TYPE_NAVI_ADD_POINT = 210009;
+
+ public static final int TYPE_NAVI_SPEAK = 10011;
+ public static final int TYPE_COMMON_ADDRESS_SETTING = 10007;
+ public static final int TYPE_COMMON_ADDRESS_CHANGED = 10008;
+ public static final int TYPE_NAVI_TO = 110027;
+
+ // 地图免唤醒语音注册
+ /**
+ * 放大地图
+ */
+ public static final String CMD_MAP_ZOOM_IN = "CMD_MAP_ZOOM_IN";
+ public static final String[] CMD_MAP_ZOOM_IN_WAKE_UP_WORDS = {"放大地图"};
+
+ /**
+ * 缩小地图
+ */
+ public static final String CMD_MAP_ZOOM_OUT = "CMD_MAP_ZOOM_OUT";
+ public static final String[] CMD_MAP_ZOOM_OUT_WAKE_UP_WORDS = {"缩小地图"};
+
+ /**
+ * 2D模式
+ */
+ public static final String CMD_MAP_2D = "CMD_MAP_2D";
+ public static final String[] CMD_MAP_2D_WAKE_UP_WORDS = {"2D模式"};
+ /**
+ * 3D模式
+ */
+ public static final String CMD_MAP_3D = "CMD_MAP_3D";
+ public static final String[] CMD_MAP_3D_WAKE_UP_WORDS = {"3D模式"};
+
+ /**
+ * 白天模式
+ */
+ public static final String CMD_MAP_LIGHT_MODE = "CMD_MAP_LIGHT_MODE";
+ public static final String[] CMD_MAP_LIGHT_MODE_WAKE_UP_WORDS = {"白天模式"};
+
+ /**
+ * 黑夜模式
+ */
+ public static final String CMD_MAP_NIGHT_MODE = "CMD_MAP_NIGHT_MODE";
+ public static final String[] CMD_MAP_NIGHT_MODE_WAKE_UP_WORDS = {"黑夜模式"};
+
+ /**
+ * 查看路况
+ */
+ public static final String CMD_MAP_TRAFFIC_MODE = "CMD_MAP_TRAFFIC_MODE";
+ public static final String[] CMD_MAP_TRAFFIC_MODE_WAKE_UP_WORDS = {"查看路况"};
+ /**
+ * 关闭路况
+ */
+ public static final String CMD_MAP_UN_TRAFFIC_MODE = "CMD_MAP_UN_TRAFFIC_MODE";
+ public static final String[] CMD_MAP_UN_TRAFFIC_MODE_WAKE_UP_WORDS = {"关闭路况"};
+
+
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java
index 785f51bde4..943c415cc4 100644
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java
@@ -2,10 +2,12 @@ package com.mogo.module.service;
import android.content.Context;
+import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
@@ -25,8 +27,13 @@ import com.mogo.map.navi.IMogoNaviListener;
import com.mogo.map.navi.MogoNaviInfo;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.map.uicontroller.IMogoMapUIController;
+import com.mogo.module.common.MogoModule;
+import com.mogo.module.common.MogoModulePaths;
import com.mogo.module.service.network.RefreshCallback;
import com.mogo.module.service.network.RefreshModel;
+import com.mogo.module.service.receiver.AIAssistReceiver;
+import com.mogo.module.service.refresh.AutoRefreshStrategy;
+import com.mogo.module.service.refresh.CustomRefreshStrategy;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.map.IMogoMapService;
import com.mogo.service.module.IMogoModuleLifecycle;
@@ -37,6 +44,8 @@ import com.mogo.service.statusmanager.IMogoStatusManager;
import com.mogo.service.statusmanager.StatusDescriptor;
import com.mogo.utils.logger.Logger;
+import java.util.List;
+
/**
* @author congtaowang
* @since 2020-01-03
@@ -71,6 +80,8 @@ public class MogoServiceProvider implements IMogoModuleProvider,
*/
boolean mIsVertical = false;
+ private AIAssistReceiver mAIAssistReceiver;
+
/**
* 手动刷新策略
*/
@@ -208,6 +219,31 @@ public class MogoServiceProvider implements IMogoModuleProvider,
//TODO 初始化地图地图绘制大而全的Marker
MarkerServiceHandler.init( mContext );
+ registerAIReceiver( context );
+ }
+
+ private void registerAIReceiver( Context context ) {
+ if ( context == null ) {
+ return;
+ }
+ List< MogoModule > modules = MogoModulePaths.getModules();
+ if ( modules.isEmpty() || modules == null ) {
+ return;
+ }
+ mAIAssistReceiver = new AIAssistReceiver( context );
+ IntentFilter filter = new IntentFilter();
+ for ( MogoModule module : modules ) {
+ String action = module.getVoiceAction();
+ if ( !TextUtils.isEmpty( action ) ) {
+ filter.addAction( action );
+ }
+ }
+ try {
+ context.getApplicationContext().registerReceiver( mAIAssistReceiver, filter );
+ Logger.i( TAG, "register voice receiver." );
+ } catch ( Exception e ) {
+ Logger.e( TAG, e, "error. " );
+ }
}
@Override
@@ -331,7 +367,6 @@ public class MogoServiceProvider implements IMogoModuleProvider,
mLastCustomRefreshCenterLocation = latLng;
}
}
- Logger.d( TAG, "current map status: %s, zoom = %f, tilt = %f, bearing = %f", latLng, zoom, tilt, bearing );
}
private int getQueryRadius() {
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/AIAssistReceiver.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/AIAssistReceiver.java
new file mode 100644
index 0000000000..00376fdf83
--- /dev/null
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/receiver/AIAssistReceiver.java
@@ -0,0 +1,37 @@
+package com.mogo.module.service.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.mogo.service.MogoServicePaths;
+import com.mogo.service.voice.IMogoVoiceManager;
+import com.mogo.utils.logger.Logger;
+
+/**
+ * @author congtaowang
+ * @since 2019-10-03
+ *
+ * 语音助手广播接收者
+ */
+public class AIAssistReceiver extends BroadcastReceiver {
+
+ private static final String TAG = "AIAssistReceiver";
+
+
+ private IMogoVoiceManager mMogoVoiceManager;
+
+ public AIAssistReceiver( Context context ) {
+ mMogoVoiceManager = ( IMogoVoiceManager ) ARouter.getInstance().build( MogoServicePaths.PATH_VOICE_MANAGER ).navigation( context );
+ }
+
+ @Override
+ public void onReceive( Context context, Intent intent ) {
+ Logger.i( TAG, "receive ai assist intent" );
+ final String action = intent.getAction();
+ mMogoVoiceManager.invoke( action, intent );
+ }
+}
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/AutoRefreshStrategy.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/refresh/AutoRefreshStrategy.java
similarity index 95%
rename from modules/mogo-module-service/src/main/java/com/mogo/module/service/AutoRefreshStrategy.java
rename to modules/mogo-module-service/src/main/java/com/mogo/module/service/refresh/AutoRefreshStrategy.java
index 3a107c335d..d620f20586 100644
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/AutoRefreshStrategy.java
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/refresh/AutoRefreshStrategy.java
@@ -1,4 +1,4 @@
-package com.mogo.module.service;
+package com.mogo.module.service.refresh;
/**
* @author congtaowang
diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/CustomRefreshStrategy.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/refresh/CustomRefreshStrategy.java
similarity index 86%
rename from modules/mogo-module-service/src/main/java/com/mogo/module/service/CustomRefreshStrategy.java
rename to modules/mogo-module-service/src/main/java/com/mogo/module/service/refresh/CustomRefreshStrategy.java
index 90005b3c5d..1a5187e86b 100644
--- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/CustomRefreshStrategy.java
+++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/refresh/CustomRefreshStrategy.java
@@ -1,4 +1,4 @@
-package com.mogo.module.service;
+package com.mogo.module.service.refresh;
/**
* @author congtaowang
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java
index be2f322d7b..375b48bb41 100644
--- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java
@@ -71,7 +71,10 @@ public class MogoServicePaths {
*/
public static final String PATH_FRAGMENT_MANAGER = "/fragmentmanager/api";
-
+ /**
+ * 免唤醒语音控制
+ */
+ public static final String PATH_VOICE_MANAGER = "/voicemanager/api";
}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/voice/IMogoVoiceListener.java b/services/mogo-service-api/src/main/java/com/mogo/service/voice/IMogoVoiceListener.java
new file mode 100644
index 0000000000..b7c329f1c3
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/voice/IMogoVoiceListener.java
@@ -0,0 +1,20 @@
+package com.mogo.service.voice;
+
+import android.content.Intent;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-09
+ *
+ * 免唤醒语音监听
+ */
+public interface IMogoVoiceListener {
+
+ /**
+ * 回调语音意图
+ *
+ * @param action 广播 action
+ * @param intent 意图
+ */
+ void onIntentReceived( String action, Intent intent );
+}
diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/voice/IMogoVoiceManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/voice/IMogoVoiceManager.java
new file mode 100644
index 0000000000..35f5c7b342
--- /dev/null
+++ b/services/mogo-service-api/src/main/java/com/mogo/service/voice/IMogoVoiceManager.java
@@ -0,0 +1,36 @@
+package com.mogo.service.voice;
+
+import android.content.Intent;
+
+import com.alibaba.android.arouter.facade.template.IProvider;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-09
+ *
+ * 免唤醒语音控制
+ */
+public interface IMogoVoiceManager extends IProvider {
+
+ /**
+ * 注册意图接收者
+ *
+ * @param action
+ */
+ void registerIntentListener( String action, IMogoVoiceListener listener );
+
+ /**
+ * 注册意图接收者
+ *
+ * @param action
+ */
+ void unregisterIntentListener( String action );
+
+ /**
+ * 触发意图回调,各业务不用关心
+ *
+ * @param action
+ * @param intent
+ */
+ void invoke( String action, Intent intent );
+}
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/voice/MogoVoiceManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/voice/MogoVoiceManager.java
new file mode 100644
index 0000000000..f1b7cd8b5b
--- /dev/null
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/voice/MogoVoiceManager.java
@@ -0,0 +1,42 @@
+package com.mogo.service.impl.voice;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.viewpager.widget.ViewPager;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.mogo.service.MogoServicePaths;
+import com.mogo.service.voice.IMogoVoiceListener;
+import com.mogo.service.voice.IMogoVoiceManager;
+import com.zhidao.auto.platform.voice.VoiceClient;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-09
+ *
+ * 描述
+ */
+@Route( path = MogoServicePaths.PATH_VOICE_MANAGER )
+public class MogoVoiceManager implements IMogoVoiceManager {
+
+ @Override
+ public void registerIntentListener( String action, IMogoVoiceListener listener ) {
+ VoiceManager.getInstance().registerIntentListener( action, listener );
+ }
+
+ @Override
+ public void unregisterIntentListener( String action ) {
+ VoiceManager.getInstance().unregisterIntentListener( action );
+ }
+
+ @Override
+ public void invoke( String action, Intent intent ) {
+ VoiceManager.getInstance().invoke( action, intent );
+ }
+
+ @Override
+ public void init( Context context ) {
+ VoiceManager.getInstance().init( context );
+ }
+}
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/voice/VoiceManager.java b/services/mogo-service/src/main/java/com/mogo/service/impl/voice/VoiceManager.java
new file mode 100644
index 0000000000..f77b16a0eb
--- /dev/null
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/voice/VoiceManager.java
@@ -0,0 +1,76 @@
+package com.mogo.service.impl.voice;
+
+import android.content.Context;
+import android.content.Intent;
+
+import com.mogo.service.voice.IMogoVoiceListener;
+import com.mogo.service.voice.IMogoVoiceManager;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author congtaowang
+ * @since 2020-01-09
+ *
+ * 描述
+ */
+public class VoiceManager implements IMogoVoiceManager {
+
+ private static volatile VoiceManager sInstance;
+
+ private VoiceManager() {
+ }
+
+ public static VoiceManager getInstance() {
+ if ( sInstance == null ) {
+ synchronized ( VoiceManager.class ) {
+ if ( sInstance == null ) {
+ sInstance = new VoiceManager();
+ }
+ }
+ }
+ return sInstance;
+ }
+
+ public synchronized void release() {
+ sInstance = null;
+ }
+
+
+ private Map< String, List< IMogoVoiceListener > > mListeners = new HashMap<>();
+
+ @Override
+ public void registerIntentListener( String action, IMogoVoiceListener listener ) {
+ if ( listener == null || action == null ) {
+ return;
+ }
+ if ( !mListeners.containsKey( action ) ) {
+ mListeners.put( action, new ArrayList<>() );
+ }
+ mListeners.get( action ).add( listener );
+
+ }
+
+ @Override
+ public void unregisterIntentListener( String action ) {
+ mListeners.remove( action );
+ }
+
+ @Override
+ public void init( Context context ) {
+
+ }
+
+ @Override
+ public void invoke( String action, Intent intent ) {
+ List< IMogoVoiceListener > listeners = mListeners.get( action );
+ if ( listeners != null && !listeners.isEmpty() ) {
+ for ( IMogoVoiceListener listener : listeners ) {
+ listener.onIntentReceived( action, intent );
+ }
+ }
+ }
+}
diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/windowview/WindowViewHandler.java b/services/mogo-service/src/main/java/com/mogo/service/impl/windowview/WindowViewHandler.java
index 8c511e1da7..9e782f3a4e 100644
--- a/services/mogo-service/src/main/java/com/mogo/service/impl/windowview/WindowViewHandler.java
+++ b/services/mogo-service/src/main/java/com/mogo/service/impl/windowview/WindowViewHandler.java
@@ -47,7 +47,7 @@ public class WindowViewHandler {
try {
sWindowManager = ( WindowManager ) view.getContext().getApplicationContext().getSystemService( Context.WINDOW_SERVICE );
} catch ( Exception e ) {
- Logger.e( TAG, "error. ", e );
+ Logger.e( TAG, e, "error. " );
return;
}
}