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 index 7029ae106b..c000684d06 100644 --- 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 @@ -42,6 +42,17 @@ public class AppFilterImpl { } } + public static boolean isSelfApp( PackageInfo packageInfo ) { + try { + if ( packageInfo.packageName.startsWith( "com.mogo.launcher" ) ) { + return true; + } + } catch ( Exception e ) { + + } + return false; + } + public static boolean sFilter( PackageInfo packageInfo ) { if ( isInExternalFilter( packageInfo ) ) { return true; diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java index f148156e82..077cc96031 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/applaunch/AppLauncher.java @@ -1,6 +1,9 @@ package com.mogo.module.apps.applaunch; +import android.content.ComponentName; import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; import com.mogo.module.apps.AppServiceHandler; import com.mogo.module.apps.R; @@ -21,7 +24,18 @@ public class AppLauncher extends BaseAppLauncher { @Override public void launch( Context context, AppInfo appInfo ) { - launch( context, appInfo.getPackageName() ); + if ( !TextUtils.isEmpty( appInfo.getActivityClsName() ) ) { + Intent intent = new Intent(); + intent.setComponent( new ComponentName( appInfo.getPackageName(), appInfo.getActivityClsName() ) ); + try { + intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); + context.startActivity( intent ); + } catch ( Exception e ) { + launch( context, appInfo.getPackageName() ); + } + } else { + launch( context, appInfo.getPackageName() ); + } } @Override diff --git a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java index 62b2c34105..8eca3575a3 100644 --- a/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java +++ b/modules/mogo-module-apps/src/main/java/com/mogo/module/apps/model/AppInfo.java @@ -15,15 +15,17 @@ public class AppInfo { private final String mName; private final String mPackageName; + private final String mActivityClsName; private final String mVersionName; private final int mVersionCode; private final Drawable mIcon; private final int mIconResId; private final int mTrackType; // 埋点类型 - public AppInfo( String mName, String mPackageName, String mVersionName, int mVersionCode, Drawable mIcon, int mIconResId, int mTrackType ) { + public AppInfo( String mName, String mPackageName, String mActivityClsName, String mVersionName, int mVersionCode, Drawable mIcon, int mIconResId, int mTrackType ) { this.mName = mName; this.mPackageName = mPackageName; + this.mActivityClsName = mActivityClsName; this.mVersionName = mVersionName; this.mVersionCode = mVersionCode; this.mIcon = mIcon; @@ -31,8 +33,12 @@ public class AppInfo { this.mTrackType = mTrackType; } + public AppInfo( String mName, String mPackageName, String mVersionName, int mVersionCode, Drawable mIcon, int mIconResId, int mTrackType ) { + this( mName, mPackageName,"", mVersionName, mVersionCode, mIcon, mIconResId, mTrackType ); + } + public AppInfo( String mName, String mPackageName, String mVersionName, int mVersionCode, Drawable mIcon, int mIconResId ) { - this( mName, mPackageName, mVersionName, mVersionCode, mIcon, mIconResId, 0 ); + this( mName, mPackageName,"", mVersionName, mVersionCode, mIcon, mIconResId, 0 ); } public int getIconResId() { @@ -43,6 +49,10 @@ public class AppInfo { return mName; } + public String getActivityClsName() { + return mActivityClsName; + } + public String getPackageName() { return mPackageName; } 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 index c7b1df564e..491ea9b82f 100644 --- 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 @@ -1,17 +1,21 @@ package com.mogo.module.apps.model; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.text.TextUtils; +import com.mogo.commons.debug.DebugConfig; import com.mogo.module.apps.AppFilterImpl; import com.mogo.module.apps.AppsConst; import com.mogo.module.apps.AppsListChangedLiveData; import com.mogo.utils.logger.Logger; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -69,7 +73,6 @@ public class AppsModel { AppFilterImpl.loadExternalFilterPackagesList(); } catch ( Exception e ) { Logger.e( TAG, e, "error." ); - e.printStackTrace(); } final PackageManager packageManager = mContext.getPackageManager(); List< PackageInfo > packages = packageManager.getInstalledPackages( 0 ); @@ -77,23 +80,24 @@ public class AppsModel { for ( int i = 0; i < packages.size(); ++i ) { PackageInfo packageInfo = packages.get( i ); if ( AppFilterImpl.sFilter( packageInfo ) ) { + if ( DebugConfig.isDebug() ) { + if ( AppFilterImpl.isSelfApp( packageInfo ) ) { + counter = addSelfLauncher( mContext, packageManager, packageInfo, counter ); + } + } continue; } - int page = counter++ / AppsConst.TOTAL_SIZE_EACH_PAGE; - if ( mPagedApps.get( page ) == null ) { - mPagedApps.put( page, new ArrayList<>() ); + List< ResolveInfo > resolveInfoList = getApkLaunchResolveInfoForInstalled( mContext, packageInfo.packageName ); + if ( resolveInfoList == null || resolveInfoList.isEmpty() ) { + continue; } - String appName = getApplicationName( packageManager, packageInfo ); - String packageName = packageInfo.packageName; - String versionName = packageInfo.versionName; - int versionCode = packageInfo.versionCode; - int iconResId = AppEnumHelper.getCustomizedAppIconResId( packageName ); - Drawable appIcon = null; - if ( iconResId == 0 ) { - appIcon = packageInfo.applicationInfo.loadIcon( packageManager ); + for ( ResolveInfo resolveInfo : resolveInfoList ) { + if ( resolveInfo == null ) { + continue; + } + int page = counter++ / AppsConst.TOTAL_SIZE_EACH_PAGE; + addApp( packageManager, packageInfo, resolveInfo, page ); } - AppInfo appInfo = new AppInfo( appName, packageName, versionName, versionCode, appIcon, iconResId ); - mPagedApps.get( page ).add( appInfo ); } if ( callback != null ) { callback.onLoaded( mPagedApps ); @@ -101,6 +105,82 @@ public class AppsModel { mIsLoaded.set( true ); } + private int addSelfLauncher( Context context, + PackageManager packageManager, + PackageInfo packageInfo, + int counter ) { + List< ResolveInfo > resolveInfoList = getApkLaunchResolveInfoForInstalled( context, packageInfo.packageName ); + if ( resolveInfoList == null || resolveInfoList.isEmpty() ) { + return counter; + } + for ( ResolveInfo resolveInfo : resolveInfoList ) { + if ( resolveInfo == null ) { + continue; + } + if ( TextUtils.equals( resolveInfo.activityInfo.name, + "com.zhidao.mogo.module.main.launcher.MainLauncherActivity" ) ) { + continue; + } + int page = counter++ / AppsConst.TOTAL_SIZE_EACH_PAGE; + addApp( packageManager, packageInfo, resolveInfo, page ); + } + return counter; + } + + /** + * 获取所有可以启动的ResolveInfo,其中包含所有activity及其Icon + * + * @param context context of the operation + * @return all app lists + */ + public static List< ResolveInfo > getApkLaunchResolveInfoForInstalled( Context context, + String packageName ) { + List< ResolveInfo > apps = null; + if ( null != context ) { + PackageManager manager = context.getPackageManager(); + Intent mainIntent = new Intent( Intent.ACTION_MAIN, null ); + mainIntent.addCategory( Intent.CATEGORY_LAUNCHER ); + if ( null != packageName && !packageName.isEmpty() ) { + mainIntent.setPackage( packageName ); + } + apps = manager.queryIntentActivities( mainIntent, 0 ); + } + return null == apps ? new ArrayList<>() : apps; + } + + private void addApp( PackageManager packageManager, + PackageInfo packageInfo, + ResolveInfo resolveInfo, + int page ) { + if ( mPagedApps.get( page ) == null ) { + mPagedApps.put( page, new ArrayList<>() ); + } + mPagedApps.get( page ).add( wrapAppInfo( packageManager, packageInfo, resolveInfo ) ); + } + + private AppInfo wrapAppInfo( PackageManager packageManager, + PackageInfo packageInfo, + ResolveInfo resolveInfo ) { + String appName = getApplicationName( packageManager, packageInfo ); + String packageName = packageInfo.packageName; + String versionName = packageInfo.versionName; + int versionCode = packageInfo.versionCode; + int iconResId = AppEnumHelper.getCustomizedAppIconResId( packageName ); + Drawable appIcon = null; + if ( iconResId == 0 ) { + if ( resolveInfo != null + && resolveInfo.activityInfo != null + && !TextUtils.equals( packageName, resolveInfo.activityInfo.processName ) ) { + appIcon = resolveInfo.activityInfo.loadIcon( packageManager ); + appName = resolveInfo.activityInfo.loadLabel( packageManager ).toString(); + } + if ( appIcon == null ) { + appIcon = packageInfo.applicationInfo.loadIcon( packageManager ); + } + } + return new AppInfo( appName, packageName, resolveInfo != null ? resolveInfo.activityInfo.name : null, versionName, versionCode, appIcon, iconResId, 0 ); + } + public void appAdded( String packageName ) { if ( !mIsLoaded.get() ) { return; @@ -115,16 +195,8 @@ public class AppsModel { final PackageManager packageManager = mContext.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo( packageName, 0 ); if ( !AppFilterImpl.sFilter( packageInfo ) ) { - String appName = getApplicationName( packageManager, packageInfo ); - String versionName = packageInfo.versionName; - int versionCode = packageInfo.versionCode; - Drawable appIcon = packageInfo.applicationInfo.loadIcon( packageManager ); - AppInfo appInfo = new AppInfo( appName, packageName, versionName, versionCode, appIcon, AppEnumHelper.getCustomizedAppIconResId( packageName ) ); int pageIndex = getPageIndex( packageName, true ); - if ( mPagedApps.get( pageIndex ) == null ) { - mPagedApps.put( pageIndex, new ArrayList<>() ); - } - mPagedApps.get( pageIndex ).add( appInfo ); + addApp( packageManager, packageInfo, null, pageIndex ); } AppsListChangedLiveData.getInstance().postValue( true ); } catch ( PackageManager.NameNotFoundException e ) {