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" /> + + \ No newline at end of file diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModule.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModule.java index 5a4f67162a..45e1e0bfc8 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModule.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/MogoModule.java @@ -18,6 +18,11 @@ public class MogoModule { */ private String mName; + /** + * 语音指令通过广播传递数据 action. + */ + private String mVoiceAction; + /** * @param path 模块加载路径 * @param name 模块名称 @@ -32,15 +37,26 @@ public class MogoModule { return mPath; } - public void setPath( String path ) { + public MogoModule setPath( String path ) { this.mPath = path; + return this; } public String getName() { return mName; } - public void setName( String name ) { + public MogoModule setName( String name ) { this.mName = name; + return this; + } + + public String getVoiceAction() { + return mVoiceAction; + } + + public MogoModule setVoiceAction( String voiceAction ) { + this.mVoiceAction = voiceAction; + return this; } } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java index c668d6baf8..2eb363ccd7 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/ExtensionsPresenter.java @@ -45,7 +45,7 @@ public class ExtensionsPresenter extends Presenter< ExtensionsView > implements try { refreshTimeAndDate(); } catch ( Exception e ) { - Logger.e( TAG, "error. ", e ); + Logger.e( TAG, e, "error. " ); } } }; diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java index 587bc387f0..389aff46a2 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/weather/WeatherModel.java @@ -57,14 +57,14 @@ public class WeatherModel { try { queryWeatherInformation(); } catch ( Exception e ) { - Logger.e( TAG, "error. ", e ); + Logger.e( TAG, e, "error. " ); } } }; try { mContentResolver.registerContentObserver( mWeatherUri, false, mContentObserver ); } catch ( Exception e ) { - Logger.e( TAG, "error when query weather info.", e ); + Logger.e( TAG, e, "error when query weather info." ); } } diff --git a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml index 2d54723c23..be17991ae9 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml @@ -97,7 +97,8 @@ android:layout_width="match_parent" android:layout_height="@dimen/dp_92" android:background="@drawable/module_map_dw_top_corner_bkg" - android:orientation="vertical"> + android:orientation="vertical" + android:visibility="gone"> impleme super.onCreate( savedInstanceState ); MogoModulePaths.addModule( new MogoModule( MogoModulePaths.PATH_MODULE_APPS, MogoModulePaths.PATH_MODULE_APPS ) ); - MogoModulePaths.addModule( new MogoModule( MogoModulePaths.PATH_MODULE_MAP, MogoModulePaths.PATH_MODULE_MAP ) ); + MogoModulePaths.addModule( new MogoModule( MogoModulePaths.PATH_MODULE_MAP, MogoModulePaths.PATH_MODULE_MAP ).setVoiceAction( VoiceConstants.ACTION_GAODE_SDK_NAVI_RECV ) ); MogoModulePaths.addModule( new MogoModule( ServiceConst.PATH_REFRESH_STRATEGY, ServiceConst.PATH_REFRESH_STRATEGY ) ); MogoModulePaths.addModule( new MogoModule( ExtensionsModuleConst.PATH_EXTENSION, ExtensionsModuleConst.TYPE ) ); MogoModulePaths.addModule( new MogoModule( ExtensionsModuleConst.PATH_ENTRANCE, ExtensionsModuleConst.TYPE_ENTRANCE ) ); diff --git a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java index 24e6b114d6..231b29f3ae 100644 --- a/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java +++ b/modules/mogo-module-map/src/main/java/com/mogo/module/map/MapFragment.java @@ -5,10 +5,14 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.MvpFragment; import com.mogo.map.IMogoMap; import com.mogo.map.IMogoUiSettings; import com.mogo.map.MogoMapView; +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.voice.IMogoVoiceManager; /** * @author congtaowang @@ -23,6 +27,8 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements private MogoMapView mMogoMapView; private IMogoMap mMogoMap; + private IMogoVoiceManager mMogoVoiceManager; + @Override protected int getLayoutId() { return R.layout.module_map_fragment_map; @@ -48,6 +54,8 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements mMogoMapView.onCreate( savedInstanceState ); } initMapView(); + mMogoVoiceManager = ( IMogoVoiceManager ) ARouter.getInstance().build( MogoServicePaths.PATH_VOICE_MANAGER ).navigation( getContext() ); + mMogoVoiceManager.registerIntentListener( VoiceConstants.ACTION_GAODE_SDK_NAVI_RECV, mPresenter ); } @Override @@ -66,14 +74,6 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements } } - @Override - public void onDestroyView() { - super.onDestroyView(); - if ( mMogoMapView != null ) { - mMogoMapView.onDestroy(); - } - } - @Override public void onLowMemory() { super.onLowMemory(); @@ -109,4 +109,20 @@ public class MapFragment extends MvpFragment< MapView, MapPresenter > implements } } } + + @Override + public IMogoMapUIController getUIController() { + return mMogoMap.getUIController(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if ( mMogoMapView != null ) { + mMogoMapView.onDestroy(); + } + if ( mMogoVoiceManager != null ) { + mMogoVoiceManager.unregisterIntentListener( VoiceConstants.ACTION_GAODE_SDK_NAVI_RECV ); + } + } } 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 55c045ca9f..a7964b911b 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 @@ -1,6 +1,17 @@ package com.mogo.module.map; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; + import com.mogo.commons.mvp.Presenter; +import com.mogo.commons.voice.AIAssist; +import com.mogo.commons.voice.IMogoVoiceCmdCallBack; +import com.mogo.map.uicontroller.EnumMapUI; +import com.mogo.service.voice.IMogoVoiceListener; /** * @author congtaowang @@ -8,11 +19,185 @@ import com.mogo.commons.mvp.Presenter; *

* 描述 */ -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; } }