1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.contacts.preference; 18 19 import android.content.Context; 20 import android.content.SharedPreferences; 21 import android.content.res.Resources; 22 import android.support.test.InstrumentationRegistry; 23 import android.test.InstrumentationTestCase; 24 import android.test.suitebuilder.annotation.SmallTest; 25 26 import com.android.contacts.model.account.AccountWithDataSet; 27 28 import junit.framework.Assert; 29 30 import org.mockito.Mock; 31 import org.mockito.Mockito; 32 import org.mockito.MockitoAnnotations; 33 34 import java.util.Arrays; 35 36 @SmallTest 37 public class ContactsPreferencesTest extends InstrumentationTestCase { 38 39 private static final String ACCOUNT_KEY = "ACCOUNT_KEY"; 40 41 @Mock private Context mContext; 42 @Mock private Resources mResources; 43 @Mock private SharedPreferences mSharedPreferences; 44 45 private ContactsPreferences mContactsPreferences; 46 47 @Override 48 public void setUp() throws Exception { 49 super.setUp(); 50 System.setProperty("dexmaker.dexcache", 51 getInstrumentation().getTargetContext().getCacheDir().getPath()); 52 MockitoAnnotations.initMocks(this); 53 54 Mockito.when(mContext.getResources()).thenReturn(mResources); 55 Mockito.when(mResources.getString(Mockito.anyInt())) 56 .thenReturn(ACCOUNT_KEY); // contact_editor_default_account_key 57 58 Mockito.when(mContext.getSharedPreferences(Mockito.anyString(), Mockito.anyInt())) 59 .thenReturn(mSharedPreferences); 60 Mockito.when(mSharedPreferences.contains(ContactsPreferences.SORT_ORDER_KEY)) 61 .thenReturn(true); 62 Mockito.when(mSharedPreferences.contains(ContactsPreferences.DISPLAY_ORDER_KEY)) 63 .thenReturn(true); 64 Mockito.when(mSharedPreferences.contains(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY)) 65 .thenReturn(true); 66 67 InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 68 @Override 69 public void run() { 70 mContactsPreferences = new ContactsPreferences(mContext); 71 } 72 }); 73 } 74 75 public void testGetSortOrderDefault() { 76 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 77 false, // R.bool.config_sort_order_user_changeable 78 true // R.bool.config_default_sort_order_primary 79 ); 80 Assert.assertEquals(ContactsPreferences.SORT_ORDER_PRIMARY, 81 mContactsPreferences.getSortOrder()); 82 } 83 84 public void testGetSortOrder() { 85 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 86 true // R.bool.config_sort_order_user_changeable 87 ); 88 Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.SORT_ORDER_KEY), 89 Mockito.anyInt())).thenReturn(ContactsPreferences.SORT_ORDER_PRIMARY); 90 Assert.assertEquals(ContactsPreferences.SORT_ORDER_PRIMARY, 91 mContactsPreferences.getSortOrder()); 92 } 93 94 public void testGetDisplayOrderDefault() { 95 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 96 false, // R.bool.config_display_order_user_changeable 97 true // R.bool.config_default_display_order_primary 98 ); 99 Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY, 100 mContactsPreferences.getDisplayOrder()); 101 } 102 103 public void testGetDisplayOrder() { 104 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 105 true // R.bool.config_display_order_user_changeable 106 ); 107 Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.DISPLAY_ORDER_KEY), 108 Mockito.anyInt())).thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY); 109 Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY, 110 mContactsPreferences.getDisplayOrder()); 111 } 112 113 public void testGetPhoneticNameDisplayDefault() { 114 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 115 false, // R.bool.config_phonetic_name_display_user_changeable 116 true // R.bool.config_default_hide_phonetic_name_if_empty 117 ); 118 Assert.assertEquals(PhoneticNameDisplayPreference.HIDE_IF_EMPTY, 119 mContactsPreferences.getPhoneticNameDisplayPreference()); 120 } 121 122 public void testGetPhoneticNameDisplay() { 123 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 124 true // R.bool.config_phonetic_name_display_user_changeable 125 ); 126 Mockito.when(mSharedPreferences.getInt( 127 Mockito.eq(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY), 128 Mockito.anyInt())).thenReturn(PhoneticNameDisplayPreference.HIDE_IF_EMPTY); 129 Assert.assertEquals(PhoneticNameDisplayPreference.HIDE_IF_EMPTY, 130 mContactsPreferences.getPhoneticNameDisplayPreference()); 131 } 132 133 public void testRefreshPhoneticNameDisplay() throws InterruptedException { 134 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 135 true // R.bool.config_phonetic_name_display_user_changeable 136 ); 137 Mockito.when(mSharedPreferences.getInt( 138 Mockito.eq(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY), 139 Mockito.anyInt())).thenReturn(PhoneticNameDisplayPreference.HIDE_IF_EMPTY, 140 PhoneticNameDisplayPreference.SHOW_ALWAYS); 141 142 Assert.assertEquals(PhoneticNameDisplayPreference.HIDE_IF_EMPTY, 143 mContactsPreferences.getPhoneticNameDisplayPreference()); 144 mContactsPreferences.refreshValue(ContactsPreferences.PHONETIC_NAME_DISPLAY_KEY); 145 146 Assert.assertEquals(PhoneticNameDisplayPreference.SHOW_ALWAYS, 147 mContactsPreferences.getPhoneticNameDisplayPreference()); 148 } 149 150 public void testRefreshSortOrder() throws InterruptedException { 151 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 152 true // R.bool.config_sort_order_user_changeable 153 ); 154 Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.SORT_ORDER_KEY), 155 Mockito.anyInt())).thenReturn(ContactsPreferences.SORT_ORDER_PRIMARY, 156 ContactsPreferences.SORT_ORDER_ALTERNATIVE); 157 158 Assert.assertEquals(ContactsPreferences.SORT_ORDER_PRIMARY, 159 mContactsPreferences.getSortOrder()); 160 mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY); 161 162 Assert.assertEquals(ContactsPreferences.SORT_ORDER_ALTERNATIVE, 163 mContactsPreferences.getSortOrder()); 164 } 165 166 public void testRefreshDisplayOrder() throws InterruptedException { 167 Mockito.when(mResources.getBoolean(Mockito.anyInt())).thenReturn( 168 true // R.bool.config_display_order_user_changeable 169 ); 170 Mockito.when(mSharedPreferences.getInt(Mockito.eq(ContactsPreferences.DISPLAY_ORDER_KEY), 171 Mockito.anyInt())).thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY, 172 ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE); 173 174 Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY, 175 mContactsPreferences.getDisplayOrder()); 176 mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY); 177 178 Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE, 179 mContactsPreferences.getDisplayOrder()); 180 } 181 182 public void testRefreshDefaultAccount() throws InterruptedException { 183 mContactsPreferences = new ContactsPreferences(mContext, 184 /* isDefaultAccountUserChangeable */ true); 185 186 Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString())) 187 .thenReturn(new AccountWithDataSet("name1", "type1", "dataset1").stringify(), 188 new AccountWithDataSet("name2", "type2", "dataset2").stringify()); 189 190 Assert.assertEquals(new AccountWithDataSet("name1", "type1", "dataset1"), 191 mContactsPreferences.getDefaultAccount()); 192 mContactsPreferences.refreshValue(ACCOUNT_KEY); 193 194 Assert.assertEquals(new AccountWithDataSet("name2", "type2", "dataset2"), 195 mContactsPreferences.getDefaultAccount()); 196 } 197 198 public void testShouldShowAccountChangedNotificationIfAccountNotSaved() { 199 mContactsPreferences = new ContactsPreferences(mContext, 200 /* isDefaultAccountUserChangeable */ true); 201 Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString())) 202 .thenReturn(null); 203 204 assertTrue("Should prompt to change default if no default is saved", 205 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList( 206 new AccountWithDataSet("name1", "type1", "dataset1"), 207 new AccountWithDataSet("name2", "type2", "dataset2")))); 208 } 209 210 public void testShouldShowAccountChangedNotification() { 211 mContactsPreferences = new ContactsPreferences(mContext, 212 /* isDefaultAccountUserChangeable */ true); 213 Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString())) 214 .thenReturn(new AccountWithDataSet("name", "type", "dataset").stringify()); 215 216 assertFalse("Should not prompt to change default if current default exists", 217 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList( 218 new AccountWithDataSet("name", "type", "dataset"), 219 new AccountWithDataSet("name1", "type1", "dataset1")))); 220 221 assertTrue("Should prompt to change default if current default does not exist", 222 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList( 223 new AccountWithDataSet("name1", "type1", "dataset1"), 224 new AccountWithDataSet("name2", "type2", "dataset2")))); 225 } 226 227 public void testShouldShowAccountChangedNotificationWhenThereIsOneAccount() { 228 mContactsPreferences = new ContactsPreferences(mContext, 229 /* isDefaultAccountUserChangeable */ true); 230 Mockito.when(mSharedPreferences.getString(Mockito.eq(ACCOUNT_KEY), Mockito.anyString())) 231 .thenReturn(null); 232 233 // Normally we would prompt because there is no default set but if there is just one 234 // account we should just use it. 235 assertFalse("Should not prompt to change default if there is only one account available", 236 mContactsPreferences.shouldShowAccountChangedNotification(Arrays.asList( 237 new AccountWithDataSet("name", "type", "dataset")))); 238 } 239 } 240