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

Commit e33d4b52 authored by Kweku Adams's avatar Kweku Adams Committed by Android (Google) Code Review
Browse files

Merge "Switch from Pair to UserPackage."

parents d15162cb 03d75080
Loading
Loading
Loading
Loading
+47 −49
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ import android.content.IntentFilter;
import android.content.PermissionChecker;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserPackage;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.BatteryManager;
@@ -120,7 +121,6 @@ import android.util.IndentingPrintWriter;
import android.util.IntArray;
import android.util.Log;
import android.util.LongArrayQueue;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseArrayMap;
@@ -402,7 +402,7 @@ public class AlarmManagerService extends SystemService {
            public long lastUsage;
        }
        /** Map of {package, user} -> {quotaInfo} */
        private final ArrayMap<Pair<String, Integer>, QuotaInfo> mQuotaBuffer = new ArrayMap<>();
        private final ArrayMap<UserPackage, QuotaInfo> mQuotaBuffer = new ArrayMap<>();

        private long mMaxDuration;

@@ -414,11 +414,11 @@ public class AlarmManagerService extends SystemService {
            if (quota <= 0) {
                return;
            }
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            QuotaInfo currentQuotaInfo = mQuotaBuffer.get(packageUser);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            QuotaInfo currentQuotaInfo = mQuotaBuffer.get(userPackage);
            if (currentQuotaInfo == null) {
                currentQuotaInfo = new QuotaInfo();
                mQuotaBuffer.put(packageUser, currentQuotaInfo);
                mQuotaBuffer.put(userPackage, currentQuotaInfo);
            }
            currentQuotaInfo.remainingQuota = quota;
            currentQuotaInfo.expirationTime = nowElapsed + mMaxDuration;
@@ -426,8 +426,8 @@ public class AlarmManagerService extends SystemService {

        /** Returns if the supplied package has reserve quota to fire at the given time. */
        boolean hasQuota(String packageName, int userId, long triggerElapsed) {
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            final QuotaInfo quotaInfo = mQuotaBuffer.get(packageUser);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            final QuotaInfo quotaInfo = mQuotaBuffer.get(userPackage);

            return quotaInfo != null && quotaInfo.remainingQuota > 0
                    && triggerElapsed <= quotaInfo.expirationTime;
@@ -438,8 +438,8 @@ public class AlarmManagerService extends SystemService {
         * required.
         */
        void recordUsage(String packageName, int userId, long nowElapsed) {
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            final QuotaInfo quotaInfo = mQuotaBuffer.get(packageUser);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            final QuotaInfo quotaInfo = mQuotaBuffer.get(userPackage);

            if (quotaInfo == null) {
                Slog.wtf(TAG, "Temporary quota being consumed at " + nowElapsed
@@ -479,26 +479,26 @@ public class AlarmManagerService extends SystemService {

        void removeForUser(int userId) {
            for (int i = mQuotaBuffer.size() - 1; i >= 0; i--) {
                final Pair<String, Integer> packageUserKey = mQuotaBuffer.keyAt(i);
                if (packageUserKey.second == userId) {
                final UserPackage userPackageKey = mQuotaBuffer.keyAt(i);
                if (userPackageKey.userId == userId) {
                    mQuotaBuffer.removeAt(i);
                }
            }
        }

        void removeForPackage(String packageName, int userId) {
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            mQuotaBuffer.remove(packageUser);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            mQuotaBuffer.remove(userPackage);
        }

        void dump(IndentingPrintWriter pw, long nowElapsed) {
            pw.increaseIndent();
            for (int i = 0; i < mQuotaBuffer.size(); i++) {
                final Pair<String, Integer> packageUser = mQuotaBuffer.keyAt(i);
                final UserPackage userPackage = mQuotaBuffer.keyAt(i);
                final QuotaInfo quotaInfo = mQuotaBuffer.valueAt(i);
                pw.print(packageUser.first);
                pw.print(userPackage.packageName);
                pw.print(", u");
                pw.print(packageUser.second);
                pw.print(userPackage.userId);
                pw.print(": ");
                if (quotaInfo == null) {
                    pw.print("--");
@@ -522,8 +522,7 @@ public class AlarmManagerService extends SystemService {
     */
    @VisibleForTesting
    static class AppWakeupHistory {
        private ArrayMap<Pair<String, Integer>, LongArrayQueue> mPackageHistory =
                new ArrayMap<>();
        private final ArrayMap<UserPackage, LongArrayQueue> mPackageHistory = new ArrayMap<>();
        private long mWindowSize;

        AppWakeupHistory(long windowSize) {
@@ -531,11 +530,11 @@ public class AlarmManagerService extends SystemService {
        }

        void recordAlarmForPackage(String packageName, int userId, long nowElapsed) {
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            LongArrayQueue history = mPackageHistory.get(packageUser);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            LongArrayQueue history = mPackageHistory.get(userPackage);
            if (history == null) {
                history = new LongArrayQueue();
                mPackageHistory.put(packageUser, history);
                mPackageHistory.put(userPackage, history);
            }
            if (history.size() == 0 || history.peekLast() < nowElapsed) {
                history.addLast(nowElapsed);
@@ -545,16 +544,16 @@ public class AlarmManagerService extends SystemService {

        void removeForUser(int userId) {
            for (int i = mPackageHistory.size() - 1; i >= 0; i--) {
                final Pair<String, Integer> packageUserKey = mPackageHistory.keyAt(i);
                if (packageUserKey.second == userId) {
                final UserPackage userPackageKey = mPackageHistory.keyAt(i);
                if (userPackageKey.userId == userId) {
                    mPackageHistory.removeAt(i);
                }
            }
        }

        void removeForPackage(String packageName, int userId) {
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            mPackageHistory.remove(packageUser);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            mPackageHistory.remove(userPackage);
        }

        private void snapToWindow(LongArrayQueue history) {
@@ -564,7 +563,7 @@ public class AlarmManagerService extends SystemService {
        }

        int getTotalWakeupsInWindow(String packageName, int userId) {
            final LongArrayQueue history = mPackageHistory.get(Pair.create(packageName, userId));
            final LongArrayQueue history = mPackageHistory.get(UserPackage.of(userId, packageName));
            return (history == null) ? 0 : history.size();
        }

@@ -573,7 +572,7 @@ public class AlarmManagerService extends SystemService {
         *          (1=1st-last=the ultimate wakeup and 2=2nd-last=the penultimate wakeup)
         */
        long getNthLastWakeupForPackage(String packageName, int userId, int n) {
            final LongArrayQueue history = mPackageHistory.get(Pair.create(packageName, userId));
            final LongArrayQueue history = mPackageHistory.get(UserPackage.of(userId, packageName));
            if (history == null) {
                return 0;
            }
@@ -584,11 +583,11 @@ public class AlarmManagerService extends SystemService {
        void dump(IndentingPrintWriter pw, long nowElapsed) {
            pw.increaseIndent();
            for (int i = 0; i < mPackageHistory.size(); i++) {
                final Pair<String, Integer> packageUser = mPackageHistory.keyAt(i);
                final UserPackage userPackage = mPackageHistory.keyAt(i);
                final LongArrayQueue timestamps = mPackageHistory.valueAt(i);
                pw.print(packageUser.first);
                pw.print(userPackage.packageName);
                pw.print(", u");
                pw.print(packageUser.second);
                pw.print(userPackage.userId);
                pw.print(": ");
                // limit dumping to a max of 100 values
                final int lastIdx = Math.max(0, timestamps.size() - 100);
@@ -1501,13 +1500,13 @@ public class AlarmManagerService extends SystemService {
     *                       null indicates all
     * @return True if there was any reordering done to the current list.
     */
    boolean reorderAlarmsBasedOnStandbyBuckets(ArraySet<Pair<String, Integer>> targetPackages) {
    boolean reorderAlarmsBasedOnStandbyBuckets(ArraySet<UserPackage> targetPackages) {
        final long start = mStatLogger.getTime();

        final boolean changed = mAlarmStore.updateAlarmDeliveries(a -> {
            final Pair<String, Integer> packageUser =
                    Pair.create(a.sourcePackage, UserHandle.getUserId(a.creatorUid));
            if (targetPackages != null && !targetPackages.contains(packageUser)) {
            final UserPackage userPackage =
                    UserPackage.of(UserHandle.getUserId(a.creatorUid), a.sourcePackage);
            if (targetPackages != null && !targetPackages.contains(userPackage)) {
                return false;
            }
            return adjustDeliveryTimeBasedOnBucketLocked(a);
@@ -1524,13 +1523,13 @@ public class AlarmManagerService extends SystemService {
     *                       null indicates all
     * @return True if there was any reordering done to the current list.
     */
    boolean reorderAlarmsBasedOnTare(ArraySet<Pair<String, Integer>> targetPackages) {
    boolean reorderAlarmsBasedOnTare(ArraySet<UserPackage> targetPackages) {
        final long start = mStatLogger.getTime();

        final boolean changed = mAlarmStore.updateAlarmDeliveries(a -> {
            final Pair<String, Integer> packageUser =
                    Pair.create(a.sourcePackage, UserHandle.getUserId(a.creatorUid));
            if (targetPackages != null && !targetPackages.contains(packageUser)) {
            final UserPackage userPackage =
                    UserPackage.of(UserHandle.getUserId(a.creatorUid), a.sourcePackage);
            if (targetPackages != null && !targetPackages.contains(userPackage)) {
                return false;
            }
            return adjustDeliveryTimeBasedOnTareLocked(a);
@@ -4786,8 +4785,7 @@ public class AlarmManagerService extends SystemService {
                                    }
                                }
                            }
                            final ArraySet<Pair<String, Integer>> triggerPackages =
                                    new ArraySet<>();
                            final ArraySet<UserPackage> triggerPackages = new ArraySet<>();
                            final IntArray wakeupUids = new IntArray();
                            for (int i = 0; i < triggerList.size(); i++) {
                                final Alarm a = triggerList.get(i);
@@ -4796,13 +4794,13 @@ public class AlarmManagerService extends SystemService {
                                }
                                if (mConstants.USE_TARE_POLICY) {
                                    if (!isExemptFromTare(a)) {
                                        triggerPackages.add(Pair.create(
                                                a.sourcePackage,
                                                UserHandle.getUserId(a.creatorUid)));
                                        triggerPackages.add(UserPackage.of(
                                                UserHandle.getUserId(a.creatorUid),
                                                a.sourcePackage));
                                    }
                                } else if (!isExemptFromAppStandby(a)) {
                                    triggerPackages.add(Pair.create(
                                            a.sourcePackage, UserHandle.getUserId(a.creatorUid)));
                                    triggerPackages.add(UserPackage.of(
                                            UserHandle.getUserId(a.creatorUid), a.sourcePackage));
                                }
                            }
                            if (wakeupUids.size() > 0 && mBatteryStatsInternal != null) {
@@ -4990,8 +4988,8 @@ public class AlarmManagerService extends SystemService {
                case TEMPORARY_QUOTA_CHANGED:
                case APP_STANDBY_BUCKET_CHANGED:
                    synchronized (mLock) {
                        final ArraySet<Pair<String, Integer>> filterPackages = new ArraySet<>();
                        filterPackages.add(Pair.create((String) msg.obj, msg.arg1));
                        final ArraySet<UserPackage> filterPackages = new ArraySet<>();
                        filterPackages.add(UserPackage.of(msg.arg1, (String) msg.obj));
                        if (reorderAlarmsBasedOnStandbyBuckets(filterPackages)) {
                            rescheduleKernelAlarmsLocked();
                            updateNextAlarmClockLocked();
@@ -5004,8 +5002,8 @@ public class AlarmManagerService extends SystemService {
                        final int userId = msg.arg1;
                        final String packageName = (String) msg.obj;

                        final ArraySet<Pair<String, Integer>> filterPackages = new ArraySet<>();
                        filterPackages.add(Pair.create(packageName, userId));
                        final ArraySet<UserPackage> filterPackages = new ArraySet<>();
                        filterPackages.add(UserPackage.of(userId, packageName));
                        if (reorderAlarmsBasedOnTare(filterPackages)) {
                            rescheduleKernelAlarmsLocked();
                            updateNextAlarmClockLocked();
+3 −4
Original line number Diff line number Diff line
@@ -17,8 +17,8 @@ package com.android.server.content;

import android.app.ActivityManagerInternal;
import android.app.usage.UsageStatsManagerInternal;
import android.content.pm.UserPackage;
import android.os.SystemClock;
import android.util.Pair;

import com.android.server.LocalServices;

@@ -26,8 +26,7 @@ import java.util.HashMap;

class SyncAdapterStateFetcher {

    private final HashMap<Pair<Integer, String>, Integer> mBucketCache =
            new HashMap<>();
    private final HashMap<UserPackage, Integer> mBucketCache = new HashMap<>();

    public SyncAdapterStateFetcher() {
    }
@@ -36,7 +35,7 @@ class SyncAdapterStateFetcher {
     * Return sync adapter state with a cache.
     */
    public int getStandbyBucket(int userId, String packageName) {
        final Pair<Integer, String> key = Pair.create(userId, packageName);
        final UserPackage key = UserPackage.of(userId, packageName);
        final Integer cached = mBucketCache.get(key);
        if (cached != null) {
            return cached;
+4 −4
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManagerInternal.PackageListObserver;
import android.content.pm.PermissionInfo;
import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
@@ -78,7 +79,6 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.LongSparseLongArray;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseBooleanArray;

@@ -146,7 +146,7 @@ public final class PermissionPolicyService extends SystemService {
     * scheduled for a package/user.
     */
    @GuardedBy("mLock")
    private final ArraySet<Pair<String, Integer>> mIsPackageSyncsScheduled = new ArraySet<>();
    private final ArraySet<UserPackage> mIsPackageSyncsScheduled = new ArraySet<>();

    /**
     * Whether an async {@link #resetAppOpPermissionsIfNotRequestedForUid} is currently
@@ -374,7 +374,7 @@ public final class PermissionPolicyService extends SystemService {
            @UserIdInt int changedUserId) {
        if (isStarted(changedUserId)) {
            synchronized (mLock) {
                if (mIsPackageSyncsScheduled.add(new Pair<>(packageName, changedUserId))) {
                if (mIsPackageSyncsScheduled.add(UserPackage.of(changedUserId, packageName))) {
                    // TODO(b/165030092): migrate this to PermissionThread.getHandler().
                    // synchronizePackagePermissionsAndAppOpsForUser is a heavy operation.
                    // Dispatched on a PermissionThread, it interferes with user switch.
@@ -642,7 +642,7 @@ public final class PermissionPolicyService extends SystemService {
    private void synchronizePackagePermissionsAndAppOpsForUser(@NonNull String packageName,
            @UserIdInt int userId) {
        synchronized (mLock) {
            mIsPackageSyncsScheduled.remove(new Pair<>(packageName, userId));
            mIsPackageSyncsScheduled.remove(UserPackage.of(userId, packageName));
        }

        if (DEBUG) {
+5 −5
Original line number Diff line number Diff line
@@ -259,6 +259,7 @@ import android.content.pm.ServiceInfo;
import android.content.pm.Signature;
import android.content.pm.StringParceledListSlice;
import android.content.pm.UserInfo;
import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.database.Cursor;
@@ -710,8 +711,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
     * Contains (package-user) pairs to remove. An entry (p, u) implies that removal of package p
     * is requested for user u.
     */
    private final Set<Pair<String, Integer>> mPackagesToRemove =
            new ArraySet<Pair<String, Integer>>();
    private final Set<UserPackage> mPackagesToRemove = new ArraySet<>();
    final LocalService mLocalService;
@@ -15043,7 +15043,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
        Preconditions.checkCallAuthorization(
                hasCallingOrSelfPermission(permission.MANAGE_DEVICE_ADMINS));
        Pair<String, Integer> packageUserPair = new Pair<>(packageName, caller.getUserId());
        UserPackage packageUserPair = UserPackage.of(caller.getUserId(), packageName);
        synchronized (getLockObject()) {
            return mPackagesToRemove.contains(packageUserPair);
        }
@@ -15071,7 +15071,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
            throw new IllegalArgumentException("Cannot uninstall a package with a device owner");
        }
        final Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
        final UserPackage packageUserPair = UserPackage.of(userId, packageName);
        synchronized (getLockObject()) {
            mPackagesToRemove.add(packageUserPair);
        }
@@ -15131,7 +15131,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
    }
    private void startUninstallIntent(final String packageName, final int userId) {
        final Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
        final UserPackage packageUserPair = UserPackage.of(userId, packageName);
        synchronized (getLockObject()) {
            if (!mPackagesToRemove.contains(packageUserPair)) {
                // Do nothing if uninstall was not requested or was already started.