diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java index fe40a4ce3d13e..f48181b958927 100644 --- a/core/java/android/app/BroadcastOptions.java +++ b/core/java/android/app/BroadcastOptions.java @@ -60,7 +60,6 @@ public class BroadcastOptions extends ComponentOptions { private String[] mRequireNoneOfPermissions; private long mRequireCompatChangeId = CHANGE_INVALID; private long mIdForResponseEvent; - private @Nullable IntentFilter mRemoveMatchingFilter; private @DeliveryGroupPolicy int mDeliveryGroupPolicy; private @Nullable String mDeliveryGroupMatchingKey; private @Nullable BundleMerger mDeliveryGroupExtrasMerger; @@ -189,12 +188,6 @@ public class BroadcastOptions extends ComponentOptions { private static final String KEY_ID_FOR_RESPONSE_EVENT = "android:broadcast.idForResponseEvent"; - /** - * Corresponds to {@link #setRemoveMatchingFilter}. - */ - private static final String KEY_REMOVE_MATCHING_FILTER = - "android:broadcast.removeMatchingFilter"; - /** * Corresponds to {@link #setDeliveryGroupPolicy(int)}. */ @@ -273,18 +266,6 @@ public class BroadcastOptions extends ComponentOptions { return opts; } - /** - * {@hide} - * @deprecated use {@link #setDeliveryGroupMatchingFilter(IntentFilter)} instead. - */ - @Deprecated - public static @NonNull BroadcastOptions makeRemovingMatchingFilter( - @NonNull IntentFilter removeMatchingFilter) { - BroadcastOptions opts = new BroadcastOptions(); - opts.setRemoveMatchingFilter(removeMatchingFilter); - return opts; - } - /** * Creates a new {@code BroadcastOptions} with no options initially set. */ @@ -315,8 +296,6 @@ public class BroadcastOptions extends ComponentOptions { mRequireNoneOfPermissions = opts.getStringArray(KEY_REQUIRE_NONE_OF_PERMISSIONS); mRequireCompatChangeId = opts.getLong(KEY_REQUIRE_COMPAT_CHANGE_ID, CHANGE_INVALID); mIdForResponseEvent = opts.getLong(KEY_ID_FOR_RESPONSE_EVENT); - mRemoveMatchingFilter = opts.getParcelable(KEY_REMOVE_MATCHING_FILTER, - IntentFilter.class); mDeliveryGroupPolicy = opts.getInt(KEY_DELIVERY_GROUP_POLICY, DELIVERY_GROUP_POLICY_ALL); mDeliveryGroupMatchingKey = opts.getString(KEY_DELIVERY_GROUP_KEY); @@ -796,31 +775,6 @@ public class BroadcastOptions extends ComponentOptions { return (mFlags & FLAG_IS_DEFER_UNTIL_ACTIVE) != 0; } - /** - * When enqueuing this broadcast, remove all pending broadcasts previously - * sent by this app which match the given filter. - *

- * For example, sending {@link Intent#ACTION_SCREEN_ON} would typically want - * to remove any pending {@link Intent#ACTION_SCREEN_OFF} broadcasts. - * - * @hide - * @deprecated use {@link #setDeliveryGroupMatchingFilter(IntentFilter)} instead. - */ - @Deprecated - public void setRemoveMatchingFilter(@NonNull IntentFilter removeMatchingFilter) { - mRemoveMatchingFilter = Objects.requireNonNull(removeMatchingFilter); - } - - /** @hide */ - public void clearRemoveMatchingFilter() { - mRemoveMatchingFilter = null; - } - - /** @hide */ - public @Nullable IntentFilter getRemoveMatchingFilter() { - return mRemoveMatchingFilter; - } - /** * Set delivery group policy for this broadcast to specify how multiple broadcasts belonging to * the same delivery group has to be handled. @@ -1092,9 +1046,6 @@ public class BroadcastOptions extends ComponentOptions { if (mIdForResponseEvent != 0) { b.putLong(KEY_ID_FOR_RESPONSE_EVENT, mIdForResponseEvent); } - if (mRemoveMatchingFilter != null) { - b.putParcelable(KEY_REMOVE_MATCHING_FILTER, mRemoveMatchingFilter); - } if (mDeliveryGroupPolicy != DELIVERY_GROUP_POLICY_ALL) { b.putInt(KEY_DELIVERY_GROUP_POLICY, mDeliveryGroupPolicy); } diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 10cd6ac5b0c21..e9a7f205c5191 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -192,20 +192,21 @@ public final class BatteryService extends SystemService { private ArrayDeque mBatteryLevelsEventQueue; private long mLastBatteryLevelChangedSentMs; - private Bundle mBatteryChangedOptions = BroadcastOptions.makeRemovingMatchingFilter( - new IntentFilter(Intent.ACTION_BATTERY_CHANGED)).setDeferUntilActive(true) + private Bundle mBatteryChangedOptions = BroadcastOptions.makeBasic() + .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) + .setDeferUntilActive(true) .toBundle(); - private Bundle mPowerConnectedOptions = BroadcastOptions.makeRemovingMatchingFilter( - new IntentFilter(Intent.ACTION_POWER_DISCONNECTED)).setDeferUntilActive(true) + /** Used for both connected/disconnected, so match using key */ + private Bundle mPowerOptions = BroadcastOptions.makeBasic() + .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) + .setDeliveryGroupMatchingKey("android", Intent.ACTION_POWER_CONNECTED) + .setDeferUntilActive(true) .toBundle(); - private Bundle mPowerDisconnectedOptions = BroadcastOptions.makeRemovingMatchingFilter( - new IntentFilter(Intent.ACTION_POWER_CONNECTED)).setDeferUntilActive(true) - .toBundle(); - private Bundle mBatteryLowOptions = BroadcastOptions.makeRemovingMatchingFilter( - new IntentFilter(Intent.ACTION_BATTERY_OKAY)).setDeferUntilActive(true) - .toBundle(); - private Bundle mBatteryOkayOptions = BroadcastOptions.makeRemovingMatchingFilter( - new IntentFilter(Intent.ACTION_BATTERY_LOW)).setDeferUntilActive(true) + /** Used for both low/okay, so match using key */ + private Bundle mBatteryOptions = BroadcastOptions.makeBasic() + .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) + .setDeliveryGroupMatchingKey("android", Intent.ACTION_BATTERY_OKAY) + .setDeferUntilActive(true) .toBundle(); private MetricsLogger mMetricsLogger; @@ -636,7 +637,7 @@ public final class BatteryService extends SystemService { @Override public void run() { mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL, null, - mPowerConnectedOptions); + mPowerOptions); } }); } @@ -648,7 +649,7 @@ public final class BatteryService extends SystemService { @Override public void run() { mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL, null, - mPowerDisconnectedOptions); + mPowerOptions); } }); } @@ -662,7 +663,7 @@ public final class BatteryService extends SystemService { @Override public void run() { mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL, null, - mBatteryLowOptions); + mBatteryOptions); } }); } else if (mSentLowBatteryBroadcast && @@ -675,7 +676,7 @@ public final class BatteryService extends SystemService { @Override public void run() { mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL, null, - mBatteryOkayOptions); + mBatteryOptions); } }); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7df761371b8b6..61899fd0f630d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -18179,8 +18179,9 @@ public class ActivityManagerService extends IActivityManager.Stub bOptions.setTemporaryAppAllowlist(mInternal.getBootTimeTempAllowListDuration(), TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED, PowerExemptionManager.REASON_LOCALE_CHANGED, ""); - bOptions.setRemoveMatchingFilter( - new IntentFilter(Intent.ACTION_LOCALE_CHANGED)); + bOptions.setDeliveryGroupPolicy( + BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT); + bOptions.setDeferUntilActive(true); broadcastIntentLocked(null, null, null, intent, null, null, 0, null, null, null, null, null, OP_NONE, bOptions.toBundle(), false, false, MY_PID, SYSTEM_UID, Binder.getCallingUid(), Binder.getCallingPid(), diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index b942f4b96b219..0c2169129ca5a 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -597,18 +597,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { final int cookie = traceBegin("enqueueBroadcast"); r.applySingletonPolicy(mService); - final IntentFilter removeMatchingFilter = (r.options != null) - ? r.options.getRemoveMatchingFilter() : null; - if (removeMatchingFilter != null) { - final Predicate removeMatching = removeMatchingFilter.asPredicate(); - forEachMatchingBroadcast(QUEUE_PREDICATE_ANY, (testRecord, testIndex) -> { - // We only allow caller to remove broadcasts they enqueued - return (r.callingUid == testRecord.callingUid) - && (r.userId == testRecord.userId) - && removeMatching.test(testRecord.intent); - }, mBroadcastConsumerSkipAndCanceled, true); - } - applyDeliveryGroupPolicy(r); r.enqueueTime = SystemClock.uptimeMillis(); diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java index 95c2ed2f841fa..99da415380cd7 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java @@ -758,40 +758,6 @@ public final class BroadcastQueueModernImplTest { queue.getActive().intent.getAction()); } - /** - * Verify that sending a broadcast that removes any matching pending - * broadcasts is applied as expected. - */ - @Test - public void testRemoveMatchingFilter() { - final Intent screenOn = new Intent(Intent.ACTION_SCREEN_ON); - final BroadcastOptions optionsOn = BroadcastOptions.makeBasic(); - optionsOn.setRemoveMatchingFilter(new IntentFilter(Intent.ACTION_SCREEN_OFF)); - - final Intent screenOff = new Intent(Intent.ACTION_SCREEN_OFF); - final BroadcastOptions optionsOff = BroadcastOptions.makeBasic(); - optionsOff.setRemoveMatchingFilter(new IntentFilter(Intent.ACTION_SCREEN_ON)); - - // Halt all processing so that we get a consistent view - mHandlerThread.getLooper().getQueue().postSyncBarrier(); - - mImpl.enqueueBroadcastLocked(makeBroadcastRecord(screenOn, optionsOn)); - mImpl.enqueueBroadcastLocked(makeBroadcastRecord(screenOff, optionsOff)); - mImpl.enqueueBroadcastLocked(makeBroadcastRecord(screenOn, optionsOn)); - mImpl.enqueueBroadcastLocked(makeBroadcastRecord(screenOff, optionsOff)); - - // While we're here, give our health check some test coverage - mImpl.checkHealthLocked(); - - // Marching through the queue we should only have one SCREEN_OFF - // broadcast, since that's the last state we dispatched - final BroadcastProcessQueue queue = mImpl.getProcessQueue(PACKAGE_GREEN, - getUidForPackage(PACKAGE_GREEN)); - queue.makeActiveNextPending(); - assertEquals(Intent.ACTION_SCREEN_OFF, queue.getActive().intent.getAction()); - assertTrue(queue.isEmpty()); - } - /** * Verify that sending a broadcast with DELIVERY_GROUP_POLICY_MOST_RECENT works as expected. */