Merge "Prevent whitelisted apps from blocking and silencing"
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index a451786..d12842c 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -218,7 +218,7 @@
     }
 
     private void setupBlock() {
-        if (mAppRow.systemApp) {
+        if (mAppRow.systemApp && !mAppRow.banned) {
             setVisible(mBlock, false);
         } else {
             mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
@@ -243,6 +243,9 @@
             setVisible(category, !banned);
         }
         setVisible(mBadge, !banned);
+        if (mAppRow.systemApp && !mAppRow.banned) {
+            setVisible(mBlock, false);
+        }
     }
 
     private Comparator<NotificationChannel> mChannelComparator =
diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java
index 1cb2154..18e00f8 100644
--- a/src/com/android/settings/notification/ChannelNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelNotificationSettings.java
@@ -134,7 +134,9 @@
         }
         mLights.setDisabledByAdmin(mSuspendedAppsAdmin);
         mVibrate.setDisabledByAdmin(mSuspendedAppsAdmin);
-        mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
+        if (mImportance.isEnabled()) {
+            mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
+        }
         mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
         mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin);
     }
@@ -185,21 +187,26 @@
     }
 
     protected void setupBlockAndImportance() {
-        mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
-        mBlock.setChecked(mChannel.getImportance() == NotificationManager.IMPORTANCE_NONE);
-        mBlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                final boolean value = (Boolean) newValue;
-                int importance = value ?  IMPORTANCE_NONE : IMPORTANCE_LOW;
-                mImportance.setValue(String.valueOf(importance));
-                mChannel.setImportance(importance);
-                mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-                mBackend.updateChannel(mPkg, mUid, mChannel);
-                updateDependents();
-                return true;
-            }
-        });
+        if (mAppRow.systemApp && mChannel.getImportance() != NotificationManager.IMPORTANCE_NONE) {
+            setVisible(mBlock, false);
+        } else {
+            mBlock.setEnabled(mAppRow.systemApp);
+            mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+            mBlock.setChecked(mChannel.getImportance() == NotificationManager.IMPORTANCE_NONE);
+            mBlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    final boolean value = (Boolean) newValue;
+                    int importance = value ? IMPORTANCE_NONE : IMPORTANCE_LOW;
+                    mImportance.setValue(String.valueOf(importance));
+                    mChannel.setImportance(importance);
+                    mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+                    mBackend.updateChannel(mPkg, mUid, mChannel);
+                    updateDependents();
+                    return true;
+                }
+            });
+        }
         mBadge.setDisabledByAdmin(mSuspendedAppsAdmin);
         mBadge.setEnabled(mAppRow.showBadge);
         mBadge.setChecked(mChannel.canShowBadge());
@@ -217,7 +224,8 @@
         mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
         final int numImportances = IMPORTANCE_HIGH - IMPORTANCE_MIN + 1;
         List<String> summaries = new ArrayList<>();
-        List<String> values = new ArrayList<>();;
+        List<String> values = new ArrayList<>();
+        ;
         for (int i = 0; i < numImportances; i++) {
             int importance = i + 1;
             summaries.add(getImportanceSummary(importance));
@@ -232,18 +240,21 @@
         mImportance.setEntries(summaries.toArray(new String[0]));
         mImportance.setValue(String.valueOf(mChannel.getImportance()));
         mImportance.setSummary("%s");
-
-        mImportance.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                int importance = Integer.parseInt((String) newValue);
-                mChannel.setImportance(importance);
-                mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-                mBackend.updateChannel(mPkg, mUid, mChannel);
-                updateDependents();
-                return true;
-            }
-        });
+        if (mAppRow.lockedImportance) {
+            mImportance.setEnabled(false);
+        } else {
+            mImportance.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object newValue) {
+                    int importance = Integer.parseInt((String) newValue);
+                    mChannel.setImportance(importance);
+                    mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+                    mBackend.updateChannel(mPkg, mUid, mChannel);
+                    updateDependents();
+                    return true;
+                }
+            });
+        }
     }
 
     protected void setupPriorityPref(boolean priority) {
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index d201d60..0881eb7 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -64,7 +64,7 @@
             int N = nonBlockablePkgs.length;
             for (int i = 0; i < N; i++) {
                 if (app.packageName.equals(nonBlockablePkgs[i])) {
-                    row.systemApp = true;
+                    row.systemApp = row.lockedImportance = true;
                 }
             }
         }
@@ -152,6 +152,7 @@
         public boolean banned;
         public boolean first;  // first app in section
         public boolean systemApp;
+        public boolean lockedImportance;
         public boolean showBadge;
         public int userId;
     }
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index 38de27e..6a40ea5 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -148,7 +148,9 @@
         }
         mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
                 mContext, mPkg, mUserId);
-        mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+        if (mBlock.isEnabled()) {
+            mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+        }
         mBadge.setDisabledByAdmin(mSuspendedAppsAdmin);
     }