Merge "Promote an app to RECEIVER only when handling a broadcast." into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a27b117a7f
@@ -441,17 +441,17 @@ class BroadcastProcessQueue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getPreferredSchedulingGroupLocked() {
|
public int getPreferredSchedulingGroupLocked() {
|
||||||
if (mCountForeground > mCountForegroundDeferred) {
|
if (!isActive()) {
|
||||||
|
return ProcessList.SCHED_GROUP_UNDEFINED;
|
||||||
|
} else if (mCountForeground > mCountForegroundDeferred) {
|
||||||
// We have a foreground broadcast somewhere down the queue, so
|
// We have a foreground broadcast somewhere down the queue, so
|
||||||
// boost priority until we drain them all
|
// boost priority until we drain them all
|
||||||
return ProcessList.SCHED_GROUP_DEFAULT;
|
return ProcessList.SCHED_GROUP_DEFAULT;
|
||||||
} else if ((mActive != null) && mActive.isForeground()) {
|
} else if ((mActive != null) && mActive.isForeground()) {
|
||||||
// We have a foreground broadcast right now, so boost priority
|
// We have a foreground broadcast right now, so boost priority
|
||||||
return ProcessList.SCHED_GROUP_DEFAULT;
|
return ProcessList.SCHED_GROUP_DEFAULT;
|
||||||
} else if (!isIdle()) {
|
|
||||||
return ProcessList.SCHED_GROUP_BACKGROUND;
|
|
||||||
} else {
|
} else {
|
||||||
return ProcessList.SCHED_GROUP_UNDEFINED;
|
return ProcessList.SCHED_GROUP_BACKGROUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ public final class BroadcastQueueModernImplTest {
|
|||||||
assertThat(cachedRunnableAt).isGreaterThan(notCachedRunnableAt);
|
assertThat(cachedRunnableAt).isGreaterThan(notCachedRunnableAt);
|
||||||
assertTrue(queue.isRunnable());
|
assertTrue(queue.isRunnable());
|
||||||
assertEquals(BroadcastProcessQueue.REASON_CACHED, queue.getRunnableAtReason());
|
assertEquals(BroadcastProcessQueue.REASON_CACHED, queue.getRunnableAtReason());
|
||||||
assertEquals(ProcessList.SCHED_GROUP_BACKGROUND, queue.getPreferredSchedulingGroupLocked());
|
assertEquals(ProcessList.SCHED_GROUP_UNDEFINED, queue.getPreferredSchedulingGroupLocked());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -434,13 +434,13 @@ public final class BroadcastQueueModernImplTest {
|
|||||||
queue.setProcessAndUidCached(null, false);
|
queue.setProcessAndUidCached(null, false);
|
||||||
assertTrue(queue.isRunnable());
|
assertTrue(queue.isRunnable());
|
||||||
assertThat(queue.getRunnableAt()).isAtMost(airplaneRecord.enqueueClockTime);
|
assertThat(queue.getRunnableAt()).isAtMost(airplaneRecord.enqueueClockTime);
|
||||||
assertEquals(ProcessList.SCHED_GROUP_DEFAULT, queue.getPreferredSchedulingGroupLocked());
|
assertEquals(ProcessList.SCHED_GROUP_UNDEFINED, queue.getPreferredSchedulingGroupLocked());
|
||||||
assertEquals(queue.peekNextBroadcastRecord(), airplaneRecord);
|
assertEquals(queue.peekNextBroadcastRecord(), airplaneRecord);
|
||||||
|
|
||||||
queue.setProcessAndUidCached(null, true);
|
queue.setProcessAndUidCached(null, true);
|
||||||
assertTrue(queue.isRunnable());
|
assertTrue(queue.isRunnable());
|
||||||
assertThat(queue.getRunnableAt()).isAtMost(airplaneRecord.enqueueClockTime);
|
assertThat(queue.getRunnableAt()).isAtMost(airplaneRecord.enqueueClockTime);
|
||||||
assertEquals(ProcessList.SCHED_GROUP_DEFAULT, queue.getPreferredSchedulingGroupLocked());
|
assertEquals(ProcessList.SCHED_GROUP_UNDEFINED, queue.getPreferredSchedulingGroupLocked());
|
||||||
assertEquals(queue.peekNextBroadcastRecord(), airplaneRecord);
|
assertEquals(queue.peekNextBroadcastRecord(), airplaneRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1154,6 +1154,41 @@ public final class BroadcastQueueModernImplTest {
|
|||||||
times(1));
|
times(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetPreferredSchedulingGroup() throws Exception {
|
||||||
|
final BroadcastProcessQueue queue = new BroadcastProcessQueue(mConstants,
|
||||||
|
PACKAGE_GREEN, getUidForPackage(PACKAGE_GREEN));
|
||||||
|
|
||||||
|
assertEquals(ProcessList.SCHED_GROUP_UNDEFINED, queue.getPreferredSchedulingGroupLocked());
|
||||||
|
|
||||||
|
final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK)
|
||||||
|
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
|
||||||
|
queue.enqueueOrReplaceBroadcast(makeBroadcastRecord(timeTick,
|
||||||
|
List.of(makeMockRegisteredReceiver())), 0, false);
|
||||||
|
assertEquals(ProcessList.SCHED_GROUP_UNDEFINED, queue.getPreferredSchedulingGroupLocked());
|
||||||
|
|
||||||
|
// Make the foreground broadcast as active.
|
||||||
|
queue.makeActiveNextPending();
|
||||||
|
assertEquals(ProcessList.SCHED_GROUP_DEFAULT, queue.getPreferredSchedulingGroupLocked());
|
||||||
|
|
||||||
|
queue.makeActiveIdle();
|
||||||
|
assertEquals(ProcessList.SCHED_GROUP_UNDEFINED, queue.getPreferredSchedulingGroupLocked());
|
||||||
|
|
||||||
|
final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
|
||||||
|
queue.enqueueOrReplaceBroadcast(makeBroadcastRecord(airplane,
|
||||||
|
List.of(makeMockRegisteredReceiver())), 0, false);
|
||||||
|
|
||||||
|
// Make the background broadcast as active.
|
||||||
|
queue.makeActiveNextPending();
|
||||||
|
assertEquals(ProcessList.SCHED_GROUP_BACKGROUND, queue.getPreferredSchedulingGroupLocked());
|
||||||
|
|
||||||
|
queue.enqueueOrReplaceBroadcast(makeBroadcastRecord(timeTick,
|
||||||
|
List.of(makeMockRegisteredReceiver())), 0, false);
|
||||||
|
// Even though the active broadcast is not a foreground one, scheduling group will be
|
||||||
|
// DEFAULT since there is a foreground broadcast waiting to be delivered.
|
||||||
|
assertEquals(ProcessList.SCHED_GROUP_DEFAULT, queue.getPreferredSchedulingGroupLocked());
|
||||||
|
}
|
||||||
|
|
||||||
private Intent createPackageChangedIntent(int uid, List<String> componentNameList) {
|
private Intent createPackageChangedIntent(int uid, List<String> componentNameList) {
|
||||||
final Intent packageChangedIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED);
|
final Intent packageChangedIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED);
|
||||||
packageChangedIntent.putExtra(Intent.EXTRA_UID, uid);
|
packageChangedIntent.putExtra(Intent.EXTRA_UID, uid);
|
||||||
|
|||||||
Reference in New Issue
Block a user