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