package android.app;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
/**
* 基于源码做的更改
* @author zhaoxuyang
* @since 2014-11-14
*/
final class ActivityIntentResolver extends
IntentResolver<PackageParser.ActivityIntentInfo, PackageParser.Activity> {
public List queryIntent(Intent intent, String resolvedType,
boolean defaultOnly) {
mFlags = defaultOnly ? PackageManager.MATCH_DEFAULT_ONLY : 0;
return super.queryIntent(intent, resolvedType, defaultOnly);
}
public List queryIntent(Intent intent, String resolvedType, int flags) {
mFlags = flags;
return super.queryIntent(intent, resolvedType,
(flags & PackageManager.MATCH_DEFAULT_ONLY) != 0);
}
public List queryIntentForPackage(Intent intent, String resolvedType,
int flags, ArrayList<PackageParser.Activity> packageActivities) {
if (packageActivities == null) {
return null;
}
mFlags = flags;
final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0;
int N = packageActivities.size();
ArrayList<ArrayList<PackageParser.ActivityIntentInfo>> listCut = new ArrayList<ArrayList<PackageParser.ActivityIntentInfo>>(
N);
ArrayList<PackageParser.ActivityIntentInfo> intentFilters;
for (int i = 0; i < N; ++i) {
intentFilters = packageActivities.get(i).intents;
if (intentFilters != null && intentFilters.size() > 0) {
listCut.add(intentFilters);
}
}
return super.queryIntentFromList(intent, resolvedType, defaultOnly,
listCut);
}
public final void addActivity(PackageParser.Activity a) {
mActivities.put(a.getComponentName(), a);
int NI = a.intents.size();
for (int j = 0; j < NI; j++) {
PackageParser.ActivityIntentInfo intent = a.intents.get(j);
addFilter(intent);
}
}
public final void removeActivity(PackageParser.Activity a) {
mActivities.remove(a.getComponentName());
int NI = a.intents.size();
for (int j = 0; j < NI; j++) {
PackageParser.ActivityIntentInfo intent = a.intents.get(j);
removeFilter(intent);
}
}
@Override
protected boolean allowFilterResult(
PackageParser.ActivityIntentInfo filter, List<PackageParser.Activity> dest) {
for (int i = dest.size() - 1; i >= 0; i--) {
PackageParser.Activity destAi = dest.get(i);
if (destAi == filter.activity) {
return false;
}
}
return true;
}
@Override
protected String packageForFilter(PackageParser.ActivityIntentInfo info) {
return info.activity.owner.packageName;
}
@Override
protected PackageParser.Activity newResult(PackageParser.ActivityIntentInfo info,
int match) {
return info.activity;
}
@Override
protected void sortResults(List<PackageParser.Activity> results) {
}
@Override
protected void dumpFilter(PrintWriter out, String prefix,
PackageParser.ActivityIntentInfo filter) {
out.print(prefix);
out.print(Integer.toHexString(System.identityHashCode(filter.activity)));
out.print(' ');
out.print(filter.activity.getComponentName());
out.print(" filter ");
out.println(Integer.toHexString(System.identityHashCode(filter)));
}
// Keys are String (activity class name), values are Activity.
public final HashMap<ComponentName, PackageParser.Activity> mActivities = new HashMap<ComponentName, PackageParser.Activity>();
private int mFlags;
}