Fix visibility and editability of importance fields

- Block field should always be visible
- Locked by OEM: cannot block or change importance
- Locked by default app: cannot block, can change importance
- Locked by system app: cannot block, can change importance
- system app but blockable: can block, can change importance

Test: robotests
Fixes: 131248127
Change-Id: Ifa718c84573dd5125aefa4f672a79dc4f267d515
diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
index a262191..ee9d089 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
@@ -459,7 +459,7 @@
     private boolean isChannelConfigurable(NotificationChannel channel,
             NotificationBackend.AppRow appRow) {
         if (channel != null && appRow != null) {
-            return !TextUtils.equals(channel.getId(), appRow.lockedChannelId);
+            return !channel.isImportanceLockedByOEM();
         }
 
         return false;
diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRow.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRow.java
index 4edce14..bf91f53 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRow.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRow.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.homepage.contextualcards.slices;
 
+import android.app.role.RoleManager;
 import android.content.Context;
 import android.content.pm.PackageInfo;
 
@@ -46,7 +47,7 @@
                 mPackageInfo.applicationInfo.packageName, mPackageInfo.applicationInfo.uid);
         if (channelCount > 1) {
             return mNotificationBackend.loadAppRow(mContext, mContext.getPackageManager(),
-                    mPackageInfo);
+                    mContext.getSystemService(RoleManager.class), mPackageInfo);
         }
         return null;
     }
diff --git a/src/com/android/settings/notification/BlockPreferenceController.java b/src/com/android/settings/notification/BlockPreferenceController.java
index 960526c..37589d9 100644
--- a/src/com/android/settings/notification/BlockPreferenceController.java
+++ b/src/com/android/settings/notification/BlockPreferenceController.java
@@ -54,13 +54,7 @@
         if (mAppRow == null) {
             return false;
         }
-        if (mChannel != null) {
-            return isChannelBlockable();
-        } else if (mChannelGroup != null) {
-            return isChannelGroupBlockable();
-        } else {
-            return !mAppRow.systemApp || (mAppRow.systemApp && mAppRow.banned);
-        }
+        return true;
     }
 
     public void updateState(Preference preference) {
@@ -78,6 +72,19 @@
             }
             bar.setDisabledByAdmin(mAdmin);
 
