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 ProviderIntentResolver extends IntentResolver<PackageParser.ProviderIntentInfo, PackageParser.Provider> { 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.Provider> packageProviders) { if (packageProviders == null) { return null; } mFlags = flags; final boolean defaultOnly = (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0; int N = packageProviders.size(); ArrayList<ArrayList<PackageParser.ProviderIntentInfo>> listCut = new ArrayList<ArrayList<PackageParser.ProviderIntentInfo>>( N); ArrayList<PackageParser.ProviderIntentInfo> intentFilters; for (int i = 0; i < N; ++i) { intentFilters = packageProviders.get(i).intents; if (intentFilters != null && intentFilters.size() > 0) { listCut.add(intentFilters); } } return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut); } public final void addProvider(PackageParser.Provider p) { mProviders.put(p.getComponentName(), p); int NI = p.intents.size(); for (int j = 0; j < NI; j++) { PackageParser.ProviderIntentInfo intent = p.intents.get(j); addFilter(intent); } } public final void removeProvider(PackageParser.Provider p) { mProviders.remove(p.getComponentName()); int NI = p.intents.size(); for (int j = 0; j < NI; j++) { PackageParser.ProviderIntentInfo intent = p.intents.get(j); removeFilter(intent); } } @Override protected boolean allowFilterResult( PackageParser.ProviderIntentInfo filter, List<PackageParser.Provider> dest) { for (int i = dest.size() - 1; i >= 0; i--) { PackageParser.Provider destAi = dest.get(i); if (destAi == filter.provider) { return false; } } return true; } @Override protected String packageForFilter(PackageParser.ProviderIntentInfo info) { return info.provider.owner.packageName; } @Override protected PackageParser.Provider newResult(PackageParser.ProviderIntentInfo info, int match) { return info.provider; } @Override protected void sortResults(List<PackageParser.Provider> results) { } @Override protected void dumpFilter(PrintWriter out, String prefix, PackageParser.ProviderIntentInfo filter) { out.print(prefix); out.print(Integer.toHexString(System.identityHashCode(filter.provider))); out.print(' '); out.print(filter.provider.getComponentName()); out.print(" filter "); out.println(Integer.toHexString(System.identityHashCode(filter))); } // Keys are String (Service class name), values are Service. public final HashMap<ComponentName, PackageParser.Provider> mProviders = new HashMap<ComponentName, PackageParser.Provider>(); private int mFlags; }