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
188d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhiaimport com.google.android.collect.Sets;
198d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.app.Activity;
2127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasaniimport android.app.ActivityManagerNative;
221121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.content.Intent;
231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.os.Bundle;
2427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasaniimport android.os.IBinder;
251121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.os.Parcelable;
2627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasaniimport android.os.RemoteException;
2727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasaniimport android.os.UserHandle;
2827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasaniimport android.os.UserManager;
29b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintanaimport android.text.TextUtils;
301121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.util.Log;
311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.view.View;
325a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasaniimport android.view.Window;
331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.AdapterView;
341121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.ArrayAdapter;
351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.Button;
361121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.ListView;
371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport android.widget.TextView;
38727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport com.android.internal.R;
401121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
419bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintanaimport java.io.IOException;
421121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.ArrayList;
431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.HashSet;
441121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintanaimport java.util.Set;
451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
461121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana/**
471121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana * @hide
481121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana */
499bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintanapublic class ChooseTypeAndAccountActivity extends Activity
509bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        implements AccountManagerCallback<Bundle> {
51e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private static final String TAG = "AccountChooser";
521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    /**
541121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     * A Parcelable ArrayList of Account objects that limits the choosable accounts to those
551121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     * in this list, if this parameter is supplied.
561121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     */
571121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    public static final String EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST = "allowableAccounts";
581121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
591121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    /**
601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     * A Parcelable ArrayList of String objects that limits the accounts to choose to those
611121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     * that match the types in this list, if this parameter is supplied. This list is also
621121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     * used to filter the allowable account types if add account is selected.
631121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     */
64b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    public static final String EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY = "allowableAccountTypes";
651121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    /**
67b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * This is passed as the addAccountOptions parameter in AccountManager.addAccount()
68b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * if it is called.
691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     */
701121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    public static final String EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE = "addAccountOptions";
711121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
721121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    /**
73b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * This is passed as the requiredFeatures parameter in AccountManager.addAccount()
74b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * if it is called.
75b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     */
7601df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana    public static final String EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY =
77b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana            "addAccountRequiredFeatures";
78b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
79b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    /**
80b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * This is passed as the authTokenType string in AccountManager.addAccount()
81b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * if it is called.
82b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     */
83b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    public static final String EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING = "authTokenType";
84b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
85b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    /**
861121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     * If set then the specified account is already "selected".
871121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana     */
881121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    public static final String EXTRA_SELECTED_ACCOUNT = "selectedAccount";
891121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
90b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    /**
91b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * If true then display the account selection list even if there is just
92b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * one account to choose from. boolean.
93b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     */
94b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    public static final String EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT =
95b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana            "alwaysPromptForAccount";
96b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
97b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    /**
98b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * If set then this string willb e used as the description rather than
99b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * the default.
100b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     */
101b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    public static final String EXTRA_DESCRIPTION_TEXT_OVERRIDE =
102b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana            "descriptionTextOverride";
103b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
104e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    public static final int REQUEST_NULL = 0;
105e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    public static final int REQUEST_CHOOSE_TYPE = 1;
106e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    public static final int REQUEST_ADD_ACCOUNT = 2;
107e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
108e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private static final String KEY_INSTANCE_STATE_PENDING_REQUEST = "pendingRequest";
109e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private static final String KEY_INSTANCE_STATE_EXISTING_ACCOUNTS = "existingAccounts";
110727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private static final String KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME = "selectedAccountName";
111727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private static final String KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT = "selectedAddAccount";
1121b64c9d31536ec8b4a89b1b05bf493b50a2a6c4eCarlos Valdivia    private static final String KEY_INSTANCE_STATE_ACCOUNT_LIST = "accountList";
113727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
114727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private static final int SELECTED_ITEM_NONE = -1;
115e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
1168d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<Account> mSetOfAllowableAccounts;
1178d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<String> mSetOfRelevantAccountTypes;
1188d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private String mSelectedAccountName = null;
1198d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private boolean mSelectedAddNewAccount = false;
1208d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private boolean mAlwaysPromptForAccount = false;
1218d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private String mDescriptionOverride;
1228d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
123727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private ArrayList<Account> mAccounts;
124e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private int mPendingRequest = REQUEST_NULL;
125e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private Parcelable[] mExistingAccounts = null;
126727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private int mSelectedItemIndex;
127727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private Button mOkButton;
12827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani    private int mCallingUid;
12927db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani    private String mCallingPackage;
13027db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani    private boolean mDisallowAddAccounts;
1315a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani    private boolean mDontShowPicker;
1321121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
1331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    @Override
1341121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    public void onCreate(Bundle savedInstanceState) {
1351121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        super.onCreate(savedInstanceState);
136e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
137e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onCreate(savedInstanceState="
138e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + savedInstanceState + ")");
139e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
140e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
14127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        String message = null;
14227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani
14327db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        try {
14427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            IBinder activityToken = getActivityToken();
14527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            mCallingUid = ActivityManagerNative.getDefault().getLaunchedFromUid(activityToken);
14627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            mCallingPackage = ActivityManagerNative.getDefault().getLaunchedFromPackage(
14727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                    activityToken);
14827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            if (mCallingUid != 0 && mCallingPackage != null) {
14927db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                Bundle restrictions = UserManager.get(this)
15027db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                        .getUserRestrictions(new UserHandle(UserHandle.getUserId(mCallingUid)));
15127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                mDisallowAddAccounts =
15227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                        restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false);
15327db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            }
15427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        } catch (RemoteException re) {
15527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            // Couldn't figure out caller details
15627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            Log.w(getClass().getSimpleName(), "Unable to get caller identity \n" + re);
15727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        }
15827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani
159727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        // save some items we use frequently
160727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        final Intent intent = getIntent();
161727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
162e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (savedInstanceState != null) {
163e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            mPendingRequest = savedInstanceState.getInt(KEY_INSTANCE_STATE_PENDING_REQUEST);
16401df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana            mExistingAccounts =
165e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    savedInstanceState.getParcelableArray(KEY_INSTANCE_STATE_EXISTING_ACCOUNTS);
166727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
167727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // Makes sure that any user selection is preserved across orientation changes.
1688d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            mSelectedAccountName = savedInstanceState.getString(
169727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                    KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME);
170727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
1718d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            mSelectedAddNewAccount = savedInstanceState.getBoolean(
172727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                    KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
1731b64c9d31536ec8b4a89b1b05bf493b50a2a6c4eCarlos Valdivia            mAccounts = savedInstanceState.getParcelableArrayList(KEY_INSTANCE_STATE_ACCOUNT_LIST);
174e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        } else {
175e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            mPendingRequest = REQUEST_NULL;
176e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            mExistingAccounts = null;
177727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // If the selected account as specified in the intent matches one in the list we will
178727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // show is as pre-selected.
179727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            Account selectedAccount = (Account) intent.getParcelableExtra(EXTRA_SELECTED_ACCOUNT);
180727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (selectedAccount != null) {
1818d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                mSelectedAccountName = selectedAccount.name;
182727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            }
183e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
184e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
185727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        if (Log.isLoggable(TAG, Log.VERBOSE)) {
1868d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            Log.v(TAG, "selected account name is " + mSelectedAccountName);
187b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana        }
188b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
1891121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
1908d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mSetOfAllowableAccounts = getAllowableAccountSet(intent);
1918d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mSetOfRelevantAccountTypes = getReleventAccountTypes(intent);
1928d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mAlwaysPromptForAccount = intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false);
1938d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mDescriptionOverride = intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE);
1945a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani
1955a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        // Need to do this once here to request the window feature. Can't do it in onResume
1965a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        mAccounts = getAcceptableAccountChoices(AccountManager.get(this));
1975a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        if (mAccounts.isEmpty()
1985a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani                && mDisallowAddAccounts) {
1995a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani            requestWindowFeature(Window.FEATURE_NO_TITLE);
2005a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani            setContentView(R.layout.app_not_authorized);
2015a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani            mDontShowPicker = true;
2025a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        }
2038d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
204cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia
2058d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    @Override
2068d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    protected void onResume() {
2078d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        super.onResume();
2085a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani
2095a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        if (mDontShowPicker) return;
2105a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani
2118d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        final AccountManager accountManager = AccountManager.get(this);
2121121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
2138d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mAccounts = getAcceptableAccountChoices(accountManager);
2141121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
2158d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // In cases where the activity does not need to show an account picker, cut the chase
2168d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // and return the result directly. Eg:
2178d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // Single account -> select it directly
2188d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // No account -> launch add account activity directly
219cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia        if (mPendingRequest == REQUEST_NULL) {
220727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // If there are no relevant accounts and only one relevant account type go directly to
221cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia            // add account. Otherwise let the user choose.
222727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (mAccounts.isEmpty()) {
2238d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                if (mSetOfRelevantAccountTypes.size() == 1) {
2248d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                    runAddAccountForAuthenticator(mSetOfRelevantAccountTypes.iterator().next());
225cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                } else {
226cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                    startChooseAccountTypeActivity();
227cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                }
228cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                return;
229cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia            }
230cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia
231cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia            // if there is only one allowable account return it
2328d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            if (!mAlwaysPromptForAccount && mAccounts.size() == 1) {
233727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                Account account = mAccounts.get(0);
234cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                setResultAndFinish(account.name, account.type);
235cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                return;
236cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia            }
237cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia        }
238cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia
2398d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        String[] listItems = getListOfDisplayableOptions(mAccounts);
2408d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mSelectedItemIndex = getItemIndexToSelect(
2418d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            mAccounts, mSelectedAccountName, mSelectedAddNewAccount);
2428d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
243727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        // Cannot set content view until we know that mPendingRequest is not null, otherwise
244727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        // would cause screen flicker.
245cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia        setContentView(R.layout.choose_type_and_account);
2468d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        overrideDescriptionIfSupplied(mDescriptionOverride);
2478d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        populateUIAccountList(listItems);
2486cab5e823a0053c60576c65cd307c865512eac38Alice Yang
2496cab5e823a0053c60576c65cd307c865512eac38Alice Yang        // Only enable "OK" button if something has been selected.
2506cab5e823a0053c60576c65cd307c865512eac38Alice Yang        mOkButton = (Button) findViewById(android.R.id.button2);
2516cab5e823a0053c60576c65cd307c865512eac38Alice Yang        mOkButton.setEnabled(mSelectedItemIndex != SELECTED_ITEM_NONE);
252e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    }
253e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
254e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    @Override
255e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    protected void onDestroy() {
256e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
257e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onDestroy()");
258e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
259e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        super.onDestroy();
260e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    }
261e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
262e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    @Override
263e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    protected void onSaveInstanceState(final Bundle outState) {
264e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        super.onSaveInstanceState(outState);
265e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        outState.putInt(KEY_INSTANCE_STATE_PENDING_REQUEST, mPendingRequest);
26601df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana        if (mPendingRequest == REQUEST_ADD_ACCOUNT) {
26701df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana            outState.putParcelableArray(KEY_INSTANCE_STATE_EXISTING_ACCOUNTS, mExistingAccounts);
26801df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana        }
269727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
270727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (mSelectedItemIndex == mAccounts.size()) {
271727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                outState.putBoolean(KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, true);
272727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            } else {
273727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                outState.putBoolean(KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
274727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                outState.putString(KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME,
275727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                        mAccounts.get(mSelectedItemIndex).name);
276727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            }
277727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        }
2781b64c9d31536ec8b4a89b1b05bf493b50a2a6c4eCarlos Valdivia        outState.putParcelableArrayList(KEY_INSTANCE_STATE_ACCOUNT_LIST, mAccounts);
279727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    }
280727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
281727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    public void onCancelButtonClicked(View view) {
282727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        onBackPressed();
283727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    }
284727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
285727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    public void onOkButtonClicked(View view) {
286727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        if (mSelectedItemIndex == mAccounts.size()) {
287727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // Selected "Add New Account" option
288727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            startChooseAccountTypeActivity();
289727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        } else if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
290727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            onAccountSelected(mAccounts.get(mSelectedItemIndex));
291727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        }
2921121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
2931121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
2941121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    // Called when the choose account type activity (for adding an account) returns.
2951121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    // If it was a success read the account and set it in the result. In all cases
2961121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    // return the result and finish this activity.
2971121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    @Override
2981121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    protected void onActivityResult(final int requestCode, final int resultCode,
2991121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana            final Intent data) {
300e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
301e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            if (data != null && data.getExtras() != null) data.getExtras().keySet();
302e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Bundle extras = data != null ? data.getExtras() : null;
303e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onActivityResult(reqCode=" + requestCode
304e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + ", resCode=" + resultCode + ", extras=" + extras + ")");
305e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
306e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
307e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        // we got our result, so clear the fact that we had a pending request
308e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        mPendingRequest = REQUEST_NULL;
309e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
310e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (resultCode == RESULT_CANCELED) {
311727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // if canceling out of addAccount and the original state caused us to skip this,
3122becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana            // finish this activity
313727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (mAccounts.isEmpty()) {
3142becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana                setResult(Activity.RESULT_CANCELED);
3152becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana                finish();
3162becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana            }
317e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            return;
318e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
319e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
320e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (resultCode == RESULT_OK) {
321e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            if (requestCode == REQUEST_CHOOSE_TYPE) {
322e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (data != null) {
323e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
324e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    if (accountType != null) {
325e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        runAddAccountForAuthenticator(accountType);
326e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        return;
327e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    }
328e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
329e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                Log.d(TAG, "ChooseTypeAndAccountActivity.onActivityResult: unable to find account "
330e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        + "type, pretending the request was canceled");
331e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            } else if (requestCode == REQUEST_ADD_ACCOUNT) {
332e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                String accountName = null;
333e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                String accountType = null;
334e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
335e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (data != null) {
336e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
337e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
338e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
339e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
340e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (accountName == null || accountType == null) {
34127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                    Account[] currentAccounts = AccountManager.get(this).getAccountsForPackage(
34227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                            mCallingPackage, mCallingUid);
343e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    Set<Account> preExistingAccounts = new HashSet<Account>();
34401df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana                    for (Parcelable accountParcel : mExistingAccounts) {
345e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        preExistingAccounts.add((Account) accountParcel);
346e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    }
347e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    for (Account account : currentAccounts) {
348e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        if (!preExistingAccounts.contains(account)) {
349e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                            accountName = account.name;
350e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                            accountType = account.type;
351e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                            break;
352e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        }
353e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    }
354e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
355e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
356e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (accountName != null || accountType != null) {
357e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    setResultAndFinish(accountName, accountType);
358e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    return;
359e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
3601121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana            }
361e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.d(TAG, "ChooseTypeAndAccountActivity.onActivityResult: unable to find added "
362e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + "account, pretending the request was canceled");
363e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
364e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
365e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onActivityResult: canceled");
3661121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        }
3671121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        setResult(Activity.RESULT_CANCELED);
3681121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        finish();
3691121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
3701121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
3719bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    protected void runAddAccountForAuthenticator(String type) {
372e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
373e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "runAddAccountForAuthenticator: " + type);
374e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
3759bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        final Bundle options = getIntent().getBundleExtra(
3769bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE);
3779bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        final String[] requiredFeatures = getIntent().getStringArrayExtra(
3789bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY);
3799bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        final String authTokenType = getIntent().getStringExtra(
3809bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING);
3819bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        AccountManager.get(this).addAccount(type, authTokenType, requiredFeatures,
382e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                options, null /* activity */, this /* callback */, null /* Handler */);
3839bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    }
3849bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana
385727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    @Override
3869bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    public void run(final AccountManagerFuture<Bundle> accountManagerFuture) {
3879bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        try {
3889bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            final Bundle accountManagerResult = accountManagerFuture.getResult();
389e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            final Intent intent = (Intent)accountManagerResult.getParcelable(
390e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    AccountManager.KEY_INTENT);
391e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            if (intent != null) {
392e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                mPendingRequest = REQUEST_ADD_ACCOUNT;
39327db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                mExistingAccounts = AccountManager.get(this).getAccountsForPackage(mCallingPackage,
39427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                        mCallingUid);
395e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
396e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                startActivityForResult(intent, REQUEST_ADD_ACCOUNT);
3979bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                return;
3989bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            }
3999bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        } catch (OperationCanceledException e) {
4009bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            setResult(Activity.RESULT_CANCELED);
4019bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            finish();
4029bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            return;
4039bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        } catch (IOException e) {
4049bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        } catch (AuthenticatorException e) {
4059bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        }
4069bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        Bundle bundle = new Bundle();
4079bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error communicating with server");
4089bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
4099bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        finish();
4109bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    }
411b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
412727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private void onAccountSelected(Account account) {
413727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang      Log.d(TAG, "selected account " + account);
414727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang      setResultAndFinish(account.name, account.type);
4151121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
4161121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
4171121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    private void setResultAndFinish(final String accountName, final String accountType) {
4181121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        Bundle bundle = new Bundle();
4191121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
4201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
4211121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
422e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
423e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.setResultAndFinish: "
424e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + "selected account " + accountName + ", " + accountType);
425e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
4261121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        finish();
4271121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
4281121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
4291121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    private void startChooseAccountTypeActivity() {
430e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
431e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseAccountTypeActivity.startChooseAccountTypeActivity()");
432e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
4331121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        final Intent intent = new Intent(this, ChooseAccountTypeActivity.class);
4349bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
435a77253a417e885f87280901a3519412262758412Fred Quintana        intent.putExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY,
436a77253a417e885f87280901a3519412262758412Fred Quintana                getIntent().getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY));
4371121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        intent.putExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE,
438b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana                getIntent().getBundleExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE));
439b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana        intent.putExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY,
440b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana                getIntent().getStringArrayExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY));
441b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana        intent.putExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING,
442a77253a417e885f87280901a3519412262758412Fred Quintana                getIntent().getStringExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING));
443e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        startActivityForResult(intent, REQUEST_CHOOSE_TYPE);
444e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        mPendingRequest = REQUEST_CHOOSE_TYPE;
4451121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
4468d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4478d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
4488d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * @return a value between 0 (inclusive) and accounts.size() (inclusive) or SELECTED_ITEM_NONE.
4498d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     *      An index value of accounts.size() indicates 'Add account' option.
4508d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
4518d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private int getItemIndexToSelect(ArrayList<Account> accounts, String selectedAccountName,
4528d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        boolean selectedAddNewAccount) {
4538d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // If "Add account" option was previously selected by user, preserve it across
4548d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // orientation changes.
4558d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (selectedAddNewAccount) {
4568d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          return accounts.size();
4578d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
4588d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // search for the selected account name if present
4598d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      for (int i = 0; i < accounts.size(); i++) {
4608d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        if (accounts.get(i).name.equals(selectedAccountName)) {
4618d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          return i;
4628d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        }
4638d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
4648d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // no account selected.
4658d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return SELECTED_ITEM_NONE;
4668d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
4678d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4688d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private String[] getListOfDisplayableOptions(ArrayList<Account> accounts) {
4698d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // List of options includes all accounts found together with "Add new account" as the
4708d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // last item in the list.
47127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      String[] listItems = new String[accounts.size() + (mDisallowAddAccounts ? 0 : 1)];
4728d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      for (int i = 0; i < accounts.size(); i++) {
4738d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          listItems[i] = accounts.get(i).name;
4748d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
47527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      if (!mDisallowAddAccounts) {
47627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani          listItems[accounts.size()] = getResources().getString(
47727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                  R.string.add_account_button_label);
47827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      }
4798d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return listItems;
4808d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
4818d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4828d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
4838d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Create a list of Account objects for each account that is acceptable. Filter out
4848d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * accounts that don't match the allowable types, if provided, or that don't match the
4858d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * allowable accounts, if provided.
4868d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
4878d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private ArrayList<Account> getAcceptableAccountChoices(AccountManager accountManager) {
48827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      final Account[] accounts = accountManager.getAccountsForPackage(mCallingPackage,
48927db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani              mCallingUid);
4908d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      ArrayList<Account> accountsToPopulate = new ArrayList<Account>(accounts.length);
4918d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      for (Account account : accounts) {
4928d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          if (mSetOfAllowableAccounts != null
4938d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  && !mSetOfAllowableAccounts.contains(account)) {
4948d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              continue;
4958d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
4968d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          if (mSetOfRelevantAccountTypes != null
4978d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  && !mSetOfRelevantAccountTypes.contains(account.type)) {
4988d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              continue;
4998d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
5008d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          accountsToPopulate.add(account);
5018d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5028d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return accountsToPopulate;
5038d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5048d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5058d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5068d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Return a set of account types speficied by the intent as well as supported by the
5078d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * AccountManager.
5088d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5098d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<String> getReleventAccountTypes(final Intent intent) {
5108d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // An account type is relevant iff it is allowed by the caller and supported by the account
5118d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // manager.
5128d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      Set<String> setOfRelevantAccountTypes = null;
5138d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      final String[] allowedAccountTypes =
5148d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              intent.getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY);
5158d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (allowedAccountTypes != null) {
5168d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          setOfRelevantAccountTypes = Sets.newHashSet(allowedAccountTypes);
5178d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes();
5188d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          Set<String> supportedAccountTypes = new HashSet<String>(descs.length);
5198d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          for (AuthenticatorDescription desc : descs) {
5208d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              supportedAccountTypes.add(desc.type);
5218d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
5228d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          setOfRelevantAccountTypes.retainAll(supportedAccountTypes);
5238d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5248d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return setOfRelevantAccountTypes;
5258d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5268d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5278d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5288d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Returns a set of whitelisted accounts given by the intent or null if none specified by the
5298d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * intent.
5308d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5318d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<Account> getAllowableAccountSet(final Intent intent) {
5328d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      Set<Account> setOfAllowableAccounts = null;
5338d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      final ArrayList<Parcelable> validAccounts =
5348d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              intent.getParcelableArrayListExtra(EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST);
5358d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (validAccounts != null) {
5368d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          setOfAllowableAccounts = new HashSet<Account>(validAccounts.size());
5378d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          for (Parcelable parcelable : validAccounts) {
5388d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              setOfAllowableAccounts.add((Account)parcelable);
5398d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
5408d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5418d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return setOfAllowableAccounts;
5428d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5438d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5448d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5458d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Overrides the description text view for the picker activity if specified by the intent.
5468d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * If not specified then makes the description invisible.
5478d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5488d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private void overrideDescriptionIfSupplied(String descriptionOverride) {
5498d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      TextView descriptionView = (TextView) findViewById(R.id.description);
5508d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (!TextUtils.isEmpty(descriptionOverride)) {
5518d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          descriptionView.setText(descriptionOverride);
5528d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      } else {
5538d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          descriptionView.setVisibility(View.GONE);
5548d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5558d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5568d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5578d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5588d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Populates the UI ListView with the given list of items and selects an item
5598d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * based on {@code mSelectedItemIndex} member variable.
5608d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5618d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private final void populateUIAccountList(String[] listItems) {
5628d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      ListView list = (ListView) findViewById(android.R.id.list);
5638d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setAdapter(new ArrayAdapter<String>(this,
5648d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              android.R.layout.simple_list_item_single_choice, listItems));
5658d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
5668d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setItemsCanFocus(false);
5678d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setOnItemClickListener(
5688d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              new AdapterView.OnItemClickListener() {
5698d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  @Override
5708d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
5718d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                      mSelectedItemIndex = position;
5728d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                      mOkButton.setEnabled(true);
5738d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  }
5748d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              });
5758d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
5768d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          list.setItemChecked(mSelectedItemIndex, true);
5778d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          if (Log.isLoggable(TAG, Log.VERBOSE)) {
5788d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              Log.v(TAG, "List item " + mSelectedItemIndex + " should be selected");
5798d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
5808d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5818d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5821121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana}
583