diff --git a/res/values/strings.xml b/res/values/strings.xml
index 28e1f05d584..a0fa1708b65 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9177,6 +9177,8 @@
Conversations
All conversations
+
+ all conversations
Priority conversations
priority conversations
diff --git a/src/com/android/settings/notification/modes/ZenHelperBackend.java b/src/com/android/settings/notification/modes/ZenHelperBackend.java
index a2c3578af07..bf9167873cd 100644
--- a/src/com/android/settings/notification/modes/ZenHelperBackend.java
+++ b/src/com/android/settings/notification/modes/ZenHelperBackend.java
@@ -81,12 +81,20 @@ class ZenHelperBackend {
}
}
- @SuppressWarnings("unchecked")
+ ImmutableList getAllConversations() {
+ return getConversations(false);
+ }
+
ImmutableList getImportantConversations() {
+ return getConversations(true);
+ }
+
+ @SuppressWarnings("unchecked")
+ private ImmutableList getConversations(boolean onlyImportant) {
try {
ImmutableList.Builder list = new ImmutableList.Builder<>();
ParceledListSlice parceledList = mInm.getConversations(
- /* onlyImportant= */ true);
+ onlyImportant);
if (parceledList != null) {
for (ConversationChannelWrapper conversation : parceledList.getList()) {
if (!conversation.getNotificationChannel().isDemoted()) {
diff --git a/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceController.java b/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceController.java
index 0d3a7219099..4610c35ca82 100644
--- a/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceController.java
@@ -189,8 +189,7 @@ class ZenModePeopleLinkPreferenceController extends AbstractZenModePreferenceCon
: CONVERSATION_SENDERS_NONE;
ImmutableList conversationsAllowed = ImmutableList.of();
if (conversationSendersAllowed == CONVERSATION_SENDERS_ANYONE) {
- // TODO: b/354658240 - Need to handle CONVERSATION_SENDERS_ANYONE?
- return;
+ conversationsAllowed = mHelperBackend.getAllConversations();
} else if (conversationSendersAllowed == CONVERSATION_SENDERS_IMPORTANT) {
conversationsAllowed = mHelperBackend.getImportantConversations();
}
@@ -223,7 +222,7 @@ class ZenModePeopleLinkPreferenceController extends AbstractZenModePreferenceCon
peopleItem.conversation.getShortcutInfo(),
peopleItem.conversation.getPkg(),
peopleItem.conversation.getUid(),
- /* important= */ true);
+ peopleItem.conversation.getNotificationChannel().isImportantConversation());
} else {
throw new IllegalArgumentException("Neither all nor contact nor conversation!");
}
diff --git a/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java b/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java
index 32c6a9881f0..ab5e2d9e56b 100644
--- a/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java
@@ -26,6 +26,8 @@ import static android.service.notification.ZenPolicy.PEOPLE_TYPE_NONE;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_STARRED;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_UNSET;
+import static com.google.common.base.Preconditions.checkNotNull;
+
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
@@ -36,7 +38,6 @@ import android.service.notification.ZenPolicy;
import android.view.View;
import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
@@ -48,11 +49,13 @@ import com.android.settingslib.notification.modes.ZenMode;
import com.android.settingslib.notification.modes.ZenModesBackend;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
-import java.util.ArrayList;
+import com.google.common.collect.ImmutableSet;
+
import java.util.HashMap;
-import java.util.List;
+import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
/**
* Common preference controller functionality for zen mode priority senders preferences for both
@@ -69,9 +72,11 @@ class ZenModePrioritySendersPreferenceController
static final String KEY_ANY = "senders_anyone";
static final String KEY_CONTACTS = "senders_contacts";
static final String KEY_STARRED = "senders_starred_contacts";
- static final String KEY_IMPORTANT = "conversations_important";
+ static final String KEY_IMPORTANT_CONVERSATIONS = "conversations_important";
+ static final String KEY_ANY_CONVERSATIONS = "conversations_any";
static final String KEY_NONE = "senders_none";
+ private int mNumAllConversations = 0;
private int mNumImportantConversations = 0;
private static final Intent ALL_CONTACTS_INTENT =
@@ -86,7 +91,8 @@ class ZenModePrioritySendersPreferenceController
private final ZenHelperBackend mHelperBackend;
private final PackageManager mPackageManager;
private PreferenceCategory mPreferenceCategory;
- private List mSelectorPreferences = new ArrayList<>();
+ private final LinkedHashMap mOptions =
+ new LinkedHashMap<>();
private final ZenModeSummaryHelper mZenModeSummaryHelper;
@@ -110,53 +116,92 @@ class ZenModePrioritySendersPreferenceController
@Override
public void displayPreference(PreferenceScreen screen) {
- mPreferenceCategory = screen.findPreference(getPreferenceKey());
+ mPreferenceCategory = checkNotNull(screen.findPreference(getPreferenceKey()));
if (mPreferenceCategory.getPreferenceCount() == 0) {
makeSelectorPreference(KEY_STARRED,
- com.android.settings.R.string.zen_mode_from_starred, mIsMessages);
+ com.android.settings.R.string.zen_mode_from_starred, mIsMessages, true);
makeSelectorPreference(KEY_CONTACTS,
- com.android.settings.R.string.zen_mode_from_contacts, mIsMessages);
+ com.android.settings.R.string.zen_mode_from_contacts, mIsMessages, true);
if (mIsMessages) {
- makeSelectorPreference(KEY_IMPORTANT,
- com.android.settings.R.string.zen_mode_from_important_conversations, true);
+ // "Any conversations" will only be available as option if it is the current value.
+ // Because it's confusing and we don't want users setting it up that way, but apps
+ // could create such ZenPolicies and we must show that.
+ makeSelectorPreference(KEY_ANY_CONVERSATIONS,
+ com.android.settings.R.string.zen_mode_from_all_conversations, true,
+ /* isVisibleByDefault= */ false);
+ makeSelectorPreference(KEY_IMPORTANT_CONVERSATIONS,
+ com.android.settings.R.string.zen_mode_from_important_conversations, true,
+ true);
}
makeSelectorPreference(KEY_ANY,
- com.android.settings.R.string.zen_mode_from_anyone, mIsMessages);
+ com.android.settings.R.string.zen_mode_from_anyone, mIsMessages, true);
makeSelectorPreference(KEY_NONE,
- com.android.settings.R.string.zen_mode_none_messages, mIsMessages);
+ com.android.settings.R.string.zen_mode_none_messages, mIsMessages, true);
}
super.displayPreference(screen);
}
@Override
public void updateState(Preference preference, @NonNull ZenMode zenMode) {
+ final int contacts = getPrioritySenders(zenMode.getPolicy());
+ final int conversations = getPriorityConversationSenders(zenMode.getPolicy());
+
if (mIsMessages) {
updateChannelCounts();
- }
- final int currContactsSetting = getPrioritySenders(zenMode.getPolicy());
- final int currConversationsSetting = getPriorityConversationSenders(zenMode.getPolicy());
- for (SelectorWithWidgetPreference pref : mSelectorPreferences) {
- // for each preference, check whether the current state matches what this state
- // would look like if the button were checked.
- final int[] checkedState = keyToSettingEndState(pref.getKey(), true);
- final int checkedContactsSetting = checkedState[0];
- final int checkedConversationsSetting = checkedState[1];
- boolean match = checkedContactsSetting == currContactsSetting;
- if (mIsMessages && checkedConversationsSetting != CONVERSATION_SENDERS_UNSET) {
- // "CONVERSATION_SENDERS_UNSET" in checkedContactsSetting means this preference
- // doesn't govern the priority senders setting, so the full match happens when
- // either the priority senders setting matches or if it's CONVERSATION_SENDERS_UNSET
- // so only the conversation setting needs to match.
- match = (match || checkedContactsSetting == PEOPLE_TYPE_UNSET)
- && (checkedConversationsSetting == currConversationsSetting);
+ if (contacts == PEOPLE_TYPE_ANYONE) {
+ setSelectedOption(KEY_ANY);
+ } else if (contacts == PEOPLE_TYPE_NONE && conversations == CONVERSATION_SENDERS_NONE) {
+ setSelectedOption(KEY_NONE);
+ } else {
+ ImmutableSet.Builder selectedOptions = new ImmutableSet.Builder<>();
+ if (contacts == PEOPLE_TYPE_STARRED) {
+ selectedOptions.add(KEY_STARRED);
+ } else if (contacts == PEOPLE_TYPE_CONTACTS) {
+ selectedOptions.add(KEY_CONTACTS);
+ }
+ if (conversations == CONVERSATION_SENDERS_IMPORTANT) {
+ selectedOptions.add(KEY_IMPORTANT_CONVERSATIONS);
+ } else if (conversations == CONVERSATION_SENDERS_ANYONE) {
+ selectedOptions.add(KEY_ANY_CONVERSATIONS);
+ }
+ setSelectedOptions(selectedOptions.build());
+ }
+ } else {
+ // Calls is easy!
+ switch (contacts) {
+ case PEOPLE_TYPE_ANYONE -> setSelectedOption(KEY_ANY);
+ case PEOPLE_TYPE_CONTACTS -> setSelectedOption(KEY_CONTACTS);
+ case PEOPLE_TYPE_STARRED -> setSelectedOption(KEY_STARRED);
+ case PEOPLE_TYPE_NONE -> setSelectedOption(KEY_NONE);
+ default -> throw new IllegalArgumentException("Unexpected PeopleType: " + contacts);
}
-
- pref.setChecked(match);
}
+
updateSummaries();
}
+ private void setSelectedOption(String key) {
+ setSelectedOptions(ImmutableSet.of(key));
+ }
+
+ private void setSelectedOptions(Set keys) {
+ if (keys.isEmpty()) {
+ throw new IllegalArgumentException("At least one option should be selected!");
+ }
+
+ for (SelectorWithWidgetPreference optionPreference : mOptions.values()) {
+ optionPreference.setChecked(keys.contains(optionPreference.getKey()));
+ if (optionPreference.isChecked()) {
+ // Ensure selected options are visible. This is to support "Any conversations"
+ // which is only shown if the policy has Conversations=Anyone (and doesn't have
+ // messages=Anyone), and then remains visible until the user exits the page
+ // (so that toggling back and forth is possible without the option disappearing).
+ optionPreference.setVisible(true);
+ }
+ }
+ }
+
public void onResume() {
if (mIsMessages) {
updateChannelCounts();
@@ -165,6 +210,7 @@ class ZenModePrioritySendersPreferenceController
}
private void updateChannelCounts() {
+ mNumAllConversations = mHelperBackend.getAllConversations().size();
mNumImportantConversations = mHelperBackend.getImportantConversations().size();
}
@@ -183,13 +229,14 @@ class ZenModePrioritySendersPreferenceController
return CONVERSATION_SENDERS_UNSET;
}
- private SelectorWithWidgetPreference makeSelectorPreference(String key, int titleId,
- boolean isCheckbox) {
+ private void makeSelectorPreference(String key, int titleId,
+ boolean isCheckbox, boolean isVisibleByDefault) {
final SelectorWithWidgetPreference pref =
new SelectorWithWidgetPreference(mPreferenceCategory.getContext(), isCheckbox);
pref.setKey(key);
pref.setTitle(titleId);
pref.setOnClickListener(mSelectorClickListener);
+ pref.setVisible(isVisibleByDefault);
View.OnClickListener widgetClickListener = getWidgetClickListener(key);
if (widgetClickListener != null) {
@@ -197,12 +244,12 @@ class ZenModePrioritySendersPreferenceController
}
mPreferenceCategory.addPreference(pref);
- mSelectorPreferences.add(pref);
- return pref;
+ mOptions.put(key, pref);
}
private View.OnClickListener getWidgetClickListener(String key) {
- if (!KEY_CONTACTS.equals(key) && !KEY_STARRED.equals(key) && !KEY_IMPORTANT.equals(key)) {
+ if (!KEY_CONTACTS.equals(key) && !KEY_STARRED.equals(key)
+ && !KEY_ANY_CONVERSATIONS.equals(key) && !KEY_IMPORTANT_CONVERSATIONS.equals(key)) {
return null;
}
@@ -221,7 +268,8 @@ class ZenModePrioritySendersPreferenceController
} else if (KEY_CONTACTS.equals(key)
&& ALL_CONTACTS_INTENT.resolveActivity(mPackageManager) != null) {
mContext.startActivity(ALL_CONTACTS_INTENT);
- } else if (KEY_IMPORTANT.equals(key)) {
+ } else if (KEY_ANY_CONVERSATIONS.equals(key)
+ || KEY_IMPORTANT_CONVERSATIONS.equals(key)) {
// TODO: b/332937635 - set correct metrics category
new SubSettingLauncher(mContext)
.setDestination(ConversationListSettings.class.getName())
@@ -244,7 +292,7 @@ class ZenModePrioritySendersPreferenceController
}
void updateSummaries() {
- for (SelectorWithWidgetPreference pref : mSelectorPreferences) {
+ for (SelectorWithWidgetPreference pref : mOptions.values()) {
pref.setSummary(getSummary(pref.getKey()));
}
}
@@ -255,7 +303,7 @@ class ZenModePrioritySendersPreferenceController
// Returns an integer array with 2 entries. The first entry is the setting for priority senders
// and the second entry is for priority conversation senders; if isMessages is false, then
// no changes will ever be prescribed for conversation senders.
- int[] keyToSettingEndState(String key, boolean checked) {
+ private int[] keyToSettingEndState(String key, boolean checked) {
int[] endState = new int[]{ PEOPLE_TYPE_UNSET, CONVERSATION_SENDERS_UNSET };
if (!checked) {
// Unchecking any priority-senders-based state should reset the state to NONE.
@@ -268,11 +316,12 @@ class ZenModePrioritySendersPreferenceController
endState[0] = PEOPLE_TYPE_NONE;
}
- // For messages, unchecking "priority conversations" and "any" should reset conversation
- // state to "NONE" as well.
+ // For messages, unchecking "priority/any conversations" and "any" should reset
+ // conversation state to "NONE" as well.
if (mIsMessages) {
switch (key) {
- case KEY_IMPORTANT:
+ case KEY_IMPORTANT_CONVERSATIONS:
+ case KEY_ANY_CONVERSATIONS:
case KEY_ANY:
case KEY_NONE:
endState[1] = CONVERSATION_SENDERS_NONE;
@@ -297,9 +346,10 @@ class ZenModePrioritySendersPreferenceController
// In the messages case *only*, also handle changing of conversation settings.
if (mIsMessages) {
switch (key) {
- case KEY_IMPORTANT:
+ case KEY_IMPORTANT_CONVERSATIONS:
endState[1] = CONVERSATION_SENDERS_IMPORTANT;
break;
+ case KEY_ANY_CONVERSATIONS:
case KEY_ANY:
endState[1] = CONVERSATION_SENDERS_ANYONE;
break;
@@ -335,7 +385,7 @@ class ZenModePrioritySendersPreferenceController
// the contacts setting is additionally reset to "none".
// - if "anyone" is previously selected, and the user clicks one of the contacts values,
// then the conversations setting is additionally reset to "none".
- int[] settingsToSaveOnClick(String key, boolean checked,
+ private int[] settingsToSaveOnClick(String key, boolean checked,
int currSendersSetting, int currConvosSetting) {
int[] savedSettings = new int[]{ PEOPLE_TYPE_UNSET, CONVERSATION_SENDERS_UNSET };
@@ -360,15 +410,18 @@ class ZenModePrioritySendersPreferenceController
// Special-case handling for the "priority conversations" checkbox:
// If a specific selection exists for priority senders (starred, contacts), we leave
// it untouched. Otherwise (when the senders is set to "any"), set it to NONE.
- if (key.equals(KEY_IMPORTANT)
+ if ((key.equals(KEY_IMPORTANT_CONVERSATIONS) || key.equals(KEY_ANY_CONVERSATIONS))
&& currSendersSetting == PEOPLE_TYPE_ANYONE) {
savedSettings[0] = PEOPLE_TYPE_NONE;
}
- // Flip-side special case for clicking either "contacts" option: if a specific selection
- // exists for priority conversations, leave it untouched; otherwise, set to none.
+ // The flip-side case for the "contacts" option is slightly different -- we only
+ // reset conversations if leaving PEOPLE_ANY by selecting a contact option, but not
+ // if switching contact options. That's because starting from Anyone, checking Contacts,
+ // and then "important conversations" also shown checked because it was there (albeit
+ // subsumed into PEOPLE_ANY) would be weird.
if ((key.equals(KEY_STARRED) || key.equals(KEY_CONTACTS))
- && currConvosSetting == CONVERSATION_SENDERS_ANYONE) {
+ && currSendersSetting == PEOPLE_TYPE_ANYONE) {
savedSettings[1] = CONVERSATION_SENDERS_NONE;
}
}
@@ -382,8 +435,10 @@ class ZenModePrioritySendersPreferenceController
return mZenModeSummaryHelper.getStarredContactsSummary();
case KEY_CONTACTS:
return mZenModeSummaryHelper.getContactsNumberSummary();
- case KEY_IMPORTANT:
- return getConversationSummary();
+ case KEY_ANY_CONVERSATIONS:
+ return getConversationSummary(mNumAllConversations);
+ case KEY_IMPORTANT_CONVERSATIONS:
+ return getConversationSummary(mNumImportantConversations);
case KEY_ANY:
return mContext.getResources().getString(mIsMessages
? R.string.zen_mode_all_messages_summary
@@ -394,9 +449,7 @@ class ZenModePrioritySendersPreferenceController
}
}
- private String getConversationSummary() {
- final int numConversations = mNumImportantConversations;
-
+ private String getConversationSummary(int numConversations) {
if (numConversations == CONVERSATION_SENDERS_UNSET) {
return null;
} else {
@@ -409,8 +462,7 @@ class ZenModePrioritySendersPreferenceController
}
}
- @VisibleForTesting
- SelectorWithWidgetPreference.OnClickListener mSelectorClickListener =
+ private final SelectorWithWidgetPreference.OnClickListener mSelectorClickListener =
new SelectorWithWidgetPreference.OnClickListener() {
@Override
public void onRadioButtonClicked(SelectorWithWidgetPreference preference) {
diff --git a/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java b/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java
index 1acef20ac6c..7a16d91d743 100644
--- a/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java
+++ b/src/com/android/settings/notification/modes/ZenModeSummaryHelper.java
@@ -140,6 +140,14 @@ class ZenModeSummaryHelper {
}
String getMessagesSettingSummary(ZenPolicy policy) {
+ if (policy.getPriorityCategoryMessages() == STATE_ALLOW
+ && policy.getPriorityMessageSenders() == PEOPLE_TYPE_ANYONE) {
+ // Messages=anyone means anyone. Even if conversation senders is specially configured,
+ // saying "Anyone and priority conversations" 1) makes no sense and 2) is incorrect
+ // because conversations WILL get through by virtue of also being messages.
+ return mContext.getString(R.string.zen_mode_from_anyone);
+ }
+
List enabledCategories = getEnabledCategories(policy,
category -> PRIORITY_CATEGORY_MESSAGES == category
|| PRIORITY_CATEGORY_CONVERSATIONS == category, true);
@@ -278,10 +286,11 @@ class ZenModeSummaryHelper {
continue;
}
- // For conversations, only the "priority conversations" setting is relevant; any
- // other setting is subsumed by the messages-specific messaging.
+ // For conversations, only the "all/priority conversations" settings are relevant;
+ // any other setting is subsumed by the messages-specific messaging.
if (category == PRIORITY_CATEGORY_CONVERSATIONS
&& policy.isCategoryAllowed(PRIORITY_CATEGORY_CONVERSATIONS, false)
+ && policy.getPriorityConversationSenders() != CONVERSATION_SENDERS_ANYONE
&& policy.getPriorityConversationSenders()
!= CONVERSATION_SENDERS_IMPORTANT) {
continue;
@@ -320,13 +329,20 @@ class ZenModeSummaryHelper {
} else {
return mContext.getString(R.string.zen_mode_from_starred);
}
- } else if (category == PRIORITY_CATEGORY_CONVERSATIONS
- && policy.getPriorityConversationSenders() == CONVERSATION_SENDERS_IMPORTANT) {
- if (isFirst) {
- return mContext.getString(R.string.zen_mode_from_important_conversations);
- } else {
- return mContext.getString(
- R.string.zen_mode_from_important_conversations_second);
+ } else if (category == PRIORITY_CATEGORY_CONVERSATIONS) {
+ if (policy.getPriorityConversationSenders() == CONVERSATION_SENDERS_IMPORTANT) {
+ if (isFirst) {
+ return mContext.getString(R.string.zen_mode_from_important_conversations);
+ } else {
+ return mContext.getString(
+ R.string.zen_mode_from_important_conversations_second);
+ }
+ } else if (policy.getPriorityConversationSenders() == CONVERSATION_SENDERS_ANYONE) {
+ if (isFirst) {
+ return mContext.getString(R.string.zen_mode_from_all_conversations);
+ } else {
+ return mContext.getString(R.string.zen_mode_from_all_conversations_second);
+ }
}
} else if (category == PRIORITY_CATEGORY_EVENTS) {
if (isFirst) {
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java
index 64de1418ad6..eb570947d88 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java
@@ -19,21 +19,23 @@ package com.android.settings.notification.modes;
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_ANYONE;
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_IMPORTANT;
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_NONE;
-import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_UNSET;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_ANYONE;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_CONTACTS;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_NONE;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_STARRED;
-import static android.service.notification.ZenPolicy.PEOPLE_TYPE_UNSET;
-import static android.service.notification.ZenPolicy.STATE_UNSET;
+import static android.service.notification.ZenPolicy.conversationTypeToString;
+import static android.service.notification.ZenPolicy.peopleTypeToString;
import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_ANY;
+import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_ANY_CONVERSATIONS;
import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_CONTACTS;
-import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_IMPORTANT;
+import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_IMPORTANT_CONVERSATIONS;
import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_NONE;
import static com.android.settings.notification.modes.ZenModePrioritySendersPreferenceController.KEY_STARRED;
+import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -43,11 +45,14 @@ import android.content.Context;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.service.notification.ZenPolicy;
+import android.service.notification.ZenPolicy.ConversationSenders;
+import android.service.notification.ZenPolicy.PeopleType;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
+import androidx.preference.TwoStatePreference;
import com.android.settingslib.notification.modes.TestModeBuilder;
import com.android.settingslib.notification.modes.ZenMode;
@@ -66,6 +71,9 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
@RunWith(RobolectricTestRunner.class)
@EnableFlags(Flags.FLAG_MODES_UI)
public final class ZenModePrioritySendersPreferenceControllerTest {
@@ -109,24 +117,30 @@ public final class ZenModePrioritySendersPreferenceControllerTest {
when(mHelperBackend.getAllContacts()).thenReturn(
ImmutableList.of(new ZenHelperBackend.Contact(1, "The only contact", null)));
when(mHelperBackend.getAllContactsCount()).thenReturn(1);
+
when(mHelperBackend.getImportantConversations()).thenReturn(ImmutableList.of());
+ when(mHelperBackend.getAllConversations()).thenReturn(ImmutableList.of());
}
@Test
public void testDisplayPreferences_makeMessagesPrefs() {
mMessagesController.displayPreference(mPreferenceScreen);
- // Starred contacts, Contacts, Priority Conversations, Any, None
- assertThat(mMessagesPrefCategory.getPreferenceCount()).isEqualTo(5);
+ // "Any Conversations" is invisible by default.
+ assertThat(getAllOptions(mMessagesPrefCategory)).containsExactly(KEY_STARRED, KEY_CONTACTS,
+ KEY_ANY_CONVERSATIONS, KEY_IMPORTANT_CONVERSATIONS, KEY_ANY, KEY_NONE).inOrder();
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(KEY_STARRED,
+ KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_ANY, KEY_NONE).inOrder();
}
@Test
public void testDisplayPreferences_makeCallsPrefs() {
mCallsController.displayPreference(mPreferenceScreen);
- assertThat(mCallsPrefCategory.getPreferenceCount()).isEqualTo(4);
- assertThat((Comparable>) mCallsPrefCategory.findPreference(KEY_IMPORTANT)).isNull();
-
+ assertThat(getAllOptions(mCallsPrefCategory)).containsExactly(KEY_STARRED, KEY_CONTACTS,
+ KEY_ANY, KEY_NONE).inOrder();
+ assertThat(getVisibleOptions(mCallsPrefCategory)).containsExactly(KEY_STARRED, KEY_CONTACTS,
+ KEY_ANY, KEY_NONE).inOrder();
}
@Test
@@ -143,287 +157,1198 @@ public final class ZenModePrioritySendersPreferenceControllerTest {
}
@Test
- public void testKeyToSettingEndState_messagesCheck() {
- int[] endState;
+ public void updateState_callsAny() {
+ ZenMode zenMode = newModeWithPolicy(p -> p.allowCalls(PEOPLE_TYPE_ANYONE));
+ mCallsController.displayPreference(mPreferenceScreen);
- // For KEY_NONE everything should be none.
- endState = mMessagesController.keyToSettingEndState(KEY_NONE, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
+ mCallsController.updateZenMode(mCallsPrefCategory, zenMode);
- // For KEY_ANY everything should be allowed.
- endState = mMessagesController.keyToSettingEndState(KEY_ANY, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_ANYONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_ANYONE);
-
- // For [starred] contacts, we should set the priority senders, but not the conversations
- endState = mMessagesController.keyToSettingEndState(KEY_STARRED, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_STARRED);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mMessagesController.keyToSettingEndState(KEY_CONTACTS, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_CONTACTS);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For priority conversations, we should set the conversations but not priority senders
- endState = mMessagesController.keyToSettingEndState(KEY_IMPORTANT, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_UNSET);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_IMPORTANT);
+ assertThat(getCheckedOptions(mCallsPrefCategory)).containsExactly(KEY_ANY);
}
@Test
- public void testKeyToSettingEndState_messagesUncheck() {
- int[] endState;
+ public void updateState_callsContacts() {
+ ZenMode zenMode = newModeWithPolicy(p -> p.allowCalls(PEOPLE_TYPE_CONTACTS));
+ mCallsController.displayPreference(mPreferenceScreen);
- // For KEY_NONE, "unchecking" still means "none".
- endState = mMessagesController.keyToSettingEndState(KEY_NONE, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
+ mCallsController.updateZenMode(mCallsPrefCategory, zenMode);
- // For KEY_ANY unchecking resets the state to "none".
- endState = mMessagesController.keyToSettingEndState(KEY_ANY, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
-
- // For [starred] contacts, we should unset the priority senders, but not the conversations
- endState = mMessagesController.keyToSettingEndState(KEY_STARRED, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mMessagesController.keyToSettingEndState(KEY_CONTACTS, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For priority conversations, we should set the conversations but not priority senders
- endState = mMessagesController.keyToSettingEndState(KEY_IMPORTANT, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_UNSET);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
+ assertThat(getCheckedOptions(mCallsPrefCategory)).containsExactly(KEY_CONTACTS);
}
@Test
- public void testKeyToSettingEndState_callsCheck() {
- int[] endState;
+ public void updateState_callsStarredContacts() {
+ ZenMode zenMode = newModeWithPolicy(p -> p.allowCalls(PEOPLE_TYPE_STARRED));
+ mCallsController.displayPreference(mPreferenceScreen);
- // For calls: we should never set conversations, as this is unrelated to calls.
- // For KEY_NONE senders should be none.
- endState = mCallsController.keyToSettingEndState(KEY_NONE, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ mCallsController.updateZenMode(mCallsPrefCategory, zenMode);
- // For KEY_ANY senders should be ANY.
- endState = mCallsController.keyToSettingEndState(KEY_ANY, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_ANYONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For [starred] contacts, we should set the priority senders accordingly
- endState = mCallsController.keyToSettingEndState(KEY_STARRED, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_STARRED);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mCallsController.keyToSettingEndState(KEY_CONTACTS, true);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_CONTACTS);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ assertThat(getCheckedOptions(mCallsPrefCategory)).containsExactly(KEY_STARRED);
}
@Test
- public void testKeyToSettingEndState_callsUncheck() {
- int[] endState;
+ public void updateState_callsNone() {
+ ZenMode zenMode = newModeWithPolicy(p -> p.allowCalls(PEOPLE_TYPE_NONE));
+ mCallsController.displayPreference(mPreferenceScreen);
- // A calls setup should never set conversations settings.
- // For KEY_NONE, "unchecking" still means "none".
- endState = mCallsController.keyToSettingEndState(KEY_NONE, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ mCallsController.updateZenMode(mCallsPrefCategory, zenMode);
- // For KEY_ANY unchecking resets the state to "none".
- endState = mCallsController.keyToSettingEndState(KEY_ANY, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For [starred] contacts, we should unset the priority senders, but not the conversations
- endState = mCallsController.keyToSettingEndState(KEY_STARRED, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mCallsController.keyToSettingEndState(KEY_CONTACTS, false);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ assertThat(getCheckedOptions(mCallsPrefCategory)).containsExactly(KEY_NONE);
}
@Test
- public void testSettingsToSaveOnClick_messagesCheck() {
- int[] endState;
+ public void updateState_msgAnyConvAny() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
- // For KEY_NONE everything should be none.
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_NONE, true, PEOPLE_TYPE_ANYONE, CONVERSATION_SENDERS_ANYONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
- // For KEY_ANY everything should be allowed.
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_ANY, true, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_ANYONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_ANYONE);
-
- // For [starred] contacts, we should set the priority senders, but not the conversations
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_STARRED, true, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_STARRED);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_CONTACTS, true, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_CONTACTS);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For priority conversations, we should set the conversations but not priority senders
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_IMPORTANT, true, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_UNSET);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_IMPORTANT);
+ // Messages=ANY shows ANY checked, regardless of conversations value (all conversations are
+ // messages and will get through).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_ANY);
}
@Test
- public void testSettingsToSaveOnClick_messagesUncheck() {
- int[] endState;
+ public void updateState_msgAnyConvImportant() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
- // For KEY_NONE, "unchecking" still means "none".
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_NONE, false, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_UNSET);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
- // For KEY_ANY unchecking resets the state to "none".
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_ANY, false, PEOPLE_TYPE_ANYONE, CONVERSATION_SENDERS_ANYONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
-
- // For [starred] contacts, we should unset the priority senders, but not the conversations
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_STARRED, false, PEOPLE_TYPE_STARRED, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_CONTACTS, false, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For priority conversations, we should set the conversations but not priority senders
- endState = mMessagesController.settingsToSaveOnClick(
- KEY_IMPORTANT, false, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_UNSET);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
+ // Messages=ANY shows ANY checked, regardless of conversations value (all conversations are
+ // messages and will get through).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_ANY);
}
@Test
- public void testSettingsToSaveOnClick_callsCheck() {
- int[] endState;
+ public void updateState_msgAnyConvNone() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
- // For calls: we should never set conversations, as this is unrelated to calls.
- // For KEY_NONE senders should be none.
- endState = mCallsController.settingsToSaveOnClick(
- KEY_NONE, true, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
- // For KEY_ANY senders should be ANY.
- endState = mCallsController.settingsToSaveOnClick(
- KEY_ANY, true, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_ANYONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For [starred] contacts, we should set the priority senders accordingly
- endState = mCallsController.settingsToSaveOnClick(
- KEY_STARRED, true, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_STARRED);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mCallsController.settingsToSaveOnClick(
- KEY_CONTACTS, true, PEOPLE_TYPE_STARRED, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_CONTACTS);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ // Messages=ANY shows ANY checked, regardless of conversations value (all conversations are
+ // messages and will get through).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_ANY);
}
@Test
- public void testSettingsToSaveOnClick_callsUncheck() {
- int[] endState;
+ public void updateState_msgContactsConvAny() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_CONTACTS)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
- // A calls setup should never set conversations settings.
- // For KEY_NONE, "unchecking" still means "none".
- endState = mCallsController.settingsToSaveOnClick(
- KEY_NONE, false, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(endState[0]).isEqualTo(STATE_UNSET);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
- // For KEY_ANY unchecking resets the state to "none".
- endState = mCallsController.settingsToSaveOnClick(
- KEY_ANY, false, PEOPLE_TYPE_ANYONE, CONVERSATION_SENDERS_ANYONE);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- // For [starred] contacts, we should unset the priority senders, but not the conversations
- endState = mCallsController.settingsToSaveOnClick(
- KEY_STARRED, false, PEOPLE_TYPE_STARRED, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
-
- endState = mCallsController.settingsToSaveOnClick(
- KEY_CONTACTS, false, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(endState[0]).isEqualTo(PEOPLE_TYPE_NONE);
- assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_UNSET);
+ // Shows a checked option for conversations=ANY which is normally unavailable.
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(KEY_ANY,
+ KEY_STARRED, KEY_CONTACTS, KEY_ANY_CONVERSATIONS, KEY_IMPORTANT_CONVERSATIONS,
+ KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_CONTACTS,
+ KEY_ANY_CONVERSATIONS);
}
@Test
- public void testSettingsToSave_messages_noChange() {
- int[] savedSettings;
+ public void updateState_msgContactsConvImportant() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_CONTACTS)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_NONE, true, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
- assertThat(savedSettings[1]).isEqualTo(STATE_UNSET);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_ANY, true, PEOPLE_TYPE_ANYONE, CONVERSATION_SENDERS_ANYONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
- assertThat(savedSettings[1]).isEqualTo(STATE_UNSET);
-
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_STARRED, true, PEOPLE_TYPE_STARRED, CONVERSATION_SENDERS_ANYONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
-
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_CONTACTS, true, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_ANYONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
-
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_IMPORTANT, true, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
- assertThat(savedSettings[1]).isEqualTo(STATE_UNSET);
+ // Contacts and important conversations.
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_CONTACTS,
+ KEY_IMPORTANT_CONVERSATIONS);
}
@Test
- public void testSettingsToSave_calls_noChange() {
- int[] savedSettings;
+ public void updateState_msgContactsConvNone() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_CONTACTS)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_NONE, true, PEOPLE_TYPE_NONE, CONVERSATION_SENDERS_NONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
- assertThat(savedSettings[1]).isEqualTo(STATE_UNSET);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_ANY, true, PEOPLE_TYPE_ANYONE, CONVERSATION_SENDERS_ANYONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
- assertThat(savedSettings[1]).isEqualTo(STATE_UNSET);
+ // Just contacts (will include conversations with those contacts but not explicitly chosen).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_CONTACTS);
+ }
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_STARRED, true, PEOPLE_TYPE_STARRED, CONVERSATION_SENDERS_ANYONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
+ @Test
+ public void updateState_msgStarredConvAny() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_STARRED)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
- savedSettings = mMessagesController.settingsToSaveOnClick(
- KEY_CONTACTS, true, PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_ANYONE);
- assertThat(savedSettings[0]).isEqualTo(STATE_UNSET);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+
+ // Shows a checked option for conversations=ANY which is normally unavailable.
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(KEY_ANY,
+ KEY_STARRED, KEY_CONTACTS, KEY_ANY_CONVERSATIONS, KEY_IMPORTANT_CONVERSATIONS,
+ KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_STARRED,
+ KEY_ANY_CONVERSATIONS);
+ }
+
+ @Test
+ public void updateState_msgStarredConvImportant() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_STARRED)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+
+ // Starred contacts and important conversations.
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_STARRED,
+ KEY_IMPORTANT_CONVERSATIONS);
+ }
+
+ @Test
+ public void updateState_msgStarredConvNone() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_STARRED)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+
+ // Just starred contacts (will include conversations with those contacts but not
+ // explicitly chosen).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_STARRED);
+ }
+
+ @Test
+ public void updateState_msgNoneConvAny() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+
+ // Shows a checked option for conversations=ANY which is normally unavailable.
+ // Only option checked (messages=NONE is reserved for none at all).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(KEY_ANY,
+ KEY_STARRED, KEY_CONTACTS, KEY_ANY_CONVERSATIONS, KEY_IMPORTANT_CONVERSATIONS,
+ KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY_CONVERSATIONS);
+ }
+
+ @Test
+ public void updateState_msgNoneConvImportant() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+
+ // Only important conversations (messages=NONE is reserved for none at all).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_IMPORTANT_CONVERSATIONS);
+ }
+
+ @Test
+ public void updateState_msgNoneConvNone() {
+ ZenMode zenMode = newModeWithPolicy(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+
+ // Just starred contacts (will include conversations with those contacts but not
+ // explicitly chosen).
+ assertThat(getVisibleOptions(mMessagesPrefCategory)).containsExactly(
+ KEY_ANY, KEY_STARRED, KEY_CONTACTS, KEY_IMPORTANT_CONVERSATIONS, KEY_NONE);
+ assertThat(getCheckedOptions(mMessagesPrefCategory)).containsExactly(KEY_NONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=Any, Conv=Any
+
+ @Test
+ public void checkContacts_fromMsgAnyConvAny_toMsgContactsConvNone() {
+ checkSomeContacts_fromMsgAnyConvAny_toMsgSomeContactsConvNone(KEY_CONTACTS,
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void checkStarred_fromMsgAnyConvAny_toMsgStarredConvNone() {
+ checkSomeContacts_fromMsgAnyConvAny_toMsgSomeContactsConvNone(KEY_STARRED,
+ PEOPLE_TYPE_STARRED);
+ }
+
+ private void checkSomeContacts_fromMsgAnyConvAny_toMsgSomeContactsConvNone(
+ String contactsOptionKey, @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Choosing CONTACTS/STARRED will also internally switch conversations to NONE (which is
+ // fine because the user didn't see the old conv=Any, just messages=Anyone).
+ setMessagesOptionChecked(contactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgAnyConvAny_toMsgNoneConvImportant() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgAnyConvAny_toMsgNoneConvAny() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Normally this option won't be visible, but it could be if the page was launched with
+ // conv=Any previously.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void uncheckAnyone_fromMsgAnyConvAny_toMsgNoneConvNone() {
+ uncheckAnyone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_ANYONE,
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkNone_fromMsgAnyConvAny_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_ANYONE, CONVERSATION_SENDERS_ANYONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=Any, Conv=Important
+
+ @Test
+ public void checkContacts_fromMsgAnyConvImportant_toMsgContactsConvNone() {
+ checkSomeContacts_fromMsgAnyConvImportant_toMsgSomeContactsConvNone(KEY_CONTACTS,
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void checkStarred_fromMsgAnyConvImportant_toMsgStarredConvNone() {
+ checkSomeContacts_fromMsgAnyConvImportant_toMsgSomeContactsConvNone(KEY_STARRED,
+ PEOPLE_TYPE_STARRED);
+ }
+
+ private void checkSomeContacts_fromMsgAnyConvImportant_toMsgSomeContactsConvNone(
+ String contactsOptionKey, @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Choosing CONTACTS/STARRED will also internally switch conversations to NONE (which is
+ // fine because the user didn't see the old setting, just messages=Anyone).
+ setMessagesOptionChecked(contactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgAnyConvImportant_toMsgNoneConvImportant() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Although conv=IMPORTANT previously, we show it as Anyone, so selecting important
+ // conversations should switch to important conversations only.
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgAnyConvImportant_toMsgNoneConvAny() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Normally this option won't be visible, but it could be if the page was launched with
+ // conv=Any previously.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void uncheckAnyone_fromMsgAnyConvImportant_toMsgNoneConvNone() {
+ uncheckAnyone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_ANYONE,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkNone_fromMsgAnyConvImportant_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_ANYONE,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=Any, Conv=None
+
+ @Test
+ public void checkContacts_fromMsgAnyConvNone_toMsgContactsConvNone() {
+ checkSomeContacts_fromMsgAnyConvNone_toMsgSomeContactsConvNone(KEY_CONTACTS,
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void checkStarred_fromMsgAnyConvNone_toMsgStarredConvNone() {
+ checkSomeContacts_fromMsgAnyConvNone_toMsgSomeContactsConvNone(KEY_STARRED,
+ PEOPLE_TYPE_STARRED);
+ }
+
+ private void checkSomeContacts_fromMsgAnyConvNone_toMsgSomeContactsConvNone(
+ String contactsOptionKey, @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Choosing CONTACTS/STARRED will also internally switch conversations to NONE (which is
+ // fine because the user didn't see the old setting, just messages=Anyone).
+ setMessagesOptionChecked(contactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgAnyConvNone_toMsgNoneConvImportant() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgAnyConvNone_toMsgNoneConvAny() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Normally this option won't be visible, but it could be if the page was launched with
+ // conv=Any previously.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void uncheckAnyone_fromMsgAnyConvNone_toMsgNoneConvNone() {
+ uncheckAnyone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_ANYONE,
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkNone_fromMsgAnyConvNone_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_ANYONE,
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=Contacts OR Starred, Conv=Any
+
+ @Test
+ public void switchContacts_fromMsgStarredConvAny_toMsgContactsConvAny() {
+ switchContacts_fromMsgSomeContactsConvAny_toMsgOtherContactsConvAny(PEOPLE_TYPE_STARRED,
+ KEY_CONTACTS, PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void switchContacts_fromMsgContactsConvAny_toMsgStarredConvAny() {
+ switchContacts_fromMsgSomeContactsConvAny_toMsgOtherContactsConvAny(PEOPLE_TYPE_CONTACTS,
+ KEY_STARRED, PEOPLE_TYPE_STARRED);
+ }
+
+ private void switchContacts_fromMsgSomeContactsConvAny_toMsgOtherContactsConvAny(
+ @PeopleType int fromMessageSenders, String checkingContactsOptionKey,
+ @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Switching CONTACTS/STARRED or vice-versa will leave conversations untouched.
+ setMessagesOptionChecked(checkingContactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void uncheckStarred_fromMsgStarredConvAny_toMsgNoneConvAny() {
+ uncheckSomeContacts_fromMsgSomeContactsConvAny_toMsgNoneConvAny(PEOPLE_TYPE_STARRED,
+ KEY_STARRED);
+ }
+
+ @Test
+ public void uncheckContacts_fromMsgContactsConvAny_toMsgNoneConvAny() {
+ uncheckSomeContacts_fromMsgSomeContactsConvAny_toMsgNoneConvAny(
+ PEOPLE_TYPE_CONTACTS, KEY_CONTACTS);
+ }
+
+ private void uncheckSomeContacts_fromMsgSomeContactsConvAny_toMsgNoneConvAny(
+ @PeopleType int fromMessageSenders, String checkingContactsOptionKey) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Unchecking CONTACTS or STARRED will leave conversations untouched.
+ setMessagesOptionChecked(checkingContactsOptionKey, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgStarredConvAny_toMsgStarredConvImportant() {
+ checkImportantConv_fromMsgSomeContactsConvAny_toMsgSomeContactsConvImportant(
+ PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgContactsConvAny_toMsgContactsConvImportant() {
+ checkImportantConv_fromMsgSomeContactsConvAny_toMsgSomeContactsConvImportant(
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void checkImportantConv_fromMsgSomeContactsConvAny_toMsgSomeContactsConvImportant(
+ @PeopleType int fromMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Choosing important conversations leaves contacts untouched.
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(fromMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void uncheckAnyConv_fromMsgStarredConvAny_toMsgStarredConvNone() {
+ uncheckAnyConv_fromMsgSomeContactsConvAny_toMsgSomeContactsConvNone(
+ PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void uncheckAnyConv_fromMsgContactsConvAny_toMsgContactsConvNone() {
+ uncheckAnyConv_fromMsgSomeContactsConvAny_toMsgSomeContactsConvNone(
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void uncheckAnyConv_fromMsgSomeContactsConvAny_toMsgSomeContactsConvNone(
+ @PeopleType int fromMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Unmarking any conversation leaves contacts untouched.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(fromMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgStarredConvAny_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_STARRED,
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgContactsConvAny_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_CONTACTS,
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkNone_fromMsgStarredConvAny_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_STARRED, CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkNone_fromMsgContactsConvAny_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_CONTACTS, CONVERSATION_SENDERS_ANYONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=Contacts OR Starred, Conv=Important
+
+ @Test
+ public void switchContacts_fromMsgStarredConvImportant_toMsgContactsConvImportant() {
+ switchContacts_fromMsgSomeContactsConvImportant_toMsgOtherContactsConvImportant(
+ PEOPLE_TYPE_CONTACTS, KEY_STARRED, PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void switchContacts_fromMsgContactsConvImportant_toMsgStarredConvImportant() {
+ switchContacts_fromMsgSomeContactsConvImportant_toMsgOtherContactsConvImportant(
+ PEOPLE_TYPE_STARRED, KEY_CONTACTS, PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void switchContacts_fromMsgSomeContactsConvImportant_toMsgOtherContactsConvImportant(
+ @PeopleType int fromMessageSenders, String checkingContactsOptionKey,
+ @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Switching CONTACTS/STARRED or vice-versa will leave conversations untouched.
+ setMessagesOptionChecked(checkingContactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void uncheckStarred_fromMsgStarredConvImportant_toMsgNoneConvImportant() {
+ uncheckSomeContacts_fromMsgSomeContactsConvImportant_toMsgNoneConvImportant(
+ PEOPLE_TYPE_STARRED, KEY_STARRED);
+ }
+
+ @Test
+ public void uncheckContacts_fromMsgContactsConvImportant_toMsgNoneConvImportant() {
+ uncheckSomeContacts_fromMsgSomeContactsConvImportant_toMsgNoneConvImportant(
+ PEOPLE_TYPE_CONTACTS, KEY_CONTACTS);
+ }
+
+ private void uncheckSomeContacts_fromMsgSomeContactsConvImportant_toMsgNoneConvImportant(
+ @PeopleType int fromMessageSenders, String checkingContactsOptionKey) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Unchecking CONTACTS or STARRED will leave conversations untouched.
+ setMessagesOptionChecked(checkingContactsOptionKey, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void uncheckImportantConv_fromMsgStarredConvImportant_toMsgStarredConvNone() {
+ uncheckImportantConv_fromMsgSomeContactsConvImportant_toMsgSomeContactsConvNone(
+ PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void uncheckImportantConv_fromMsgContactsConvImportant_toMsgContactsConvNone() {
+ uncheckImportantConv_fromMsgSomeContactsConvImportant_toMsgSomeContactsConvNone(
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void uncheckImportantConv_fromMsgSomeContactsConvImportant_toMsgSomeContactsConvNone(
+ @PeopleType int fromMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Deselecting important conversations leaves contacts untouched.
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(fromMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgStarredConvImportant_toMsgStarredConvAny() {
+ checkAnyConv_fromMsgSomeContactsConvImportant_toMsgSomeContactsConvAny(
+ PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgContactsConvImportant_toMsgContactsConvAny() {
+ checkAnyConv_fromMsgSomeContactsConvImportant_toMsgSomeContactsConvAny(
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void checkAnyConv_fromMsgSomeContactsConvImportant_toMsgSomeContactsConvAny(
+ @PeopleType int fromMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Selecting any conversations leaves contacts untouched.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(fromMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgStarredConvImportant_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_STARRED,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgContactsConvImportant_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_CONTACTS,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkNone_fromMsgStarredConvImportant_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_STARRED,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkNone_fromMsgContactsConvImportant_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_CONTACTS,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=Contacts OR Starred, Conv=None
+
+ @Test
+ public void switchContacts_fromMsgStarredConvNone_toMsgContactsConvNone() {
+ switchContacts_fromMsgSomeContactsConvNone_toMsgSomeContactsConvNone(PEOPLE_TYPE_CONTACTS,
+ KEY_STARRED, PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void switchContacts_fromMsgContactsConvNone_toMsgStarredConvNone() {
+ switchContacts_fromMsgSomeContactsConvNone_toMsgSomeContactsConvNone(PEOPLE_TYPE_STARRED,
+ KEY_CONTACTS, PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void switchContacts_fromMsgSomeContactsConvNone_toMsgSomeContactsConvNone(
+ @PeopleType int fromMessageSenders, String checkingContactsOptionKey,
+ @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Switching CONTACTS/STARRED or vice-versa will leave conversations untouched.
+ setMessagesOptionChecked(checkingContactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void uncheckStarred_fromMsgStarredConvNone_toMsgNoneConvNone() {
+ uncheckSomeContacts_fromMsgSomeContactsConvNone_toMsgNoneConvNone(
+ PEOPLE_TYPE_STARRED, KEY_STARRED);
+ }
+
+ @Test
+ public void uncheckContacts_fromMsgContactsConvNone_toMsgNoneConvNone() {
+ uncheckSomeContacts_fromMsgSomeContactsConvNone_toMsgNoneConvNone(
+ PEOPLE_TYPE_CONTACTS, KEY_CONTACTS);
+ }
+
+ private void uncheckSomeContacts_fromMsgSomeContactsConvNone_toMsgNoneConvNone(
+ @PeopleType int fromMessageSenders, String checkingContactsOptionKey) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Unchecking CONTACTS or STARRED will leave conversations untouched.
+ setMessagesOptionChecked(checkingContactsOptionKey, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgStarredConvNone_toMsgSomeContactsConvImportant() {
+ checkImportantConv_fromMsgSomeContactsConvNone_toMsgSomeContactsConvImportant(
+ PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgContactsConvNone_toMsgSomeContactsConvImportant() {
+ checkImportantConv_fromMsgSomeContactsConvNone_toMsgSomeContactsConvImportant(
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void checkImportantConv_fromMsgSomeContactsConvNone_toMsgSomeContactsConvImportant(
+ @PeopleType int fromMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Deselecting important conversations leaves contacts untouched.
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(fromMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgStarredConvNone_toMsgStarredConvAny() {
+ checkAnyConv_fromMsgSomeContactsConvNone_toMsgSomeContactsConvAny(PEOPLE_TYPE_STARRED);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgContactsConvNone_toMsgContactsConvAny() {
+ checkAnyConv_fromMsgSomeContactsConvNone_toMsgSomeContactsConvAny(PEOPLE_TYPE_CONTACTS);
+ }
+
+ private void checkAnyConv_fromMsgSomeContactsConvNone_toMsgSomeContactsConvAny(
+ @PeopleType int fromMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMessageSenders)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Selecting any conversations leaves contacts untouched.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(fromMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgStarredConvNone_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_STARRED,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgContactsConvNone_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_CONTACTS,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkNone_fromMsgStarredConvNone_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_STARRED,
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkNone_fromMsgContactsConvNone_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_CONTACTS,
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=None, Conv=Any
+
+ @Test
+ public void checkContacts_fromMsgNoneConvAny_toMsgContactsConvAny() {
+ checkSomeContacts_fromMsgNoneConvAny_toMsgSomeContactsConvAny(KEY_CONTACTS,
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void checkStarred_fromMsgNoneConvAny_toMsgStarredConvAny() {
+ checkSomeContacts_fromMsgNoneConvAny_toMsgSomeContactsConvAny(KEY_STARRED,
+ PEOPLE_TYPE_STARRED);
+ }
+
+ private void checkSomeContacts_fromMsgNoneConvAny_toMsgSomeContactsConvAny(
+ String contactsOptionKey, @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ // Adding CONTACTS/STARRED will leave conversations untouched.
+ setMessagesOptionChecked(contactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgNoneConvAny_toMsgNoneConvImportant() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void uncheckAnyConv_fromMsgNoneConvAny_toMsgNoneConvNone() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE));
+
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgNoneConvAny_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_NONE,
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkNone_fromMsgNoneConvAny_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_NONE,
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=None, Conv=Important
+
+ @Test
+ public void checkContacts_fromMsgNoneConvImportant_toMsgContactsConvImportant() {
+ checkSomeContacts_fromMsgNoneConvImportant_toMsgSomeContactsConvImportant(KEY_CONTACTS,
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void checkStarred_fromMsgNoneConvImportant_toMsgStarredConvImportant() {
+ checkSomeContacts_fromMsgNoneConvImportant_toMsgSomeContactsConvImportant(KEY_STARRED,
+ PEOPLE_TYPE_STARRED);
+ }
+
+ private void checkSomeContacts_fromMsgNoneConvImportant_toMsgSomeContactsConvImportant(
+ String contactsOptionKey, @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Adding CONTACTS/STARRED will leave conversations untouched.
+ setMessagesOptionChecked(contactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void uncheckImportantConv_fromMsgNoneConvImportant_toMsgNoneConvNone() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgNoneConvImportant_toMsgNoneConvAny() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT));
+
+ // Normally this option won't be visible, but it could be if the page was launched with
+ // conv=Any previously.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgNoneConvImportant_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_NONE,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkNone_fromMsgNoneConvImportant_toMsgNoneConvNone() {
+ checkNone_fromState_toMsgNoneConvNone(PEOPLE_TYPE_NONE,
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, starting with Msg=None, Conv=None
+
+ @Test
+ public void checkContacts_fromMsgNoneConvNone_toMsgContactsConvNone() {
+ checkSomeContacts_fromMsgNoneConvNone_toMsgSomeContactsConvNone(KEY_CONTACTS,
+ PEOPLE_TYPE_CONTACTS);
+ }
+
+ @Test
+ public void checkStarred_fromMsgNoneConvNone_toMsgStarredConvNone() {
+ checkSomeContacts_fromMsgNoneConvNone_toMsgSomeContactsConvNone(KEY_STARRED,
+ PEOPLE_TYPE_STARRED);
+ }
+
+ private void checkSomeContacts_fromMsgNoneConvNone_toMsgSomeContactsConvNone(
+ String contactsOptionKey, @PeopleType int toMessageSenders) {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Choosing CONTACTS/STARRED will leave conversations untouched.
+ setMessagesOptionChecked(contactsOptionKey, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(toMessageSenders);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void checkImportantConv_fromMsgNoneConvNone_toMsgNoneConvImportant() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ setMessagesOptionChecked(KEY_IMPORTANT_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_IMPORTANT);
+ }
+
+ @Test
+ public void checkAnyConv_fromMsgNoneConvNone_toMsgNoneConvAny() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ // Normally this option won't be visible, but it could be if the page was launched with
+ // conv=Any previously.
+ setMessagesOptionChecked(KEY_ANY_CONVERSATIONS, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ @Test
+ public void checkAnyone_fromMsgNoneConvNone_toMsgAnyConvNone() {
+ checkAnyone_fromState_toMsgAnyConvAny(PEOPLE_TYPE_NONE,
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ @Test
+ public void uncheckNone_fromMsgNoneConvNone_noChanges() {
+ setUpMessagesController(p ->
+ p.allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_NONE));
+
+ setMessagesOptionChecked(KEY_NONE, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertThat(savedPolicy.getPriorityMessageSenders()).isEqualTo(PEOPLE_TYPE_NONE);
+ assertThat(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ // --------------------------------------------------------------------------
+ // Message checkbox tests, common cases.
+
+ private void checkAnyone_fromState_toMsgAnyConvAny(@PeopleType int fromMsg,
+ @ConversationSenders int fromConv) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMsg).allowConversations(fromConv));
+ String context = "Trying to check Anyone; starting with Msg=" + peopleTypeToString(fromMsg)
+ + ", Conv=" + conversationTypeToString(fromConv);
+
+ // Checking ANY will always unselect everything else in the UI, no matter the initial state,
+ // but will save PEOPLE_ANY and CONVERSATIONS_ANY (which is redundant but equivalent).
+ setMessagesOptionChecked(KEY_ANY, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertWithMessage(context).that(savedPolicy.getPriorityMessageSenders()).isEqualTo(
+ PEOPLE_TYPE_ANYONE);
+ assertWithMessage(context).that(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_ANYONE);
+ }
+
+ private void uncheckAnyone_fromState_toMsgNoneConvNone(@PeopleType int fromMsg,
+ @ConversationSenders int fromConv) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMsg).allowConversations(fromConv));
+ String context = "Trying to uncheck Anyone; starting with Msg=" + peopleTypeToString(
+ fromMsg) + ", Conv=" + conversationTypeToString(fromConv);
+
+ // Unchecking ANYONE means NONE to both, even if Anyone was previously Msg=Any&Conv=Any or
+ // Msg=Any&Conv=Important.
+ setMessagesOptionChecked(KEY_ANY, false);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertWithMessage(context).that(savedPolicy.getPriorityMessageSenders()).isEqualTo(
+ PEOPLE_TYPE_NONE);
+ assertWithMessage(context).that(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ private void checkNone_fromState_toMsgNoneConvNone(@PeopleType int fromMsg,
+ @ConversationSenders int fromConv) {
+ setUpMessagesController(p ->
+ p.allowMessages(fromMsg).allowConversations(fromConv));
+ String context = "Trying to check None; starting with Msg=" + peopleTypeToString(fromMsg)
+ + ", Conv=" + conversationTypeToString(fromConv);
+
+ // Checking NONE will always unselect everything else, no matter the initial state.
+ setMessagesOptionChecked(KEY_NONE, true);
+ ZenPolicy savedPolicy = getSavedPolicy();
+
+ assertWithMessage(context).that(savedPolicy.getPriorityMessageSenders()).isEqualTo(
+ PEOPLE_TYPE_NONE);
+ assertWithMessage(context).that(savedPolicy.getPriorityConversationSenders()).isEqualTo(
+ CONVERSATION_SENDERS_NONE);
+ }
+
+ private void setUpMessagesController(Consumer policyMaker) {
+ ZenMode zenMode = newModeWithPolicy(policyMaker);
+ mMessagesController.displayPreference(mPreferenceScreen);
+ mMessagesController.updateZenMode(mMessagesPrefCategory, zenMode);
+ }
+
+ private static ZenMode newModeWithPolicy(Consumer policyMaker) {
+ ZenPolicy.Builder policyBuilder = new ZenPolicy.Builder();
+ policyMaker.accept(policyBuilder);
+ return new TestModeBuilder().setZenPolicy(policyBuilder.build()).build();
+ }
+
+ private static ImmutableList getAllOptions(PreferenceCategory category) {
+ return getOptions(category, o -> true);
+ }
+
+ private static ImmutableList getVisibleOptions(PreferenceCategory category) {
+ return getOptions(category, Preference::isVisible);
+ }
+
+ private static ImmutableList getCheckedOptions(PreferenceCategory category) {
+ return getOptions(category, TwoStatePreference::isChecked);
+ }
+
+ private static ImmutableList getOptions(PreferenceCategory category,
+ Predicate filter) {
+ ImmutableList.Builder keys = new ImmutableList.Builder<>();
+ for (int i = 0; i < category.getPreferenceCount(); i++) {
+ SelectorWithWidgetPreference option =
+ (SelectorWithWidgetPreference) category.getPreference(i);
+ if (filter.test(option)) {
+ keys.add(category.getPreference(i).getKey());
+ }
+ }
+ return keys.build();
+ }
+
+
+ private static void setOptionChecked(PreferenceCategory category, String key, boolean checked) {
+ SelectorWithWidgetPreference preference = checkNotNull(category.findPreference(key));
+ if (preference.isChecked() == checked) {
+ throw new IllegalArgumentException(
+ "This test is trying to " + (checked ? "check" : "uncheck") + " " + key
+ + ", but it's already " + (checked ? "checked" : "unchecked") + "!");
+ }
+ preference.performClick();
+ }
+
+ private void setMessagesOptionChecked(String key, boolean checked) {
+ setOptionChecked(mMessagesPrefCategory, key, checked);
+ }
+
+ private ZenPolicy getSavedPolicy() {
+ ArgumentCaptor captor = ArgumentCaptor.forClass(ZenMode.class);
+ verify(mBackend).updateMode(captor.capture());
+ return captor.getValue().getPolicy();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
index a7257f53705..948eec0277d 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
@@ -21,8 +21,11 @@ import static android.provider.Settings.Global.ZEN_MODE_OFF;
import static android.service.notification.Condition.SOURCE_UNKNOWN;
import static android.service.notification.Condition.STATE_TRUE;
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_ANYONE;
+import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_IMPORTANT;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_ANYONE;
import static android.service.notification.ZenPolicy.PEOPLE_TYPE_CONTACTS;
+import static android.service.notification.ZenPolicy.PEOPLE_TYPE_NONE;
+import static android.service.notification.ZenPolicy.PEOPLE_TYPE_STARRED;
import static android.service.notification.ZenPolicy.VISUAL_EFFECT_AMBIENT;
import static android.service.notification.ZenPolicy.VISUAL_EFFECT_LIGHTS;
@@ -123,6 +126,59 @@ public class ZenModesSummaryHelperTest {
assertThat(mSummaryHelper.getPeopleSummary(policy)).isEqualTo("All people can interrupt");
}
+ @Test
+ public void getMessagesSettingSummary_allMessages() {
+ ZenPolicy policy1 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_ANYONE)
+ .build();
+ ZenPolicy policy2 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT)
+ .build();
+ ZenPolicy policy3 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_ANYONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE)
+ .build();
+
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy1)).isEqualTo("Anyone");
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy2)).isEqualTo("Anyone");
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy3)).isEqualTo("Anyone");
+ }
+
+ @Test
+ public void getMessagesSettingSummary_noMessagesButSomeConversations() {
+ ZenPolicy policy1 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT)
+ .build();
+ ZenPolicy policy2 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_NONE)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE)
+ .build();
+
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy1)).isEqualTo(
+ "Priority conversations");
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy2)).isEqualTo(
+ "All conversations");
+ }
+
+ @Test
+ public void getMessagesSettingSummary_contactsAndConversations() {
+ ZenPolicy policy1 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_STARRED)
+ .allowConversations(CONVERSATION_SENDERS_IMPORTANT)
+ .build();
+ ZenPolicy policy2 = new ZenPolicy.Builder()
+ .allowMessages(PEOPLE_TYPE_STARRED)
+ .allowConversations(CONVERSATION_SENDERS_ANYONE)
+ .build();
+
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy1)).isEqualTo(
+ "Starred contacts and priority conversations");
+ assertThat(mSummaryHelper.getMessagesSettingSummary(policy2)).isEqualTo(
+ "Starred contacts and all conversations");
+ }
+
@Test
public void getOtherSoundCategoriesSummary_single() {
ZenMode zenMode = new TestModeBuilder()