diff options
Diffstat (limited to 'services/java/com/android/server/IntentResolver.java')
-rw-r--r-- | services/java/com/android/server/IntentResolver.java | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java index 1d3e3ac..b3d7220 100644 --- a/services/java/com/android/server/IntentResolver.java +++ b/services/java/com/android/server/IntentResolver.java @@ -41,7 +41,7 @@ import android.content.IntentFilter; /** * {@hide} */ -public class IntentResolver<F extends IntentFilter, R extends Object> { +public abstract class IntentResolver<F extends IntentFilter, R extends Object> { final private static String TAG = "IntentResolver"; final private static boolean DEBUG = false; final private static boolean localLOGV = DEBUG || false; @@ -333,14 +333,19 @@ public class IntentResolver<F extends IntentFilter, R extends Object> { return false; } - protected String packageForFilter(F filter) { - return null; - } + /** + * Return the package that owns this filter. This must be implemented to + * provide correct filtering of Intents that have specified a package name + * they are to be delivered to. + */ + protected abstract String packageForFilter(F filter); + @SuppressWarnings("unchecked") protected R newResult(F filter, int match) { return (R)filter; } + @SuppressWarnings("unchecked") protected void sortResults(List<R> results) { Collections.sort(results, mResolvePrioritySorter); } @@ -502,6 +507,7 @@ public class IntentResolver<F extends IntentFilter, R extends Object> { String resolvedType, String scheme, List<F> src, List<R> dest) { final String action = intent.getAction(); final Uri data = intent.getData(); + final String packageName = intent.getPackage(); final boolean excludingStopped = intent.isExcludingStopped(); @@ -520,6 +526,14 @@ public class IntentResolver<F extends IntentFilter, R extends Object> { continue; } + // Is delivery being limited to filters owned by a particular package? + if (packageName != null && !packageName.equals(packageForFilter(filter))) { + if (debug) { + Slog.v(TAG, " Filter is not from package " + packageName + "; skipping"); + } + continue; + } + // Do we already have this one? if (!allowFilterResult(filter, dest)) { if (debug) { @@ -561,6 +575,7 @@ public class IntentResolver<F extends IntentFilter, R extends Object> { } // Sorts a List of IntentFilter objects into descending priority order. + @SuppressWarnings("rawtypes") private static final Comparator mResolvePrioritySorter = new Comparator() { public int compare(Object o1, Object o2) { final int q1 = ((IntentFilter) o1).getPriority(); |