summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2023-12-31 00:24:36 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-12-31 00:24:36 +0000
commit1ce208cd0448478eb4c94defeb2edc5a421f3210 (patch)
treee0a77da195c5f2d07f8a8ad9ccea8d32f1bbdb5e
parent33674d8d6683e5a600458026937b196a9a34ab68 (diff)
parent1d36edb695a2a289043dd2b19752ef1380373d7c (diff)
Merge "Avoid replacing receivers with ones from the same BroadcastRecord." into main
-rw-r--r--services/core/java/com/android/server/am/BroadcastProcessQueue.java3
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java27
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);