From ef2c91c9a30a275a041ef7fe19091818fa9fe398 Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 30 Mar 2020 13:21:43 -0400 Subject: [PATCH] Don't filter demoted conversation from app subtext If the notification channel is a demoted converation, we still want to include it as a notification channel that can bypass DND under the "apps" preference for DND. Test: manual, make RunSettingsRoboTests7 Fixes: 152765113 Change-Id: Ief072b19280b0dc6e6c37d2d46d51f045d42bb4e --- ...ModeBypassingAppsPreferenceController.java | 2 +- ...BypassingAppsPreferenceControllerTest.java | 71 ++++++++++++++++++- 2 files changed, 71 insertions(+), 2 deletions(-) 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