Loading services/core/java/com/android/server/am/BroadcastProcessQueue.java +7 −1 Original line number Diff line number Diff line Loading @@ -1015,6 +1015,7 @@ class BroadcastProcessQueue { static final int REASON_CONTAINS_INSTRUMENTED = 16; static final int REASON_CONTAINS_MANIFEST = 17; static final int REASON_FOREGROUND = 18; static final int REASON_CORE_UID = 19; @IntDef(flag = false, prefix = { "REASON_" }, value = { REASON_EMPTY, Loading @@ -1035,6 +1036,7 @@ class BroadcastProcessQueue { REASON_CONTAINS_INSTRUMENTED, REASON_CONTAINS_MANIFEST, REASON_FOREGROUND, REASON_CORE_UID, }) @Retention(RetentionPolicy.SOURCE) public @interface Reason {} Loading @@ -1059,6 +1061,7 @@ class BroadcastProcessQueue { case REASON_CONTAINS_INSTRUMENTED: return "CONTAINS_INSTRUMENTED"; case REASON_CONTAINS_MANIFEST: return "CONTAINS_MANIFEST"; case REASON_FOREGROUND: return "FOREGROUND"; case REASON_CORE_UID: return "CORE_UID"; default: return Integer.toString(reason); } } Loading Loading @@ -1103,6 +1106,9 @@ class BroadcastProcessQueue { } else if (mProcessPersistent) { mRunnableAt = runnableAt + constants.DELAY_PERSISTENT_PROC_MILLIS; mRunnableAtReason = REASON_PERSISTENT; } else if (UserHandle.isCore(uid)) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CORE_UID; } else if (mCountOrdered > 0) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CONTAINS_ORDERED; Loading Loading @@ -1257,7 +1263,7 @@ class BroadcastProcessQueue { BroadcastProcessQueue test = head; BroadcastProcessQueue tail = null; while (test != null) { if (test.getRunnableAt() >= itemRunnableAt) { if (test.getRunnableAt() > itemRunnableAt) { item.runnableAtNext = test; item.runnableAtPrev = test.runnableAtPrev; if (item.runnableAtNext != null) { Loading services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ import android.os.Bundle; import android.os.BundleMerger; import android.os.DropBoxManager; import android.os.HandlerThread; import android.os.Process; import android.os.SystemClock; import android.os.TestLooperManager; import android.os.UserHandle; Loading Loading @@ -326,6 +327,20 @@ public final class BroadcastQueueModernImplTest { assertOrphan(mQueue4); } @Test public void testRunnableList_sameRunnableAt() { doReturn(2L).when(mQueue1).getRunnableAt(); doReturn(2L).when(mQueue2).getRunnableAt(); doReturn(2L).when(mQueue3).getRunnableAt(); doReturn(2L).when(mQueue4).getRunnableAt(); mHead = insertIntoRunnableList(mHead, mQueue1); mHead = insertIntoRunnableList(mHead, mQueue2); mHead = insertIntoRunnableList(mHead, mQueue3); mHead = insertIntoRunnableList(mHead, mQueue4); assertRunnableList(List.of(mQueue1, mQueue2, mQueue3, mQueue4), mHead); } @Test public void testProcessQueue_Complex() { BroadcastProcessQueue red = mImpl.getOrCreateProcessQueue(PACKAGE_RED, TEST_UID); Loading Loading @@ -561,6 +576,20 @@ public final class BroadcastQueueModernImplTest { assertEquals(BroadcastProcessQueue.REASON_NORMAL, queue.getRunnableAtReason()); } @Test public void testRunnableAt_coreUid() { final BroadcastProcessQueue queue = new BroadcastProcessQueue(mConstants, "com.android.bluetooth", Process.BLUETOOTH_UID); final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK); final BroadcastRecord timeTickRecord = makeBroadcastRecord(timeTick, List.of(makeMockRegisteredReceiver())); enqueueOrReplaceBroadcast(queue, timeTickRecord, 0); assertThat(queue.getRunnableAt()).isEqualTo(timeTickRecord.enqueueTime); assertEquals(BroadcastProcessQueue.REASON_CORE_UID, queue.getRunnableAtReason()); } /** * Verify that a cached process that would normally be delayed becomes * immediately runnable when the given broadcast is enqueued. Loading Loading
services/core/java/com/android/server/am/BroadcastProcessQueue.java +7 −1 Original line number Diff line number Diff line Loading @@ -1015,6 +1015,7 @@ class BroadcastProcessQueue { static final int REASON_CONTAINS_INSTRUMENTED = 16; static final int REASON_CONTAINS_MANIFEST = 17; static final int REASON_FOREGROUND = 18; static final int REASON_CORE_UID = 19; @IntDef(flag = false, prefix = { "REASON_" }, value = { REASON_EMPTY, Loading @@ -1035,6 +1036,7 @@ class BroadcastProcessQueue { REASON_CONTAINS_INSTRUMENTED, REASON_CONTAINS_MANIFEST, REASON_FOREGROUND, REASON_CORE_UID, }) @Retention(RetentionPolicy.SOURCE) public @interface Reason {} Loading @@ -1059,6 +1061,7 @@ class BroadcastProcessQueue { case REASON_CONTAINS_INSTRUMENTED: return "CONTAINS_INSTRUMENTED"; case REASON_CONTAINS_MANIFEST: return "CONTAINS_MANIFEST"; case REASON_FOREGROUND: return "FOREGROUND"; case REASON_CORE_UID: return "CORE_UID"; default: return Integer.toString(reason); } } Loading Loading @@ -1103,6 +1106,9 @@ class BroadcastProcessQueue { } else if (mProcessPersistent) { mRunnableAt = runnableAt + constants.DELAY_PERSISTENT_PROC_MILLIS; mRunnableAtReason = REASON_PERSISTENT; } else if (UserHandle.isCore(uid)) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CORE_UID; } else if (mCountOrdered > 0) { mRunnableAt = runnableAt; mRunnableAtReason = REASON_CONTAINS_ORDERED; Loading Loading @@ -1257,7 +1263,7 @@ class BroadcastProcessQueue { BroadcastProcessQueue test = head; BroadcastProcessQueue tail = null; while (test != null) { if (test.getRunnableAt() >= itemRunnableAt) { if (test.getRunnableAt() > itemRunnableAt) { item.runnableAtNext = test; item.runnableAtPrev = test.runnableAtPrev; if (item.runnableAtNext != null) { Loading
services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ import android.os.Bundle; import android.os.BundleMerger; import android.os.DropBoxManager; import android.os.HandlerThread; import android.os.Process; import android.os.SystemClock; import android.os.TestLooperManager; import android.os.UserHandle; Loading Loading @@ -326,6 +327,20 @@ public final class BroadcastQueueModernImplTest { assertOrphan(mQueue4); } @Test public void testRunnableList_sameRunnableAt() { doReturn(2L).when(mQueue1).getRunnableAt(); doReturn(2L).when(mQueue2).getRunnableAt(); doReturn(2L).when(mQueue3).getRunnableAt(); doReturn(2L).when(mQueue4).getRunnableAt(); mHead = insertIntoRunnableList(mHead, mQueue1); mHead = insertIntoRunnableList(mHead, mQueue2); mHead = insertIntoRunnableList(mHead, mQueue3); mHead = insertIntoRunnableList(mHead, mQueue4); assertRunnableList(List.of(mQueue1, mQueue2, mQueue3, mQueue4), mHead); } @Test public void testProcessQueue_Complex() { BroadcastProcessQueue red = mImpl.getOrCreateProcessQueue(PACKAGE_RED, TEST_UID); Loading Loading @@ -561,6 +576,20 @@ public final class BroadcastQueueModernImplTest { assertEquals(BroadcastProcessQueue.REASON_NORMAL, queue.getRunnableAtReason()); } @Test public void testRunnableAt_coreUid() { final BroadcastProcessQueue queue = new BroadcastProcessQueue(mConstants, "com.android.bluetooth", Process.BLUETOOTH_UID); final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK); final BroadcastRecord timeTickRecord = makeBroadcastRecord(timeTick, List.of(makeMockRegisteredReceiver())); enqueueOrReplaceBroadcast(queue, timeTickRecord, 0); assertThat(queue.getRunnableAt()).isEqualTo(timeTickRecord.enqueueTime); assertEquals(BroadcastProcessQueue.REASON_CORE_UID, queue.getRunnableAtReason()); } /** * Verify that a cached process that would normally be delayed becomes * immediately runnable when the given broadcast is enqueued. Loading