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