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 Original line Diff line number Diff line
@@ -84,6 +84,7 @@ import android.content.IntentFilter;
import android.content.PermissionChecker;
import android.content.PermissionChecker;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserPackage;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.net.Uri;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.BatteryManager;
@@ -120,7 +121,6 @@ import android.util.IndentingPrintWriter;
import android.util.IntArray;
import android.util.IntArray;
import android.util.Log;
import android.util.Log;
import android.util.LongArrayQueue;
import android.util.LongArrayQueue;
import android.util.Pair;
import android.util.Slog;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseArray;
import android.util.SparseArrayMap;
import android.util.SparseArrayMap;
@@ -402,7 +402,7 @@ public class AlarmManagerService extends SystemService {
            public long lastUsage;
            public long lastUsage;
        }
        }
        /** Map of {package, user} -> {quotaInfo} */
        /** 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;
        private long mMaxDuration;


@@ -414,11 +414,11 @@ public class AlarmManagerService extends SystemService {
            if (quota <= 0) {
            if (quota <= 0) {
                return;
                return;
            }
            }
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            QuotaInfo currentQuotaInfo = mQuotaBuffer.get(packageUser);
            QuotaInfo currentQuotaInfo = mQuotaBuffer.get(userPackage);
            if (currentQuotaInfo == null) {
            if (currentQuotaInfo == null) {
                currentQuotaInfo = new QuotaInfo();
                currentQuotaInfo = new QuotaInfo();
                mQuotaBuffer.put(packageUser, currentQuotaInfo);
                mQuotaBuffer.put(userPackage, currentQuotaInfo);
            }
            }
            currentQuotaInfo.remainingQuota = quota;
            currentQuotaInfo.remainingQuota = quota;
            currentQuotaInfo.expirationTime = nowElapsed + mMaxDuration;
            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. */
        /** Returns if the supplied package has reserve quota to fire at the given time. */
        boolean hasQuota(String packageName, int userId, long triggerElapsed) {
        boolean hasQuota(String packageName, int userId, long triggerElapsed) {
            final Pair<String, Integer> packageUser = Pair.create(packageName, userId);
            final UserPackage userPackage = UserPackage.of(userId, packageName);
            final QuotaInfo quotaInfo = mQuotaBuffer.get(packageUser);
            final QuotaInfo quotaInfo = mQuotaBuffer.get(userPackage);


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


import com.android.server.LocalServices;
import com.android.server.LocalServices;


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


class SyncAdapterStateFetcher {
class SyncAdapterStateFetcher {


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


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


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


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