package me.ele.amigo.utils.component; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.text.TextUtils; import java.util.List; import static android.content.IntentFilter.NO_MATCH_ACTION; import static android.content.IntentFilter.NO_MATCH_CATEGORY; import static android.content.IntentFilter.NO_MATCH_DATA; import static android.content.IntentFilter.NO_MATCH_TYPE; public class ActivityFinder extends ComponentFinder { private static ComponentName newLauncherComponent; private static ActivityInfo[] sHostActivities; public static ActivityInfo[] getAppActivities(Context context) { if (sHostActivities != null) { return sHostActivities; } try { PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA); return sHostActivities = info.activities; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return null; } public static boolean newActivityExistsInPatch(Context context) { parsePackage(context); getAppActivities(context); for (int i = sActivities.size() - 1; i >= 0; i--) { ActivityInfo patchActivityInfo = sActivities.get(i).activityInfo; if (isNew(patchActivityInfo)) { return true; } } return false; } private static boolean isNew(ActivityInfo patchActivityInfo) { // check any changes in activity's metadata ? for (int i1 = sHostActivities.length - 1; i1 >= 0; i1--) { if (sHostActivities[i1].name.equals(patchActivityInfo.name)) { return false; } } return true; } public static ComponentName getNewLauncherComponent(Context context) { if (newLauncherComponent != null) { return newLauncherComponent; } parsePackage(context); for (Activity activity : sActivities) { if (isNewLauncherActivity(activity)) { ActivityInfo info = activity.activityInfo; return newLauncherComponent = new ComponentName(context.getPackageName(), info.targetActivity != null ? info.targetActivity : info.name); } } return newLauncherComponent; } private static boolean isNewLauncherActivity(Activity activity) { List<IntentFilter> intents = activity.filters; if (intents == null || intents.isEmpty()) { return false; } for (IntentFilter intentFilter : intents) { if (intentFilter.hasAction(Intent.ACTION_MAIN) && intentFilter.hasCategory(Intent.CATEGORY_LAUNCHER)) { return true; } } return false; } public static ComponentName getLauncherComponent(Context context) { Intent launcherIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); ActivityInfo activityInfo = launcherIntent.resolveActivityInfo(context.getPackageManager(), 0); String className = activityInfo.targetActivity != null ? activityInfo.targetActivity : activityInfo.name; return new ComponentName(context.getPackageName(), className); } public static ActivityInfo getActivityInfoInNewApp(Context context, String activityClassName) { parsePackage(context); if (sActivities.isEmpty()) { return null; } for (Activity activity : sActivities) { ActivityInfo activityInfo = activity.activityInfo; if (!activityInfo.name.equals(activityClassName)) { continue; } boolean isAlias = !TextUtils.isEmpty(activityInfo.targetActivity); if (!isAlias) { return activityInfo; } else { return getActivityInfoInNewApp(context, activityInfo.targetActivity); } } return null; } public static ActivityInfo getActivityInfoInNewApp(Context context, Intent intent) { if (intent == null) { return null; } if (intent.getComponent() != null) { return getActivityInfoInNewApp(context, intent.getComponent().getClassName()); } parsePackage(context); if (sActivities.isEmpty()) { return null; } for (Activity activity : sActivities) { List<IntentFilter> filters = activity.filters; if (filters == null || filters.size() == 0) { continue; } for (IntentFilter filter : filters) { int match = filter.match(null, intent, false, "filter_match_tag"); if (match != NO_MATCH_TYPE && match != NO_MATCH_DATA && match != NO_MATCH_ACTION && match != NO_MATCH_CATEGORY) { return getActivityInfoInNewApp(context, activity.activityInfo.name); } } } return null; } }