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

Commit dcf47aee authored by Kweku Adams's avatar Kweku Adams
Browse files

Add missing TARE changes.

These were somehow left out of the previous change.

Bug: 158300259
Test: atest frameworks/base/services/tests/mockingservicestests/src/com/android/server/alarm
Test: atest CtsAlarmManagerTestCases
Change-Id: If94bd1553d042cdca2b68389c8a8e9dc60b2f2d3
parent 1ea287ba
Loading
Loading
Loading
Loading
+41 −7
Original line number Original line Diff line number Diff line
@@ -909,6 +909,11 @@ public class AlarmManagerService extends SystemService {
                        }
                        }
                        return standbyChanged || tareChanged;
                        return standbyChanged || tareChanged;
                    });
                    });
                    if (!USE_TARE_POLICY) {
                        // Remove the cached values so we don't accidentally use them when TARE is
                        // re-enabled.
                        mAffordabilityCache.clear();
                    }
                    if (changed) {
                    if (changed) {
                        rescheduleKernelAlarmsLocked();
                        rescheduleKernelAlarmsLocked();
                        updateNextAlarmClockLocked();
                        updateNextAlarmClockLocked();
@@ -1382,6 +1387,7 @@ public class AlarmManagerService extends SystemService {
     * @param uid         uid to filter on
     * @param uid         uid to filter on
     * @param packageName package to filter on, or null for all packages in uid
     * @param packageName package to filter on, or null for all packages in uid
     */
     */
    @GuardedBy("mLock")
    void sendPendingBackgroundAlarmsLocked(int uid, String packageName) {
    void sendPendingBackgroundAlarmsLocked(int uid, String packageName) {
        final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.get(uid);
        final ArrayList<Alarm> alarmsForUid = mPendingBackgroundAlarms.get(uid);
        if (alarmsForUid == null || alarmsForUid.size() == 0) {
        if (alarmsForUid == null || alarmsForUid.size() == 0) {
@@ -1418,6 +1424,7 @@ public class AlarmManagerService extends SystemService {
     *
     *
     * This is only called when the power save whitelist changes, so it's okay to be slow.
     * This is only called when the power save whitelist changes, so it's okay to be slow.
     */
     */
    @GuardedBy("mLock")
    void sendAllUnrestrictedPendingBackgroundAlarmsLocked() {
    void sendAllUnrestrictedPendingBackgroundAlarmsLocked() {
        final ArrayList<Alarm> alarmsToDeliver = new ArrayList<>();
        final ArrayList<Alarm> alarmsToDeliver = new ArrayList<>();


@@ -1454,6 +1461,7 @@ public class AlarmManagerService extends SystemService {
        }
        }
    }
    }


    @GuardedBy("mLock")
    private void deliverPendingBackgroundAlarmsLocked(ArrayList<Alarm> alarms, long nowELAPSED) {
    private void deliverPendingBackgroundAlarmsLocked(ArrayList<Alarm> alarms, long nowELAPSED) {
        final int N = alarms.size();
        final int N = alarms.size();
        boolean hasWakeup = false;
        boolean hasWakeup = false;
@@ -2129,6 +2137,7 @@ public class AlarmManagerService extends SystemService {
        }
        }
    }
    }


    @GuardedBy("mLock")
    private void setImplLocked(int type, long when, long whenElapsed, long windowLength,
    private void setImplLocked(int type, long when, long whenElapsed, long windowLength,
            long interval, PendingIntent operation, IAlarmListener directReceiver,
            long interval, PendingIntent operation, IAlarmListener directReceiver,
            String listenerTag, int flags, WorkSource workSource,
            String listenerTag, int flags, WorkSource workSource,
@@ -2406,12 +2415,13 @@ public class AlarmManagerService extends SystemService {
            return;
            return;
        }
        }
        mEconomyManagerInternal.registerAffordabilityChangeListener(
        mEconomyManagerInternal.registerAffordabilityChangeListener(
                UserHandle.getUserId(alarm.uid), alarm.sourcePackage,
                UserHandle.getUserId(alarm.creatorUid), alarm.sourcePackage,
                mAffordabilityChangeListener, TareBill.getAppropriateBill(alarm));
                mAffordabilityChangeListener, TareBill.getAppropriateBill(alarm));
    }
    }


    /** Unregister the TARE listener associated with the alarm if it's no longer needed. */
    /** Unregister the TARE listener associated with the alarm if it's no longer needed. */
    private void maybeUnregisterTareListener(Alarm alarm) {
    @GuardedBy("mLock")
    private void maybeUnregisterTareListenerLocked(Alarm alarm) {
        if (!mConstants.USE_TARE_POLICY) {
        if (!mConstants.USE_TARE_POLICY) {
            return;
            return;
        }
        }
@@ -2421,12 +2431,21 @@ public class AlarmManagerService extends SystemService {
                        && alarm.sourcePackage.equals(a.sourcePackage)
                        && alarm.sourcePackage.equals(a.sourcePackage)
                        && bill.equals(TareBill.getAppropriateBill(a));
                        && bill.equals(TareBill.getAppropriateBill(a));
        if (mAlarmStore.getCount(isSameAlarmTypeForSameApp) == 0) {
        if (mAlarmStore.getCount(isSameAlarmTypeForSameApp) == 0) {
            final int userId = UserHandle.getUserId(alarm.creatorUid);
            mEconomyManagerInternal.unregisterAffordabilityChangeListener(
            mEconomyManagerInternal.unregisterAffordabilityChangeListener(
                    UserHandle.getUserId(alarm.uid), alarm.sourcePackage,
                    userId, alarm.sourcePackage,
                    mAffordabilityChangeListener, bill);
                    mAffordabilityChangeListener, bill);
            // Remove the cached value so we don't accidentally use it when the app
            // schedules a new alarm.
            ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
                    mAffordabilityCache.get(userId, alarm.sourcePackage);
            if (actionAffordability != null) {
                actionAffordability.remove(bill);
            }
        }
        }
    }
    }


    @GuardedBy("mLock")
    private void setImplLocked(Alarm a) {
    private void setImplLocked(Alarm a) {
        if ((a.flags & AlarmManager.FLAG_IDLE_UNTIL) != 0) {
        if ((a.flags & AlarmManager.FLAG_IDLE_UNTIL) != 0) {
            adjustIdleUntilTime(a);
            adjustIdleUntilTime(a);
@@ -3775,6 +3794,7 @@ public class AlarmManagerService extends SystemService {
     *
     *
     * This is not expected to get called frequently.
     * This is not expected to get called frequently.
     */
     */
    @GuardedBy("mLock")
    void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
    void removeExactAlarmsOnPermissionRevokedLocked(int uid, String packageName) {
        if (isExemptFromExactAlarmPermission(uid)
        if (isExemptFromExactAlarmPermission(uid)
                || !isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
                || !isExactAlarmChangeEnabled(packageName, UserHandle.getUserId(uid))) {
@@ -3792,6 +3812,7 @@ public class AlarmManagerService extends SystemService {
        }
        }
    }
    }


    @GuardedBy("mLock")
    private void removeAlarmsInternalLocked(Predicate<Alarm> whichAlarms, int reason) {
    private void removeAlarmsInternalLocked(Predicate<Alarm> whichAlarms, int reason) {
        final long nowRtc = mInjector.getCurrentTimeMillis();
        final long nowRtc = mInjector.getCurrentTimeMillis();
        final long nowElapsed = mInjector.getElapsedRealtime();
        final long nowElapsed = mInjector.getElapsedRealtime();
@@ -3832,7 +3853,7 @@ public class AlarmManagerService extends SystemService {
                mRemovalHistory.put(removed.uid, bufferForUid);
                mRemovalHistory.put(removed.uid, bufferForUid);
            }
            }
            bufferForUid.append(new RemovedAlarm(removed, reason, nowRtc, nowElapsed));
            bufferForUid.append(new RemovedAlarm(removed, reason, nowRtc, nowElapsed));
            maybeUnregisterTareListener(removed);
            maybeUnregisterTareListenerLocked(removed);
        }
        }


        if (removedFromStore) {
        if (removedFromStore) {
@@ -3857,6 +3878,7 @@ public class AlarmManagerService extends SystemService {
        }
        }
    }
    }


    @GuardedBy("mLock")
    void removeLocked(PendingIntent operation, IAlarmListener directReceiver, int reason) {
    void removeLocked(PendingIntent operation, IAlarmListener directReceiver, int reason) {
        if (operation == null && directReceiver == null) {
        if (operation == null && directReceiver == null) {
            if (localLOGV) {
            if (localLOGV) {
@@ -3868,6 +3890,7 @@ public class AlarmManagerService extends SystemService {
        removeAlarmsInternalLocked(a -> a.matches(operation, directReceiver), reason);
        removeAlarmsInternalLocked(a -> a.matches(operation, directReceiver), reason);
    }
    }


    @GuardedBy("mLock")
    void removeLocked(final int uid, int reason) {
    void removeLocked(final int uid, int reason) {
        if (uid == Process.SYSTEM_UID) {
        if (uid == Process.SYSTEM_UID) {
            // If a force-stop occurs for a system-uid package, ignore it.
            // If a force-stop occurs for a system-uid package, ignore it.
@@ -3876,6 +3899,7 @@ public class AlarmManagerService extends SystemService {
        removeAlarmsInternalLocked(a -> a.uid == uid, reason);
        removeAlarmsInternalLocked(a -> a.uid == uid, reason);
    }
    }


    @GuardedBy("mLock")
    void removeLocked(final String packageName) {
    void removeLocked(final String packageName) {
        if (packageName == null) {
        if (packageName == null) {
            if (localLOGV) {
            if (localLOGV) {
@@ -3888,6 +3912,7 @@ public class AlarmManagerService extends SystemService {
    }
    }


    // Only called for ephemeral apps
    // Only called for ephemeral apps
    @GuardedBy("mLock")
    void removeForStoppedLocked(final int uid) {
    void removeForStoppedLocked(final int uid) {
        if (uid == Process.SYSTEM_UID) {
        if (uid == Process.SYSTEM_UID) {
            // If a force-stop occurs for a system-uid package, ignore it.
            // If a force-stop occurs for a system-uid package, ignore it.
@@ -3898,6 +3923,7 @@ public class AlarmManagerService extends SystemService {
        removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_UNDEFINED);
        removeAlarmsInternalLocked(whichAlarms, REMOVE_REASON_UNDEFINED);
    }
    }


    @GuardedBy("mLock")
    void removeUserLocked(int userHandle) {
    void removeUserLocked(int userHandle) {
        if (userHandle == USER_SYSTEM) {
        if (userHandle == USER_SYSTEM) {
            Slog.w(TAG, "Ignoring attempt to remove system-user state!");
            Slog.w(TAG, "Ignoring attempt to remove system-user state!");
@@ -3924,6 +3950,7 @@ public class AlarmManagerService extends SystemService {
        }
        }
    }
    }


    @GuardedBy("mLock")
    void interactiveStateChangedLocked(boolean interactive) {
    void interactiveStateChangedLocked(boolean interactive) {
        if (mInteractive != interactive) {
        if (mInteractive != interactive) {
            mInteractive = interactive;
            mInteractive = interactive;
@@ -4033,6 +4060,7 @@ public class AlarmManagerService extends SystemService {
    private static native int setKernelTimezone(long nativeData, int minuteswest);
    private static native int setKernelTimezone(long nativeData, int minuteswest);
    private static native long getNextAlarm(long nativeData, int type);
    private static native long getNextAlarm(long nativeData, int type);


    @GuardedBy("mLock")
    int triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED) {
    int triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED) {
        int wakeUps = 0;
        int wakeUps = 0;
        final ArrayList<Alarm> pendingAlarms = mAlarmStore.removePendingAlarms(nowELAPSED);
        final ArrayList<Alarm> pendingAlarms = mAlarmStore.removePendingAlarms(nowELAPSED);
@@ -4150,6 +4178,7 @@ public class AlarmManagerService extends SystemService {
        return timeSinceLast <= currentNonWakeupFuzzLocked(nowELAPSED);
        return timeSinceLast <= currentNonWakeupFuzzLocked(nowELAPSED);
    }
    }


    @GuardedBy("mLock")
    void deliverAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED) {
    void deliverAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED) {
        mLastAlarmDeliveryTime = nowELAPSED;
        mLastAlarmDeliveryTime = nowELAPSED;
        for (int i = 0; i < triggerList.size(); i++) {
        for (int i = 0; i < triggerList.size(); i++) {
@@ -4173,7 +4202,7 @@ public class AlarmManagerService extends SystemService {
                reportAlarmEventToTare(alarm);
                reportAlarmEventToTare(alarm);
                if (alarm.repeatInterval <= 0) {
                if (alarm.repeatInterval <= 0) {
                    // Don't bother trying to unregister for a repeating alarm.
                    // Don't bother trying to unregister for a repeating alarm.
                    maybeUnregisterTareListener(alarm);
                    maybeUnregisterTareListenerLocked(alarm);
                }
                }
            } catch (RuntimeException e) {
            } catch (RuntimeException e) {
                Slog.w(TAG, "Failure sending alarm.", e);
                Slog.w(TAG, "Failure sending alarm.", e);
@@ -4184,6 +4213,9 @@ public class AlarmManagerService extends SystemService {
    }
    }


    private void reportAlarmEventToTare(Alarm alarm) {
    private void reportAlarmEventToTare(Alarm alarm) {
        if (!mConstants.USE_TARE_POLICY) {
            return;
        }
        final boolean allowWhileIdle =
        final boolean allowWhileIdle =
                (alarm.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_ALLOW_WHILE_IDLE)) != 0;
                (alarm.flags & (FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED | FLAG_ALLOW_WHILE_IDLE)) != 0;
        final int action;
        final int action;
@@ -4222,7 +4254,7 @@ public class AlarmManagerService extends SystemService {
            }
            }
        }
        }
        mEconomyManagerInternal.noteInstantaneousEvent(
        mEconomyManagerInternal.noteInstantaneousEvent(
                UserHandle.getUserId(alarm.uid), alarm.sourcePackage, action, null);
                UserHandle.getUserId(alarm.creatorUid), alarm.sourcePackage, action, null);
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -4537,7 +4569,7 @@ public class AlarmManagerService extends SystemService {
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private boolean canAffordBillLocked(@NonNull Alarm alarm,
    private boolean canAffordBillLocked(@NonNull Alarm alarm,
            @NonNull EconomyManagerInternal.ActionBill bill) {
            @NonNull EconomyManagerInternal.ActionBill bill) {
        final int userId = UserHandle.getUserId(alarm.uid);
        final int userId = UserHandle.getUserId(alarm.creatorUid);
        final String pkgName = alarm.sourcePackage;
        final String pkgName = alarm.sourcePackage;
        ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
        ArrayMap<EconomyManagerInternal.ActionBill, Boolean> actionAffordability =
                mAffordabilityCache.get(userId, pkgName);
                mAffordabilityCache.get(userId, pkgName);
@@ -5049,6 +5081,7 @@ public class AlarmManagerService extends SystemService {


    class DeliveryTracker extends IAlarmCompleteListener.Stub implements PendingIntent.OnFinished {
    class DeliveryTracker extends IAlarmCompleteListener.Stub implements PendingIntent.OnFinished {


        @GuardedBy("mLock")
        private InFlight removeLocked(PendingIntent pi, Intent intent) {
        private InFlight removeLocked(PendingIntent pi, Intent intent) {
            for (int i = 0; i < mInFlight.size(); i++) {
            for (int i = 0; i < mInFlight.size(); i++) {
                final InFlight inflight = mInFlight.get(i);
                final InFlight inflight = mInFlight.get(i);
@@ -5063,6 +5096,7 @@ public class AlarmManagerService extends SystemService {
            return null;
            return null;
        }
        }


        @GuardedBy("mLock")
        private InFlight removeLocked(IBinder listener) {
        private InFlight removeLocked(IBinder listener) {
            for (int i = 0; i < mInFlight.size(); i++) {
            for (int i = 0; i < mInFlight.size(); i++) {
                if (mInFlight.get(i).mListener == listener) {
                if (mInFlight.get(i).mListener == listener) {