+            if (mChannel != null && !isChannelBlockable()) {
+                bar.setEnabled(false);
+            }
+
+            if (mChannelGroup != null && !isChannelGroupBlockable()) {
+                bar.setEnabled(false);
+            }
+
+            if (mChannel == null && mAppRow.systemApp
+                    && (!mAppRow.banned || mAppRow.lockedImportance)) {
+                bar.setEnabled(false);
+            }
+
             if (mChannel != null) {
                 bar.setChecked(!mAppRow.banned
                         && mChannel.getImportance() != NotificationManager.IMPORTANCE_NONE);
diff --git a/src/com/android/settings/notification/HighImportancePreferenceController.java b/src/com/android/settings/notification/HighImportancePreferenceController.java
index b82cb1f..da9b3b4 100644
--- a/src/com/android/settings/notification/HighImportancePreferenceController.java
+++ b/src/com/android/settings/notification/HighImportancePreferenceController.java
@@ -62,7 +62,7 @@
     @Override
     public void updateState(Preference preference) {
         if (mAppRow != null && mChannel != null) {
-            preference.setEnabled(mAdmin == null && isChannelBlockable());
+            preference.setEnabled(mAdmin == null && !mChannel.isImportanceLockedByOEM());
 
             RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference;
             pref.setChecked(mChannel.getImportance() >= IMPORTANCE_HIGH);
diff --git a/src/com/android/settings/notification/ImportancePreferenceController.java b/src/com/android/settings/notification/ImportancePreferenceController.java
index 708fc15..46b2ec6 100644
--- a/src/com/android/settings/notification/ImportancePreferenceController.java
+++ b/src/com/android/settings/notification/ImportancePreferenceController.java
@@ -59,9 +59,9 @@
     @Override
     public void updateState(Preference preference) {
         if (mAppRow!= null && mChannel != null) {
-            preference.setEnabled(mAdmin == null && isChannelBlockable());
+            preference.setEnabled(mAdmin == null && !mChannel.isImportanceLockedByOEM());
             ImportancePreference pref = (ImportancePreference) preference;
-            pref.setConfigurable(isChannelBlockable());
+            pref.setConfigurable(!mChannel.isImportanceLockedByOEM());
             pref.setImportance(mChannel.getImportance());
             pref.setDisplayInStatusBar(mBackend.showSilentInStatusBar(mContext.getPackageName()));
             // TODO: b/128445911 pass along lock screen setting
diff --git a/src/com/android/settings/notification/MinImportancePreferenceController.java b/src/com/android/settings/notification/MinImportancePreferenceController.java
index 84cead1..0af0c8d 100644
--- a/src/com/android/settings/notification/MinImportancePreferenceController.java
+++ b/src/com/android/settings/notification/MinImportancePreferenceController.java
@@ -62,7 +62,7 @@
     @Override
     public void updateState(Preference preference) {
         if (mAppRow != null && mChannel != null) {
-            preference.setEnabled(mAdmin == null && isChannelBlockable());
+            preference.setEnabled(mAdmin == null && !mChannel.isImportanceLockedByOEM());
 
             RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference;
             pref.setChecked(mChannel.getImportance() == IMPORTANCE_MIN);
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index def820c..747c541 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -21,6 +21,7 @@
 import android.app.INotificationManager;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
+import android.app.role.RoleManager;
 import android.app.usage.IUsageStatsManager;
 import android.app.usage.UsageEvents;
 import android.content.ComponentName;
@@ -86,14 +87,22 @@
         return !systemApp || (systemApp && blocked);
     }
 
-    public AppRow loadAppRow(Context context, PackageManager pm, PackageInfo app) {
+    public AppRow loadAppRow(Context context, PackageManager pm,
+            RoleManager roleManager, PackageInfo app) {
         final AppRow row = loadAppRow(context, pm, app.applicationInfo);
-        recordCanBeBlocked(context, pm, app, row);
+        recordCanBeBlocked(context, pm, roleManager, app, row);
         return row;
     }
 
-    void recordCanBeBlocked(Context context, PackageManager pm, PackageInfo app, AppRow row) {
+    void recordCanBeBlocked(Context context, PackageManager pm, RoleManager rm, PackageInfo app,
+            AppRow row) {
         row.systemApp = Utils.isSystemPackage(context.getResources(), pm, app);
+        List<String> roles = rm.getHeldRolesFromController(app.packageName);
+        if (roles.contains(RoleManager.ROLE_SMS)
+                || roles.contains(RoleManager.ROLE_DIALER)
+                || roles.contains(RoleManager.ROLE_EMERGENCY)) {
+            row.systemApp = true;
+        }
         final String[] nonBlockablePkgs = context.getResources().getStringArray(
                 com.android.internal.R.array.config_nonBlockableNotificationPackages);
         markAppRowWithBlockables(nonBlockablePkgs, row, app.packageName);
@@ -108,10 +117,8 @@
                 if (pkg == null) {
                     continue;
                 } else if (pkg.contains(":")) {
-                    // Interpret as channel; lock only this channel for this app.
-                    if (packageName.equals(pkg.split(":", 2)[0])) {
-                        row.lockedChannelId = pkg.split(":", 2 )[1];
-                    }
+                    // handled by NotificationChannel.isImportanceLockedByOEM()
+                    continue;
                 } else if (packageName.equals(nonBlockablePkgs[i])) {
                     row.systemApp = row.lockedImportance = true;
                 }
@@ -123,8 +130,9 @@
         try {
             PackageInfo info = context.getPackageManager().getPackageInfo(
                     app.packageName, PackageManager.GET_SIGNATURES);
+            RoleManager rm = context.getSystemService(RoleManager.class);
             final AppRow row = new AppRow();
-            recordCanBeBlocked(context,  context.getPackageManager(), info, row);
+            recordCanBeBlocked(context, context.getPackageManager(), rm, info, row);
             return row.systemApp;
         } catch (PackageManager.NameNotFoundException e) {
             e.printStackTrace();
@@ -491,7 +499,6 @@
         public boolean first;  // first app in section
         public boolean systemApp;
         public boolean lockedImportance;
-        public String lockedChannelId;
         public boolean showBadge;
         public boolean allowBubbles;
         public int userId;
diff --git a/src/com/android/settings/notification/NotificationPreferenceController.java b/src/com/android/settings/notification/NotificationPreferenceController.java
index 1bfe47e..d09ea4d 100644
--- a/src/com/android/settings/notification/NotificationPreferenceController.java
+++ b/src/com/android/settings/notification/NotificationPreferenceController.java
@@ -110,27 +110,13 @@
         }
     }
 
-    private boolean isChannelConfigurable() {
-        if (mAppRow != null && mAppRow.lockedImportance) {
-            return false;
-        }
-        if (mChannel != null && mAppRow != null) {
-            return !Objects.equals(mChannel.getId(), mAppRow.lockedChannelId);
-        }
-        return false;
-    }
-
     protected boolean isChannelBlockable() {
         if (mChannel != null && mAppRow != null) {
-            if (!isChannelConfigurable()) {
+            if (mChannel.isImportanceLockedByCriticalDeviceFunction()
+                    || mChannel.isImportanceLockedByOEM()) {
                 return mChannel.getImportance() == IMPORTANCE_NONE;
             }
 
-            if (mChannel.isImportanceLockedByOEM()
-                    || mChannel.isImportanceLockedByCriticalDeviceFunction()) {
-                return false;
-            }
-
             return mChannel.isBlockableSystem() || !mAppRow.systemApp
                     || mChannel.getImportance() == IMPORTANCE_NONE;
         }
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index 163671a..32d8e91 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -25,6 +25,7 @@
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
 import android.app.NotificationManager;
+import android.app.role.RoleManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -36,7 +37,6 @@
 import android.content.pm.ResolveInfo;
 import android.graphics.BlendMode;
 import android.graphics.BlendModeColorFilter;
-import android.graphics.ColorFilter;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.graphics.drawable.LayerDrawable;
@@ -71,6 +71,7 @@
     protected PackageManager mPm;
     protected NotificationBackend mBackend = new NotificationBackend();
     protected NotificationManager mNm;
+    protected RoleManager mRm;
     protected Context mContext;
 
     protected int mUid;
@@ -101,6 +102,7 @@
 
         mPm = getPackageManager();
         mNm = NotificationManager.from(mContext);
+        mRm = mContext.getSystemService(RoleManager.class);
 
         mPkg = mArgs != null && mArgs.containsKey(AppInfoBase.ARG_PACKAGE_NAME)
                 ? mArgs.getString(AppInfoBase.ARG_PACKAGE_NAME)
@@ -195,7 +197,7 @@
     }
 
     private void loadAppRow() {
-        mAppRow = mBackend.loadAppRow(mContext, mPm, mPkgInfo);
+        mAppRow = mBackend.loadAppRow(mContext, mPm, mRm, mPkgInfo);
     }
 
     private void loadChannelGroup() {
@@ -342,7 +344,7 @@
 
     protected boolean isChannelConfigurable(NotificationChannel channel) {
         if (channel != null && mAppRow != null) {
-            return !channel.getId().equals(mAppRow.lockedChannelId);
+            return !channel.isImportanceLockedByOEM();
         }
         return false;
     }
@@ -353,6 +355,14 @@
                 return true;
             }
 
+            if (channel.isImportanceLockedByCriticalDeviceFunction()) {
+                return false;
+            }
+
+            if (channel.isImportanceLockedByOEM()) {
+                return false;
+            }
+
             return channel.isBlockableSystem()
                     || channel.getImportance() == NotificationManager.IMPORTANCE_NONE;
         }
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSliceTest.java
index 60a6b42..335e99f 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSliceTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSliceTest.java
@@ -30,6 +30,7 @@
 
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
+import android.app.role.RoleManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -345,7 +346,7 @@
         doReturn(buildNotificationChannelGroups(channels)).when(mNotificationBackend).getGroups(
                 any(String.class), any(int.class));
         doReturn(appRow).when(mNotificationBackend).loadAppRow(any(Context.class),
-                any(PackageManager.class), any(PackageInfo.class));
+                any(PackageManager.class), any(RoleManager.class), any(PackageInfo.class));
         doReturn(channelCount).when(mNotificationBackend).getChannelCount(
                 any(String.class), any(int.class));
     }
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRowTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRowTest.java
index d722af6..c6222f1 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRowTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/NotificationMultiChannelAppRowTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
+import android.app.role.RoleManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -65,7 +66,7 @@
         mNotificationMultiChannelAppRow.call();
 
         verify(mNotificationBackend).loadAppRow(any(Context.class), any(PackageManager.class),
-                any(PackageInfo.class));
+                any(RoleManager.class), any(PackageInfo.class));
     }
 
     @Test
@@ -76,6 +77,6 @@
         mNotificationMultiChannelAppRow.call();
 
         verify(mNotificationBackend, never()).loadAppRow(any(Context.class),
-                any(PackageManager.class), any(PackageInfo.class));
+                any(PackageManager.class), any(RoleManager.class), any(PackageInfo.class));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java
index 9d27541..f747842 100644
--- a/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java
@@ -139,12 +139,11 @@
     }
 
     @Test
-    public void testUpdateState_notBlockable() {
-        String lockedId = "locked";
+    public void testUpdateState_notBlockable_oem() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.getId()).thenReturn("");
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         Preference pref = new RestrictedSwitchPreference(mContext);
diff --git a/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java
index 9ea201a..6de5565 100644
--- a/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java
@@ -188,11 +188,10 @@
 
     @Test
     public void testUpdateState_channelNotBlockable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.getId()).thenReturn("");
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         Preference pref = new RestrictedSwitchPreference(mContext);
@@ -204,7 +203,6 @@
     @Test
     public void testUpdateState_channel() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = "a";
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.canShowBadge()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
diff --git a/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java
index bdbf40a..41655fa 100644
--- a/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java
@@ -101,23 +101,23 @@
     }
 
     @Test
