ChooseTypeAndAccountActivity.java revision a77253a417e885f87280901a3519412262758412
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 391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.ArrayList; 401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.HashMap; 411121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.HashSet; 421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.Set; 431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 441121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana/** 451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * @hide 461121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 471121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanapublic class ChooseTypeAndAccountActivity extends Activity { 481121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static final String TAG = "AccountManager"; 491121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * A Parcelable ArrayList of Account objects that limits the choosable accounts to those 521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * in this list, if this parameter is supplied. 531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 541121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public static final String EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST = "allowableAccounts"; 551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * A Parcelable ArrayList of String objects that limits the accounts to choose to those 581121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * that match the types in this list, if this parameter is supplied. This list is also 591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * used to filter the allowable account types if add account is selected. 601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 61b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY = "allowableAccountTypes"; 621121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 631121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 64b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * This is passed as the addAccountOptions parameter in AccountManager.addAccount() 65b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * if it is called. 661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 671121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public static final String EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE = "addAccountOptions"; 681121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana /** 70b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * This is passed as the requiredFeatures parameter in AccountManager.addAccount() 71b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * if it is called. 72b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 73b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY = 74b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana "addAccountRequiredFeatures"; 75b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 76b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 77b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * This is passed as the authTokenType string in AccountManager.addAccount() 78b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * if it is called. 79b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 80b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING = "authTokenType"; 81b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 82b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 831121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * If set then the specified account is already "selected". 841121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */ 851121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public static final String EXTRA_SELECTED_ACCOUNT = "selectedAccount"; 861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 87b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 88b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * If true then display the account selection list even if there is just 89b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * one account to choose from. boolean. 90b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 91b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT = 92b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana "alwaysPromptForAccount"; 93b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 94b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana /** 95b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * If set then this string willb e used as the description rather than 96b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana * the default. 97b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana */ 98b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana public static final String EXTRA_DESCRIPTION_TEXT_OVERRIDE = 99b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana "descriptionTextOverride"; 100b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 1011121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private ArrayList<AccountInfo> mAccountInfos; 1021121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1031121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana @Override 1041121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public void onCreate(Bundle savedInstanceState) { 1051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana super.onCreate(savedInstanceState); 1061121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setContentView(R.layout.choose_type_and_account); 107b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 108b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // save some items we use frequently 1091121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final AccountManager accountManager = AccountManager.get(this); 110b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final Intent intent = getIntent(); 111b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 112b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // override the description text if supplied 113b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final String descriptionOverride = 114b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE); 115b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana if (!TextUtils.isEmpty(descriptionOverride)) { 116b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana ((TextView)findViewById(R.id.description)).setText(descriptionOverride); 117b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana } 118b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 119b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // If the selected account matches one in the list we will place a 120b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana // checkmark next to it. 121b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final Account selectedAccount = 122b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana (Account)intent.getParcelableExtra(EXTRA_SELECTED_ACCOUNT); 1231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1241121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // build an efficiently queryable map of account types to authenticator descriptions 1251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final HashMap<String, AuthenticatorDescription> typeToAuthDescription = 1261121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana new HashMap<String, AuthenticatorDescription>(); 1271121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for(AuthenticatorDescription desc : accountManager.getAuthenticatorTypes()) { 1281121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana typeToAuthDescription.put(desc.type, desc); 1291121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Read the validAccounts, if present, and add them to the setOfAllowableAccounts 1321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Set<Account> setOfAllowableAccounts = null; 1331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final ArrayList<Parcelable> validAccounts = 134b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.getParcelableArrayListExtra(EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST); 1351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (validAccounts != null) { 1361121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setOfAllowableAccounts = new HashSet<Account>(validAccounts.size()); 1371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for (Parcelable parcelable : validAccounts) { 1381121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setOfAllowableAccounts.add((Account)parcelable); 1391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1411121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes 1431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Set<String> setOfAllowableAccountTypes = null; 144a77253a417e885f87280901a3519412262758412Fred Quintana final String[] validAccountTypes = 145a77253a417e885f87280901a3519412262758412Fred Quintana intent.getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY); 1461121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (validAccountTypes != null) { 147a77253a417e885f87280901a3519412262758412Fred Quintana setOfAllowableAccountTypes = new HashSet<String>(validAccountTypes.length); 1481121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for (String type : validAccountTypes) { 1491121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setOfAllowableAccountTypes.add(type); 1501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Create a list of AccountInfo objects for each account that is allowable. Filter out 1541121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // accounts that don't match the allowable types, if provided, or that don't match the 1551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // allowable accounts, if provided. 1561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Account[] accounts = accountManager.getAccounts(); 1571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mAccountInfos = new ArrayList<AccountInfo>(accounts.length); 1581121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana for (Account account : accounts) { 1591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (setOfAllowableAccounts != null 1601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana && !setOfAllowableAccounts.contains(account)) { 1611121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana continue; 1621121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1631121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (setOfAllowableAccountTypes != null 1641121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana && !setOfAllowableAccountTypes.contains(account.type)) { 1651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana continue; 1661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1671121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mAccountInfos.add(new AccountInfo(account, 168b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana getDrawableForType(typeToAuthDescription, account.type), 169b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana account.equals(selectedAccount))); 1701121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1711121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1721121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // If there are no allowable accounts go directly to add account 1731121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (mAccountInfos.isEmpty()) { 1741121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana startChooseAccountTypeActivity(); 1751121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return; 1761121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1771121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1781121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // if there is only one allowable account return it 179b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false) 180b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana && mAccountInfos.size() == 1) { 1811121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Account account = mAccountInfos.get(0).account; 1821121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResultAndFinish(account.name, account.type); 1831121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return; 1841121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1851121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // there is more than one allowable account. initialize the list adapter to allow 1871121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // the user to select an account. 1881121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ListView list = (ListView) findViewById(android.R.id.list); 1891121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana list.setAdapter(new AccountArrayAdapter(this, 1901121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana android.R.layout.simple_list_item_1, mAccountInfos)); 1911121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 1921121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 1931121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 1941121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana onListItemClick((ListView)parent, v, position, id); 1951121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 1961121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana }); 1971121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 1981121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // set the listener for the addAccount button 1991121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Button addAccountButton = (Button) findViewById(R.id.addAccount); 2001121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana addAccountButton.setOnClickListener(new View.OnClickListener() { 2011121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public void onClick(final View v) { 2021121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana startChooseAccountTypeActivity(); 2031121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2041121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana }); 2051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2061121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2071121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Called when the choose account type activity (for adding an account) returns. 2081121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // If it was a success read the account and set it in the result. In all cases 2091121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // return the result and finish this activity. 2101121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana @Override 2111121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana protected void onActivityResult(final int requestCode, final int resultCode, 2121121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Intent data) { 2131121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (resultCode == RESULT_OK && data != null) { 2141121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 2151121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE); 2161121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (accountName != null && accountType != null) { 2171121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResultAndFinish(accountName, accountType); 2181121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return; 2191121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 221b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana Log.d(TAG, "ChooseTypeAndAccountActivity.onActivityResult: canceled"); 2221121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResult(Activity.RESULT_CANCELED); 2231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana finish(); 2241121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 226b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana 2271121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private Drawable getDrawableForType( 2281121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final HashMap<String, AuthenticatorDescription> typeToAuthDescription, 2291121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana String accountType) { 2301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Drawable icon = null; 2311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (typeToAuthDescription.containsKey(accountType)) { 2321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana try { 2331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana AuthenticatorDescription desc = typeToAuthDescription.get(accountType); 2341121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Context authContext = createPackageContext(desc.packageName, 0); 2351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana icon = authContext.getResources().getDrawable(desc.iconId); 2361121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } catch (PackageManager.NameNotFoundException e) { 2371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Nothing we can do much here, just log 2381121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (Log.isLoggable(TAG, Log.WARN)) { 2391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Log.w(TAG, "No icon name for account type " + accountType); 2401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2411121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } catch (Resources.NotFoundException e) { 2421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana // Nothing we can do much here, just log 2431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (Log.isLoggable(TAG, Log.WARN)) { 2441121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Log.w(TAG, "No icon resource for account type " + accountType); 2451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2461121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2471121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2481121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return icon; 2491121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana protected void onListItemClick(ListView l, View v, int position, long id) { 2521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana AccountInfo accountInfo = mAccountInfos.get(position); 2531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Log.d(TAG, "selected account " + accountInfo.account); 2541121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResultAndFinish(accountInfo.account.name, accountInfo.account.type); 2551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private void setResultAndFinish(final String accountName, final String accountType) { 2581121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Bundle bundle = new Bundle(); 2591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName); 2601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType); 2611121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana setResult(Activity.RESULT_OK, new Intent().putExtras(bundle)); 262b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana Log.d(TAG, "ChooseTypeAndAccountActivity.setResultAndFinish: " 263b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana + "selected account " + accountName + ", " + accountType); 2641121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana finish(); 2651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2671121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private void startChooseAccountTypeActivity() { 2681121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Intent intent = new Intent(this, ChooseAccountTypeActivity.class); 269a77253a417e885f87280901a3519412262758412Fred Quintana intent.putExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY, 270a77253a417e885f87280901a3519412262758412Fred Quintana getIntent().getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY)); 2711121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana intent.putExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE, 272b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana getIntent().getBundleExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE)); 273b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.putExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY, 274b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana getIntent().getStringArrayExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY)); 275b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana intent.putExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING, 276a77253a417e885f87280901a3519412262758412Fred Quintana getIntent().getStringExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING)); 2771121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana startActivityForResult(intent, 0); 2781121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2791121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2801121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static class AccountInfo { 2811121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Account account; 2821121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana final Drawable drawable; 283b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana private final boolean checked; 2841121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 285b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana AccountInfo(Account account, Drawable drawable, boolean checked) { 2861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana this.account = account; 2871121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana this.drawable = drawable; 288b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana this.checked = checked; 2891121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2901121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2911121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2921121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static class ViewHolder { 2931121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ImageView icon; 2941121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana TextView text; 295b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana ImageView checkmark; 2961121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 2971121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 2981121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> { 2991121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private LayoutInflater mLayoutInflater; 3001121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana private ArrayList<AccountInfo> mInfos; 3011121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3021121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public AccountArrayAdapter(Context context, int textViewResourceId, 3031121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ArrayList<AccountInfo> infos) { 3041121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana super(context, textViewResourceId, infos); 3051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mInfos = infos; 3061121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana mLayoutInflater = (LayoutInflater) context.getSystemService( 3071121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana Context.LAYOUT_INFLATER_SERVICE); 3081121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3091121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3101121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana @Override 3111121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana public View getView(int position, View convertView, ViewGroup parent) { 3121121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana ViewHolder holder; 3131121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3141121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana if (convertView == null) { 315b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana convertView = mLayoutInflater.inflate(R.layout.choose_selected_account_row, null); 3161121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder = new ViewHolder(); 3171121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.text = (TextView) convertView.findViewById(R.id.account_row_text); 3181121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon); 319b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana holder.checkmark = (ImageView) convertView.findViewById(R.id.account_row_checkmark); 3201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana convertView.setTag(holder); 3211121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } else { 3221121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder = (ViewHolder) convertView.getTag(); 3231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3241121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana 3251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.text.setText(mInfos.get(position).account.name); 3261121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana holder.icon.setImageDrawable(mInfos.get(position).drawable); 327b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana final int displayCheckmark = 328b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana mInfos.get(position).checked ? View.VISIBLE : View.INVISIBLE; 329b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana holder.checkmark.setVisibility(displayCheckmark); 3301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana return convertView; 3311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana } 3331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana} 334