ChooseTypeAndAccountActivity.java revision 9bbdd0bf5006512a000b0d3e6bd6ee2998a2e48b
11121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana/* 21121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * Copyright (C) 2011 The Android Open Source Project 31121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * 41121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License"); 51121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * you may not use this file except in compliance with the License. 61121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * You may obtain a copy of the License at 71121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * 81121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * http://www.apache.org/licenses/LICENSE-2.0 91121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * 101121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * Unless required by applicable law or agreed to in writing, software 111121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS, 121121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * See the License for the specific language governing permissions and 141121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * limitations under the License. 151121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 161121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanapackage android.accounts; 171121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 181121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.app.Activity; 191121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.content.Context; 201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.content.Intent; 211121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.content.pm.PackageManager; 221121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.content.res.Resources; 231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.graphics.drawable.Drawable; 241121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.os.Bundle; 251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.os.Parcelable; 26b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintanaimport android.text.TextUtils; 271121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.util.Log; 281121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.view.LayoutInflater; 291121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.view.View; 301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.view.ViewGroup; 311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.AdapterView; 321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.ArrayAdapter; 331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.Button; 341121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.ImageView; 351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.ListView; 361121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.TextView; 371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport com.android.internal.R; 381121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 399bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintanaimport java.io.IOException; 401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.ArrayList; 411121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.HashMap; 421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.HashSet; 431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.Set; 441121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana/** 461121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * @hide 471121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 489bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintanapublic class ChooseTypeAndAccountActivity extends Activity 499bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana implements AccountManagerCallback<Bundle> { 501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static final String TAG = "AccountManager"; 511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * A Parcelable ArrayList of Account objects that limits the choosable accounts to those 541121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * in this list, if this parameter is supplied. 551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public static final String EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST = "allowableAccounts"; 571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 581121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * A Parcelable ArrayList of String objects that limits the accounts to choose to those 601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * that match the types in this list, if this parameter is supplied. This list is also 611121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * used to filter the allowable account types if add account is selected. 621121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 63b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY = "allowableAccountTypes"; 641121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 66b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * This is passed as the addAccountOptions parameter in AccountManager.addAccount() 67b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * if it is called. 681121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public static final String EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE = "addAccountOptions"; 701121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 711121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 72b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * This is passed as the requiredFeatures parameter in AccountManager.addAccount() 73b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * if it is called. 74b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 75b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY = 76b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana "addAccountRequiredFeatures"; 77b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 78b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 79b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * This is passed as the authTokenType string in AccountManager.addAccount() 80b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * if it is called. 81b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 82b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING = "authTokenType"; 83b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 84b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 851121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * If set then the specified account is already "selected". 861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 871121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public static final String EXTRA_SELECTED_ACCOUNT = "selectedAccount"; 881121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 89b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 90b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * If true then display the account selection list even if there is just 91b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * one account to choose from. boolean. 92b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 93b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT = 94b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana "alwaysPromptForAccount"; 95b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 96b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 97b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * If set then this string willb e used as the description rather than 98b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * the default. 99b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 100b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_DESCRIPTION_TEXT_OVERRIDE = 101b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana "descriptionTextOverride"; 102b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 1031121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private ArrayList<AccountInfo> mAccountInfos; 1041121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana @Override 1061121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public void onCreate(Bundle savedInstanceState) { 1071121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana super.onCreate(savedInstanceState); 1081121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setContentView(R.layout.choose_type_and_account); 109b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 110b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // save some items we use frequently 1111121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final AccountManager accountManager = AccountManager.get(this); 112b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final Intent intent = getIntent(); 113b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 114b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // override the description text if supplied 115b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final String descriptionOverride = 116b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE); 117b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana if (!TextUtils.isEmpty(descriptionOverride)) { 118b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana ((TextView)findViewById(R.id.description)).setText(descriptionOverride); 119b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana } 120b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 121b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // If the selected account matches one in the list we will place a 122b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // checkmark next to it. 123b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final Account selectedAccount = 124b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana (Account)intent.getParcelableExtra(EXTRA_SELECTED_ACCOUNT); 1251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1261121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // build an efficiently queryable map of account types to authenticator descriptions 1271121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final HashMap<String, AuthenticatorDescription> typeToAuthDescription = 1281121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana new HashMap<String, AuthenticatorDescription>(); 1291121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for(AuthenticatorDescription desc : accountManager.getAuthenticatorTypes()) { 1301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana typeToAuthDescription.put(desc.type, desc); 1311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Read the validAccounts, if present, and add them to the setOfAllowableAccounts 1341121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Set<Account> setOfAllowableAccounts = null; 1351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final ArrayList<Parcelable> validAccounts = 136b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.getParcelableArrayListExtra(EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST); 1371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (validAccounts != null) { 1381121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setOfAllowableAccounts = new HashSet<Account>(validAccounts.size()); 1391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for (Parcelable parcelable : validAccounts) { 1401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setOfAllowableAccounts.add((Account)parcelable); 1411121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1441121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes 1451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Set<String> setOfAllowableAccountTypes = null; 146a77253a417e885f87280901a3519412262758412Fred Quintana final String[] validAccountTypes = 147a77253a417e885f87280901a3519412262758412Fred Quintana intent.getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY); 1481121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (validAccountTypes != null) { 149a77253a417e885f87280901a3519412262758412Fred Quintana setOfAllowableAccountTypes = new HashSet<String>(validAccountTypes.length); 1501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for (String type : validAccountTypes) { 1511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setOfAllowableAccountTypes.add(type); 1521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1541121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Create a list of AccountInfo objects for each account that is allowable. Filter out 1561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // accounts that don't match the allowable types, if provided, or that don't match the 1571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // allowable accounts, if provided. 1581121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Account[] accounts = accountManager.getAccounts(); 1591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mAccountInfos = new ArrayList<AccountInfo>(accounts.length); 1601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for (Account account : accounts) { 1611121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (setOfAllowableAccounts != null 1621121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana && !setOfAllowableAccounts.contains(account)) { 1631121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana continue; 1641121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (setOfAllowableAccountTypes != null 1661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana && !setOfAllowableAccountTypes.contains(account.type)) { 1671121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana continue; 1681121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mAccountInfos.add(new AccountInfo(account, 170b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana getDrawableForType(typeToAuthDescription, account.type), 171b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana account.equals(selectedAccount))); 1721121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1731121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1741121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // If there are no allowable accounts go directly to add account 1751121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (mAccountInfos.isEmpty()) { 1761121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana startChooseAccountTypeActivity(); 1771121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return; 1781121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1791121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1801121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // if there is only one allowable account return it 181b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false) 182b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana && mAccountInfos.size() == 1) { 1831121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Account account = mAccountInfos.get(0).account; 1841121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResultAndFinish(account.name, account.type); 1851121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return; 1861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1871121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1881121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // there is more than one allowable account. initialize the list adapter to allow 1891121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // the user to select an account. 1901121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ListView list = (ListView) findViewById(android.R.id.list); 1911121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana list.setAdapter(new AccountArrayAdapter(this, 1921121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana android.R.layout.simple_list_item_1, mAccountInfos)); 1931121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 1941121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 1951121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 1961121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana onListItemClick((ListView)parent, v, position, id); 1971121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1981121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana }); 1991121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2001121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // set the listener for the addAccount button 2011121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Button addAccountButton = (Button) findViewById(R.id.addAccount); 2021121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana addAccountButton.setOnClickListener(new View.OnClickListener() { 2031121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public void onClick(final View v) { 2041121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana startChooseAccountTypeActivity(); 2051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2061121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana }); 2071121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2081121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2091121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Called when the choose account type activity (for adding an account) returns. 2101121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // If it was a success read the account and set it in the result. In all cases 2111121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // return the result and finish this activity. 2121121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana @Override 2131121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana protected void onActivityResult(final int requestCode, final int resultCode, 2141121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Intent data) { 2151121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (resultCode == RESULT_OK && data != null) { 2161121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE); 2179bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana if (accountType != null) { 2189bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana runAddAccountForAuthenticator(accountType); 2191121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return; 2201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2211121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 222b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana Log.d(TAG, "ChooseTypeAndAccountActivity.onActivityResult: canceled"); 2231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResult(Activity.RESULT_CANCELED); 2241121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana finish(); 2251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2261121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2279bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana protected void runAddAccountForAuthenticator(String type) { 2289bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana Log.d(TAG, "selected account type " + type); 2299bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final Bundle options = getIntent().getBundleExtra( 2309bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE); 2319bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final String[] requiredFeatures = getIntent().getStringArrayExtra( 2329bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY); 2339bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final String authTokenType = getIntent().getStringExtra( 2349bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING); 2359bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana AccountManager.get(this).addAccount(type, authTokenType, requiredFeatures, 2369bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana options, this, this, null /* Handler */); 2379bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } 2389bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana 2399bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana public void run(final AccountManagerFuture<Bundle> accountManagerFuture) { 2409bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana try { 2419bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final Bundle accountManagerResult = accountManagerFuture.getResult(); 2429bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final String name = accountManagerResult.getString(AccountManager.KEY_ACCOUNT_NAME); 2439bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final String type = accountManagerResult.getString(AccountManager.KEY_ACCOUNT_TYPE); 2449bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana if (name != null && type != null) { 2459bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana final Bundle bundle = new Bundle(); 2469bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_NAME, name); 2479bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, type); 2489bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana setResult(Activity.RESULT_OK, new Intent().putExtras(bundle)); 2499bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana finish(); 2509bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana return; 2519bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } 2529bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } catch (OperationCanceledException e) { 2539bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana setResult(Activity.RESULT_CANCELED); 2549bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana finish(); 2559bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana return; 2569bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } catch (IOException e) { 2579bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } catch (AuthenticatorException e) { 2589bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } 2599bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana Bundle bundle = new Bundle(); 2609bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error communicating with server"); 2619bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana setResult(Activity.RESULT_OK, new Intent().putExtras(bundle)); 2629bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana finish(); 2639bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana } 264b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 2651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private Drawable getDrawableForType( 2661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final HashMap<String, AuthenticatorDescription> typeToAuthDescription, 2671121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana String accountType) { 2681121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Drawable icon = null; 2691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (typeToAuthDescription.containsKey(accountType)) { 2701121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana try { 2711121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana AuthenticatorDescription desc = typeToAuthDescription.get(accountType); 2721121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Context authContext = createPackageContext(desc.packageName, 0); 2731121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana icon = authContext.getResources().getDrawable(desc.iconId); 2741121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } catch (PackageManager.NameNotFoundException e) { 2751121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Nothing we can do much here, just log 2761121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (Log.isLoggable(TAG, Log.WARN)) { 2771121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Log.w(TAG, "No icon name for account type " + accountType); 2781121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2791121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } catch (Resources.NotFoundException e) { 2801121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Nothing we can do much here, just log 2811121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (Log.isLoggable(TAG, Log.WARN)) { 2821121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Log.w(TAG, "No icon resource for account type " + accountType); 2831121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2841121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2851121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return icon; 2871121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2881121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2891121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana protected void onListItemClick(ListView l, View v, int position, long id) { 2901121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana AccountInfo accountInfo = mAccountInfos.get(position); 2911121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Log.d(TAG, "selected account " + accountInfo.account); 2921121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResultAndFinish(accountInfo.account.name, accountInfo.account.type); 2931121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2941121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2951121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private void setResultAndFinish(final String accountName, final String accountType) { 2961121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Bundle bundle = new Bundle(); 2971121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName); 2981121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType); 2991121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResult(Activity.RESULT_OK, new Intent().putExtras(bundle)); 300b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana Log.d(TAG, "ChooseTypeAndAccountActivity.setResultAndFinish: " 301b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana + "selected account " + accountName + ", " + accountType); 3021121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana finish(); 3031121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3041121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private void startChooseAccountTypeActivity() { 3061121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Intent intent = new Intent(this, ChooseAccountTypeActivity.class); 3079bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 308a77253a417e885f87280901a3519412262758412Fred Quintana intent.putExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY, 309a77253a417e885f87280901a3519412262758412Fred Quintana getIntent().getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY)); 3101121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana intent.putExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE, 311b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana getIntent().getBundleExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE)); 312b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.putExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY, 313b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana getIntent().getStringArrayExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY)); 314b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.putExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING, 315a77253a417e885f87280901a3519412262758412Fred Quintana getIntent().getStringExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING)); 3161121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana startActivityForResult(intent, 0); 3171121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3181121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3191121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static class AccountInfo { 3201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Account account; 3211121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Drawable drawable; 322b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana private final boolean checked; 3231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 324b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana AccountInfo(Account account, Drawable drawable, boolean checked) { 3251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana this.account = account; 3261121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana this.drawable = drawable; 327b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana this.checked = checked; 3281121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3291121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static class ViewHolder { 3321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ImageView icon; 3331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana TextView text; 334b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana ImageView checkmark; 3351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3361121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> { 3381121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private LayoutInflater mLayoutInflater; 3391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private ArrayList<AccountInfo> mInfos; 3401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3411121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public AccountArrayAdapter(Context context, int textViewResourceId, 3421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ArrayList<AccountInfo> infos) { 3431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana super(context, textViewResourceId, infos); 3441121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mInfos = infos; 3451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mLayoutInflater = (LayoutInflater) context.getSystemService( 3461121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Context.LAYOUT_INFLATER_SERVICE); 3471121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3481121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3491121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana @Override 3501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public View getView(int position, View convertView, ViewGroup parent) { 3511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ViewHolder holder; 3521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (convertView == null) { 354b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana convertView = mLayoutInflater.inflate(R.layout.choose_selected_account_row, null); 3551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder = new ViewHolder(); 3561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.text = (TextView) convertView.findViewById(R.id.account_row_text); 3571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon); 358b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana holder.checkmark = (ImageView) convertView.findViewById(R.id.account_row_checkmark); 3591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana convertView.setTag(holder); 3601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } else { 3611121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder = (ViewHolder) convertView.getTag(); 3621121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3631121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3641121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.text.setText(mInfos.get(position).account.name); 3651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.icon.setImageDrawable(mInfos.get(position).drawable); 366b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final int displayCheckmark = 367b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana mInfos.get(position).checked ? View.VISIBLE : View.INVISIBLE; 368b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana holder.checkmark.setVisibility(displayCheckmark); 3691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return convertView; 3701121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3711121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3721121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana} 373