-    public void testIsAvailable_notIfChannelNotBlockable() {
+    public void testIsAvailable_channelNotBlockable() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = true;
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
         mController.onResume(appRow, channel, null, null);
-        assertFalse(mController.isAvailable());
+        assertTrue(mController.isAvailable());
     }
 
     @Test
-    public void testIsAvailable_notIfChannelNonDefault() {
+    public void testIsAvailable_channelNonDefault() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = true;
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
         mController.onResume(appRow, channel, null, null);
-        assertFalse(mController.isAvailable());
+        assertTrue(mController.isAvailable());
     }
 
     @Test
@@ -131,19 +131,19 @@
     }
 
     @Test
-    public void testIsAvailable_notIfGroupNotBlockable() {
+    public void testIsAvailable_GroupNotBlockable() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = true;
         mController.onResume(appRow, null, mock(NotificationChannelGroup.class), null);
-        assertFalse(mController.isAvailable());
+        assertTrue(mController.isAvailable());
     }
 
     @Test
-    public void testIsAvailable_notIfAppNotBlockable() {
+    public void testIsAvailable_AppNotBlockable() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = true;
         mController.onResume(appRow, null, null, null);
-        assertFalse(mController.isAvailable());
+        assertTrue(mController.isAvailable());
     }
 
     @Test
