diff options
Diffstat (limited to 'services/java/com/android/server')
3 files changed, 17 insertions, 3 deletions
diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java index 9b19008..8f703f0 100644 --- a/services/java/com/android/server/IntentResolver.java +++ b/services/java/com/android/server/IntentResolver.java @@ -609,7 +609,7 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> { public int compare(Object o1, Object o2) { final int q1 = ((IntentFilter) o1).getPriority(); final int q2 = ((IntentFilter) o2).getPriority(); - return (q1 > q2) ? -1 : ((q1 < q2) ? 1 : 0); + return (q1 > q2) ? -1 : ((q1 < q2) ? 1 : ((IntentFilter) o1).onCompareTie((IntentFilter) o2)); } }; diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 618f02c..d7f9eb4 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -11522,7 +11522,7 @@ public final class ActivityManagerService extends ActivityManagerNative + " was previously registered for user " + rl.userId); } BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, - permission, callingUid, userId); + permission, callingUid, userId, (callerApp.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0); rl.add(bf); if (!bf.debugCheck()) { Slog.w(TAG, "==> For Dynamic broadast"); diff --git a/services/java/com/android/server/am/BroadcastFilter.java b/services/java/com/android/server/am/BroadcastFilter.java index c631b6e..1d983c7 100644 --- a/services/java/com/android/server/am/BroadcastFilter.java +++ b/services/java/com/android/server/am/BroadcastFilter.java @@ -29,15 +29,17 @@ class BroadcastFilter extends IntentFilter { final String requiredPermission; final int owningUid; final int owningUserId; + final boolean isSystem; BroadcastFilter(IntentFilter _filter, ReceiverList _receiverList, - String _packageName, String _requiredPermission, int _owningUid, int _userId) { + String _packageName, String _requiredPermission, int _owningUid, int _userId, boolean _isSystem) { super(_filter); receiverList = _receiverList; packageName = _packageName; requiredPermission = _requiredPermission; owningUid = _owningUid; owningUserId = _userId; + isSystem = _isSystem; } public void dump(PrintWriter pw, String prefix) { @@ -71,4 +73,16 @@ class BroadcastFilter extends IntentFilter { sb.append('}'); return sb.toString(); } + + @Override + public int onCompareTie(IntentFilter other) { + // in case of a tie when sorting ordered broadcasts, + // favor system apps. + BroadcastFilter bf = (BroadcastFilter)other; + if (isSystem) + return -1; + if (bf.isSystem) + return 1; + return 0; + } } |
