Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c9ca800 authored by Suprabh Shukla's avatar Suprabh Shukla
Browse files

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
parent 1d5ea8c3
Loading
Loading
Loading
Loading
+3 −41
Original line number Original line Diff line number Diff line
@@ -3363,56 +3363,18 @@ public class AlarmManagerService extends SystemService {


    void removeUserLocked(int userHandle) {
    void removeUserLocked(int userHandle) {
        if (userHandle == USER_SYSTEM) {
        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;
            return;
        }
        }
        final Predicate<Alarm> whichAlarms =
        final Predicate<Alarm> whichAlarms =
                (Alarm a) -> UserHandle.getUserId(a.creatorUid) == userHandle;
                (Alarm a) -> UserHandle.getUserId(a.uid) == userHandle;
        final ArrayList<Alarm> removedAlarms = mAlarmStore.remove(whichAlarms);
        removeAlarmsInternalLocked(whichAlarms);
        for (final Alarm removed : removedAlarms) {
            decrementAlarmCount(removed.uid, 1);
        }
        final boolean didRemove = !removedAlarms.isEmpty();


        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--) {
        for (int i = mLastPriorityAlarmDispatch.size() - 1; i >= 0; i--) {
            if (UserHandle.getUserId(mLastPriorityAlarmDispatch.keyAt(i)) == userHandle) {
            if (UserHandle.getUserId(mLastPriorityAlarmDispatch.keyAt(i)) == userHandle) {
                mLastPriorityAlarmDispatch.removeAt(i);
                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) {
    void interactiveStateChangedLocked(boolean interactive) {