RESTRICT AUTOMERGE Remove alarms from mPendingNonWakeupAlarms am: 951fa94b6a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12522607

Change-Id: I9bd1aef0adf102f5535f5b6f6692154a0d459ddf
This commit is contained in:
Suprabh Shukla
2020-09-10 21:28:03 +00:00
committed by Automerger Merge Worker
2 changed files with 51 additions and 0 deletions

View File

@@ -3109,6 +3109,14 @@ class AlarmManagerService extends SystemService {
mPendingBackgroundAlarms.removeAt(i);
}
}
for (int i = mPendingNonWakeupAlarms.size() - 1; i >= 0; i--) {
final Alarm a = mPendingNonWakeupAlarms.get(i);
if (a.matches(operation, directReceiver)) {
// Don't set didRemove, since this doesn't impact the scheduled alarms.
mPendingNonWakeupAlarms.remove(i);
decrementAlarmCount(a.uid, 1);
}
}
if (didRemove) {
if (DEBUG_BATCH) {
Slog.v(TAG, "remove(operation) changed bounds; rebatching");

View File

@@ -1053,6 +1053,49 @@ public class AlarmManagerServiceTest {
}
}
@Test
public void nonWakeupAlarmsDeferred() throws Exception {
final int numAlarms = 10;
final PendingIntent[] pis = new PendingIntent[numAlarms];
for (int i = 0; i < numAlarms; i++) {
pis[i] = getNewMockPendingIntent();
setTestAlarm(ELAPSED_REALTIME, mNowElapsedTest + i + 5, pis[i]);
}
doReturn(true).when(mService).checkAllowNonWakeupDelayLocked(anyLong());
// Advance time past all expirations.
mNowElapsedTest += numAlarms + 5;
mTestTimer.expire();
assertEquals(numAlarms, mService.mPendingNonWakeupAlarms.size());
// These alarms should be sent on interactive state change to true
mService.interactiveStateChangedLocked(false);
mService.interactiveStateChangedLocked(true);
for (int i = 0; i < numAlarms; i++) {
verify(pis[i]).send(eq(mMockContext), eq(0), any(Intent.class), any(),
any(Handler.class), isNull(), any());
}
}
@Test
public void alarmCountOnPendingNonWakeupAlarmsRemoved() throws Exception {
final int numAlarms = 10;
final PendingIntent[] pis = new PendingIntent[numAlarms];
for (int i = 0; i < numAlarms; i++) {
pis[i] = getNewMockPendingIntent();
setTestAlarm(ELAPSED_REALTIME, mNowElapsedTest + i + 5, pis[i]);
}
doReturn(true).when(mService).checkAllowNonWakeupDelayLocked(anyLong());
// Advance time past all expirations.
mNowElapsedTest += numAlarms + 5;
mTestTimer.expire();
assertEquals(numAlarms, mService.mPendingNonWakeupAlarms.size());
for (int i = 0; i < numAlarms; i++) {
mService.removeLocked(pis[i], null);
assertEquals(numAlarms - i - 1, mService.mAlarmsPerUid.get(TEST_CALLING_UID, 0));
}
}
@After
public void tearDown() {
if (mMockingSession != null) {