diff --git a/app/build.gradle b/app/build.gradle index 13a08c24df..db84b9275e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,7 +61,7 @@ dependencies { // implementation rootProject.ext.dependencies.moduledemo // implementation rootProject.ext.dependencies.moduledemo2 - implementation rootProject.ext.dependencies.modulechatting +// 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 0c3a658736..941198c975 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -6,10 +6,8 @@ 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; import com.mogo.tanlu.constant.TanluConstants; /** @@ -28,7 +26,7 @@ public class MogoApplication extends AbsMogoApplication { DebugConfig.setNetMode( DebugConfig.NET_MODE_QA ); 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-commons/src/main/java/com/mogo/commons/voice/AIAssist.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java index 7f50aeae8e..af59685709 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/AIAssist.java @@ -33,7 +33,7 @@ public class AIAssist implements VoiceClient.VoiceCmdCallBack { } private final VoiceClient mVoiceClient; - private Map< String, IMogoVoiceCmdCallBack > mUnWakeupCmdMap = new HashMap<>(); + private Map< String, IMogoVoiceCmdCallBack > mCmdMap = new HashMap<>(); private AIAssist( Context context ) { // private constructor @@ -43,7 +43,7 @@ public class AIAssist implements VoiceClient.VoiceCmdCallBack { @Override public void onCmdSelected( String cmd ) { - final IMogoVoiceCmdCallBack cmdCallBack = mUnWakeupCmdMap.get( cmd ); + final IMogoVoiceCmdCallBack cmdCallBack = mCmdMap.get( cmd ); if ( cmdCallBack != null ) { cmdCallBack.onCmdSelected( cmd ); } @@ -51,17 +51,23 @@ public class AIAssist implements VoiceClient.VoiceCmdCallBack { @Override public void onCmdAction( String speakText ) { - + IMogoVoiceCmdCallBack cmdCallBack = mCmdMap.remove( speakText ); + if ( cmdCallBack != null ) { + cmdCallBack.onCmdAction( speakText ); + } } @Override public void onCmdCancel( String speakText ) { - + IMogoVoiceCmdCallBack cmdCallBack = mCmdMap.remove( speakText ); + if ( cmdCallBack != null ) { + cmdCallBack.onCmdCancel( speakText ); + } } @Override public void onSpeakEnd( String speakText ) { - IMogoVoiceCmdCallBack callBack = mUnWakeupCmdMap.get( speakText ); + IMogoVoiceCmdCallBack callBack = mCmdMap.remove( speakText ); if ( callBack != null ) { callBack.onSpeakEnd( speakText ); } @@ -69,34 +75,81 @@ public class AIAssist implements VoiceClient.VoiceCmdCallBack { @Override public void onSpeakSelectTimeOut( String speakText ) { - IMogoVoiceCmdCallBack callBack = mUnWakeupCmdMap.get( speakText ); + IMogoVoiceCmdCallBack callBack = mCmdMap.remove( speakText ); if ( callBack != null ) { callBack.onSpeakSelectTimeOut( speakText ); } } - public void speakTTSVoice( String text ) { + /** + * 语音播报 + * + * @param text + */ + public void speakTTSVoice( String text, IMogoVoiceCmdCallBack callBack ) { try { + mCmdMap.put( text, callBack ); mVoiceClient.speakDefault( text ); } catch ( Exception e ) { } } + + /** + * 语音播报 + * + * @param text 播报内容 + * @param type 播报策略 + */ + public void speakTTSVoice( String text, VoicePreemptType type, IMogoVoiceCmdCallBack callBack ) { + try { + mCmdMap.put( text, callBack ); + mVoiceClient.speakTypeText( text, type.getPreemptType() ); + } catch ( Exception e ) { + } + } + + /** + * 问答类型语音注册:默认确认和取消 + * + * @param tts 播报内容 + */ + public void speakQAndACmd( String tts, IMogoVoiceCmdCallBack callBack ) { + mCmdMap.put( tts, callBack ); + mVoiceClient.speakTtsAndRegistCmd( tts ); + } + + /** + * 问答类型语音注册 + * + * @param tts 播报内容 + * @param okCmds 确认命令唤醒词 + * @param cancelCmds 取消命令唤醒词 + */ + public void speakQAndACmd( String tts, String[] okCmds, String[] cancelCmds, IMogoVoiceCmdCallBack callBack ) { + mCmdMap.put( tts, callBack ); + mVoiceClient.speakTtsAndRegistCmd( tts, okCmds, cancelCmds ); + } + + /** + * 注册免唤醒命令 + * + * @param cmd + * @param cmdWords + * @param callBack + */ public void registerUnWakeupCommand( String cmd, String[] cmdWords, IMogoVoiceCmdCallBack callBack ) { - mUnWakeupCmdMap.put( cmd, callBack ); + mCmdMap.put( cmd, callBack ); mVoiceClient.registerCustomWakeupCmd( cmd, cmdWords ); } + /** + * 注销免唤醒命令 + * + * @param cmd + */ public void unregisterUnWakeupCommand( String cmd ) { - mUnWakeupCmdMap.remove( cmd ); + mCmdMap.remove( cmd ); mVoiceClient.unRegisterCustomWakeupCmd( cmd ); } - - public void registerTTSCallback( String tts, IMogoVoiceCmdCallBack cmdCallBack ) { - mUnWakeupCmdMap.put( tts, cmdCallBack ); - } - - public void unregisterTTSCallback( String tts ) { - mUnWakeupCmdMap.remove( tts ); - } } diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/VoicePreemptType.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/VoicePreemptType.java new file mode 100644 index 0000000000..aef7e63252 --- /dev/null +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/voice/VoicePreemptType.java @@ -0,0 +1,23 @@ +package com.mogo.commons.voice; + +import com.zhidao.auto.platform.voice.VoiceClient; + +public enum VoicePreemptType { + + + PREEMPT_TYPE_NONE( VoiceClient.PreemptType.PREEMPT_TYPE_NONE ), //不打断 + PREEMPT_TYPE_IMMEADIATELY( VoiceClient.PreemptType.PREEMPT_TYPE_IMMEADIATELY ), //立即打断,取消当前的tts插队播放 + PREEMPT_TYPE_NEXT( VoiceClient.PreemptType.PREEMPT_TYPE_NEXT ), //下一个插入,不取消当前的tts,插队下一个播放 + PREEMPT_TYPE_FLUSH( VoiceClient.PreemptType.PREEMPT_TYPE_FLUSH ), //清空队列 + PREEMPT_TYPE_IMMEADIATELY_WITHOUT_CANCLE( VoiceClient.PreemptType.PREEMPT_TYPE_IMMEADIATELY_WITHOUT_CANCLE ); //立即打断,不取消当前tts + + public VoiceClient.PreemptType preemptType; + + VoicePreemptType( VoiceClient.PreemptType preemptType ) { + this.preemptType = preemptType; + } + + public VoiceClient.PreemptType getPreemptType() { + return preemptType; + } +} \ No newline at end of file diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppFilter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppFilter.java new file mode 100644 index 0000000000..f0f5cd93cf --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppFilter.java @@ -0,0 +1,20 @@ +package com.mogo.module.apps; + +import android.content.pm.PackageInfo; + +/** + * @author congtaowang + * @since 2020-01-08 + *

+ * app 过滤规则 + */ +public interface AppFilter { + + /** + * 过滤包 + * + * @param packageInfo + * @return true - 过滤 false - 不过滤 + */ + boolean filter( PackageInfo packageInfo ); +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppFilterImpl.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppFilterImpl.java new file mode 100644 index 0000000000..d4e8a280d8 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppFilterImpl.java @@ -0,0 +1,55 @@ +package com.mogo.module.apps; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; + +import java.util.Arrays; +import java.util.List; + +/** + * @author congtaowang + * @since 2020-01-08 + *

+ * 过滤 app + */ +public class AppFilterImpl implements AppFilter { + + private final Context mContext; + private List< String > mFilterPackages; + + public AppFilterImpl( Context context ) { + mContext = context; + final String[] values = context.getResources().getStringArray( R.array.module_apps_array_filter_packages ); + if ( values != null ) { + mFilterPackages = Arrays.asList( values ); + } + } + + @Override + public boolean filter( PackageInfo packageInfo ) { +// if ( isSystemApp( packageInfo ) ) { +// return true; +// } + if ( isFilterPackages( packageInfo ) ) { + return true; + } + if ( noLaunchIntent( packageInfo ) ) { + return true; + } + return false; + } + + private boolean isSystemApp( PackageInfo packageInfo ) { + return ( packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM ) != 0; + } + + private boolean isFilterPackages( PackageInfo packageInfo ) { + return mFilterPackages.contains( packageInfo.packageName ); + } + + private boolean noLaunchIntent( PackageInfo packageInfo ) { + return mContext.getPackageManager().getLaunchIntentForPackage( packageInfo.packageName ) == null; + } + +} diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsAdapter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsAdapter.java index 14f8703945..88eb41f68b 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsAdapter.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsAdapter.java @@ -3,11 +3,11 @@ package com.mogo.module.apps; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; import com.mogo.module.apps.model.AppInfo; @@ -19,53 +19,59 @@ import java.util.List; *

* 描述 */ -public class AppsAdapter extends RecyclerView.Adapter< AppsAdapter.AppsViewHolder > { +public class AppsAdapter extends BaseAdapter { private List< AppInfo > mAppInfos; public AppsAdapter( List< AppInfo > appInfos ) { this.mAppInfos = appInfos; } - private View.OnClickListener onClickListener; public void refreshAppInfos( List< AppInfo > mAppInfos ) { this.mAppInfos = mAppInfos; notifyDataSetChanged(); } - @NonNull @Override - public AppsViewHolder onCreateViewHolder( @NonNull ViewGroup parent, int viewType ) { - return new AppsViewHolder( LayoutInflater.from( parent.getContext() ).inflate( R.layout.module_apps_item_app, null ) ); - } - - @Override - public void onBindViewHolder( @NonNull AppsViewHolder holder, int position ) { - final AppInfo appInfo = mAppInfos.get( position ); - holder.mIcon.setImageDrawable( appInfo.getIcon() ); - holder.mName.setText( appInfo.getName() ); - holder.itemView.setTag(appInfo); - holder.itemView.setOnClickListener(onClickListener); - } - - @Override - public int getItemCount() { + public int getCount() { return mAppInfos == null ? 0 : mAppInfos.size(); } - public static class AppsViewHolder extends RecyclerView.ViewHolder { + @Override + public AppInfo getItem( int position ) { + return mAppInfos.get( position ); + } + @Override + public long getItemId( int position ) { + return position; + } + + @Override + public View getView( int position, View convertView, ViewGroup parent ) { + AppViewHolder holder = null; + if ( convertView == null ) { + holder = new AppViewHolder( LayoutInflater.from( parent.getContext() ).inflate( R.layout.module_apps_item_app, null ) ); + } else { + holder = ( ( AppViewHolder ) convertView.getTag() ); + } + AppInfo appInfo = getItem( position ); + holder.mIcon.setImageDrawable( appInfo.getIcon() ); + holder.mName.setText( appInfo.getName() ); + return holder.mItemView; + } + + public static class AppViewHolder { + + private View mItemView; public ImageView mIcon; public TextView mName; - public AppsViewHolder( @NonNull View itemView ) { - super( itemView ); + public AppViewHolder( @NonNull View itemView ) { + mItemView = itemView; mIcon = itemView.findViewById( R.id.module_apps_id_app_icon ); mName = itemView.findViewById( R.id.module_apps_id_app_name ); + mItemView.setTag( this ); } } - - public void setOnClickListener(View.OnClickListener onClickListener) { - this.onClickListener = onClickListener; - } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsConst.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsConst.java new file mode 100644 index 0000000000..5c38567236 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsConst.java @@ -0,0 +1,12 @@ +package com.mogo.module.apps; + +/** + * @author congtaowang + * @since 2020-01-08 + *

+ * 描述 + */ +public class AppsConst { + + public static final int TOTAL_SIZE_EACH_PAGE = 12; +} 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 7d97be7388..d0dcbdfe6a 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 @@ -1,16 +1,21 @@ package com.mogo.module.apps; import android.os.Bundle; +import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager.widget.ViewPager; +import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.MvpFragment; import com.mogo.module.apps.model.AppInfo; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.fragmentmanager.IMogoFragmentManager; +import com.mogo.utils.logger.Logger; import java.util.List; +import java.util.Map; /** * @author congtaowang @@ -23,8 +28,11 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme public static final String TAG = "AppsFragment"; // private BottomSheetBehavior mBottomSheetBehavior; - private RecyclerView mAppsList; - private AppsAdapter mAppsAdapter; + private ViewPager mAppsPager; + private AppsPagerAdapter mAppsPagerAdapter; + + private View mExit; + private IMogoFragmentManager mMogoFragmentManager; @Override protected int getLayoutId() { @@ -33,8 +41,13 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme @Override protected void initViews() { - mAppsList = findViewById( R.id.module_apps_id_apps ); - mAppsList.setLayoutManager( new GridLayoutManager( getContext(), 8 ) ); + mAppsPager = findViewById( R.id.module_apps_id_apps_pager ); + mExit = findViewById( R.id.module_apps_id_apps_exit ); + mExit.setOnClickListener( view -> { + mMogoFragmentManager.pop(); + } ); +// mAppsList = findViewById( R.id.module_apps_id_apps ); +// mAppsList.setLayoutManager( new GridLayoutManager( getContext(), 8 ) ); // mBottomSheetBehavior = BottomSheetBehavior.from( mAppsList ); // mBottomSheetBehavior.setSkipCollapsed( true ); // mBottomSheetBehavior.setBottomSheetCallback( new BottomSheetBehavior.BottomSheetCallback() { @@ -60,23 +73,20 @@ public class AppsFragment extends MvpFragment< AppsView, AppsPresenter > impleme @Override public void onActivityCreated( @Nullable Bundle savedInstanceState ) { super.onActivityCreated( savedInstanceState ); + mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation(); } @Override - public void renderApps( List< AppInfo > appInfos ) { - if ( mAppsAdapter == null ) { - mAppsAdapter = new AppsAdapter( appInfos ); - mAppsList.setAdapter( mAppsAdapter ); - bindListener(); + public void renderApps( Map< Integer, List< AppInfo > > appInfos ) { + if ( mAppsPagerAdapter == null ) { + mAppsPagerAdapter = new AppsPagerAdapter( appInfos ); + mAppsPager.setAdapter( mAppsPagerAdapter ); + mAppsPagerAdapter.setOnAppClickedListener( ( appInfo, position ) -> { + Logger.i( TAG, "position = %d clicked. name = %s", position, appInfo.getName() ); + mPresenter.launch( appInfo ); + } ); } else { - mAppsAdapter.refreshAppInfos( appInfos ); + mAppsPagerAdapter.setPagedApps( appInfos ); } } - - private void bindListener() { - mAppsAdapter.setOnClickListener( view -> { - AppInfo app = ( AppInfo ) view.getTag(); - mPresenter.launch( app ); - } ); - } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPagerAdapter.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPagerAdapter.java new file mode 100644 index 0000000000..c15b211d07 --- /dev/null +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsPagerAdapter.java @@ -0,0 +1,85 @@ +package com.mogo.module.apps; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.GridView; + +import androidx.annotation.NonNull; +import androidx.viewpager.widget.PagerAdapter; + +import com.mogo.module.apps.model.AppInfo; + +import java.util.List; +import java.util.Map; + +/** + * @author congtaowang + * @since 2020-01-08 + *

+ * 描述 + */ +public class AppsPagerAdapter extends PagerAdapter { + + private Map< Integer, List< AppInfo > > mPagedApps; + private OnAppClickedListener mOnAppClickedListener; + + public AppsPagerAdapter( Map< Integer, List< AppInfo > > apps ) { + this.mPagedApps = apps; + } + + @Override + public int getCount() { + return mPagedApps == null ? 0 : mPagedApps.size(); + } + + public void setOnAppClickedListener( OnAppClickedListener onAppClickedListener ) { + this.mOnAppClickedListener = onAppClickedListener; + } + + public OnAppClickedListener getOnAppClickedListener() { + return mOnAppClickedListener; + } + + @Override + public boolean isViewFromObject( @NonNull View view, @NonNull Object object ) { + return view == object; + } + + public void setPagedApps( Map< Integer, List< AppInfo > > pagedApps ) { + this.mPagedApps = pagedApps; + notifyDataSetChanged(); + } + + @NonNull + @Override + public Object instantiateItem( @NonNull ViewGroup container, int position ) { + View pager = LayoutInflater.from( container.getContext() ).inflate( R.layout.module_apps_item_app_pager, null ); + GridView page = pager.findViewById( R.id.module_apps_id_apps_page ); + page.setAdapter( new AppsAdapter( mPagedApps.get( position ) ) ); + page.setOnItemClickListener( ( parent, view, appPosition, id ) -> { + if ( getOnAppClickedListener() != null ) { + getOnAppClickedListener().onClick( mPagedApps.get( position ).get( appPosition ), position * AppsConst.TOTAL_SIZE_EACH_PAGE + appPosition ); + } + } ); + container.addView( page ); + return page; + } + + @Override + public void destroyItem( @NonNull ViewGroup container, int position, @NonNull Object object ) { + if ( object instanceof View ) { + container.removeView( ( ( View ) object ) ); + } + } + + @Override + public int getItemPosition( @NonNull Object object ) { + return POSITION_NONE; + } + + public interface OnAppClickedListener { + void onClick( AppInfo appInfo, int position ); + } +} 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 aafde6d392..9aade9ba5d 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 @@ -13,11 +13,14 @@ import androidx.lifecycle.Observer; import com.mogo.commons.mvp.Presenter; import com.mogo.module.apps.model.AppInfo; 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 @@ -29,13 +32,12 @@ public class AppsPresenter extends Presenter< AppsView > { private static final String TAG = "AppsPresenter"; + private AppFilter mAppFilter; + public AppsPresenter( AppsView view ) { super( view ); - RefreshAppsListLiveData.getInstance().observeForever( new Observer< String >() { - @Override - public void onChanged( String s ) { - renderAppsList(); - } + RefreshAppsListLiveData.getInstance().observeForever( s -> { + renderAppsList(); } ); } @@ -46,55 +48,58 @@ public class AppsPresenter extends Presenter< AppsView > { } private void renderAppsList() { - ThreadPoolService.execute( new Runnable() { - @Override - public void run() { - final List< AppInfo > appInfoList = loadAppsList(); - UiThreadHandler.post( new Runnable() { - @Override - public void run() { - if ( mView != null ) { - mView.renderApps( appInfoList ); - } - } - } ); - - } + ThreadPoolService.execute( () -> { + final Map< Integer, List< AppInfo > > appInfoList = loadAppsList(); + UiThreadHandler.post( () -> { + if ( mView != null ) { + mView.renderApps( appInfoList ); + } + } ); } ); } - private List< AppInfo > loadAppsList() { + private Map< Integer, List< AppInfo > > loadAppsList() { Logger.i( TAG, "load apps list." ); - final List< AppInfo > appInfos = new ArrayList<>(); + 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 ( ( packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM ) == 0 ) { - 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 ); - appInfos.add( appInfo ); + 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 appInfos; + return pagedApps; } public void launch( AppInfo appInfo ) { if ( appInfo == null ) { return; } - Intent intent = getContext().getPackageManager().getLaunchIntentForPackage( appInfo.getPackageName() ); - if ( intent == null ) { - Logger.e( TAG, "can't launch app: %s", appInfo.toString() ); - return; + + try { + Intent intent = getContext().getPackageManager().getLaunchIntentForPackage( appInfo.getPackageName() ); + intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); + getContext().startActivity( intent ); + } catch ( Exception e ) { + TipToast.shortTip( R.string.module_apps_str_no_app ); } - intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); - getContext().startActivity( intent ); } } diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java index bb66995def..03ca995a0b 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/AppsView.java @@ -4,6 +4,7 @@ import com.mogo.commons.mvp.IView; import com.mogo.module.apps.model.AppInfo; import java.util.List; +import java.util.Map; /** * @author congtaowang @@ -18,5 +19,5 @@ public interface AppsView extends IView { * * @param appInfos */ - void renderApps( List< AppInfo > appInfos ); + void renderApps( Map< Integer, List< AppInfo > > appInfos ); } diff --git a/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_retract.png b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_retract.png new file mode 100755 index 0000000000..8c37a69e35 Binary files /dev/null and b/modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_retract.png differ 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 b3c0033544..85340fa44d 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 @@ -12,15 +12,22 @@ - + android:layout_height="match_parent" + android:background="#0C0C0C"> - + + - \ No newline at end of file + android:layout_marginTop="@dimen/dp_210" /> + \ No newline at end of file diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml index ade4edbf41..499d8a5166 100644 --- a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml +++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app.xml @@ -8,13 +8,16 @@ + android:layout_width="@dimen/dp_120" + android:layout_height="@dimen/dp_120" /> + android:maxLines="2" + android:textColor="#FFFFFF" + android:textSize="@dimen/dp_32" /> \ No newline at end of file diff --git a/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_pager.xml b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_pager.xml new file mode 100644 index 0000000000..1e159101ce --- /dev/null +++ b/modules/mogo-module-apps/src/main/res/layout/module_apps_item_app_pager.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/modules/mogo-module-apps/src/main/res/values/strings.xml b/modules/mogo-module-apps/src/main/res/values/strings.xml index 2b14f63364..905586c2af 100644 --- a/modules/mogo-module-apps/src/main/res/values/strings.xml +++ b/modules/mogo-module-apps/src/main/res/values/strings.xml @@ -1,3 +1,7 @@ mogo-module-apps + APP 未安装 + + com.mogo.launcher +