@@ -160,7 +160,6 @@
     public void testIsAvailable_nonSystemApp() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = false;
-        appRow.lockedChannelId = "not this";
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
         mController.onResume(appRow, channel, null, null);
@@ -168,6 +167,93 @@
     }
 
     @Test
+    public void testIsEnabled_lockedApp() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.lockedImportance = true;
+        appRow.systemApp = true;
+        mController.onResume(appRow, null, null, null);
+        mController.updateState(mPreference);
+        assertFalse(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_GroupNotBlockable() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        mController.onResume(appRow, null, mock(NotificationChannelGroup.class), null);
+        mController.updateState(mPreference);
+        assertFalse(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_systemAppNotBlockable() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        mController.onResume(appRow, null, null, null);
+        mController.updateState(mPreference);
+        assertFalse(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_systemAppBlockable() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_DEFAULT);
+        channel.setBlockableSystem(true);
+        mController.onResume(appRow, channel, null, null);
+        mController.updateState(mPreference);
+        assertTrue(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_lockedChannel() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        mController.updateState(mPreference);
+
+        assertFalse(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_defaultAppChannel() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        mController.updateState(mPreference);
+
+        assertFalse(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_channel() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        mController.updateState(mPreference);
+
+        assertTrue(mSwitch.isEnabled());
+    }
+
+    @Test
+    public void testIsEnabled_app() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        mController.onResume(appRow, null, null, null);
+
+        mController.updateState(mPreference);
+
+        assertTrue(mSwitch.isEnabled());
+    }
+
+    @Test
     public void testUpdateState_app() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.banned = true;
diff --git a/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java
index 0d0b485..ea66964 100644
--- a/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java
@@ -203,11 +203,9 @@
 
     @Test
     public void testUpdateState_channelNotBlockable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         Preference pref = new RestrictedSwitchPreference(mContext);
@@ -219,7 +217,6 @@
     @Test
     public void testUpdateState_channel() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = "a";
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.canBubble()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
diff --git a/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java
index 929c14d..f663630 100644
--- a/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java
@@ -111,11 +111,9 @@
 
     @Test
     public void testUpdateState_notBlockable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         Preference pref = new RestrictedSwitchPreference(RuntimeEnvironment.application);
diff --git a/tests/robotests/src/com/android/settings/notification/HighImportancePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/HighImportancePreferenceControllerTest.java
index 6e6dad4..a89a826 100644
--- a/tests/robotests/src/com/android/settings/notification/HighImportancePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/HighImportancePreferenceControllerTest.java
@@ -142,11 +142,9 @@
 
     @Test
     public void testUpdateState_notConfigurable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
         mController.onResume(appRow, channel, null, null);
 
@@ -157,6 +155,36 @@
     }
 
     @Test
+    public void testUpdateState_systemButConfigurable() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByOEM()).thenReturn(false);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        Preference pref = new RestrictedSwitchPreference(mContext, null);
+        mController.updateState(pref);
+
+        assertTrue(pref.isEnabled());
+    }
+
+    @Test
+    public void testUpdateState_defaultApp() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        Preference pref = new RestrictedSwitchPreference(mContext, null);
+        mController.updateState(pref);
+
+        assertTrue(pref.isEnabled());
+    }
+
+    @Test
     public void testUpdateState_high() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
