ContactEditorUtils.java revision 949d4e88400761dac02992978f6b79997b5f0055
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
19558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.accounts.Account;
20558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.accounts.AccountManager;
21558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.app.Activity;
22558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.content.Context;
23558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.content.Intent;
24558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.text.TextUtils;
25558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
260d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.model.AccountTypeManager;
27428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountType;
28428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountWithDataSet;
29949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerottimport com.android.contacts.common.preference.ContactsPreferences;
30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.google.common.annotations.VisibleForTesting;
31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.google.common.collect.Sets;
32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
33558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport java.util.ArrayList;
34558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport java.util.List;
35558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport java.util.Set;
36558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
37558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki/**
38558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Utility methods for the "account changed" notification in the new contact creation flow.
39558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */
40558669dab4109afebd19eade1f95a396215fb44dMakoto Onukipublic class ContactEditorUtils {
41558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private static final String TAG = "ContactEditorUtils";
42558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
43949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    private final ContactsPreferences mContactsPrefs;
44558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private final AccountTypeManager mAccountTypes;
45558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
46558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private ContactEditorUtils(Context context) {
47558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        this(context, AccountTypeManager.getInstance(context));
48558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
49558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
50558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    @VisibleForTesting
51558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    ContactEditorUtils(Context context, AccountTypeManager accountTypes) {
52949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mContactsPrefs = new ContactsPreferences(context);
53558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        mAccountTypes = accountTypes;
54558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
55558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
56949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    public static ContactEditorUtils create(Context context) {
57949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        return new ContactEditorUtils(context.getApplicationContext());
58558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
59558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
60558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    void cleanupForTest() {
61949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mContactsPrefs.clearDefaultAccount();
62558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
63558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
64131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki    void removeDefaultAccountForTest() {
65949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mContactsPrefs.clearDefaultAccount();
66131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki    }
67131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki
68558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private List<AccountWithDataSet> getWritableAccounts() {
69558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        return mAccountTypes.getAccounts(true);
70558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
71558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
72558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
73949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * Saves the default account, which can later be obtained with {@link #getOnlyOrDefaultAccount}.
74558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
75558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * This should be called when saving a newly created contact.
76558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
77fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott     * @param defaultAccount the account used to save a newly created contact.
78558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
79949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    public void saveDefaultAccount(AccountWithDataSet defaultAccount) {
80fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        if (defaultAccount == null) {
81949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott            mContactsPrefs.clearDefaultAccount();
82131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        } else {
83949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott            mContactsPrefs.setDefaultAccount(defaultAccount);
84131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        }
85558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
86558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
87558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
88949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * @return the first account if there is only a single account or the default account saved
89949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * with {@link #saveDefaultAccount}.
90558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
91949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * A null return value indicates that there is multiple accounts and a default hasn't been set
92558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
93558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Also note that the returned account may have been removed already.
94558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
95949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    public AccountWithDataSet getOnlyOrDefaultAccount() {
964abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang        final List<AccountWithDataSet> currentWritableAccounts = getWritableAccounts();
974abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang        if (currentWritableAccounts.size() == 1) {
984abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang            return currentWritableAccounts.get(0);
994abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang        }
1004abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang
101949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        return mContactsPrefs.getDefaultAccount();
102558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
103558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
104558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public boolean shouldShowAccountChangedNotification() {
105949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        return mContactsPrefs.shouldShowAccountChangedNotification(getWritableAccounts());
106558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
107558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
108558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    @VisibleForTesting
109558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    String[] getWritableAccountTypeStrings() {
110558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        final Set<String> types = Sets.newHashSet();
111558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        for (AccountType type : mAccountTypes.getAccountTypes(true)) {
112558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki            types.add(type.accountType);
113558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        }
114558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        return types.toArray(new String[types.size()]);
115558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
116558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
117558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
118558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Create an {@link Intent} to start "add new account" setup wizard.  Selectable account
119558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * types will be limited to ones that supports editing contacts.
120558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
121558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Use {@link Activity#startActivityForResult} or
122558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * {@link android.app.Fragment#startActivityForResult} to start the wizard, and
123558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * {@link Activity#onActivityResult} or {@link android.app.Fragment#onActivityResult} to
124558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * get the result.
125558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
126558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public Intent createAddWritableAccountIntent() {
127558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        return AccountManager.newChooseAccountIntent(
128558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                null, // selectedAccount
129558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                new ArrayList<Account>(), // allowableAccounts
130558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                getWritableAccountTypeStrings(), // allowableAccountTypes
131558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                false, // alwaysPromptForAccount
132558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                null, // descriptionOverrideText
133558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                null, // addAccountAuthTokenType
134558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                null, // addAccountRequiredFeatures
135558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                null // addAccountOptions
136558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki                );
137558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
138558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
139558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
140558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Parses a result from {@link #createAddWritableAccountIntent} and returns the created
141558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * {@link Account}, or null if the user has canceled the wizard.  Pass the {@code resultCode}
142558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * and {@code data} parameters passed to {@link Activity#onActivityResult} or
143558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * {@link android.app.Fragment#onActivityResult}.
144558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
145558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Note although the return type is {@link AccountWithDataSet}, return values from this method
146558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * will never have {@link AccountWithDataSet#dataSet} set, as there's no way to create an
147558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * extension package account from setup wizard.
148558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
149558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public AccountWithDataSet getCreatedAccount(int resultCode, Intent resultData) {
150558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Javadoc doesn't say anything about resultCode but that the data intent will be non null
151558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // on success.
152558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        if (resultData == null) return null;
153558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
154558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        final String accountType = resultData.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
155558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        final String accountName = resultData.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
156558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
157558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Just in case
158558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        if (TextUtils.isEmpty(accountType) || TextUtils.isEmpty(accountName)) return null;
159558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
160558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        return new AccountWithDataSet(accountName, accountType, null);
161558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
162558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki}
163