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

Commit b24c62c9 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Add missing synchronization

To 2 places where channels can be removed, not just marked as deleted.

Also rename a variable to remove an extraneous s.

Test: manual
Change-Id: Ic7f676499425fe54453384d7c03de5d95c03a713
Fixes: 113036956
parent a7ba45ac
Loading
Loading
Loading
Loading
+148 −138
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ public class PreferencesHelper implements RankingConfig {
    }

    // pkg|uid => PackagePreferences
    private final ArrayMap<String, PackagePreferences> mPackagePreferencess = new ArrayMap<>();
    private final ArrayMap<String, PackagePreferences> mPackagePreferences = new ArrayMap<>();
    // pkg => PackagePreferences
    private final ArrayMap<String, PackagePreferences> mRestoredWithoutUids = new ArrayMap<>();

@@ -142,7 +142,9 @@ public class PreferencesHelper implements RankingConfig {
        if (type != XmlPullParser.START_TAG) return;
        String tag = parser.getName();
        if (!TAG_RANKING.equals(tag)) return;
        synchronized (mPackagePreferences) {
            // Clobber groups and channels with the xml, but don't delete other data that wasn't present

            // at the time of serialization.
            mRestoredWithoutUids.clear();
            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
@@ -168,7 +170,8 @@ public class PreferencesHelper implements RankingConfig {
                            PackagePreferences r = getOrCreatePackagePreferences(name, uid,
                                    XmlUtils.readIntAttribute(
                                            parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE),
                                XmlUtils.readIntAttribute(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
                                    XmlUtils.readIntAttribute(parser, ATT_PRIORITY,
                                            DEFAULT_PRIORITY),
                                    XmlUtils.readIntAttribute(
                                            parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
                                    XmlUtils.readBooleanAttribute(
@@ -196,7 +199,8 @@ public class PreferencesHelper implements RankingConfig {
                                // Channel groups
                                if (TAG_GROUP.equals(tagName)) {
                                    String id = parser.getAttributeValue(null, ATT_ID);
                                CharSequence groupName = parser.getAttributeValue(null, ATT_NAME);
                                    CharSequence groupName = parser.getAttributeValue(null,
                                            ATT_NAME);
                                    if (!TextUtils.isEmpty(id)) {
                                        NotificationChannelGroup group
                                                = new NotificationChannelGroup(id, groupName);
@@ -230,11 +234,14 @@ public class PreferencesHelper implements RankingConfig {
                                    boolean delegateEnabled = XmlUtils.readBooleanAttribute(
                                            parser, ATT_ENABLED, Delegate.DEFAULT_ENABLED);
                                    boolean userAllowed = XmlUtils.readBooleanAttribute(
                                        parser, ATT_USER_ALLOWED, Delegate.DEFAULT_USER_ALLOWED);
                                            parser, ATT_USER_ALLOWED,
                                            Delegate.DEFAULT_USER_ALLOWED);
                                    Delegate d = null;
                                if (delegateId != UNKNOWN_UID && !TextUtils.isEmpty(delegateName)) {
                                    if (delegateId != UNKNOWN_UID && !TextUtils.isEmpty(
                                            delegateName)) {
                                        d = new Delegate(
                                            delegateName, delegateId, delegateEnabled, userAllowed);
                                                delegateName, delegateId, delegateEnabled,
                                                userAllowed);
                                    }
                                    r.delegate = d;
                                }
@@ -250,13 +257,14 @@ public class PreferencesHelper implements RankingConfig {
                    }
                }
            }
        }
        throw new IllegalStateException("Failed to reach END_DOCUMENT");
    }

    private PackagePreferences getPackagePreferences(String pkg, int uid) {
        final String key = packagePreferencesKey(pkg, uid);
        synchronized (mPackagePreferencess) {
            return mPackagePreferencess.get(key);
        synchronized (mPackagePreferences) {
            return mPackagePreferences.get(key);
        }
    }

@@ -268,10 +276,10 @@ public class PreferencesHelper implements RankingConfig {
    private PackagePreferences getOrCreatePackagePreferences(String pkg, int uid, int importance,
            int priority, int visibility, boolean showBadge) {
        final String key = packagePreferencesKey(pkg, uid);
        synchronized (mPackagePreferencess) {
        synchronized (mPackagePreferences) {
            PackagePreferences
                    r = (uid == UNKNOWN_UID) ? mRestoredWithoutUids.get(pkg)
                    : mPackagePreferencess.get(key);
                    : mPackagePreferences.get(key);
            if (r == null) {
                r = new PackagePreferences();
                r.pkg = pkg;
@@ -290,7 +298,7 @@ public class PreferencesHelper implements RankingConfig {
                if (r.uid == UNKNOWN_UID) {
                    mRestoredWithoutUids.put(pkg, r);
                } else {
                    mPackagePreferencess.put(key, r);
                    mPackagePreferences.put(key, r);
                }
            }
            return r;
@@ -364,10 +372,10 @@ public class PreferencesHelper implements RankingConfig {
        out.startTag(null, TAG_RANKING);
        out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION));

        synchronized (mPackagePreferencess) {
            final int N = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            final int N = mPackagePreferences.size();
            for (int i = 0; i < N; i++) {
                final PackagePreferences r = mPackagePreferencess.valueAt(i);
                final PackagePreferences r = mPackagePreferences.valueAt(i);
                //TODO: http://b/22388012
                if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
                    continue;
@@ -882,10 +890,10 @@ public class PreferencesHelper implements RankingConfig {

    public int getBlockedAppCount(int userId) {
        int count = 0;
        synchronized (mPackagePreferencess) {
            final int N = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            final int N = mPackagePreferences.size();
            for (int i = 0; i < N; i++) {
                final PackagePreferences r = mPackagePreferencess.valueAt(i);
                final PackagePreferences r = mPackagePreferences.valueAt(i);
                if (userId == UserHandle.getUserId(r.uid)
                        && r.importance == IMPORTANCE_NONE) {
                    count++;
@@ -896,11 +904,11 @@ public class PreferencesHelper implements RankingConfig {
    }

    public void updateChannelsBypassingDnd() {
        synchronized (mPackagePreferencess) {
            final int numPackagePreferencess = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            final int numPackagePreferencess = mPackagePreferences.size();
            for (int PackagePreferencesIndex = 0; PackagePreferencesIndex < numPackagePreferencess;
                    PackagePreferencesIndex++) {
                final PackagePreferences r = mPackagePreferencess.valueAt(PackagePreferencesIndex);
                final PackagePreferences r = mPackagePreferences.valueAt(PackagePreferencesIndex);
                final int numChannels = r.channels.size();

                for (int channelIndex = 0; channelIndex < numChannels; channelIndex++) {
@@ -1064,8 +1072,8 @@ public class PreferencesHelper implements RankingConfig {
        pw.println("per-package config:");

        pw.println("PackagePreferencess:");
        synchronized (mPackagePreferencess) {
            dumpPackagePreferencess(pw, prefix, filter, mPackagePreferencess);
        synchronized (mPackagePreferences) {
            dumpPackagePreferencess(pw, prefix, filter, mPackagePreferences);
        }
        pw.println("Restored without uid:");
        dumpPackagePreferencess(pw, prefix, filter, mRestoredWithoutUids);
@@ -1073,9 +1081,9 @@ public class PreferencesHelper implements RankingConfig {

    public void dump(ProtoOutputStream proto,
            @NonNull NotificationManagerService.DumpFilter filter) {
        synchronized (mPackagePreferencess) {
        synchronized (mPackagePreferences) {
            dumpPackagePreferencess(proto, RankingHelperProto.RECORDS, filter,
                    mPackagePreferencess);
                    mPackagePreferences);
        }
        dumpPackagePreferencess(proto, RankingHelperProto.RECORDS_RESTORED_WITHOUT_UID, filter,
                mRestoredWithoutUids);
@@ -1160,10 +1168,10 @@ public class PreferencesHelper implements RankingConfig {
        } catch (JSONException e) {
            // pass
        }
        synchronized (mPackagePreferencess) {
            final int N = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            final int N = mPackagePreferences.size();
            for (int i = 0; i < N; i++) {
                final PackagePreferences r = mPackagePreferencess.valueAt(i);
                final PackagePreferences r = mPackagePreferences.valueAt(i);
                if (filter == null || filter.matches(r.pkg)) {
                    JSONObject PackagePreferences = new JSONObject();
                    try {
@@ -1240,11 +1248,11 @@ public class PreferencesHelper implements RankingConfig {
    }

    public Map<Integer, String> getPackageBans() {
        synchronized (mPackagePreferencess) {
            final int N = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            final int N = mPackagePreferences.size();
            ArrayMap<Integer, String> packageBans = new ArrayMap<>(N);
            for (int i = 0; i < N; i++) {
                final PackagePreferences r = mPackagePreferencess.valueAt(i);
                final PackagePreferences r = mPackagePreferences.valueAt(i);
                if (r.importance == IMPORTANCE_NONE) {
                    packageBans.put(r.uid, r.pkg);
                }
@@ -1284,9 +1292,9 @@ public class PreferencesHelper implements RankingConfig {

    private Map<String, Integer> getPackageChannels() {
        ArrayMap<String, Integer> packageChannels = new ArrayMap<>();
        synchronized (mPackagePreferencess) {
            for (int i = 0; i < mPackagePreferencess.size(); i++) {
                final PackagePreferences r = mPackagePreferencess.valueAt(i);
        synchronized (mPackagePreferences) {
            for (int i = 0; i < mPackagePreferences.size(); i++) {
                final PackagePreferences r = mPackagePreferences.valueAt(i);
                int channelCount = 0;
                for (int j = 0; j < r.channels.size(); j++) {
                    if (!r.channels.valueAt(j).isDeleted()) {
@@ -1300,22 +1308,22 @@ public class PreferencesHelper implements RankingConfig {
    }

    public void onUserRemoved(int userId) {
        synchronized (mPackagePreferencess) {
            int N = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            int N = mPackagePreferences.size();
            for (int i = N - 1; i >= 0; i--) {
                PackagePreferences PackagePreferences = mPackagePreferencess.valueAt(i);
                PackagePreferences PackagePreferences = mPackagePreferences.valueAt(i);
                if (UserHandle.getUserId(PackagePreferences.uid) == userId) {
                    mPackagePreferencess.removeAt(i);
                    mPackagePreferences.removeAt(i);
                }
            }
        }
    }

    protected void onLocaleChanged(Context context, int userId) {
        synchronized (mPackagePreferencess) {
            int N = mPackagePreferencess.size();
        synchronized (mPackagePreferences) {
            int N = mPackagePreferences.size();
            for (int i = 0; i < N; i++) {
                PackagePreferences PackagePreferences = mPackagePreferencess.valueAt(i);
                PackagePreferences PackagePreferences = mPackagePreferences.valueAt(i);
                if (UserHandle.getUserId(PackagePreferences.uid) == userId) {
                    if (PackagePreferences.channels.containsKey(
                            NotificationChannel.DEFAULT_CHANNEL_ID)) {
@@ -1341,8 +1349,8 @@ public class PreferencesHelper implements RankingConfig {
            for (int i = 0; i < size; i++) {
                final String pkg = pkgList[i];
                final int uid = uidList[i];
                synchronized (mPackagePreferencess) {
                    mPackagePreferencess.remove(packagePreferencesKey(pkg, uid));
                synchronized (mPackagePreferences) {
                    mPackagePreferences.remove(packagePreferencesKey(pkg, uid));
                }
                mRestoredWithoutUids.remove(pkg);
                updated = true;
@@ -1355,8 +1363,8 @@ public class PreferencesHelper implements RankingConfig {
                    try {
                        r.uid = mPm.getPackageUidAsUser(r.pkg, changeUserId);
                        mRestoredWithoutUids.remove(pkg);
                        synchronized (mPackagePreferencess) {
                            mPackagePreferencess.put(packagePreferencesKey(r.pkg, r.uid), r);
                        synchronized (mPackagePreferences) {
                            mPackagePreferences.put(packagePreferencesKey(r.pkg, r.uid), r);
                        }
                        updated = true;
                    } catch (PackageManager.NameNotFoundException e) {
@@ -1365,12 +1373,14 @@ public class PreferencesHelper implements RankingConfig {
                }
                // Package upgrade
                try {
                    synchronized (mPackagePreferences) {
                        PackagePreferences fullPackagePreferences = getPackagePreferences(pkg,
                                mPm.getPackageUidAsUser(pkg, changeUserId));
                        if (fullPackagePreferences != null) {
                            createDefaultChannelIfNeeded(fullPackagePreferences);
                            deleteDefaultChannelIfNeeded(fullPackagePreferences);
                        }
                    }
                } catch (PackageManager.NameNotFoundException e) {
                }
            }