diff --git a/tests/robotests/src/com/android/settings/notification/ImportancePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ImportancePreferenceControllerTest.java
index c9f62e9..999631e 100644
--- a/tests/robotests/src/com/android/settings/notification/ImportancePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ImportancePreferenceControllerTest.java
@@ -159,11 +159,9 @@
 
     @Test
     public void testUpdateState_notConfigurable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
         mController.onResume(appRow, channel, null, null);
 
@@ -174,6 +172,36 @@
     }
 
     @Test
+    public void testUpdateState_systemButConfigurable() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByOEM()).thenReturn(false);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        Preference pref = new ImportancePreference(mContext, null);
+        mController.updateState(pref);
+
+        assertTrue(pref.isEnabled());
+    }
+
+    @Test
+    public void testUpdateState_defaultApp() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH);
+        mController.onResume(appRow, channel, null, null);
+
+        Preference pref = new ImportancePreference(mContext, null);
+        mController.updateState(pref);
+
+        assertTrue(pref.isEnabled());
+    }
+
+    @Test
     public void testUpdateState() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_HIGH);
diff --git a/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java
index 3724ddb..ac9cdf1 100644
--- a/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java
@@ -159,11 +159,9 @@
 
     @Test
     public void testUpdateState_notBlockable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         Preference pref = new RestrictedSwitchPreference(mContext);
diff --git a/tests/robotests/src/com/android/settings/notification/MinImportancePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MinImportancePreferenceControllerTest.java
index 28058a4..b8ef7d1 100644
--- a/tests/robotests/src/com/android/settings/notification/MinImportancePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/MinImportancePreferenceControllerTest.java
@@ -142,11 +142,9 @@
 
     @Test
     public void testUpdateState_notConfigurable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         when(channel.getImportance()).thenReturn(IMPORTANCE_LOW);
         mController.onResume(appRow, channel, null, null);
 
@@ -157,6 +155,36 @@
     }
 
     @Test
+    public void testUpdateState_systemButConfigurable() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByOEM()).thenReturn(false);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_LOW);
+        mController.onResume(appRow, channel, null, null);
+
+        Preference pref = new RestrictedSwitchPreference(mContext, null);
+        mController.updateState(pref);
+
+        assertTrue(pref.isEnabled());
+    }
+
+    @Test
+    public void testUpdateState_defaultApp() {
+        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
+        appRow.systemApp = true;
+        NotificationChannel channel = mock(NotificationChannel.class);
+        when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
+        when(channel.getImportance()).thenReturn(IMPORTANCE_LOW);
+        mController.onResume(appRow, channel, null, null);
+
+        Preference pref = new RestrictedSwitchPreference(mContext, null);
+        mController.updateState(pref);
+
+        assertTrue(pref.isEnabled());
+    }
+
+    @Test
     public void testUpdateState_min() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_MIN);
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
index 2c2e379..cb50609 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
@@ -18,22 +18,28 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+import android.app.role.RoleManager;
 import android.app.usage.UsageEvents;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
 import android.os.Parcel;
 
 import com.android.settings.notification.NotificationBackend.AppRow;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
 public class NotificationBackendTest {
@@ -50,81 +56,40 @@
 
         // This package has a package lock but no locked channels
         assertTrue(appRow.lockedImportance);
-        assertNull(appRow.lockedChannelId);
     }
 
     @Test
