Merge "Allow users to block notification channels" into tm-dev
diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java
index 75d7a1f..ebd092cd 100644
--- a/services/core/java/com/android/server/notification/PreferencesHelper.java
+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java
@@ -1116,7 +1116,8 @@
             }
 
             if (mPermissionHelper.isMigrationEnabled()) {
-                if (mPermissionHelper.isPermissionFixed(r.pkg, UserHandle.getUserId(r.uid))) {
+                if (mPermissionHelper.isPermissionFixed(r.pkg, UserHandle.getUserId(r.uid))
+                        && !(channel.isBlockable() || channel.getImportance() == IMPORTANCE_NONE)) {
                     updatedChannel.setImportance(channel.getImportance());
                 }
             } else {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
index 7d5a0d0..63d7453 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java
@@ -4016,6 +4016,45 @@
     }
 
     @Test
+    public void testUpdateNotificationChannel_fixedPermission_butUserPreviouslyBlockedIt() {
+        when(mPermissionHelper.isMigrationEnabled()).thenReturn(true);
+        when(mPermissionHelper.isPermissionFixed(PKG_O, 0)).thenReturn(true);
+
+        NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_NONE);
+        mHelper.createNotificationChannel(PKG_O, UID_O, a, false, false);
+
+        NotificationChannel update = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        update.setAllowBubbles(false);
+
+        mHelper.updateNotificationChannel(PKG_O, UID_O, update, true);
+
+        assertEquals(IMPORTANCE_HIGH,
+                mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).getImportance());
+        assertEquals(false,
+                mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).canBubble());
+    }
+
+    @Test
+    public void testUpdateNotificationChannel_fixedPermission_butAppAllowsIt() {
+        when(mPermissionHelper.isMigrationEnabled()).thenReturn(true);
+        when(mPermissionHelper.isPermissionFixed(PKG_O, 0)).thenReturn(true);
+
+        NotificationChannel a = new NotificationChannel("a", "a", IMPORTANCE_HIGH);
+        a.setBlockable(true);
+        mHelper.createNotificationChannel(PKG_O, UID_O, a, true, false);
+
+        NotificationChannel update = new NotificationChannel("a", "a", IMPORTANCE_NONE);
+        update.setAllowBubbles(false);
+
+        mHelper.updateNotificationChannel(PKG_O, UID_O, update, true);
+
+        assertEquals(IMPORTANCE_NONE,
+                mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).getImportance());
+        assertEquals(false,
+                mHelper.getNotificationChannel(PKG_O, UID_O, a.getId(), false).canBubble());
+    }
+
+    @Test
     public void testUpdateNotificationChannel_notFixedPermission() {
         when(mPermissionHelper.isMigrationEnabled()).thenReturn(true);
         when(mPermissionHelper.isPermissionFixed(PKG_O, 0)).thenReturn(false);