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
19807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport static junit.framework.Assert.assertEquals;
20807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport static junit.framework.Assert.assertFalse;
21807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport static junit.framework.Assert.assertNull;
22807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport static org.junit.Assert.assertTrue;
23807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott
24807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport android.support.test.InstrumentationRegistry;
25807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport android.support.test.filters.SmallTest;
26807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport android.support.test.runner.AndroidJUnit4;
27e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
2869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountType;
2969c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountWithDataSet;
300a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai
31807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport org.junit.Before;
32807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport org.junit.Test;
33807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport org.junit.runner.RunWith;
34558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
35807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport java.util.ArrayList;
36807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport java.util.Arrays;
37807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport java.util.Collections;
38807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottimport java.util.List;
39558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
40558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki/**
41558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Test case for {@link ContactEditorUtils}.
42558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki *
43558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * adb shell am instrument -w -e class com.android.contacts.editor.ContactEditorUtilsTest \
44558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki       com.android.contacts.tests/android.test.InstrumentationTestRunner
45807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott
46807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott * <p>It may make sense to just delete or move these tests since the code under test just forwards
47807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott * calls to {@link com.android.contacts.preference.ContactsPreferences} and that logic is already
48807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott * covered by {@link com.android.contacts.preference.ContactsPreferencesTest}
49807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott * </p>
50558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */
51558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki@SmallTest
52807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott@RunWith(AndroidJUnit4.class)
53807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerottpublic class ContactEditorUtilsTest {
54558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private ContactEditorUtils mTarget;
55558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
56807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    private static final String TYPE1 = "type1";
57807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    private static final String TYPE2 = "type2";
58807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    private static final String TYPE2_EXT = "ext";
59558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
60807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    private static final AccountWithDataSet ACCOUNT_1_A = new AccountWithDataSet("a", TYPE1, null);
61807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    private static final AccountWithDataSet ACCOUNT_1_B = new AccountWithDataSet("b", TYPE1, null);
62558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
63807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    private static final AccountWithDataSet ACCOUNT_2_A = new AccountWithDataSet("a", TYPE2, null);
64558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private static final AccountWithDataSet ACCOUNT_2EX_A = new AccountWithDataSet(
65807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott            "a", TYPE2, TYPE2_EXT);
66558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
67807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Before
68807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    public void setUp() throws Exception {
69807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        mTarget = ContactEditorUtils.create(InstrumentationRegistry.getTargetContext());
70558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
71558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Clear the preferences.
72558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        mTarget.cleanupForTest();
73558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
74558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
75558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
76558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Test for
77949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * - {@link ContactEditorUtils#saveDefaultAccount}
78949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * - {@link ContactEditorUtils#getOnlyOrDefaultAccount}
79558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
80807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Test
81949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    public void testSaveDefaultAccount() {
82949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(null);
83807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertNull(mTarget.getOnlyOrDefaultAccount(Collections.<AccountWithDataSet>emptyList()));
84558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
85949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(ACCOUNT_1_A);
86807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertEquals(ACCOUNT_1_A, mTarget.getOnlyOrDefaultAccount(Collections.
87807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                <AccountWithDataSet>emptyList()));
88558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
89558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
90558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
91807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * Tests for
92807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * {@link ContactEditorUtils#shouldShowAccountChangedNotification(List<AccountWithDataSet>)},
93807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * starting with 0 accounts.
94558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
95807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Test
96558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public void testShouldShowAccountChangedNotification_0Accounts() {
97807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        List<AccountWithDataSet> currentAccounts = new ArrayList<>();
98807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertTrue(mTarget.shouldShowAccountChangedNotification(currentAccounts));
99558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
100558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // We show the notification here, and user clicked "add account"
101807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.add(ACCOUNT_1_A);
102558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
103558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Now we open the contact editor with the new account.
104558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
105558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // When closing the editor, we save the default account.
106949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(ACCOUNT_1_A);
107558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
108558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Next time the user creates a contact, we don't show the notification.
109807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
110558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
111558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // User added a new writable account, ACCOUNT_1_B.
112807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.add(ACCOUNT_1_B);
113558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
11483ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang        // Since default account is still ACCOUNT_1_A, we don't show the notification.
115807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
116558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
117558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // User saved a new contact.  We update the account list and the default account.
118949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(ACCOUNT_1_B);
119558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
120558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // User created another contact.  Now we don't show the notification.
121807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
122558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
123558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // User installed a new contact sync adapter...
124558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
125558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Add new accounts: ACCOUNT_2_A, ACCOUNT_2EX_A.
126807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.add(ACCOUNT_2_A);
127807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.add(ACCOUNT_2EX_A);
128558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
12983ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang        // New added account but default account is still not changed, so no notification.
130807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
131558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
132558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // User saves a new contact, with a different default account.
133949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(ACCOUNT_2_A);
134558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
135558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Next time user creates a contact, no notification.
136807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
137558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
138558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Remove ACCOUNT_2EX_A.
139807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.remove(ACCOUNT_2EX_A);
140558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
141558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // ACCOUNT_2EX_A was not default, so no notification either.
142807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
143558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
144807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        // Remove ACCOUNT_2_A, which is default.
145807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.remove(ACCOUNT_2_A);
146558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
147558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Now we show the notification.
148807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertTrue(mTarget.shouldShowAccountChangedNotification(currentAccounts));
14983ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang
15083ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang        // Do not save the default account, and add a new account now.
151807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.add(ACCOUNT_2EX_A);
15283ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang
15383ff34fa9417cf673e68b56b2bf682b56d6a505eTingting Wang        // No default account, so show notification.
154807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertTrue(mTarget.shouldShowAccountChangedNotification(currentAccounts));
155558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
156558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
157558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
158807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * Tests for
159807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * {@link ContactEditorUtils#shouldShowAccountChangedNotification(List<AccountWithDataSet>)},
160807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * starting with 1 accounts.
161558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
162807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Test
163558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public void testShouldShowAccountChangedNotification_1Account() {
16437ad9fbba748664acfeaf058a36c221600aa62d5Tingting Wang        // Always returns false when 1 writable account.
165807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(
166807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                Collections.singletonList(ACCOUNT_1_A)));
167558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
168558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // User saves a new contact.
169949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(ACCOUNT_1_A);
170558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
171558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Next time, no notification.
172807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(
173807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                Collections.singletonList(ACCOUNT_1_A)));
174558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
175558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // The rest is the same...
176558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
177558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
178558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
179807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * Tests for
180807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * {@link ContactEditorUtils#shouldShowAccountChangedNotification(List<AccountWithDataSet>)},
181807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott     * starting with 0 accounts, and the user selected "local only".
182558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
183807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Test
184558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public void testShouldShowAccountChangedNotification_0Account_localOnly() {
185558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // First launch -- always true.
186807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertTrue(mTarget.shouldShowAccountChangedNotification(Collections.
187807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                <AccountWithDataSet>emptyList()));
188558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
189558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // We show the notification here, and user clicked "keep local" and saved an contact.
190949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(AccountWithDataSet.getNullAccount());
191558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
192558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Now there are no accounts, and default account is null.
193558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
194558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // The user created another contact, but this we shouldn't show the notification.
195807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(Collections.
196807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                <AccountWithDataSet>emptyList()));
197558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
198558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
199807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Test
200131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki    public void testShouldShowAccountChangedNotification_sanity_check() {
201131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        // Prepare 1 account and save it as the default.
202949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mTarget.saveDefaultAccount(ACCOUNT_1_A);
203131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki
204131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        // Right after a save, the dialog shouldn't show up.
205807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(
206807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                Collections.singletonList(ACCOUNT_1_A)));
207131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki
208131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        // Remove the default account to emulate broken preferences.
209131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        mTarget.removeDefaultAccountForTest();
21063859fe784a843f4790f15603c767d4692e5be9bguanxiongliu
21163859fe784a843f4790f15603c767d4692e5be9bguanxiongliu        // The dialog shouldn't show up.
21263859fe784a843f4790f15603c767d4692e5be9bguanxiongliu        // The logic is, if there's a writable account, we'll pick it as default
213807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(
214807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott                Collections.singletonList(ACCOUNT_1_A)));
215131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki    }
216131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki
217807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    @Test
218807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    public void testShouldShowAccountChangedNotification_nullAccount() {
219807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        final List<AccountWithDataSet> currentAccounts = new ArrayList<>();
220807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        final AccountWithDataSet nullAccount = AccountWithDataSet.getNullAccount();
221807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        currentAccounts.add(nullAccount);
222807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott
223807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertTrue(mTarget.shouldShowAccountChangedNotification(currentAccounts));
224807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott
225807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        // User chooses to keep the "device" account as the default
226807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        mTarget.saveDefaultAccount(nullAccount);
227807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott
228807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        // Right after a save, the dialog shouldn't show up.
229807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        assertFalse(mTarget.shouldShowAccountChangedNotification(currentAccounts));
230558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
231558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
232558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private static class MockAccountType extends AccountType {
233558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        private boolean mAreContactsWritable;
234558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
235558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        public MockAccountType(String accountType, String dataSet, boolean areContactsWritable) {
236558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki            this.accountType = accountType;
237558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki            this.dataSet = dataSet;
238558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki            mAreContactsWritable = areContactsWritable;
239558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        }
240558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
241558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        @Override
242558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        public boolean areContactsWritable() {
243558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki            return mAreContactsWritable;
244558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        }
245558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
246558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        @Override
247558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        public boolean isGroupMembershipEditable() {
248558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki            return true;
249558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        }
250558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
251558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki}
252