Merge messages & conversations settings for DND priority senders.
This change explicitly allows for multiselect between priority senders (starred, contacts) & priority conversations, and also allows unchecking boxes by clicking on the same ones again. Also makes the screens for setting messages and calls in custom rules consistent in behavior with the main DND settings. Since much of the functionality is shared, this change refactors most of the logic into a new helper class used by both. While these changes also affect how the "calls" screen is constructed, in effect there is no change to the functionality of priority call sender settings except under the hood. Test: atest ZenPrioritySendersHelperTest; Settings robotests Bug: 190180868 Bug: 197223270 Change-Id: I894775537a18feb7a891b2668b9a613a203a129c
This commit is contained in:
@@ -0,0 +1,559 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.notification.zen;
|
||||
|
||||
import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_ANYONE;
|
||||
import static android.app.NotificationManager.Policy.PRIORITY_SENDERS_ANY;
|
||||
import static android.app.NotificationManager.Policy.PRIORITY_SENDERS_CONTACTS;
|
||||
import static android.app.NotificationManager.Policy.PRIORITY_SENDERS_STARRED;
|
||||
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_IMPORTANT;
|
||||
import static android.service.notification.ZenPolicy.CONVERSATION_SENDERS_NONE;
|
||||
|
||||
import static com.android.settings.notification.zen.ZenModeBackend.SOURCE_NONE;
|
||||
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.KEY_ANY;
|
||||
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.KEY_CONTACTS;
|
||||
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.KEY_IMPORTANT;
|
||||
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.KEY_NONE;
|
||||
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.KEY_STARRED;
|
||||
import static com.android.settings.notification.zen.ZenPrioritySendersHelper.UNKNOWN;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.argThat;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.notification.NotificationBackend;
|
||||
import com.android.settingslib.widget.SelectorWithWidgetPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.ArgumentMatcher;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ZenPrioritySendersHelperTest {
|
||||
public static final String TAG = "ZenPrioritySendersHelperTest";
|
||||
@Mock
|
||||
private PreferenceCategory mMockPrefCategory;
|
||||
@Mock
|
||||
private ZenModeBackend mZenBackend;
|
||||
@Mock
|
||||
private NotificationBackend mNotifBackend;
|
||||
@Mock
|
||||
private SelectorWithWidgetPreference.OnClickListener mClickListener;
|
||||
|
||||
private Context mContext;
|
||||
@Mock
|
||||
private Resources mResources;
|
||||
@Mock
|
||||
private ContentResolver mContentResolver;
|
||||
|
||||
// This class is simply a wrapper to override getSummary() in order to avoid ZenModeBackend
|
||||
// calls.
|
||||
private class ZenPrioritySendersHelperWrapper extends ZenPrioritySendersHelper {
|
||||
ZenPrioritySendersHelperWrapper(Context context, boolean isMessages,
|
||||
ZenModeBackend zenModeBackend,
|
||||
NotificationBackend notificationBackend,
|
||||
SelectorWithWidgetPreference.OnClickListener clickListener) {
|
||||
super(context, isMessages, zenModeBackend, notificationBackend, clickListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
void updateSummaries() {
|
||||
// Do nothing, so we don't try to get summaries from resources.
|
||||
}
|
||||
}
|
||||
|
||||
// Extension of ArgumentMatcher to check that a preference argument has the correct preference
|
||||
// key, but doesn't check any other properties.
|
||||
private class PrefKeyMatcher implements ArgumentMatcher<SelectorWithWidgetPreference> {
|
||||
private String mKey;
|
||||
PrefKeyMatcher(String key) {
|
||||
mKey = key;
|
||||
}
|
||||
|
||||
public boolean matches(SelectorWithWidgetPreference pref) {
|
||||
return pref.getKey() != null && pref.getKey().equals(mKey);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "SelectorWithWidgetPreference matcher for key " + mKey;
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
when(mContext.getContentResolver()).thenReturn(mContentResolver);
|
||||
when(mContext.getResources()).thenReturn(mResources);
|
||||
when(mMockPrefCategory.getContext()).thenReturn(mContext);
|
||||
|
||||
// We don't care about resource contents, just make sure that attempting to access
|
||||
// resources doesn't kill the test
|
||||
when(mResources.getString(anyInt())).thenReturn("testString");
|
||||
}
|
||||
|
||||
private ZenPrioritySendersHelper makeMessagesHelper() {
|
||||
return new ZenPrioritySendersHelperWrapper(
|
||||
mContext, true, mZenBackend, mNotifBackend, mClickListener);
|
||||
}
|
||||
|
||||
private ZenPrioritySendersHelper makeCallsHelper() {
|
||||
return new ZenPrioritySendersHelperWrapper(
|
||||
mContext, false, mZenBackend, mNotifBackend, mClickListener);
|
||||
}
|
||||
|
||||
private SelectorWithWidgetPreference makePreference(String key, boolean isCheckbox) {
|
||||
final SelectorWithWidgetPreference pref =
|
||||
new SelectorWithWidgetPreference(mContext, isCheckbox);
|
||||
pref.setKey(key);
|
||||
return pref;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayPreferences_makeMessagesPrefs() {
|
||||
ArgumentCaptor<SelectorWithWidgetPreference> prefCaptor =
|
||||
ArgumentCaptor.forClass(SelectorWithWidgetPreference.class);
|
||||
when(mMockPrefCategory.getPreferenceCount()).thenReturn(0); // not yet created
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
messagesHelper.displayPreference(mMockPrefCategory);
|
||||
|
||||
// Starred contacts, Contacts, Priority Conversations, Any, None
|
||||
verify(mMockPrefCategory, times(5))
|
||||
.addPreference(prefCaptor.capture());
|
||||
|
||||
// First verify that the click listener has not been called yet before we start clicking on
|
||||
// things.
|
||||
verify(mClickListener, never())
|
||||
.onRadioButtonClicked(any(SelectorWithWidgetPreference.class));
|
||||
for (SelectorWithWidgetPreference pref : prefCaptor.getAllValues()) {
|
||||
// Verify that the click listener got a click on something with this pref key.
|
||||
pref.onClick();
|
||||
verify(mClickListener).onRadioButtonClicked(argThat(new PrefKeyMatcher(pref.getKey())));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayPreferences_makeCallsPrefs() {
|
||||
ArgumentCaptor<SelectorWithWidgetPreference> prefCaptor =
|
||||
ArgumentCaptor.forClass(SelectorWithWidgetPreference.class);
|
||||
when(mMockPrefCategory.getPreferenceCount()).thenReturn(0); // not yet created
|
||||
ZenPrioritySendersHelper callsHelper = makeCallsHelper();
|
||||
callsHelper.displayPreference(mMockPrefCategory);
|
||||
|
||||
// Starred contacts, Contacts, Any, None
|
||||
verify(mMockPrefCategory, times(4))
|
||||
.addPreference(prefCaptor.capture());
|
||||
|
||||
// Make sure we never have the conversation one
|
||||
verify(mMockPrefCategory, never())
|
||||
.addPreference(argThat(new PrefKeyMatcher(KEY_IMPORTANT)));
|
||||
|
||||
verify(mClickListener, never())
|
||||
.onRadioButtonClicked(any(SelectorWithWidgetPreference.class));
|
||||
for (SelectorWithWidgetPreference pref : prefCaptor.getAllValues()) {
|
||||
// Verify that the click listener got a click on something with this pref key.
|
||||
pref.onClick();
|
||||
verify(mClickListener).onRadioButtonClicked(argThat(new PrefKeyMatcher(pref.getKey())));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDisplayPreferences_createdOnlyOnce() {
|
||||
// Return a nonzero number of child preference when asked.
|
||||
// Then when displayPreference is called, it should never make any new preferences.
|
||||
when(mMockPrefCategory.getPreferenceCount()).thenReturn(4); // already created
|
||||
ZenPrioritySendersHelper callsHelper = makeCallsHelper();
|
||||
callsHelper.displayPreference(mMockPrefCategory);
|
||||
callsHelper.displayPreference(mMockPrefCategory);
|
||||
callsHelper.displayPreference(mMockPrefCategory);
|
||||
|
||||
// Even though we called display 3 times we shouldn't add more preferences here.
|
||||
verify(mMockPrefCategory, never())
|
||||
.addPreference(any(SelectorWithWidgetPreference.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeyToSettingEndState_messagesCheck() {
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
int[] endState;
|
||||
|
||||
// For KEY_NONE everything should be none.
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_NONE, true);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
// For KEY_ANY everything should be allowed.
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_ANY, true);
|
||||
assertThat(endState[0]).isEqualTo(PRIORITY_SENDERS_ANY);
|
||||
assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_ANYONE);
|
||||
|
||||
// For [starred] contacts, we should set the priority senders, but not the conversations
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_STARRED, true);
|
||||
assertThat(endState[0]).isEqualTo(PRIORITY_SENDERS_STARRED);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_CONTACTS, true);
|
||||
assertThat(endState[0]).isEqualTo(PRIORITY_SENDERS_CONTACTS);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// For priority conversations, we should set the conversations but not priority senders
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_IMPORTANT, true);
|
||||
assertThat(endState[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_IMPORTANT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeyToSettingEndState_messagesUncheck() {
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
int[] endState;
|
||||
|
||||
// For KEY_NONE, "unchecking" still means "none".
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_NONE, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
// For KEY_ANY unchecking resets the state to "none".
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_ANY, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
// For [starred] contacts, we should unset the priority senders, but not the conversations
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_STARRED, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_CONTACTS, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// For priority conversations, we should set the conversations but not priority senders
|
||||
endState = messagesHelper.keyToSettingEndState(KEY_IMPORTANT, false);
|
||||
assertThat(endState[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(endState[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeyToSettingEndState_callsCheck() {
|
||||
ZenPrioritySendersHelper callsHelper = makeCallsHelper();
|
||||
int[] endState;
|
||||
|
||||
// For all of calls: we should never set conversations, as this is unrelated to calls.
|
||||
// For KEY_NONE senders should be none.
|
||||
endState = callsHelper.keyToSettingEndState(KEY_NONE, true);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// For KEY_ANY senders should be ANY.
|
||||
endState = callsHelper.keyToSettingEndState(KEY_ANY, true);
|
||||
assertThat(endState[0]).isEqualTo(PRIORITY_SENDERS_ANY);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// For [starred] contacts, we should set the priority senders accordingly
|
||||
endState = callsHelper.keyToSettingEndState(KEY_STARRED, true);
|
||||
assertThat(endState[0]).isEqualTo(PRIORITY_SENDERS_STARRED);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
endState = callsHelper.keyToSettingEndState(KEY_CONTACTS, true);
|
||||
assertThat(endState[0]).isEqualTo(PRIORITY_SENDERS_CONTACTS);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testKeyToSettingEndState_callsUncheck() {
|
||||
ZenPrioritySendersHelper callsHelper = makeCallsHelper();
|
||||
int[] endState;
|
||||
|
||||
// A calls setup should never set conversations settings.
|
||||
// For KEY_NONE, "unchecking" still means "none".
|
||||
endState = callsHelper.keyToSettingEndState(KEY_NONE, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// For KEY_ANY unchecking resets the state to "none".
|
||||
endState = callsHelper.keyToSettingEndState(KEY_ANY, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// For [starred] contacts, we should unset the priority senders, but not the conversations
|
||||
endState = callsHelper.keyToSettingEndState(KEY_STARRED, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
endState = callsHelper.keyToSettingEndState(KEY_CONTACTS, false);
|
||||
assertThat(endState[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(endState[1]).isEqualTo(UNKNOWN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettingsToSave_messagesNone() {
|
||||
// Test coming from the same state (don't newly save redundant settings) and coming from
|
||||
// different states (when settings to save should be "none" for both senders and
|
||||
// conversations).
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
int[] savedSettings;
|
||||
|
||||
// None preference; not a checkbox (so whenever we click it, it counts as "checking").
|
||||
SelectorWithWidgetPreference nonePref = makePreference(KEY_NONE, false);
|
||||
|
||||
// Current settings already none; expect no settings to need to be saved
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
nonePref, SOURCE_NONE, CONVERSATION_SENDERS_NONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Current settings are something else; save the "none" settings
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
nonePref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
// One but not the other
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
nonePref, SOURCE_NONE, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
nonePref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_NONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettingsToSave_messagesAny() {
|
||||
// Test coming from the same state (don't newly save redundant settings) and coming from
|
||||
// different states (when settings to save should be "any" for both senders and
|
||||
// conversations).
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
int[] savedSettings;
|
||||
|
||||
// Any preference; checkbox.
|
||||
SelectorWithWidgetPreference anyPref = makePreference(KEY_ANY, true);
|
||||
|
||||
// Current settings already none; expect no settings to need to be saved
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
anyPref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Current settings are something else; save the "any" settings
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
anyPref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_ANY);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_ANYONE);
|
||||
|
||||
// It shouldn't be possible to have a starting state of one but not the other, but
|
||||
// make sure it works anyway?
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
anyPref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_ANYONE);
|
||||
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
anyPref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_ANY);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Test that unchecking the box results in a "none" state
|
||||
anyPref.setChecked(true);
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
anyPref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettingsToSave_messagesContacts() {
|
||||
// Test coming from the same state (don't newly save redundant settings) and coming from
|
||||
// different states.
|
||||
// In addition, saving either starred or contacts has the special case where if we're
|
||||
// coming from the "any" state it should also set the conversation senders to none.
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
int[] savedSettings;
|
||||
|
||||
// Test both contacts-related preferences here.
|
||||
SelectorWithWidgetPreference starredPref = makePreference(KEY_STARRED, true);
|
||||
SelectorWithWidgetPreference contactsPref = makePreference(KEY_CONTACTS, true);
|
||||
|
||||
// Current settings already the relevant ones; expect no settings to need to be saved
|
||||
// Note that since these are checkboxes, this state shouldn't be reachable, but check it
|
||||
// anyway just in case.
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
starredPref, PRIORITY_SENDERS_STARRED, CONVERSATION_SENDERS_NONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
contactsPref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Current settings are something else (contacts setting or "none"); save new senders
|
||||
// but do not change conversations.
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
starredPref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_STARRED);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
contactsPref, SOURCE_NONE, CONVERSATION_SENDERS_NONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_CONTACTS);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Special additional case: if the settings are currently "any" for both, we additionally
|
||||
// reset the conversation settings to none.
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
starredPref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_STARRED);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
contactsPref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_CONTACTS);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
|
||||
// Test that un-checking works as well.
|
||||
starredPref.setChecked(true);
|
||||
contactsPref.setChecked(true);
|
||||
|
||||
// Make sure we don't overwrite existing conversation senders setting when unchecking
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
starredPref, PRIORITY_SENDERS_STARRED, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
contactsPref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_NONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettingsToSave_messagesConversations() {
|
||||
// Test coming from the same state (don't newly save redundant settings) and coming from
|
||||
// different states.
|
||||
// In addition, saving either starred or contacts has the special case where if we're
|
||||
// coming from the "any" state it should also set the conversation senders to none.
|
||||
ZenPrioritySendersHelper messagesHelper = makeMessagesHelper();
|
||||
int[] savedSettings;
|
||||
|
||||
SelectorWithWidgetPreference convsPref = makePreference(KEY_IMPORTANT, true);
|
||||
|
||||
// Current settings already the relevant ones; expect no settings to need to be saved
|
||||
// Note that since these are checkboxes, this state shouldn't be reachable, but check it
|
||||
// anyway just in case.
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
convsPref, PRIORITY_SENDERS_STARRED, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Current settings are something else (only actual choice here is "none"); save
|
||||
// new conversations but do not change senders.
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
convsPref, PRIORITY_SENDERS_CONTACTS, CONVERSATION_SENDERS_NONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_IMPORTANT);
|
||||
|
||||
// Special additional case: if the settings are currently "any" for both, we additionally
|
||||
// reset the senders settings to none.
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
convsPref, PRIORITY_SENDERS_ANY, CONVERSATION_SENDERS_ANYONE);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_IMPORTANT);
|
||||
|
||||
// Test that un-checking works as well.
|
||||
convsPref.setChecked(true);
|
||||
|
||||
// Make sure we don't overwrite existing conversation senders setting when unchecking
|
||||
savedSettings = messagesHelper.settingsToSaveOnClick(
|
||||
convsPref, PRIORITY_SENDERS_STARRED, CONVERSATION_SENDERS_IMPORTANT);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(CONVERSATION_SENDERS_NONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettingsToSave_calls() {
|
||||
// Simpler test for calls: for each one, test that the relevant ones are saved if not
|
||||
// already set, and that conversation settings are never changed.
|
||||
ZenPrioritySendersHelper callsHelper = makeCallsHelper();
|
||||
int[] savedSettings;
|
||||
|
||||
// None of the preferences are checkboxes.
|
||||
SelectorWithWidgetPreference starredPref = makePreference(KEY_STARRED, false);
|
||||
SelectorWithWidgetPreference contactsPref = makePreference(KEY_CONTACTS, false);
|
||||
SelectorWithWidgetPreference anyPref = makePreference(KEY_ANY, false);
|
||||
SelectorWithWidgetPreference nonePref = makePreference(KEY_NONE, false);
|
||||
|
||||
// Test that if the settings are already what is set, nothing happens.
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(
|
||||
starredPref, PRIORITY_SENDERS_STARRED, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(
|
||||
contactsPref, PRIORITY_SENDERS_CONTACTS, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(anyPref, PRIORITY_SENDERS_ANY, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(nonePref, SOURCE_NONE, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(UNKNOWN);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
// Test that if the settings are something different, the relevant thing gets saved.
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(
|
||||
starredPref, PRIORITY_SENDERS_CONTACTS, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_STARRED);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(
|
||||
contactsPref, PRIORITY_SENDERS_ANY, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_CONTACTS);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(anyPref, SOURCE_NONE, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(PRIORITY_SENDERS_ANY);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
|
||||
savedSettings = callsHelper.settingsToSaveOnClick(
|
||||
nonePref, PRIORITY_SENDERS_STARRED, UNKNOWN);
|
||||
assertThat(savedSettings[0]).isEqualTo(SOURCE_NONE);
|
||||
assertThat(savedSettings[1]).isEqualTo(UNKNOWN);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user