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