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

Commit eaf47991 authored by Matías Hernández's avatar Matías Hernández Committed by Automerger Merge Worker
Browse files

Merge "Prevent accidental creation of PackagePreferences for non-existing...

Merge "Prevent accidental creation of PackagePreferences for non-existing packages" into udc-dev am: 05e00548

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/35367988



Change-Id: I2a989e71e743aca5bd18de4909ed035756601315
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 7ac7ae32 05e00548
Loading
Loading
Loading
Loading
+27 −15
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_NORMAL;
import static android.os.PowerWhitelistManager.REASON_NOTIFICATION_SERVICE;
import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
import static android.os.Process.INVALID_UID;
import static android.os.UserHandle.USER_NULL;
import static android.os.UserHandle.USER_SYSTEM;
import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING;
@@ -404,7 +405,6 @@ public class NotificationManagerService extends SystemService {
    static final long SNOOZE_UNTIL_UNSPECIFIED = -1;
    static final int INVALID_UID = -1;
    static final String ROOT_PKG = "root";
    static final String[] ALLOWED_ADJUSTMENTS = new String[] {
@@ -3999,7 +3999,7 @@ public class NotificationManagerService extends SystemService {
                String conversationId) {
            if (canNotifyAsPackage(callingPkg, targetPkg, userId)
                    || isCallerIsSystemOrSysemUiOrShell()) {
                int targetUid = -1;
                int targetUid = INVALID_UID;
                try {
                    targetUid = mPackageManagerClient.getPackageUidAsUser(targetPkg, userId);
                } catch (NameNotFoundException e) {
@@ -4252,7 +4252,7 @@ public class NotificationManagerService extends SystemService {
                String callingPkg, String targetPkg, int userId) {
            if (canNotifyAsPackage(callingPkg, targetPkg, userId)
                || isCallingUidSystem()) {
                int targetUid = -1;
                int targetUid = INVALID_UID;
                try {
                    targetUid = mPackageManagerClient.getPackageUidAsUser(targetPkg, userId);
                } catch (NameNotFoundException e) {
@@ -5870,14 +5870,12 @@ public class NotificationManagerService extends SystemService {
        }
        private int getUidForPackageAndUser(String pkg, UserHandle user) throws RemoteException {
            int uid = INVALID_UID;
            final long identity = Binder.clearCallingIdentity();
            try {
                uid = mPackageManager.getPackageUid(pkg, 0, user.getIdentifier());
                return mPackageManager.getPackageUid(pkg, 0, user.getIdentifier());
            } finally {
                Binder.restoreCallingIdentity(identity);
            }
            return uid;
        }
        @Override
@@ -11867,15 +11865,22 @@ public class NotificationManagerService extends SystemService {
            List<UserHandle> users = mUm.getUserHandles(/* excludeDying */ true);
            mNonBlockableDefaultApps = new ArrayMap<>();
            for (int i = 0; i < NON_BLOCKABLE_DEFAULT_ROLES.length; i++) {
                String role = NON_BLOCKABLE_DEFAULT_ROLES[i];
                final ArrayMap<Integer, ArraySet<String>> userToApprovedList = new ArrayMap<>();
                mNonBlockableDefaultApps.put(NON_BLOCKABLE_DEFAULT_ROLES[i], userToApprovedList);
                mNonBlockableDefaultApps.put(role, userToApprovedList);
                for (int j = 0; j < users.size(); j++) {
                    Integer userId = users.get(j).getIdentifier();
                    int userId = users.get(j).getIdentifier();
                    ArraySet<String> approvedForUserId = new ArraySet<>(mRm.getRoleHoldersAsUser(
                            NON_BLOCKABLE_DEFAULT_ROLES[i], UserHandle.of(userId)));
                            role, UserHandle.of(userId)));
                    ArraySet<Pair<String, Integer>> approvedAppUids = new ArraySet<>();
                    for (String pkg : approvedForUserId) {
                        approvedAppUids.add(new Pair(pkg, getUidForPackage(pkg, userId)));
                        int uid = getUidForPackage(pkg, userId);
                        if (uid != INVALID_UID) {
                            approvedAppUids.add(new Pair<>(pkg, uid));
                        } else {
                            Slog.e(TAG, "init: Invalid package for role " + role
                                    + " (user " + userId + "): " + pkg);
                        }
                    }
                    userToApprovedList.put(userId, approvedForUserId);
                    mPreferencesHelper.updateDefaultApps(userId, null, approvedAppUids);
@@ -11941,8 +11946,13 @@ public class NotificationManagerService extends SystemService {
            }
            for (String nowApproved : roleHolders) {
                if (!previouslyApproved.contains(nowApproved)) {
                    toAdd.add(new Pair(nowApproved,
                            getUidForPackage(nowApproved, user.getIdentifier())));
                    int uid = getUidForPackage(nowApproved, user.getIdentifier());
                    if (uid != INVALID_UID) {
                        toAdd.add(new Pair<>(nowApproved, uid));
                    } else {
                        Slog.e(TAG, "onRoleHoldersChanged: Invalid package for role " + roleName
                                + " (user " + user.getIdentifier() + "): " + nowApproved);
                    }
                }
            }
@@ -11982,10 +11992,12 @@ public class NotificationManagerService extends SystemService {
                UserHandle user = users[i];
                for (String pkg : mRm.getRoleHoldersAsUser(RoleManager.ROLE_BROWSER, user)) {
                    int uid = getUidForPackage(pkg, user.getIdentifier());
                    if (uid != -1) {
                    if (uid != INVALID_UID) {
                        newUids.add(uid);
                    } else {
                        Slog.e(TAG, "Bad uid (-1) for browser package " + pkg);
                        Slog.e(TAG, "updateTrampoline: Invalid package for role "
                                + RoleManager.ROLE_BROWSER + " (user " + user.getIdentifier()
                                + "): " + pkg);
                    }
                }
            }
@@ -11998,7 +12010,7 @@ public class NotificationManagerService extends SystemService {
            } catch (RemoteException e) {
                Slog.e(TAG, "role manager has bad default " + pkg + " " + userId);
            }
            return -1;
            return INVALID_UID;
        }
    }
+92 −79
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_MAX;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
import static android.os.Process.INVALID_UID;
import static android.util.StatsLog.ANNOTATION_ID_IS_UID;

import static com.android.internal.util.FrameworkStatsLog.PACKAGE_NOTIFICATION_CHANNEL_GROUP_PREFERENCES;
@@ -106,8 +107,6 @@ public class PreferencesHelper implements RankingConfig {
    private static final int XML_VERSION_NOTIF_PERMISSION = 3;
    /** The first xml version that notifies users to review their notification permissions */
    private static final int XML_VERSION_REVIEW_PERMISSIONS_NOTIFICATION = 4;
    @VisibleForTesting
    static final int UNKNOWN_UID = UserHandle.USER_NULL;
    private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":";

    @VisibleForTesting
@@ -274,7 +273,7 @@ public class PreferencesHelper implements RankingConfig {
            @UserIdInt int userId, String name, boolean upgradeForBubbles,
            boolean migrateToPermission) {
        try {
            int uid = parser.getAttributeInt(null, ATT_UID, UNKNOWN_UID);
            int uid = parser.getAttributeInt(null, ATT_UID, INVALID_UID);
            if (forRestore) {
                try {
                    uid = mPm.getPackageUidAsUser(name, userId);
@@ -285,7 +284,7 @@ public class PreferencesHelper implements RankingConfig {
            boolean skipWarningLogged = false;
            boolean skipGroupWarningLogged = false;
            boolean hasSAWPermission = false;
            if (upgradeForBubbles && uid != UNKNOWN_UID) {
            if (upgradeForBubbles && uid != INVALID_UID) {
                hasSAWPermission = mAppOps.noteOpNoThrow(
                        OP_SYSTEM_ALERT_WINDOW, uid, name, null,
                        "check-notif-bubble") == AppOpsManager.MODE_ALLOWED;
@@ -295,7 +294,7 @@ public class PreferencesHelper implements RankingConfig {
                    : parser.getAttributeInt(null, ATT_ALLOW_BUBBLE, DEFAULT_BUBBLE_PREFERENCE);
            int appImportance = parser.getAttributeInt(null, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);

            PackagePreferences r = getOrCreatePackagePreferencesLocked(
            PackagePreferences r = getOrCreatePackagePreferencesSupportingInvalidUidLocked(
                    name, userId, uid,
                    appImportance,
                    parser.getAttributeInt(null, ATT_PRIORITY, DEFAULT_PRIORITY),
@@ -355,12 +354,12 @@ public class PreferencesHelper implements RankingConfig {

                // Delegate
                if (TAG_DELEGATE.equals(tagName)) {
                    int delegateId = parser.getAttributeInt(null, ATT_UID, UNKNOWN_UID);
                    int delegateId = parser.getAttributeInt(null, ATT_UID, INVALID_UID);
                    String delegateName = XmlUtils.readStringAttribute(parser, ATT_NAME);
                    boolean delegateEnabled = parser.getAttributeBoolean(
                            null, ATT_ENABLED, Delegate.DEFAULT_ENABLED);
                    Delegate d = null;
                    if (delegateId != UNKNOWN_UID && !TextUtils.isEmpty(delegateName)) {
                    if (delegateId != INVALID_UID && !TextUtils.isEmpty(delegateName)) {
                        d = new Delegate(delegateName, delegateId, delegateEnabled);
                    }
                    r.delegate = d;
@@ -394,7 +393,7 @@ public class PreferencesHelper implements RankingConfig {
                NotificationChannel channel = new NotificationChannel(
                        id, channelName, channelImportance);
                if (forRestore) {
                    final boolean pkgInstalled = r.uid != UNKNOWN_UID;
                    final boolean pkgInstalled = r.uid != INVALID_UID;
                    channel.populateFromXmlForRestore(parser, pkgInstalled, mContext);
                } else {
                    channel.populateFromXml(parser);
@@ -443,25 +442,55 @@ public class PreferencesHelper implements RankingConfig {
        return true;
    }

    /**
     * Returns the {@link PackagePreferences} object associated to the pkg/uid pair. If it doesn't
     * exist, return {@code null}.
     */
    @GuardedBy("mPackagePreferences")
    @Nullable
    private PackagePreferences getPackagePreferencesLocked(String pkg, int uid) {
        final String key = packagePreferencesKey(pkg, uid);
        return mPackagePreferences.get(key);
    }

    private PackagePreferences getOrCreatePackagePreferencesLocked(String pkg,
            int uid) {
    /**
     * Returns the {@link PackagePreferences} object associated to the pkg/uid pair. If it doesn't
     * exist, a new one is initialized (with appropriate defaults, e.g. default channel if pre-O)
     * and stored in {@link #mPackagePreferences}.
     *
     * @throws IllegalArgumentException if the supplied uid is not valid (i.e. {@code INVALID_UID}).
     */
    @GuardedBy("mPackagePreferences")
    @NonNull
    private PackagePreferences getOrCreatePackagePreferencesLocked(String pkg, int uid) {
        Objects.requireNonNull(pkg);
        Preconditions.checkArgument(uid != INVALID_UID,
                "Valid uid required to get settings of %s", pkg);

        // TODO (b/194833441): use permissionhelper instead of DEFAULT_IMPORTANCE
        return getOrCreatePackagePreferencesLocked(pkg, UserHandle.getUserId(uid), uid,
                DEFAULT_IMPORTANCE, DEFAULT_PRIORITY, DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE,
                DEFAULT_BUBBLE_PREFERENCE);
        return getOrCreatePackagePreferencesSupportingInvalidUidLocked(pkg,
                UserHandle.getUserId(uid), uid, DEFAULT_IMPORTANCE, DEFAULT_PRIORITY,
                DEFAULT_VISIBILITY, DEFAULT_SHOW_BADGE, DEFAULT_BUBBLE_PREFERENCE);
    }

    private PackagePreferences getOrCreatePackagePreferencesLocked(String pkg,
    /**
     * Returns the {@link PackagePreferences} object associated to the pkg/uid pair, and initializes
     * a new one (with appropriate defaults, e.g. default channel if pre-O) if it doesn't exist.
     *
     * <p>This method accepts {@link android.os.Process#INVALID_UID} as the {@code uid}
     * parameter, and in that case will create a (time-limited) entry in
     * {@link #mRestoredWithoutUids} instead of {@link #mPackagePreferences}. As such, should only
     * be used that way by the {@code readXml()} path, to support restoring NMS backups before all
     * packages have been reinstalled -- for API calls, we shouldn't create entries for
     * non-existing packages.
     */
    @GuardedBy("mPackagePreferences")
    private PackagePreferences getOrCreatePackagePreferencesSupportingInvalidUidLocked(String pkg,
            @UserIdInt int userId, int uid, int importance, int priority, int visibility,
            boolean showBadge, int bubblePreference) {
        final String key = packagePreferencesKey(pkg, uid);
        PackagePreferences
                r = (uid == UNKNOWN_UID)
                r = (uid == INVALID_UID)
                ? mRestoredWithoutUids.get(unrestoredPackageKey(pkg, userId))
                : mPackagePreferences.get(key);
        if (r == null) {
@@ -480,7 +509,7 @@ public class PreferencesHelper implements RankingConfig {
                Slog.e(TAG, "createDefaultChannelIfNeededLocked - Exception: " + e);
            }

            if (r.uid == UNKNOWN_UID) {
            if (r.uid == INVALID_UID) {
                mRestoredWithoutUids.put(unrestoredPackageKey(pkg, userId), r);
            } else {
                mPackagePreferences.put(key, r);
@@ -523,7 +552,7 @@ public class PreferencesHelper implements RankingConfig {

    private boolean createDefaultChannelIfNeededLocked(PackagePreferences r) throws
            PackageManager.NameNotFoundException {
        if (r.uid == UNKNOWN_UID) {
        if (r.uid == INVALID_UID) {
            return false;
        }

@@ -689,20 +718,23 @@ public class PreferencesHelper implements RankingConfig {
    @Override
    public int getBubblePreference(String pkg, int uid) {
        synchronized (mPackagePreferences) {
            return getOrCreatePackagePreferencesLocked(pkg, uid).bubblePreference;
            PackagePreferences p = getPackagePreferencesLocked(pkg, uid);
            return p != null ? p.bubblePreference : DEFAULT_BUBBLE_PREFERENCE;
        }
    }

    public int getAppLockedFields(String pkg, int uid) {
        synchronized (mPackagePreferences) {
            return getOrCreatePackagePreferencesLocked(pkg, uid).lockedAppFields;
            PackagePreferences p = getPackagePreferencesLocked(pkg, uid);
            return p != null ? p.lockedAppFields : DEFAULT_LOCKED_APP_FIELDS;
        }
    }

    @Override
    public boolean canShowBadge(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            return getOrCreatePackagePreferencesLocked(packageName, uid).showBadge;
            PackagePreferences p = getPackagePreferencesLocked(packageName, uid);
            return p != null ? p.showBadge : DEFAULT_SHOW_BADGE;
        }
    }

@@ -723,15 +755,15 @@ public class PreferencesHelper implements RankingConfig {

    public boolean isInInvalidMsgState(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            return r.hasSentInvalidMessage && !r.hasSentValidMessage;
            PackagePreferences r = getPackagePreferencesLocked(packageName, uid);
            return r != null && r.hasSentInvalidMessage && !r.hasSentValidMessage;
        }
    }

    public boolean hasUserDemotedInvalidMsgApp(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            return isInInvalidMsgState(packageName, uid) ? r.userDemotedMsgApp : false;
            PackagePreferences r = getPackagePreferencesLocked(packageName, uid);
            return r != null && isInInvalidMsgState(packageName, uid) && r.userDemotedMsgApp;
        }
    }

@@ -765,24 +797,24 @@ public class PreferencesHelper implements RankingConfig {
    @VisibleForTesting
    boolean hasSentInvalidMsg(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            return r.hasSentInvalidMessage;
            PackagePreferences r = getPackagePreferencesLocked(packageName, uid);
            return r != null && r.hasSentInvalidMessage;
        }
    }

    @VisibleForTesting
    boolean hasSentValidMsg(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            return r.hasSentValidMessage;
            PackagePreferences r = getPackagePreferencesLocked(packageName, uid);
            return r != null && r.hasSentValidMessage;
        }
    }

    @VisibleForTesting
    boolean didUserEverDemoteInvalidMsgApp(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            return r.userDemotedMsgApp;
            PackagePreferences p = getPackagePreferencesLocked(packageName, uid);
            return p != null && p.userDemotedMsgApp;
        }
    }

@@ -798,15 +830,17 @@ public class PreferencesHelper implements RankingConfig {

    boolean hasSentValidBubble(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            return r.hasSentValidBubble;
            PackagePreferences p = getPackagePreferencesLocked(packageName, uid);
            return p != null && p.hasSentValidBubble;
        }
    }

    boolean isImportanceLocked(String pkg, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            return r.fixedImportance || r.defaultAppLockedImportance;
            PackagePreferences p = getPackagePreferencesLocked(pkg, uid);
            return p != null
                    ? p.fixedImportance || p.defaultAppLockedImportance
                    : DEFAULT_APP_LOCKED_IMPORTANCE;
        }
    }

@@ -816,7 +850,10 @@ public class PreferencesHelper implements RankingConfig {
            return false;
        }
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(packageName, uid);
            PackagePreferences r = getPackagePreferencesLocked(packageName, uid);
            if (r == null) {
                return false;
            }
            NotificationChannelGroup group = r.groups.get(groupId);
            if (group == null) {
                return false;
@@ -827,13 +864,15 @@ public class PreferencesHelper implements RankingConfig {

    int getPackagePriority(String pkg, int uid) {
        synchronized (mPackagePreferences) {
            return getOrCreatePackagePreferencesLocked(pkg, uid).priority;
            PackagePreferences p = getPackagePreferencesLocked(pkg, uid);
            return p != null ? p.priority : DEFAULT_PRIORITY;
        }
    }

    int getPackageVisibility(String pkg, int uid) {
        synchronized (mPackagePreferences) {
            return getOrCreatePackagePreferencesLocked(pkg, uid).visibility;
            PackagePreferences p = getPackagePreferencesLocked(pkg, uid);
            return p != null ? p.visibility : DEFAULT_VISIBILITY;
        }
    }

@@ -849,9 +888,6 @@ public class PreferencesHelper implements RankingConfig {
        boolean needsDndChange = false;
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
                throw new IllegalArgumentException("Invalid package");
            }
            if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) {
                throw new IllegalStateException("Limit exceed; cannot create more groups");
            }
@@ -903,9 +939,6 @@ public class PreferencesHelper implements RankingConfig {
        boolean needsPolicyFileChange = false, wasUndeleted = false, needsDndChange = false;
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
                throw new IllegalArgumentException("Invalid package");
            }
            if (channel.getGroup() != null && !r.groups.containsKey(channel.getGroup())) {
                throw new IllegalArgumentException("NotificationChannelGroup doesn't exist");
            }
@@ -1058,10 +1091,6 @@ public class PreferencesHelper implements RankingConfig {
        Objects.requireNonNull(updatedChannelId);
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
                throw new IllegalArgumentException("Invalid package");
            }

            NotificationChannel channel = r.channels.get(updatedChannelId);
            if (channel == null || channel.isDeleted()) {
                throw new IllegalArgumentException("Channel does not exist");
@@ -1080,9 +1109,6 @@ public class PreferencesHelper implements RankingConfig {
        boolean needsDndChange = false;
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
                throw new IllegalArgumentException("Invalid package");
            }
            NotificationChannel channel = r.channels.get(updatedChannel.getId());
            if (channel == null || channel.isDeleted()) {
                throw new IllegalArgumentException("Channel does not exist");
@@ -1140,6 +1166,9 @@ public class PreferencesHelper implements RankingConfig {
    public NotificationChannel getNotificationChannel(String pkg, int uid, String channelId,
            boolean includeDeleted) {
        Objects.requireNonNull(pkg);
        if (uid == INVALID_UID) {
            return null;
        }
        return getConversationNotificationChannel(pkg, uid, channelId, null, true, includeDeleted);
    }

@@ -1148,11 +1177,11 @@ public class PreferencesHelper implements RankingConfig {
            String channelId, String conversationId, boolean returnParentIfNoConversationChannel,
            boolean includeDeleted) {
        Preconditions.checkNotNull(pkg);
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
        if (uid == INVALID_UID) {
            return null;
        }
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (channelId == null) {
                channelId = NotificationChannel.DEFAULT_CHANNEL_ID;
            }
@@ -1184,26 +1213,6 @@ public class PreferencesHelper implements RankingConfig {
        return null;
    }

    public List<NotificationChannel> getNotificationChannelsByConversationId(String pkg, int uid,
            String conversationId) {
        Preconditions.checkNotNull(pkg);
        Preconditions.checkNotNull(conversationId);
        List<NotificationChannel> channels = new ArrayList<>();
        synchronized (mPackagePreferences) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
                return channels;
            }
            for (NotificationChannel nc : r.channels.values()) {
                if (conversationId.equals(nc.getConversationId())
                        && !nc.isDeleted()) {
                    channels.add(nc);
                }
            }
            return channels;
        }
    }

    @Override
    public boolean deleteNotificationChannel(String pkg, int uid, String channelId,
            int callingUid, boolean fromSystemOrSystemUi) {
@@ -1595,6 +1604,9 @@ public class PreferencesHelper implements RankingConfig {
    public ParceledListSlice<NotificationChannel> getNotificationChannels(String pkg, int uid,
            boolean includeDeleted) {
        Objects.requireNonNull(pkg);
        if (uid == INVALID_UID) {
            return ParceledListSlice.emptyList();
        }
        List<NotificationChannel> channels = new ArrayList<>();
        synchronized (mPackagePreferences) {
            PackagePreferences r = getPackagePreferencesLocked(pkg, uid);
@@ -1777,7 +1789,8 @@ public class PreferencesHelper implements RankingConfig {
     * {@code uid}, have their importance locked by the user. Locked notifications don't get
     * considered for sentiment adjustments (and thus never show a blocking helper).
     */
    public void setAppImportanceLocked(String packageName, int uid) {
    @VisibleForTesting
    void setAppImportanceLocked(String packageName, int uid) {
        synchronized (mPackagePreferences) {
            PackagePreferences prefs = getOrCreatePackagePreferencesLocked(packageName, uid);
            if ((prefs.lockedAppFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0) {
@@ -1918,7 +1931,7 @@ public class PreferencesHelper implements RankingConfig {
                pw.print("  AppSettings: ");
                pw.print(r.pkg);
                pw.print(" (");
                pw.print(r.uid == UNKNOWN_UID ? "UNKNOWN_UID" : Integer.toString(r.uid));
                pw.print(r.uid == INVALID_UID ? "INVALID_UID" : Integer.toString(r.uid));
                pw.print(')');
                Pair<Integer, String> key = new Pair<>(r.uid, r.pkg);
                if (packagePermissions != null && pkgsWithPermissionsToHandle.contains(key)) {
@@ -1972,7 +1985,7 @@ public class PreferencesHelper implements RankingConfig {
                    pw.print("  AppSettings: ");
                    pw.print(p.second);
                    pw.print(" (");
                    pw.print(p.first == UNKNOWN_UID ? "UNKNOWN_UID" : Integer.toString(p.first));
                    pw.print(p.first == INVALID_UID ? "INVALID_UID" : Integer.toString(p.first));
                    pw.print(')');
                    pw.print(" importance=");
                    pw.print(NotificationListenerService.Ranking.importanceToString(
@@ -2692,7 +2705,7 @@ public class PreferencesHelper implements RankingConfig {
                synchronized (mPackagePreferences) {
                    PackagePreferences p = getOrCreatePackagePreferencesLocked(
                            pi.packageName, pi.applicationInfo.uid);
                    if (p.migrateToPm && p.uid != UNKNOWN_UID) {
                    if (p.migrateToPm && p.uid != INVALID_UID) {
                        try {
                            PackagePermission pkgPerm = new PackagePermission(
                                    p.pkg, UserHandle.getUserId(p.uid),
@@ -2722,7 +2735,7 @@ public class PreferencesHelper implements RankingConfig {

    private static class PackagePreferences {
        String pkg;
        int uid = UNKNOWN_UID;
        int uid = INVALID_UID;
        int importance = DEFAULT_IMPORTANCE;
        int priority = DEFAULT_PRIORITY;
        int visibility = DEFAULT_VISIBILITY;
@@ -2765,7 +2778,7 @@ public class PreferencesHelper implements RankingConfig {
        }

        public boolean isAllowed(String pkg, int uid) {
            if (pkg == null || uid == UNKNOWN_UID) {
            if (pkg == null || uid == INVALID_UID) {
                return false;
            }
            return pkg.equals(mPkg)