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;
227b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jangimport android.content.ContentUris;
23558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.content.Context;
24558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.content.Intent;
257b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jangimport android.net.Uri;
26f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerottimport android.os.Bundle;
277b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jangimport android.provider.ContactsContract;
28558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport android.text.TextUtils;
29558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
3069c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountWithDataSet;
3169c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.preference.ContactsPreferences;
320a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai
33558669dab4109afebd19eade1f95a396215fb44dMakoto Onukiimport java.util.List;
34558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
35558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki/**
36558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki * Utility methods for the "account changed" notification in the new contact creation flow.
37558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki */
38558669dab4109afebd19eade1f95a396215fb44dMakoto Onukipublic class ContactEditorUtils {
39558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private static final String TAG = "ContactEditorUtils";
40558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
41949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    private final ContactsPreferences mContactsPrefs;
42558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
43558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    private ContactEditorUtils(Context context) {
44949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mContactsPrefs = new ContactsPreferences(context);
45558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
46558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
47949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    public static ContactEditorUtils create(Context context) {
48949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        return new ContactEditorUtils(context.getApplicationContext());
49558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
50558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
517b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang    /**
527b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     * Returns a legacy version of the given contactLookupUri if a legacy Uri was originally
537b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     * passed to the contact editor.
547b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     *
557b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     * @param contactLookupUri The Uri to possibly convert to legacy format.
567b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     * @param requestLookupUri The lookup Uri originally passed to the contact editor
577b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     *                         (via Intent data), may be null.
587b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang     */
597b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang    static Uri maybeConvertToLegacyLookupUri(Context context, Uri contactLookupUri,
607b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang            Uri requestLookupUri) {
617b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang        final String legacyAuthority = "contacts";
627b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang        final String requestAuthority = requestLookupUri == null
637b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang                ? null : requestLookupUri.getAuthority();
647b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang        if (legacyAuthority.equals(requestAuthority)) {
657b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang            // Build a legacy Uri if that is what was requested by caller
667b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang            final long contactId = ContentUris.parseId(ContactsContract.Contacts.lookupContact(
677b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang                    context.getContentResolver(), contactLookupUri));
687b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang            final Uri legacyContentUri = Uri.parse("content://contacts/people");
697b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang            return ContentUris.withAppendedId(legacyContentUri, contactId);
707b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang        }
717b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang        // Otherwise pass back a lookup-style Uri
727b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang        return contactLookupUri;
737b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang    }
747b0970fd1db1a97f1be915d66d07f4dc8499f96dWalter Jang
75558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    void cleanupForTest() {
76949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mContactsPrefs.clearDefaultAccount();
77558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
78558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
79131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki    void removeDefaultAccountForTest() {
80949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        mContactsPrefs.clearDefaultAccount();
81131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki    }
82131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki
83558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
84949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * Saves the default account, which can later be obtained with {@link #getOnlyOrDefaultAccount}.
85558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
86558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * This should be called when saving a newly created contact.
87558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
88fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott     * @param defaultAccount the account used to save a newly created contact.
89558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
90949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott    public void saveDefaultAccount(AccountWithDataSet defaultAccount) {
91fac695a36b227f5591eac064ded8e8dad3398400Marcus Hagerott        if (defaultAccount == null) {
92949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott            mContactsPrefs.clearDefaultAccount();
93131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        } else {
94949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott            mContactsPrefs.setDefaultAccount(defaultAccount);
95131e6ac666868645b48ae6932575d85751ff57c0Makoto Onuki        }
96558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
97558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
98558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
99949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * @return the first account if there is only a single account or the default account saved
100949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * with {@link #saveDefaultAccount}.
101558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
102949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott     * A null return value indicates that there is multiple accounts and a default hasn't been set
103558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
104558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Also note that the returned account may have been removed already.
105558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
106807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    public AccountWithDataSet getOnlyOrDefaultAccount(
107807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott            List<AccountWithDataSet> currentWritableAccounts) {
1084abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang        if (currentWritableAccounts.size() == 1) {
1094abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang            return currentWritableAccounts.get(0);
1104abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang        }
1114abdee91084b6ee89f1ef1a8b797a5a2e0272059Tingting Wang
112949d4e88400761dac02992978f6b79997b5f0055Marcus Hagerott        return mContactsPrefs.getDefaultAccount();
113558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
114558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
115807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    public boolean shouldShowAccountChangedNotification(List<AccountWithDataSet> writableAccounts) {
116807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott        return mContactsPrefs.shouldShowAccountChangedNotification(writableAccounts);
117558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
118558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
1193107b25dcaea54943c58f984084fa9b348ea1885Gary Mai    /**
1203107b25dcaea54943c58f984084fa9b348ea1885Gary Mai     * Sets the only non-device account to be default if it is not already.
1213107b25dcaea54943c58f984084fa9b348ea1885Gary Mai     */
122807e6208d6bc4ff1a6b0b4d8900229df27077246Marcus Hagerott    public void maybeUpdateDefaultAccount(List<AccountWithDataSet> currentWritableAccounts) {
1233107b25dcaea54943c58f984084fa9b348ea1885Gary Mai        if (currentWritableAccounts.size() == 1) {
1243107b25dcaea54943c58f984084fa9b348ea1885Gary Mai            final AccountWithDataSet onlyAccount = currentWritableAccounts.get(0);
1253107b25dcaea54943c58f984084fa9b348ea1885Gary Mai            if (!onlyAccount.isNullAccount()
1263107b25dcaea54943c58f984084fa9b348ea1885Gary Mai                    && !onlyAccount.equals(mContactsPrefs.getDefaultAccount())) {
1273107b25dcaea54943c58f984084fa9b348ea1885Gary Mai                mContactsPrefs.setDefaultAccount(onlyAccount);
1283107b25dcaea54943c58f984084fa9b348ea1885Gary Mai            }
1293107b25dcaea54943c58f984084fa9b348ea1885Gary Mai        }
1303107b25dcaea54943c58f984084fa9b348ea1885Gary Mai    }
1313107b25dcaea54943c58f984084fa9b348ea1885Gary Mai
132558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    /**
133f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * Parses a result from {@link AccountManager#newChooseAccountIntent(Account, List, String[],
134f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     *     String, String, String[], Bundle)} and returns the created {@link Account}, or null if
135f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * the user has canceled the wizard.
136558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
137f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * <p>Pass the {@code resultCode} and {@code data} parameters passed to
138f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * {@link Activity#onActivityResult} or {@link android.app.Fragment#onActivityResult}.
139f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * </p>
140558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     *
141f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * <p>
142558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * Note although the return type is {@link AccountWithDataSet}, return values from this method
143558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * will never have {@link AccountWithDataSet#dataSet} set, as there's no way to create an
144558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     * extension package account from setup wizard.
145f0e140aec2f5832a517243084bea626011be9c39Marcus Hagerott     * </p>
146558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki     */
147558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    public AccountWithDataSet getCreatedAccount(int resultCode, Intent resultData) {
148558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Javadoc doesn't say anything about resultCode but that the data intent will be non null
149558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // on success.
150558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        if (resultData == null) return null;
151558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
152558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        final String accountType = resultData.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
153558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        final String accountName = resultData.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
154558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
155558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        // Just in case
156558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        if (TextUtils.isEmpty(accountType) || TextUtils.isEmpty(accountName)) return null;
157558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki
158558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki        return new AccountWithDataSet(accountName, accountType, null);
159558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki    }
160558669dab4109afebd19eade1f95a396215fb44dMakoto Onuki}
161