1558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki/* 2558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Copyright (C) 2011 The Android Open Source Project 3558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 4558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * you may not use this file except in compliance with the License. 6558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * You may obtain a copy of the License at 7558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 8558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 10558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Unless required by applicable law or agreed to in writing, software 11558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * See the License for the specific language governing permissions and 14558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * limitations under the License. 15558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */ 16558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 17558669dab4109afebd19eade1f95a396215fb44dMakoto Onukipackage com.android.contacts.editor; 18558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 19e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.test.AndroidTestCase; 20e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.test.MoreAsserts; 21e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport android.test.suitebuilder.annotation.SmallTest; 22e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 23428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountType; 24428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountWithDataSet; 25cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.test.mocks.MockAccountTypeManager; 263e435f0e724cb3e88efce15f760e59b9bc08f0d3Chiao Chengimport com.google.common.collect.Sets; 27558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 28558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport java.util.Collection; 29558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport java.util.Set; 30558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 31558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki/** 32558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Test case for {@link ContactEditorUtils}. 33558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 34558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * adb shell am instrument -w -e class com.android.contacts.editor.ContactEditorUtilsTest \ 35558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki com.android.contacts.tests/android.test.InstrumentationTestRunner 36558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */ 37558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki@SmallTest 38558669dab4109afebd19eade1f95a396215fb44dMakoto Onukipublic class ContactEditorUtilsTest extends AndroidTestCase { 39558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private MockAccountTypeManager mAccountTypes; 40558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private ContactEditorUtils mTarget; 41558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 42558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final MockAccountType TYPE1 = new MockAccountType("type1", null, true); 43558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final MockAccountType TYPE2 = new MockAccountType("type2", null, true); 44558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final MockAccountType TYPE2EX = new MockAccountType("type2", "ext", true); 45558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 46558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Only type 3 is "readonly". 47558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final MockAccountType TYPE3 = new MockAccountType("type3", null, false); 48558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 49558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final AccountWithDataSet ACCOUNT_1_A = new AccountWithDataSet( 50558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki "a", TYPE1.accountType, TYPE1.dataSet); 51558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final AccountWithDataSet ACCOUNT_1_B = new AccountWithDataSet( 52558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki "b", TYPE1.accountType, TYPE1.dataSet); 53558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 54558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final AccountWithDataSet ACCOUNT_2_A = new AccountWithDataSet( 55558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki "a", TYPE2.accountType, TYPE2.dataSet); 56558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final AccountWithDataSet ACCOUNT_2EX_A = new AccountWithDataSet( 57558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki "a", TYPE2EX.accountType, TYPE2EX.dataSet); 58558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 59558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static final AccountWithDataSet ACCOUNT_3_C = new AccountWithDataSet( 60558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki "c", TYPE3.accountType, TYPE3.dataSet); 61558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 62558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki @Override 63558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki protected void setUp() throws Exception { 64558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Initialize with 0 types, 0 accounts. 65558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes = new MockAccountTypeManager(new AccountType[] {}, 66558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki new AccountWithDataSet[] {}); 67558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget = new ContactEditorUtils(getContext(), mAccountTypes); 68558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 69558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Clear the preferences. 70558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.cleanupForTest(); 71558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 72558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 73558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private void setAccountTypes(AccountType... types) { 74558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mTypes = types; 75558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 76558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 77558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private void setAccounts(AccountWithDataSet... accounts) { 78558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mAccounts = accounts; 79558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 80558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 81558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public void testGetWritableAccountTypeStrings() { 82558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki String[] types; 83558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 84558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 0 writable types 85558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(); 86558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 87558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki types = mTarget.getWritableAccountTypeStrings(); 88558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals(types, new String[0]); 89558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 90558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 1 writable type 91558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1); 92558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 93558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki types = mTarget.getWritableAccountTypeStrings(); 94558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals(Sets.newHashSet(TYPE1.accountType), Sets.newHashSet(types)); 95558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 96558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 2 writable types 97558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2EX); 98558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 99558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki types = mTarget.getWritableAccountTypeStrings(); 100558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals(Sets.newHashSet(TYPE1.accountType, TYPE2EX.accountType), 101558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Sets.newHashSet(types)); 102558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 103558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 3 writable types + 1 readonly type 104558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2, TYPE2EX, TYPE3); 105558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 106558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki types = mTarget.getWritableAccountTypeStrings(); 107558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals( 108558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Sets.newHashSet(TYPE1.accountType, TYPE2.accountType, TYPE2EX.accountType), 109558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Sets.newHashSet(types)); 110558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 111558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 112558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki /** 113558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Test for 114558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * - {@link ContactEditorUtils#saveDefaultAndAllAccounts} 115558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * - {@link ContactEditorUtils#getDefaultAccount} 116558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * - {@link ContactEditorUtils#getSavedAccounts()} 117558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */ 118558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public void testSaveDefaultAndAllAccounts() { 119558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Use these account types here. 120558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2); 121558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 122558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // If none has been saved, it should return an empty list. 123558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertEquals(0, mTarget.getSavedAccounts().size()); 124558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 125558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Save 0 accounts. 126558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mAccounts = new AccountWithDataSet[]{}; 127558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(null); 128558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertNull(mTarget.getDefaultAccount()); 129558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals( 130558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Sets.newHashSet(mAccountTypes.mAccounts), 131558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki toSet(mTarget.getSavedAccounts())); 132558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 133558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 1 account 134558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mAccounts = new AccountWithDataSet[]{ACCOUNT_1_A}; 135558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A); 136558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertEquals(ACCOUNT_1_A, mTarget.getDefaultAccount()); 137558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals( 138558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Sets.newHashSet(mAccountTypes.mAccounts), 139558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki toSet(mTarget.getSavedAccounts())); 140558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 141131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki // 2 accounts 142558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mAccounts = new AccountWithDataSet[]{ACCOUNT_1_A, ACCOUNT_1_B}; 143558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_B); 144558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertEquals(ACCOUNT_1_B, mTarget.getDefaultAccount()); 145558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki MoreAsserts.assertEquals( 146558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Sets.newHashSet(mAccountTypes.mAccounts), 147558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki toSet(mTarget.getSavedAccounts())); 148131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki 149131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki // 2 accounts, and save null as the default. Even though there are accounts, the saved 150131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki // account list should be empty in this case. 151131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki mTarget.saveDefaultAndAllAccounts(null); 152131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki assertNull(mTarget.getDefaultAccount()); 153131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki assertEquals(0, mTarget.getSavedAccounts().size()); 154558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 155558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 156558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public void testIsAccountValid() { 157558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Use these account types here. 158558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2); 159558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 160558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 0 accounts 161558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mAccounts = new AccountWithDataSet[]{}; 162558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.isValidAccount(ACCOUNT_1_A)); 163558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.isValidAccount(null)); // null is always valid 164558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 165558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // 2 accounts 166558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAccountTypes.mAccounts = new AccountWithDataSet[]{ACCOUNT_1_A, ACCOUNT_2_A}; 167558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.isValidAccount(ACCOUNT_1_A)); 168558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.isValidAccount(ACCOUNT_2_A)); 169558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.isValidAccount(ACCOUNT_2EX_A)); 170558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.isValidAccount(null)); // null is always valid 171558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 172558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 173558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki /** 174558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Tests for {@link ContactEditorUtils#shouldShowAccountChangedNotification()}, starting with 175558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 0 accounts. 176558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */ 177558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public void testShouldShowAccountChangedNotification_0Accounts() { 178558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // There's always at least one writable type... 179558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1); 180558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 181558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // First launch -- always true. 182558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.shouldShowAccountChangedNotification()); 183558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 184558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // We show the notification here, and user clicked "add account" 185558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccounts(ACCOUNT_1_A); 186558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 187558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Now we open the contact editor with the new account. 188558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 189558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // When closing the editor, we save the default account. 190558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A); 191558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 192558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Next time the user creates a contact, we don't show the notification. 193558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 194558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 195558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // User added a new writable account, ACCOUNT_1_B. 196558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccounts(ACCOUNT_1_A, ACCOUNT_1_B); 197558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 19883ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang // Since default account is still ACCOUNT_1_A, we don't show the notification. 19983ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang assertFalse(mTarget.shouldShowAccountChangedNotification()); 200558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 201558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // User saved a new contact. We update the account list and the default account. 202558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_B); 203558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 204558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // User created another contact. Now we don't show the notification. 205558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 206558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 207558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // User installed a new contact sync adapter... 208558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 209558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Added a new account type: TYPE2, and the TYPE2EX extension. 210558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2, TYPE2EX); 211558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Add new accounts: ACCOUNT_2_A, ACCOUNT_2EX_A. 212558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccounts(ACCOUNT_1_A, ACCOUNT_1_B, ACCOUNT_2_A, ACCOUNT_2EX_A); 213558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 21483ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang // New added account but default account is still not changed, so no notification. 21583ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang assertFalse(mTarget.shouldShowAccountChangedNotification()); 216558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 217558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // User saves a new contact, with a different default account. 218558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_2_A); 219558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 220558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Next time user creates a contact, no notification. 221558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 222558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 223558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Remove ACCOUNT_2EX_A. 224558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2, TYPE2EX); 225558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccounts(ACCOUNT_1_A, ACCOUNT_1_B, ACCOUNT_2_A); 226558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 227558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // ACCOUNT_2EX_A was not default, so no notification either. 228558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 229558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 230558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Remove ACCOUNT_1_B, which is default. 231558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2, TYPE2EX); 232558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccounts(ACCOUNT_1_A, ACCOUNT_1_B); 233558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 234558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Now we show the notification. 235558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.shouldShowAccountChangedNotification()); 23683ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang 23783ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang // Do not save the default account, and add a new account now. 23883ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang setAccountTypes(TYPE1, TYPE2, TYPE2EX); 23983ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang setAccounts(ACCOUNT_1_A, ACCOUNT_1_B, ACCOUNT_2EX_A); 24083ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang 24183ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang // No default account, so show notification. 24283ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang assertTrue(mTarget.shouldShowAccountChangedNotification()); 243558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 244558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 245558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki /** 246558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Tests for {@link ContactEditorUtils#shouldShowAccountChangedNotification()}, starting with 247558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 1 accounts. 248558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */ 249558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public void testShouldShowAccountChangedNotification_1Account() { 250558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1, TYPE2); 251558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccounts(ACCOUNT_1_A); 252558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 253558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // First launch -- always true. 254558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.shouldShowAccountChangedNotification()); 255558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 256558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // User saves a new contact. 257558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A); 258558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 259558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Next time, no notification. 260558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 261558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 262558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // The rest is the same... 263558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 264558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 265558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki /** 266558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Tests for {@link ContactEditorUtils#shouldShowAccountChangedNotification()}, starting with 267558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * 0 accounts, and the user selected "local only". 268558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */ 269558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public void testShouldShowAccountChangedNotification_0Account_localOnly() { 270558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // There's always at least one writable type... 271558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki setAccountTypes(TYPE1); 272558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 273558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // First launch -- always true. 274558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertTrue(mTarget.shouldShowAccountChangedNotification()); 275558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 276558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // We show the notification here, and user clicked "keep local" and saved an contact. 277558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mTarget.saveDefaultAndAllAccounts(null); 278558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 279558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // Now there are no accounts, and default account is null. 280558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 281558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki // The user created another contact, but this we shouldn't show the notification. 282558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 283558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 284558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 285131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki public void testShouldShowAccountChangedNotification_sanity_check() { 286131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki // Prepare 1 account and save it as the default. 287131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki setAccountTypes(TYPE1); 288131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki setAccounts(ACCOUNT_1_A); 289131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki 290131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki mTarget.saveDefaultAndAllAccounts(ACCOUNT_1_A); 291131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki 292131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki // Right after a save, the dialog shouldn't show up. 293131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki assertFalse(mTarget.shouldShowAccountChangedNotification()); 294131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki 295131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki // Remove the default account to emulate broken preferences. 296131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki mTarget.removeDefaultAccountForTest(); 297f659cb04f67fa31af0835fce9cb82ad741e1c863guanxiongliu 298f659cb04f67fa31af0835fce9cb82ad741e1c863guanxiongliu // The dialog shouldn't show up. 299f659cb04f67fa31af0835fce9cb82ad741e1c863guanxiongliu // The logic is, if there's a writable account, we'll pick it as default 300f659cb04f67fa31af0835fce9cb82ad741e1c863guanxiongliu assertFalse(mTarget.shouldShowAccountChangedNotification()); 301131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki } 302131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki 303558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static <T> Set<T> toSet(Collection<T> collection) { 304558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki Set<T> ret = Sets.newHashSet(); 305558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki ret.addAll(collection); 306558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki return ret; 307558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 308558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 309558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private static class MockAccountType extends AccountType { 310558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki private boolean mAreContactsWritable; 311558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 312558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public MockAccountType(String accountType, String dataSet, boolean areContactsWritable) { 313558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki this.accountType = accountType; 314558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki this.dataSet = dataSet; 315558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki mAreContactsWritable = areContactsWritable; 316558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 317558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 318558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki @Override 319558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public boolean areContactsWritable() { 320558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki return mAreContactsWritable; 321558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 322558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki 323558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki @Override 324558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki public boolean isGroupMembershipEditable() { 325558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki return true; 326558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 327558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki } 328558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki} 329