Fix default app notification locking on new devices

- Fresh devices, no restore, create app prefs if app hasn't done
it already
- Apply app level locking to channels created via readxml on restore

Test: atest, factory reset device and verify that default dialer app is
locked without requiring a reboot. restore backup and verify that it's
still locked
Fixes: 127855529

Change-Id: Ieca3e064eb5b5aa5877a4b575bf6223f62259668
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 9e16632..627b65c 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -38,6 +38,7 @@
 import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
+import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseBooleanArray;
 import android.util.proto.ProtoOutputStream;
@@ -236,6 +237,8 @@
                                         } else {
                                             channel.populateFromXml(parser);
                                         }
+                                        channel.setImportanceLockedByCriticalDeviceFunction(
+                                                r.defaultAppLockedImportance);
                                         r.channels.put(id, channel);
                                     }
                                 }
@@ -882,7 +885,8 @@
         }
     }
 
-    public void updateDefaultApps(int userId, ArraySet<String> toRemove, ArraySet<String> toAdd) {
+    public void updateDefaultApps(int userId, ArraySet<String> toRemove,
+            ArraySet<Pair<String, Integer>> toAdd) {
         synchronized (mPackagePreferences) {
             for (PackagePreferences p : mPackagePreferences.values()) {
                 if (userId == UserHandle.getUserId(p.uid)) {
@@ -891,11 +895,16 @@
                         for (NotificationChannel channel : p.channels.values()) {
                             channel.setImportanceLockedByCriticalDeviceFunction(false);
                         }
-                    } else if (toAdd != null && toAdd.contains(p.pkg)) {
-                        p.defaultAppLockedImportance = true;
-                        for (NotificationChannel channel : p.channels.values()) {
-                            channel.setImportanceLockedByCriticalDeviceFunction(true);
-                        }
+                    }
+                }
+            }
+            if (toAdd != null) {
+                for (Pair<String, Integer> approvedApp : toAdd) {
+                    PackagePreferences p = getOrCreatePackagePreferencesLocked(approvedApp.first,
+                            approvedApp.second);
+                    p.defaultAppLockedImportance = true;
+                    for (NotificationChannel channel : p.channels.values()) {
+                        channel.setImportanceLockedByCriticalDeviceFunction(true);
                     }
                 }
             }
@@ -1426,8 +1435,22 @@
                     pw.print(" visibility=");
                     pw.print(Notification.visibilityToString(r.visibility));
                 }
-                pw.print(" showBadge=");
-                pw.print(Boolean.toString(r.showBadge));
+                if (r.showBadge != DEFAULT_SHOW_BADGE) {
+                    pw.print(" showBadge=");
+                    pw.print(r.showBadge);
+                }
+                if (r.defaultAppLockedImportance != DEFAULT_APP_LOCKED_IMPORTANCE) {
+                    pw.print(" defaultAppLocked=");
+                    pw.print(r.defaultAppLockedImportance);
+                }
+                if (r.oemLockedImportance != DEFAULT_OEM_LOCKED_IMPORTANCE) {
+                    pw.print(" oemLocked=");
+                    pw.print(r.oemLockedImportance);
+                }
+                if (!r.futureOemLockedChannels.isEmpty()) {
+                    pw.print(" futureLockedChannels=");
+                    pw.print(r.futureOemLockedChannels);
+                }
                 pw.println();
                 for (NotificationChannel channel : r.channels.values()) {
                     pw.print(prefix);