Merge "Skip all receivers for a broadcast when it is replaced." into udc-dev

This commit is contained in:
Sudheer Shanka
2023-06-03 00:41:04 +00:00
committed by Android (Google) Code Review
4 changed files with 40 additions and 7 deletions

View File

@@ -25,6 +25,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UptimeMillisLong;
import android.app.BroadcastOptions;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.SystemClock;
@@ -257,7 +258,10 @@ class BroadcastProcessQueue {
deferredStatesApplyConsumer.accept(record, recordIndex);
}
if (record.isReplacePending()) {
// Ignore FLAG_RECEIVER_REPLACE_PENDING if the sender specified the policy using the
// BroadcastOptions delivery group APIs.
if (record.isReplacePending()
&& record.getDeliveryGroupPolicy() == BroadcastOptions.DELIVERY_GROUP_POLICY_ALL) {
final BroadcastRecord replacedBroadcastRecord = replaceBroadcast(record, recordIndex);
if (replacedBroadcastRecord != null) {
return replacedBroadcastRecord;

View File

@@ -339,7 +339,7 @@ public class BroadcastQueueImpl extends BroadcastQueue {
private BroadcastRecord replaceBroadcastLocked(ArrayList<BroadcastRecord> queue,
BroadcastRecord r, String typeForLogging) {
final Intent intent = r.intent;
for (int i = queue.size() - 1; i > 0; i--) {
for (int i = queue.size() - 1; i >= 0; i--) {
final BroadcastRecord old = queue.get(i);
if (old.userId == r.userId && intent.filterEquals(old.intent)) {
if (DEBUG_BROADCAST) {

View File

@@ -719,11 +719,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
private void skipAndCancelReplacedBroadcasts(ArraySet<BroadcastRecord> replacedBroadcasts) {
for (int i = 0; i < replacedBroadcasts.size(); ++i) {
final BroadcastRecord r = replacedBroadcasts.valueAt(i);
r.resultCode = Activity.RESULT_CANCELED;
r.resultData = null;
r.resultExtras = null;
scheduleResultTo(r);
notifyFinishBroadcast(r);
// Skip all the receivers in the replaced broadcast
for (int rcvrIdx = 0; rcvrIdx < r.receivers.size(); ++rcvrIdx) {
if (!isDeliveryStateTerminal(r.getDeliveryState(rcvrIdx))) {
mBroadcastConsumerSkipAndCanceled.accept(r, rcvrIdx);
}
}
}
}

View File

@@ -1903,6 +1903,34 @@ public class BroadcastQueueTest {
anyInt(), anyInt(), any());
}
@Test
public void testReplacePending_diffReceivers() throws Exception {
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
final ProcessRecord receiverGreenApp = makeActiveProcessRecord(PACKAGE_GREEN);
final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);
final ProcessRecord receiverYellowApp = makeActiveProcessRecord(PACKAGE_YELLOW);
final BroadcastFilter receiverGreen = makeRegisteredReceiver(receiverGreenApp);
final BroadcastFilter receiverBlue = makeRegisteredReceiver(receiverBlueApp);
final BroadcastFilter receiverYellow = makeRegisteredReceiver(receiverYellowApp);
final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)
.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
withPriority(receiverGreen, 10),
withPriority(receiverBlue, 5),
withPriority(receiverYellow, 0))));
enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
withPriority(receiverGreen, 10),
withPriority(receiverBlue, 5))));
waitForIdle();
verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
verifyScheduleRegisteredReceiver(never(), receiverYellowApp, airplane);
}
@Test
public void testIdleAndBarrier() throws Exception {
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);