Adds group to DND settings if channel names same
Adds the channel group name as a summary to the DND channel Preference if two
or more channels have identical names in the DND Menu. This allows users to
disambiguate between the channels.
Bug: 294333850
Test: Unit test updated, run with $make -j RunSettingsRoboTests ROBOTEST_FILTER=AppChannelsBypassingDndPreferenceControllerTest
Change-Id: I4eaf48e5b2ea6513098fde79c3f81d18c6f4bb3d
diff --git a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java
index 2830024..200a47b 100644
--- a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java
+++ b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java
@@ -39,13 +39,18 @@
import com.android.settings.applications.AppInfoBase;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.flags.Flags;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.RestrictedSwitchPreference;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* Populates the PreferenceCategory with notification channels associated with the given app.
@@ -61,6 +66,9 @@
private RestrictedSwitchPreference mAllNotificationsToggle;
private PreferenceCategory mPreferenceCategory;
private List<NotificationChannel> mChannels = new ArrayList<>();
+ private Set<String> mDuplicateChannelNames = new HashSet<>();
+ private Map<NotificationChannel, String> mChannelGroupNames =
+ new HashMap<NotificationChannel, String>();
public AppChannelsBypassingDndPreferenceController(
Context context,
@@ -135,10 +143,20 @@
List<NotificationChannel> newChannelList = new ArrayList<>();
List<NotificationChannelGroup> mChannelGroupList = mBackend.getGroups(mAppRow.pkg,
mAppRow.uid).getList();
+ Set<String> allChannelNames = new HashSet<>();
for (NotificationChannelGroup channelGroup : mChannelGroupList) {
for (NotificationChannel channel : channelGroup.getChannels()) {
if (!isConversation(channel)) {
newChannelList.add(channel);
+ if (Flags.dedupeDndSettingsChannels()) {
+ mChannelGroupNames.put(channel, channelGroup.getName().toString());
+ // Check if channel name is unique on this page; if not, save it.
+ if (allChannelNames.contains(channel.getName())) {
+ mDuplicateChannelNames.add(channel.getName().toString());
+ } else {
+ allChannelNames.add(channel.getName().toString());
+ }
+ }
}
}
}
@@ -172,6 +190,17 @@
&& isChannelConfigurable(channel)
&& showNotification(channel));
channelPreference.setTitle(BidiFormatter.getInstance().unicodeWrap(channel.getName()));
+ if (Flags.dedupeDndSettingsChannels()) {
+ // If the channel shares its name with another channel, set group name as summary
+ // to disambiguate in the list.
+ if (mDuplicateChannelNames.contains(channel.getName().toString())
+ && mChannelGroupNames.containsKey(channel)
+ && mChannelGroupNames.get(channel) != null
+ && !mChannelGroupNames.get(channel).isEmpty()) {
+ channelPreference.setSummary(BidiFormatter.getInstance().unicodeWrap(
+ mChannelGroupNames.get(channel)));
+ }
+ }
channelPreference.setChecked(showNotificationInDnd(channel));
channelPreference.setOnPreferenceChangeListener(
new Preference.OnPreferenceChangeListener() {
diff --git a/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java
index 13528b4..053b352 100644
--- a/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceControllerTest.java
@@ -26,16 +26,19 @@
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.ParceledListSlice;
+import android.platform.test.flag.junit.SetFlagsRule;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.flags.Flags;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.PrimarySwitchPreference;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -51,6 +54,9 @@
@LooperMode(LooperMode.Mode.LEGACY)
public class AppChannelsBypassingDndPreferenceControllerTest {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
@Mock
private NotificationBackend mBackend;
@@ -150,4 +156,44 @@
}
return new ParceledListSlice<>(Collections.singletonList(group));
}
+
+ @Test
+ public void displayPreference_duplicateChannelName_AddsGroupNameAsSummary() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_DEDUPE_DND_SETTINGS_CHANNELS);
+ NotificationChannelGroup group1 = new NotificationChannelGroup("group1_id", "Group1");
+ NotificationChannelGroup group2 = new NotificationChannelGroup("group2_id", "Group2");
+
+ group1.addChannel(new NotificationChannel("mail_group1_id", "Mail",
+ NotificationManager.IMPORTANCE_DEFAULT));
+ group1.addChannel(new NotificationChannel("other_group1_id", "Other",
+ NotificationManager.IMPORTANCE_DEFAULT));
+
+ group2.addChannel(new NotificationChannel("music_group2_id", "Music",
+ NotificationManager.IMPORTANCE_DEFAULT));
+ // This channel has the same name as a channel in group1.
+ group2.addChannel(new NotificationChannel("mail_group2_id", "Mail",
+ NotificationManager.IMPORTANCE_DEFAULT));
+
+ ParceledListSlice<NotificationChannelGroup> groups = new ParceledListSlice<>(
+ new ArrayList<NotificationChannelGroup>() {
+ {
+ add(group1);
+ add(group2);
+ }
+ }
+ );
+
+ when(mBackend.getGroups(eq(mAppRow.pkg), eq(mAppRow.uid))).thenReturn(groups);
+ mController.displayPreference(mPreferenceScreen);
+ ShadowApplication.runBackgroundTasks();
+ // Check that we've added the group name as a summary to channels that have identical names.
+ // Channels are also alphabetized.
+ assertThat(mCategory.getPreference(1).getTitle().toString()).isEqualTo("Mail");
+ assertThat(mCategory.getPreference(1).getSummary().toString()).isEqualTo("Group1");
+ assertThat(mCategory.getPreference(2).getTitle().toString()).isEqualTo("Mail");
+ assertThat(mCategory.getPreference(2).getSummary().toString()).isEqualTo("Group2");
+ assertThat(mCategory.getPreference(3).getTitle().toString()).isEqualTo("Music");
+ assertThat(mCategory.getPreference(4).getTitle().toString()).isEqualTo("Other");
+
+ }
}