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

Commit 59e55b13 authored by Matías Hernández's avatar Matías Hernández
Browse files

Add a couple of missing synchronizations in PreferencesHelper

Also added/fixed GuardedBy annotations everywhere.

Fixes: 411921853
Test: N/A, rare cross-thread issue
Flag: EXEMPT Trivial bugfix
Change-Id: I23e9fb6822578b79f7c0ad52f420b55c9db5b67e
parent 088ae231
Loading
Loading
Loading
Loading
+44 −26
Original line number Diff line number Diff line
@@ -312,8 +312,8 @@ public class PreferencesHelper implements RankingConfig {
                    } else if (TAG_PACKAGE.equals(tag)) {
                        String name = parser.getAttributeValue(null, ATT_NAME);
                        if (!TextUtils.isEmpty(name)) {
                            restorePackage(parser, forRestore, userId, name, upgradeForBubbles,
                                    migrateToPermission);
                            restorePackageLocked(parser, forRestore, userId, name,
                                    upgradeForBubbles, migrateToPermission);
                        }
                    }
                }
@@ -321,8 +321,8 @@ public class PreferencesHelper implements RankingConfig {
        }
    }

    @GuardedBy("mPackagePreferences")
    private void restorePackage(TypedXmlPullParser parser, boolean forRestore,
    @GuardedBy("mLock")
    private void restorePackageLocked(TypedXmlPullParser parser, boolean forRestore,
            @UserIdInt int userId, String name, boolean upgradeForBubbles,
            boolean migrateToPermission) {
        try {
@@ -450,7 +450,7 @@ public class PreferencesHelper implements RankingConfig {
        }
    }

    @GuardedBy("mPackagePreferences")
    @GuardedBy("mLock")
    private void restoreChannel(TypedXmlPullParser parser, boolean forRestore,
            PackagePreferences r) {
        try {
@@ -483,7 +483,7 @@ public class PreferencesHelper implements RankingConfig {
        }
    }

    @GuardedBy("mPackagePreferences")
    @GuardedBy("mLock")
    private boolean hasUserConfiguredSettings(PackagePreferences p){
        boolean hasChangedChannel = false;
        for (NotificationChannel channel : p.channels.values()) {
@@ -515,11 +515,13 @@ public class PreferencesHelper implements RankingConfig {
        return true;
    }

    @GuardedBy("mLock")
    private PackagePreferences getPackagePreferencesLocked(String pkg, int uid) {
        final String key = packagePreferencesKey(pkg, uid);
        return mPackagePreferences.get(key);
    }

    @GuardedBy("mLock")
    private PackagePreferences getOrCreatePackagePreferencesLocked(String pkg,
            int uid) {
        // TODO (b/194833441): use permissionhelper instead of DEFAULT_IMPORTANCE
@@ -590,6 +592,7 @@ public class PreferencesHelper implements RankingConfig {
        return true;
    }

    @GuardedBy("mLock")
    private boolean deleteDefaultChannelIfNeededLocked(PackagePreferences r) throws
            PackageManager.NameNotFoundException {
        if (!r.channels.containsKey(DEFAULT_CHANNEL_ID)) {
@@ -608,6 +611,7 @@ public class PreferencesHelper implements RankingConfig {
        return true;
    }

    @GuardedBy("mLock")
    private boolean createDefaultChannelIfNeededLocked(PackagePreferences r) throws
            PackageManager.NameNotFoundException {
        if (r.uid == UNKNOWN_UID) {
@@ -647,6 +651,7 @@ public class PreferencesHelper implements RankingConfig {
        return true;
    }

    @GuardedBy("mLock")
    private NotificationChannel addReservedChannelLocked(PackagePreferences p, String channelId) {
        String label = "";
        switch (channelId) {
@@ -716,7 +721,8 @@ public class PreferencesHelper implements RankingConfig {
        out.endTag(null, TAG_RANKING);
    }

    public void writePackageXml(PackagePreferences r, TypedXmlSerializer out,
    @GuardedBy("mLock")
    private void writePackageXml(PackagePreferences r, TypedXmlSerializer out,
            ArrayMap<Pair<Integer, String>, Pair<Boolean, Boolean>> notifPermissions,
            boolean forBackup) throws
            IOException {
@@ -1218,6 +1224,8 @@ public class PreferencesHelper implements RankingConfig {
        return needsPolicyFileChange;
    }

    @GuardedBy("mLock")
    @VisibleForTesting
    void clearLockedFieldsLocked(NotificationChannel channel) {
        channel.unlockFields(channel.getUserLockedFields());
    }
@@ -1322,7 +1330,7 @@ public class PreferencesHelper implements RankingConfig {
     * Updates conversation channels after user changes to their parent channel. See
     * {@link #maybeUpdateChildConversationChannel}.
     */
    @GuardedBy("mPackagePreferences")
    @GuardedBy("mLock")
    private void updateChildrenConversationChannels(@NonNull PackagePreferences packagePreferences,
            @NonNull NotificationChannel oldParent, @NonNull NotificationChannel updatedParent) {
        if (oldParent.equals(updatedParent)) {
@@ -1350,7 +1358,7 @@ public class PreferencesHelper implements RankingConfig {
     *
     * <p>This will also log the change as if it was {@code fromUser=true}.
     */
    @GuardedBy("mPackagePreferences")
    @GuardedBy("mLock")
    private void maybeUpdateChildConversationChannel(String pkg, int uid,
            @NonNull NotificationChannel conversation, @NonNull NotificationChannel oldParent,
            @NonNull NotificationChannel updatedParent) {
@@ -1438,6 +1446,7 @@ public class PreferencesHelper implements RankingConfig {
            return null;
        }
        Objects.requireNonNull(pkg);
        synchronized (mLock) {
            PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
            if (r == null) {
                return null;
@@ -1448,6 +1457,7 @@ public class PreferencesHelper implements RankingConfig {
            }
            return addReservedChannelLocked(r, channelId);
        }
    }

    @Override
    public NotificationChannel getNotificationChannel(String pkg, int uid, String channelId,
@@ -1543,6 +1553,7 @@ public class PreferencesHelper implements RankingConfig {
        return deletedChannel;
    }

    @GuardedBy("mLock")
    private boolean deleteNotificationChannelLocked(NotificationChannel channel, String pkg,
            int uid) {
        if (!channel.isDeleted()) {
@@ -1964,12 +1975,14 @@ public class PreferencesHelper implements RankingConfig {
    // without creating package preferences. For testing only, specifically to confirm the
    // notification channels of a removed/deleted package.
    protected List<NotificationChannel> getRemovedPkgNotificationChannels(String pkg, int uid) {
        synchronized (mLock) {
            PackagePreferences r = getPackagePreferencesLocked(pkg, uid);
            if (r == null || r.channels == null) {
                return new ArrayList<>();
            }
            return new ArrayList<>(r.channels.values());
        }
    }

    /**
     * Gets all notification channels associated with the given pkg and uid that can bypass dnd
@@ -2177,6 +2190,7 @@ public class PreferencesHelper implements RankingConfig {
        }
    }

    @GuardedBy("mLock")
    private boolean channelIsLiveLocked(PackagePreferences pkgPref, NotificationChannel channel) {
        // Channel is in a group that's blocked
        if (isGroupBlocked(pkgPref.pkg, pkgPref.uid, channel.getGroup())) {
@@ -2300,6 +2314,7 @@ public class PreferencesHelper implements RankingConfig {
        }
    }

    @GuardedBy("mLock")
    private void lockFieldsForUpdateLocked(NotificationChannel original,
            NotificationChannel update) {
        if (original.canBypassDnd() != update.canBypassDnd()) {
@@ -2455,6 +2470,7 @@ public class PreferencesHelper implements RankingConfig {
        }
    }

    @GuardedBy("mLock")
    private void dumpPackagePreferencesLocked(ProtoOutputStream proto, long fieldId,
            @NonNull NotificationManagerService.DumpFilter filter,
            ArrayMap<String, PackagePreferences> packagePreferences,
@@ -3055,12 +3071,14 @@ public class PreferencesHelper implements RankingConfig {
                }
                // Package upgrade
                try {
                    synchronized (mLock) {
                        PackagePreferences fullPackagePreferences = getPackagePreferencesLocked(pkg,
                                mPm.getPackageUidAsUser(pkg, changeUserId));
                        if (fullPackagePreferences != null) {
                            updated |= createDefaultChannelIfNeededLocked(fullPackagePreferences);
                            updated |= deleteDefaultChannelIfNeededLocked(fullPackagePreferences);
                        }
                    }
                } catch (PackageManager.NameNotFoundException e) {
                }
            }