Loading services/core/java/com/android/server/am/BroadcastProcessQueue.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading services/core/java/com/android/server/am/BroadcastQueueImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +6 −5 Original line number Diff line number Diff line Loading @@ -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); } } } } Loading services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +28 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
services/core/java/com/android/server/am/BroadcastProcessQueue.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading
services/core/java/com/android/server/am/BroadcastQueueImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading
services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +6 −5 Original line number Diff line number Diff line Loading @@ -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); } } } } Loading
services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +28 −0 Original line number Diff line number Diff line Loading @@ -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); Loading