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