diff --git a/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java b/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java index 6b1f46ca9b1..d088c0a4291 100644 --- a/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java +++ b/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceController.java @@ -109,7 +109,7 @@ public class ZenModeBypassingAppsPreferenceController extends AbstractZenModePre String pkg = entry.info.packageName; for (NotificationChannel channel : mNotificationBackend .getNotificationChannelsBypassingDnd(pkg, entry.info.uid).getList()) { - if (!TextUtils.isEmpty(channel.getConversationId())) { + if (!TextUtils.isEmpty(channel.getConversationId()) && !channel.isDemoted()) { // conversation channels that bypass dnd will be shown on the People page continue; } diff --git a/tests/robotests/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceControllerTest.java index a6efaaf883c..a9b82ebcba7 100644 --- a/tests/robotests/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/zen/ZenModeBypassingAppsPreferenceControllerTest.java @@ -135,7 +135,9 @@ public class ZenModeBypassingAppsPreferenceControllerTest { appEntries.add(entry2); List channelsBypassing = new ArrayList<>(); - channelsBypassing.add(mock(NotificationChannel.class)); + NotificationChannel mockChannel = mock(NotificationChannel.class); + when(mockChannel.getConversationId()).thenReturn(null); // not a conversation + channelsBypassing.add(mockChannel); when(mBackend.getNotificationChannelsBypassingDnd(entry1.info.packageName, entry1.info.uid)).thenReturn(new ParceledListSlice<>(channelsBypassing)); @@ -151,6 +153,73 @@ public class ZenModeBypassingAppsPreferenceControllerTest { assertThat(mController.getSummary().contains(entry2.label)).isTrue(); } + @Test + public void testUpdateBypassingApps_conversation() { + // GIVEN DND is off + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ZEN_MODE, + Settings.Global.ZEN_MODE_OFF); + + // mock app list + ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class); + entry.info = new ApplicationInfo(); + entry.info.packageName = "test"; + entry.label = "test"; + entry.info.uid = 0; + + List appEntries = new ArrayList<>(); + appEntries.add(entry); + + List channelsBypassing = new ArrayList<>(); + NotificationChannel conversation = mock(NotificationChannel.class); + when(conversation.getConversationId()).thenReturn("conversation!"); + channelsBypassing.add(conversation); + + when(mBackend.getNotificationChannelsBypassingDnd(entry.info.packageName, + entry.info.uid)).thenReturn(new ParceledListSlice<>(channelsBypassing)); + + // WHEN a single app is passed to the controller with a conversation notif channel + mController.updateAppsBypassingDndSummaryText(appEntries); + + // THEN the preference is enabled and the summary doesn't contain any apps because the + // only channel bypassing DND is a conversation (which will be showed on the + // conversations page instead of the apps page) + assertThat(mController.mPreference.isEnabled()).isTrue(); + assertThat(mController.getSummary().contains("No apps")).isTrue(); + } + + @Test + public void testUpdateBypassingApps_demotedConversation() { + // GIVEN DND is off + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ZEN_MODE, + Settings.Global.ZEN_MODE_OFF); + + // mock app list + ApplicationsState.AppEntry entry = mock(ApplicationsState.AppEntry.class); + entry.info = new ApplicationInfo(); + entry.info.packageName = "test"; + entry.label = "test"; + entry.info.uid = 0; + + List appEntries = new ArrayList<>(); + appEntries.add(entry); + + List channelsBypassing = new ArrayList<>(); + NotificationChannel demotedConversation = mock(NotificationChannel.class); + when(demotedConversation.getConversationId()).thenReturn("conversationId"); + when(demotedConversation.isDemoted()).thenReturn(true); + channelsBypassing.add(demotedConversation); + + when(mBackend.getNotificationChannelsBypassingDnd(entry.info.packageName, + entry.info.uid)).thenReturn(new ParceledListSlice<>(channelsBypassing)); + + // WHEN a single app is passed to the controller with a demoted conversation notif channel + mController.updateAppsBypassingDndSummaryText(appEntries); + + // THEN the preference is enabled and the summary contains the app name from the list + assertThat(mController.mPreference.isEnabled()).isTrue(); + assertThat(mController.getSummary().contains(entry.label)).isTrue(); + } + @Test public void testUpdateAppsBypassingDnd_nullAppsList() { // GIVEN DND is off