Merge "Skip all receivers for a broadcast when it is replaced." into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a0c7abf552
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user