From eae850cefe7e149f396c9e8ca1f34ec02b20a3f0 Mon Sep 17 00:00:00 2001 From: Mihai Preda Date: Wed, 13 May 2009 10:13:48 +0200 Subject: Allow intent resolution to be constrained by package name. --- .../java/com/android/server/IntentResolver.java | 17 ++++++++ .../com/android/server/PackageManagerService.java | 49 ++++++++++++++++++++-- 2 files changed, 62 insertions(+), 4 deletions(-) (limited to 'services') diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java index 72efca5..53e63c2 100644 --- a/services/java/com/android/server/IntentResolver.java +++ b/services/java/com/android/server/IntentResolver.java @@ -163,6 +163,23 @@ public class IntentResolver { return Collections.unmodifiableSet(mFilters); } + public List queryIntentFromList(Intent intent, String resolvedType, + boolean defaultOnly, ArrayList> listCut) { + ArrayList resultList = new ArrayList(); + + final boolean debug = localLOGV || + ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0); + + final String scheme = intent.getScheme(); + int N = listCut.size(); + for (int i = 0; i < N; ++i) { + buildResolveList(intent, debug, defaultOnly, + resolvedType, scheme, listCut.get(i), resultList); + } + sortResults(resultList); + return resultList; + } + public List queryIntent(ContentResolver resolver, Intent intent, String resolvedType, boolean defaultOnly) { String scheme = intent.getScheme(); diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 079f363..4ce40b6 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -1203,6 +1203,33 @@ class PackageManagerService extends IPackageManager.Stub { public ResolveInfo resolveIntent(Intent intent, String resolvedType, int flags) { List query = queryIntentActivities(intent, resolvedType, flags); + return chooseBestActivity(intent, resolvedType, flags, query); + } + + public ResolveInfo resolveIntentForPackage(Intent intent, String resolvedType, + int flags, String packageName) { + ComponentName comp = intent.getComponent(); + if (comp != null) { + // if this is an explicit intent, it must have the same the packageName + if (packageName.equals(comp.getPackageName())) { + return resolveIntent(intent, resolvedType, flags); + } + return null; + } else { + List query = null; + synchronized (mPackages) { + PackageParser.Package pkg = mPackages.get(packageName); + if (pkg != null) { + query = (List) mActivities. + queryIntentForPackage(intent, resolvedType, flags, pkg.activities); + } + } + return chooseBestActivity(intent, resolvedType, flags, query); + } + } + + private ResolveInfo chooseBestActivity(Intent intent, String resolvedType, + int flags, List query) { if (query != null) { final int N = query.size(); if (N == 1) { @@ -2853,6 +2880,22 @@ class PackageManagerService extends IPackageManager.Stub { (flags&PackageManager.MATCH_DEFAULT_ONLY) != 0); } + public List queryIntentForPackage(Intent intent, String resolvedType, int flags, + ArrayList packageActivities) { + if (packageActivities == null) { + return null; + } + mFlags = flags; + final boolean defaultOnly = (flags&PackageManager.MATCH_DEFAULT_ONLY) != 0; + int N = packageActivities.size(); + ArrayList> listCut = + new ArrayList>(N); + for (int i = 0; i < N; ++i) { + listCut.add(packageActivities.get(i).intents); + } + return super.queryIntentFromList(intent, resolvedType, defaultOnly, listCut); + } + public final void addActivity(PackageParser.Activity a, String type) { mActivities.put(a.component, a); if (SHOW_INFO || Config.LOGV) Log.v( @@ -2860,8 +2903,7 @@ class PackageManagerService extends IPackageManager.Stub { (a.info.nonLocalizedLabel != null ? a.info.nonLocalizedLabel : a.info.name) + ":"); if (SHOW_INFO || Config.LOGV) Log.v(TAG, " Class=" + a.info.name); int NI = a.intents.size(); - int j; - for (j=0; j