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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user