diff options
| author | 2023-12-31 00:24:36 +0000 | |
|---|---|---|
| committer | 2023-12-31 00:24:36 +0000 | |
| commit | 1ce208cd0448478eb4c94defeb2edc5a421f3210 (patch) | |
| tree | e0a77da195c5f2d07f8a8ad9ccea8d32f1bbdb5e | |
| parent | 33674d8d6683e5a600458026937b196a9a34ab68 (diff) | |
| parent | 1d36edb695a2a289043dd2b19752ef1380373d7c (diff) | |
Merge "Avoid replacing receivers with ones from the same BroadcastRecord." into main
| -rw-r--r-- | services/core/java/com/android/server/am/BroadcastProcessQueue.java | 3 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java | 27 |
2 files changed, 28 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java index 0b561467a078..c37e619ed985 100644 --- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java +++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java @@ -353,8 +353,7 @@ class BroadcastProcessQueue { // If we come across the record that's being enqueued in the queue, then that means // we already enqueued it for a receiver in this process and trying to insert a new // one past this could create priority inversion in the queue, so bail out. - if (record == testRecord && record.blockedUntilBeyondCount[recordIndex] - > testRecord.blockedUntilBeyondCount[testRecordIndex]) { + if (record == testRecord) { break; } if ((record.callingUid == testRecord.callingUid) diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index 115a5b0d53f2..e7aaed4edbff 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -67,6 +67,7 @@ import android.content.IIntentReceiver; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Binder; import android.os.Bundle; import android.os.DeadObjectException; @@ -1878,6 +1879,32 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { } @Test + public void testReplacePending_withSingletonReceiver() throws Exception { + final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_PHONE); + final ProcessRecord systemApp = makeActiveProcessRecord(PACKAGE_ANDROID, PROCESS_SYSTEM); + + final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED) + .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); + + final ResolveInfo systemReceiverA = makeManifestReceiver(PACKAGE_ANDROID, PROCESS_SYSTEM, + CLASS_BLUE, USER_SYSTEM); + final ResolveInfo systemReceiverB = makeManifestReceiver(PACKAGE_ANDROID, PROCESS_SYSTEM, + CLASS_BLUE, USER_GUEST); + + enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of( + systemReceiverA, systemReceiverB))); + + assertEquals("Unexpected userId for receiverA", USER_SYSTEM, + UserHandle.getUserId(systemReceiverA.activityInfo.applicationInfo.uid)); + assertEquals("Unexpected userId for receiverB", USER_SYSTEM, + UserHandle.getUserId(systemReceiverB.activityInfo.applicationInfo.uid)); + + waitForIdle(); + + verifyScheduleReceiver(times(2), systemApp, airplane); + } + + @Test public void testIdleAndBarrier() throws Exception { final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED); final ProcessRecord receiverApp = makeActiveProcessRecord(PACKAGE_GREEN); |