Removing non-wakeup alarms on user-removed

Alarms in mPendingNonWakeupAlarms were left hanging when the user is
removed. These would be defunct at the time of delivery, so there is no
point in holding on to them.

Test: atest AlarmManagerServiceTest

Fixes: 130444055
Change-Id: Ib496b26a855304556ed032b957a1c731f2e2ca18
This commit is contained in:
Suprabh Shukla
2021-04-26 18:53:54 -07:00
parent 1d5ea8c336
commit 8c9ca8004a

View File

@@ -3363,56 +3363,18 @@ public class AlarmManagerService extends SystemService {
void removeUserLocked(int userHandle) {
if (userHandle == USER_SYSTEM) {
// If we're told we're removing the system user, ignore it.
Slog.w(TAG, "Ignoring attempt to remove system-user state!");
return;
}
final Predicate<Alarm> whichAlarms =
(Alarm a) -> UserHandle.getUserId(a.creatorUid) == userHandle;
final ArrayList<Alarm> removedAlarms = mAlarmStore.remove(whichAlarms);
for (final Alarm removed : removedAlarms) {
decrementAlarmCount(removed.uid, 1);
}
final boolean didRemove = !removedAlarms.isEmpty();
(Alarm a) -> UserHandle.getUserId(a.uid) == userHandle;
removeAlarmsInternalLocked(whichAlarms);
for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) {
if (UserHandle.getUserId(mPendingBackgroundAlarms.keyAt(i)) == userHandle) {
final ArrayList<Alarm> toRemove = mPendingBackgroundAlarms.valueAt(i);
if (toRemove != null) {
for (int j = 0; j < toRemove.size(); j++) {
decrementAlarmCount(toRemove.get(j).uid, 1);
}
}
mPendingBackgroundAlarms.removeAt(i);
}
}
for (int i = mLastPriorityAlarmDispatch.size() - 1; i >= 0; i--) {
if (UserHandle.getUserId(mLastPriorityAlarmDispatch.keyAt(i)) == userHandle) {
mLastPriorityAlarmDispatch.removeAt(i);
}
}
if (mNextWakeFromIdle != null && whichAlarms.test(mNextWakeFromIdle)) {
mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm();
if (mPendingIdleUntil != null) {
final boolean updated = mAlarmStore.updateAlarmDeliveries(alarm -> {
if (alarm != mPendingIdleUntil) {
return false;
}
return adjustIdleUntilTime(alarm);
});
if (updated) {
mAlarmStore.updateAlarmDeliveries(
alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm));
}
}
}
if (didRemove) {
if (DEBUG_BATCH) {
Slog.v(TAG, "remove(user) changed bounds; rebatching");
}
rescheduleKernelAlarmsLocked();
updateNextAlarmClockLocked();
}
}
void interactiveStateChangedLocked(boolean interactive) {