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.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.UptimeMillisLong;
|
import android.annotation.UptimeMillisLong;
|
||||||
|
import android.app.BroadcastOptions;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
@@ -257,7 +258,10 @@ class BroadcastProcessQueue {
|
|||||||
deferredStatesApplyConsumer.accept(record, recordIndex);
|
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);
|
final BroadcastRecord replacedBroadcastRecord = replaceBroadcast(record, recordIndex);
|
||||||
if (replacedBroadcastRecord != null) {
|
if (replacedBroadcastRecord != null) {
|
||||||
return replacedBroadcastRecord;
|
return replacedBroadcastRecord;
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ public class BroadcastQueueImpl extends BroadcastQueue {
|
|||||||
private BroadcastRecord replaceBroadcastLocked(ArrayList<BroadcastRecord> queue,
|
private BroadcastRecord replaceBroadcastLocked(ArrayList<BroadcastRecord> queue,
|
||||||
BroadcastRecord r, String typeForLogging) {
|
BroadcastRecord r, String typeForLogging) {
|
||||||
final Intent intent = r.intent;
|
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);
|
final BroadcastRecord old = queue.get(i);
|
||||||
if (old.userId == r.userId && intent.filterEquals(old.intent)) {
|
if (old.userId == r.userId && intent.filterEquals(old.intent)) {
|
||||||
if (DEBUG_BROADCAST) {
|
if (DEBUG_BROADCAST) {
|
||||||
|
|||||||
@@ -719,11 +719,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
|
|||||||
private void skipAndCancelReplacedBroadcasts(ArraySet<BroadcastRecord> replacedBroadcasts) {
|
private void skipAndCancelReplacedBroadcasts(ArraySet<BroadcastRecord> replacedBroadcasts) {
|
||||||
for (int i = 0; i < replacedBroadcasts.size(); ++i) {
|
for (int i = 0; i < replacedBroadcasts.size(); ++i) {
|
||||||
final BroadcastRecord r = replacedBroadcasts.valueAt(i);
|
final BroadcastRecord r = replacedBroadcasts.valueAt(i);
|
||||||
r.resultCode = Activity.RESULT_CANCELED;
|
// Skip all the receivers in the replaced broadcast
|
||||||
r.resultData = null;
|
for (int rcvrIdx = 0; rcvrIdx < r.receivers.size(); ++rcvrIdx) {
|
||||||
r.resultExtras = null;
|
if (!isDeliveryStateTerminal(r.getDeliveryState(rcvrIdx))) {
|
||||||
scheduleResultTo(r);
|
mBroadcastConsumerSkipAndCanceled.accept(r, rcvrIdx);
|
||||||
notifyFinishBroadcast(r);
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1903,6 +1903,34 @@ public class BroadcastQueueTest {
|
|||||||
anyInt(), anyInt(), any());
|
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
|
@Test
|
||||||
public void testIdleAndBarrier() throws Exception {
|
public void testIdleAndBarrier() throws Exception {
|
||||||
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
|
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
|
||||||
|
|||||||
Reference in New Issue
Block a user