summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2023-12-30 07:15:32 +0000
committer Sudheer Shanka <sudheersai@google.com> 2023-12-30 07:29:44 +0000
commit1d36edb695a2a289043dd2b19752ef1380373d7c (patch)
treea4a32d7ece96ae9b2acc45e1300b5f3db2547a56
parentdd82dd11858889e61bc9afe15ccddd6f1434ab41 (diff)
Avoid replacing receivers with ones from the same BroadcastRecord.
Bug: 317217769 Test: atest services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java Change-Id: Id9943792565e3643efa27c03f3f869ad2e2f35f5
-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);