-    public void testMarkAppRow_unblockableChannelOrPkg() {
-        String channelBlockName = "foo.bar.pkgWithChannel";
-        String pkgBlockName = "foo.bar.pkgBlock";
-        String[] nonBlockablePkgs = new String[2];
-        nonBlockablePkgs[0] = pkgBlockName;
-        nonBlockablePkgs[1] = channelBlockName + ":SpecificChannel";
+    public void testMarkAppRow_defaultPackage() {
+        PackageInfo pi = new PackageInfo();
+        pi.packageName = "test";
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.packageName = "test";
+        List<String> roles = new ArrayList<>();
+        roles.add(RoleManager.ROLE_DIALER);
+        RoleManager rm = mock(RoleManager.class);
+        when(rm.getHeldRolesFromController(anyString())).thenReturn(roles);
 
-        // This package has a channel level lock but no full package lock
-        AppRow channelBlockApp = new AppRow();
-        channelBlockApp.pkg = channelBlockName;
-        NotificationBackend.markAppRowWithBlockables(nonBlockablePkgs, channelBlockApp,
-                channelBlockName);
-        assertFalse(channelBlockApp.lockedImportance);
-        assertEquals("SpecificChannel", channelBlockApp.lockedChannelId);
+        AppRow appRow = new NotificationBackend().loadAppRow(RuntimeEnvironment.application,
+                mock(PackageManager.class), rm, pi);
 
-        // This other package has the reverse
-        AppRow pkgBlock = new AppRow();
-        pkgBlock.pkg = pkgBlockName;
-        NotificationBackend.markAppRowWithBlockables(nonBlockablePkgs, pkgBlock, pkgBlockName);
-        assertTrue(pkgBlock.lockedImportance);
-        assertNull(pkgBlock.lockedChannelId);
-
-        // This third package has no locks at all
-        AppRow otherAppRow = new AppRow();
-        otherAppRow.pkg ="foo.bar.nothingBlocked";
-        NotificationBackend.markAppRowWithBlockables(nonBlockablePkgs, otherAppRow,
-                "foo.bar.nothingBlocked");
-        assertFalse(otherAppRow.lockedImportance);
-        assertNull(otherAppRow.lockedChannelId);
+        assertTrue(appRow.systemApp);
     }
 
     @Test
-    public void testMarkAppRow_unblockableChannelAndPkg() {
-        AppRow appRow = new AppRow();
-        String packageName = "foo.bar.unblockable";
-        appRow.pkg = packageName;
-        String[] nonBlockablePkgs = new String[2];
-        nonBlockablePkgs[0] = "foo.bar.unblockable";
-        nonBlockablePkgs[1] = "foo.bar.unblockable:SpecificChannel";
-        NotificationBackend.markAppRowWithBlockables(nonBlockablePkgs, appRow, packageName);
+    public void testMarkAppRow_notDefaultPackage() {
+        PackageInfo pi = new PackageInfo();
+        pi.packageName = "test";
+        pi.applicationInfo = new ApplicationInfo();
+        pi.applicationInfo.packageName = "test";
+        List<String> roles = new ArrayList<>();
+        roles.add(RoleManager.ROLE_HOME);
+        RoleManager rm = mock(RoleManager.class);
+        when(rm.getHeldRolesFromController(anyString())).thenReturn(roles);
 
-        // This package has both a channel lock and a package lock
-        assertTrue(appRow.lockedImportance);
-        assertEquals("SpecificChannel", appRow.lockedChannelId);
-    }
+        AppRow appRow = new NotificationBackend().loadAppRow(RuntimeEnvironment.application,
+                mock(PackageManager.class), rm, pi);
 
-    @Test
-    public void testMarkAppRow_channelNameWithColons() {
-        AppRow appRow = new AppRow();
-        String packageName = "foo.bar.unblockable";
-        String channelName = "SpecificChannel:1234:abc:defg";
-        appRow.pkg = packageName;
-        String[] nonBlockablePkgs = new String[1];
-        nonBlockablePkgs[0] = packageName + ":" + channelName;
-        NotificationBackend.markAppRowWithBlockables(nonBlockablePkgs, appRow, packageName);
-
-        assertEquals(channelName, appRow.lockedChannelId);
-    }
-
-    @Test
-    public void testMarkAppRow_blocklistWithNullEntries() {
-        AppRow appRow = new AppRow();
-        String packageName = "foo.bar.unblockable";
-        appRow.pkg = packageName;
-        String[] nonBlockablePkgs = new String[6]; // extra long list with some entries left null
-        nonBlockablePkgs[2] = "foo.bar.unblockable";
-        nonBlockablePkgs[4] = "foo.bar.unblockable:SpecificChannel";
-        NotificationBackend.markAppRowWithBlockables(nonBlockablePkgs, appRow, packageName);
-
-        assertTrue(appRow.lockedImportance);
-        assertEquals("SpecificChannel", appRow.lockedChannelId);
+        assertFalse(appRow.systemApp);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
index a72597b..cde5b90 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java
@@ -203,36 +203,29 @@
     }
 
     @Test
-    public void testIsBlockable_channelLevelWhitelist() {
-        String sameId = "bananas";
+    public void testIsBlockable_oemWhitelist() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = sameId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(sameId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         when(channel.getImportance()).thenReturn(IMPORTANCE_LOW);
 
         mController.onResume(appRow, channel, null, null);
         assertFalse(mController.isChannelBlockable());
 
-        when(channel.getId()).thenReturn("something new");
+        when(channel.isImportanceLockedByOEM()).thenReturn(false);
         mController.onResume(appRow, channel, null, null);
         assertTrue(mController.isChannelBlockable());
     }
 
     @Test
-    public void testIsBlockable_appLevelWhitelist() {
+    public void testIsBlockable_defaultApp() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = "something";
-        appRow.lockedImportance = true;
         NotificationChannel channel = mock(NotificationChannel.class);
         when(channel.getImportance()).thenReturn(IMPORTANCE_LOW);
+        when(channel.isImportanceLockedByCriticalDeviceFunction()).thenReturn(true);
 
         mController.onResume(appRow, channel, null, null);
         assertFalse(mController.isChannelBlockable());
-
-        appRow.lockedImportance = false;
-        mController.onResume(appRow, mock(NotificationChannel.class), null, null);
-        assertTrue(mController.isChannelBlockable());
     }
 
     @Test
@@ -282,34 +275,6 @@
     }
 
     @Test
-    public void testIsChannelBlockable_notConfigurable() {
-        String sameId = "apples";
-        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.systemApp = false;
-        appRow.lockedChannelId = sameId;
-        NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(sameId);
-        when(channel.getImportance()).thenReturn(IMPORTANCE_DEFAULT);
-
-        mController.onResume(appRow, channel, null, null);
-        assertFalse(mController.isChannelBlockable());
-    }
-
-    @Test
-    public void testIsChannelBlockable_notConfigurableButBlocked() {
-        String sameId = "apples";
-        NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.systemApp = false;
-        appRow.lockedChannelId = sameId;
-        NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(sameId);
-        when(channel.getImportance()).thenReturn(IMPORTANCE_NONE);
-
-        mController.onResume(appRow, channel, null, null);
-        assertTrue(mController.isChannelBlockable());
-    }
-
-    @Test
     public void testIsChannelGroupBlockable_nonSystemBlockable() {
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
         appRow.systemApp = false;
diff --git a/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java
index 1d9836e..f09f63b 100644
--- a/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java
@@ -162,11 +162,9 @@
 
     @Test
     public void testUpdateState_notBlockable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         AttributeSet attributeSet = Robolectric.buildAttributeSet().build();
diff --git a/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java
index adc10f4..786b713 100644
--- a/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java
@@ -141,11 +141,9 @@
 
     @Test
     public void testUpdateState_notBlockable() {
-        String lockedId = "locked";
         NotificationBackend.AppRow appRow = new NotificationBackend.AppRow();
-        appRow.lockedChannelId = lockedId;
         NotificationChannel channel = mock(NotificationChannel.class);
-        when(channel.getId()).thenReturn(lockedId);
+        when(channel.isImportanceLockedByOEM()).thenReturn(true);
         mController.onResume(appRow, channel, null, null);
 
         Preference pref = new RestrictedSwitchPreference(RuntimeEnvironment.application);