diff options
| author | Ashwini Oruganti <ashfall@google.com> | 2021-04-06 12:43:29 -0700 |
|---|---|---|
| committer | Ashwini Oruganti <ashfall@google.com> | 2021-04-12 21:58:51 +0000 |
| commit | a9192592858e42e7b43e3b7461ed772f83f6c477 (patch) | |
| tree | 845d11093343ad496f2346aa1fec80ec6292d6dd /core/java/android | |
| parent | 517485f89390e64d0480a82456017fb054ea3d98 (diff) | |
Add an excludedPermission arg to filter the set of apps that a broadcast
gets sent to
This adds an API to allow sending a broadcast to an app that has permission FOO but not permission BAR.
Earlier, a lack of this option was causing a double send problem for broadcasts, which should now be resolved.
Test: manual
Bug: 183537857
Change-Id: I13287d63e039164694be4daa832bb23709990054
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/ActivityManager.java | 3 | ||||
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 85 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.aidl | 2 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 11 | ||||
| -rw-r--r-- | core/java/android/content/ContextWrapper.java | 7 |
5 files changed, 76 insertions, 32 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index db42803ac9f9..a24555f79a1c 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -4272,7 +4272,8 @@ public class ActivityManager { try { getService().broadcastIntentWithFeature( null, null, intent, null, null, Activity.RESULT_OK, null, null, - null /*permission*/, appOp, null, false, true, userId); + null /*requiredPermissions*/, null /*excludedPermissions*/, appOp, null, false, + true, userId); } catch (RemoteException ex) { } } diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index ec7d159f707b..aabb6b2f9109 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1176,8 +1176,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, - false, getUserId()); + null, Activity.RESULT_OK, null, null, null, null /*excludedPermissions=*/, + AppOpsManager.OP_NONE, null, false, false, getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1194,7 +1194,8 @@ class ContextImpl extends Context { ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, null, Activity.RESULT_OK, null, null, receiverPermissions, - AppOpsManager.OP_NONE, null, false, false, getUserId()); + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, null, false, false, + getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1209,7 +1210,8 @@ class ContextImpl extends Context { ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, null, Activity.RESULT_OK, null, null, receiverPermissions, - AppOpsManager.OP_NONE, null, false, false, getUserId()); + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, null, false, false, + getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1224,7 +1226,24 @@ class ContextImpl extends Context { ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, null, Activity.RESULT_OK, null, null, receiverPermissions, - AppOpsManager.OP_NONE, null, false, false, user.getIdentifier()); + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, null, false, false, + user.getIdentifier()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + @Override + public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, + String[] excludedPermissions) { + warnIfCallingFromSystemProcess(); + String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); + try { + intent.prepareToLeaveProcess(this); + ActivityManager.getService().broadcastIntentWithFeature( + mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, + null, Activity.RESULT_OK, null, null, receiverPermissions, excludedPermissions, + AppOpsManager.OP_NONE, null, false, false, getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1241,7 +1260,8 @@ class ContextImpl extends Context { ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, null, Activity.RESULT_OK, null, null, receiverPermissions, - AppOpsManager.OP_NONE, options, false, false, getUserId()); + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, options, false, false, + getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1257,8 +1277,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, receiverPermissions, appOp, null, false, - false, getUserId()); + null, Activity.RESULT_OK, null, null, receiverPermissions, + null /*excludedPermissions=*/, appOp, null, false, false, getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1275,7 +1295,8 @@ class ContextImpl extends Context { ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, null, Activity.RESULT_OK, null, null, receiverPermissions, - AppOpsManager.OP_NONE, null, true, false, getUserId()); + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, null, true, false, + getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1337,8 +1358,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - rd, initialCode, initialData, initialExtras, receiverPermissions, appOp, - options, true, false, getUserId()); + rd, initialCode, initialData, initialExtras, receiverPermissions, + null /*excludedPermissions=*/, appOp, options, true, false, getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1351,8 +1372,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, - false, user.getIdentifier()); + null, Activity.RESULT_OK, null, null, null, null /*excludedPermissions=*/, + AppOpsManager.OP_NONE, null, false, false, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1375,7 +1396,8 @@ class ContextImpl extends Context { ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, null, Activity.RESULT_OK, null, null, receiverPermissions, - AppOpsManager.OP_NONE, options, false, false, user.getIdentifier()); + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, options, false, false, + user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1391,8 +1413,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, receiverPermissions, appOp, null, false, - false, user.getIdentifier()); + null, Activity.RESULT_OK, null, null, receiverPermissions, + null /*excludedPermissions=*/, appOp, null, false, false, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1442,8 +1464,9 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - rd, initialCode, initialData, initialExtras, receiverPermissions, appOp, - options, true, false, user.getIdentifier()); + rd, initialCode, initialData, initialExtras, receiverPermissions, + null /*excludedPermissions=*/, appOp, options, true, false, + user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1483,8 +1506,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, - true, getUserId()); + null, Activity.RESULT_OK, null, null, null, null /*excludedPermissions=*/, + AppOpsManager.OP_NONE, null, false, true, getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1522,8 +1545,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, options, - false, true, getUserId()); + null, Activity.RESULT_OK, null, null, null, null /*excludedPermissions=*/, + AppOpsManager.OP_NONE, options, false, true, getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1558,8 +1581,9 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - rd, initialCode, initialData, initialExtras, null, AppOpsManager.OP_NONE, null, - true, true, getUserId()); + rd, initialCode, initialData, initialExtras, null, + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, null, true, true, + getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1590,8 +1614,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, - true, user.getIdentifier()); + null, Activity.RESULT_OK, null, null, null, null /*excludedPermissions=*/, + AppOpsManager.OP_NONE, null, false, true, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1605,8 +1629,8 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - null, Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, options, - false, true, user.getIdentifier()); + null, Activity.RESULT_OK, null, null, null, null /*excludedPermissions=*/, + AppOpsManager.OP_NONE, options, false, true, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1640,8 +1664,9 @@ class ContextImpl extends Context { intent.prepareToLeaveProcess(this); ActivityManager.getService().broadcastIntentWithFeature( mMainThread.getApplicationThread(), getAttributionTag(), intent, resolvedType, - rd, initialCode, initialData, initialExtras, null, AppOpsManager.OP_NONE, null, - true, true, user.getIdentifier()); + rd, initialCode, initialData, initialExtras, null, + null /*excludedPermissions=*/, AppOpsManager.OP_NONE, null, true, true, + user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index f9279da172a0..89d90a3b9d6f 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -137,7 +137,7 @@ interface IActivityManager { int appOp, in Bundle options, boolean serialized, boolean sticky, int userId); int broadcastIntentWithFeature(in IApplicationThread caller, in String callingFeatureId, in Intent intent, in String resolvedType, in IIntentReceiver resultTo, int resultCode, - in String resultData, in Bundle map, in String[] requiredPermissions, + in String resultData, in Bundle map, in String[] requiredPermissions, in String[] excludePermissions, int appOp, in Bundle options, boolean serialized, boolean sticky, int userId); void unbroadcastIntent(in IApplicationThread caller, in Intent intent, int userId); @UnsupportedAppUsage diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 09ac8103c526..318913f3bec0 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2208,6 +2208,17 @@ public abstract class Context { } /** + * Like {@link #sendBroadcastMultiplePermissions(Intent, String[])}, but also allows + * specification of a list of excluded permissions. This allows sending a broadcast to an + * app that has the permissions in `receiverPermissions` but not `excludedPermissions`. + * @hide + */ + public void sendBroadcastMultiplePermissions(@NonNull Intent intent, + @NonNull String[] receiverPermissions, @Nullable String[] excludedPermissions) { + throw new RuntimeException("Not implemented. Must override in a subclass."); + } + + /** * Broadcast the given intent to all interested BroadcastReceivers, allowing * an array of required permissions to be enforced. This call is asynchronous; it returns * immediately, and you will continue executing while the receivers are run. No results are diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 8936d0c47a58..dddcbea63872 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -493,6 +493,13 @@ public class ContextWrapper extends Context { /** @hide */ @Override + public void sendBroadcastMultiplePermissions(@NonNull Intent intent, + @NonNull String[] receiverPermissions, @Nullable String[] excludedPermissions) { + mBase.sendBroadcastMultiplePermissions(intent, receiverPermissions, excludedPermissions); + } + + /** @hide */ + @Override public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions) { mBase.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions); |
