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);