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