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    /**
91a3db8acf3d05d66162834cca3129792aa571bccaCarlos Valdivia     * Deprecated. Providing this extra to {@link ChooseTypeAndAccountActivity}
92a3db8acf3d05d66162834cca3129792aa571bccaCarlos Valdivia     * will have no effect.
93b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     */
94a3db8acf3d05d66162834cca3129792aa571bccaCarlos Valdivia    @Deprecated
95b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    public static final String EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT =
96b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana            "alwaysPromptForAccount";
97b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
98b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    /**
99b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * If set then this string willb e used as the description rather than
100b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     * the default.
101b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana     */
102b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana    public static final String EXTRA_DESCRIPTION_TEXT_OVERRIDE =
103b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana            "descriptionTextOverride";
104b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
105e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    public static final int REQUEST_NULL = 0;
106e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    public static final int REQUEST_CHOOSE_TYPE = 1;
107e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    public static final int REQUEST_ADD_ACCOUNT = 2;
108e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
109e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private static final String KEY_INSTANCE_STATE_PENDING_REQUEST = "pendingRequest";
110e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    private static final String KEY_INSTANCE_STATE_EXISTING_ACCOUNTS = "existingAccounts";
111727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private static final String KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME = "selectedAccountName";
112727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private static final String KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT = "selectedAddAccount";
1131b64c9d31536ec8b4a89b1b05bf493b50a2a6c4eCarlos Valdivia    private static final String KEY_INSTANCE_STATE_ACCOUNT_LIST = "accountList";
114727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
115727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private static final int SELECTED_ITEM_NONE = -1;
116e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
1178d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<Account> mSetOfAllowableAccounts;
1188d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<String> mSetOfRelevantAccountTypes;
1198d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private String mSelectedAccountName = null;
1208d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private boolean mSelectedAddNewAccount = 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) {
135e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
136e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onCreate(savedInstanceState="
137e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + savedInstanceState + ")");
138e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
139e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
14027db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        String message = null;
14127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani
14227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        try {
14327db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            IBinder activityToken = getActivityToken();
14427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            mCallingUid = ActivityManagerNative.getDefault().getLaunchedFromUid(activityToken);
14527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            mCallingPackage = ActivityManagerNative.getDefault().getLaunchedFromPackage(
14627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                    activityToken);
14727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            if (mCallingUid != 0 && mCallingPackage != null) {
14827db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                Bundle restrictions = UserManager.get(this)
14927db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                        .getUserRestrictions(new UserHandle(UserHandle.getUserId(mCallingUid)));
15027db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                mDisallowAddAccounts =
15127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                        restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false);
15227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            }
15327db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        } catch (RemoteException re) {
15427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            // Couldn't figure out caller details
15527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani            Log.w(getClass().getSimpleName(), "Unable to get caller identity \n" + re);
15627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani        }
15727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani
158727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        // save some items we use frequently
159727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        final Intent intent = getIntent();
160727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
161e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (savedInstanceState != null) {
162e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            mPendingRequest = savedInstanceState.getInt(KEY_INSTANCE_STATE_PENDING_REQUEST);
16301df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana            mExistingAccounts =
164e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    savedInstanceState.getParcelableArray(KEY_INSTANCE_STATE_EXISTING_ACCOUNTS);
165727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
166727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // Makes sure that any user selection is preserved across orientation changes.
1678d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            mSelectedAccountName = savedInstanceState.getString(
168727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                    KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME);
169727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
1708d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            mSelectedAddNewAccount = savedInstanceState.getBoolean(
171727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                    KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
1721b64c9d31536ec8b4a89b1b05bf493b50a2a6c4eCarlos Valdivia            mAccounts = savedInstanceState.getParcelableArrayList(KEY_INSTANCE_STATE_ACCOUNT_LIST);
173e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        } else {
174e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            mPendingRequest = REQUEST_NULL;
175e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            mExistingAccounts = null;
176727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // If the selected account as specified in the intent matches one in the list we will
177727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // show is as pre-selected.
178727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            Account selectedAccount = (Account) intent.getParcelableExtra(EXTRA_SELECTED_ACCOUNT);
179727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (selectedAccount != null) {
1808d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                mSelectedAccountName = selectedAccount.name;
181727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            }
182e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
183e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
184727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        if (Log.isLoggable(TAG, Log.VERBOSE)) {
1858d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            Log.v(TAG, "selected account name is " + mSelectedAccountName);
186b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana        }
187b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
1881121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
1898d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mSetOfAllowableAccounts = getAllowableAccountSet(intent);
1908d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mSetOfRelevantAccountTypes = getReleventAccountTypes(intent);
1918d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mDescriptionOverride = intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE);
1925a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani
1935a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        mAccounts = getAcceptableAccountChoices(AccountManager.get(this));
1945a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        if (mAccounts.isEmpty()
1955a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani                && mDisallowAddAccounts) {
1965a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani            requestWindowFeature(Window.FEATURE_NO_TITLE);
1975a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani            setContentView(R.layout.app_not_authorized);
1985a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani            mDontShowPicker = true;
1995a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani        }
2005a3915b06bf1e82cda024945d3b71b51b470b809Amith Yamasani
201734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        if (mDontShowPicker) {
202734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli            super.onCreate(savedInstanceState);
203734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli            return;
204734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        }
2051121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
2068d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // In cases where the activity does not need to show an account picker, cut the chase
2078d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // and return the result directly. Eg:
2088d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // Single account -> select it directly
2098d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        // No account -> launch add account activity directly
210cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia        if (mPendingRequest == REQUEST_NULL) {
211727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // If there are no relevant accounts and only one relevant account type go directly to
212cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia            // add account. Otherwise let the user choose.
213727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (mAccounts.isEmpty()) {
214734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli                setNonLabelThemeAndCallSuperCreate(savedInstanceState);
2158d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                if (mSetOfRelevantAccountTypes.size() == 1) {
2168d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                    runAddAccountForAuthenticator(mSetOfRelevantAccountTypes.iterator().next());
217cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                } else {
218cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                    startChooseAccountTypeActivity();
219cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia                }
220cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia            }
221cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia        }
222cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia
2238d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        String[] listItems = getListOfDisplayableOptions(mAccounts);
2248d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        mSelectedItemIndex = getItemIndexToSelect(
2258d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia            mAccounts, mSelectedAccountName, mSelectedAddNewAccount);
2268d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
227734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        super.onCreate(savedInstanceState);
228cf0a881f1c27718f686a307e6c94213815ee9dc1Carlos Valdivia        setContentView(R.layout.choose_type_and_account);
2298d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        overrideDescriptionIfSupplied(mDescriptionOverride);
2308d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        populateUIAccountList(listItems);
2316cab5e823a0053c60576c65cd307c865512eac38Alice Yang
2326cab5e823a0053c60576c65cd307c865512eac38Alice Yang        // Only enable "OK" button if something has been selected.
2336cab5e823a0053c60576c65cd307c865512eac38Alice Yang        mOkButton = (Button) findViewById(android.R.id.button2);
2346cab5e823a0053c60576c65cd307c865512eac38Alice Yang        mOkButton.setEnabled(mSelectedItemIndex != SELECTED_ITEM_NONE);
235e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    }
236e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
237e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    @Override
238e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    protected void onDestroy() {
239e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
240e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onDestroy()");
241e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
242e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        super.onDestroy();
243e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    }
244e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
245e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    @Override
246e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana    protected void onSaveInstanceState(final Bundle outState) {
247e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        super.onSaveInstanceState(outState);
248e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        outState.putInt(KEY_INSTANCE_STATE_PENDING_REQUEST, mPendingRequest);
24901df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana        if (mPendingRequest == REQUEST_ADD_ACCOUNT) {
25001df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana            outState.putParcelableArray(KEY_INSTANCE_STATE_EXISTING_ACCOUNTS, mExistingAccounts);
25101df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana        }
252727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
253727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (mSelectedItemIndex == mAccounts.size()) {
254727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                outState.putBoolean(KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, true);
255727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            } else {
256727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                outState.putBoolean(KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
257727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                outState.putString(KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME,
258727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang                        mAccounts.get(mSelectedItemIndex).name);
259727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            }
260727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        }
2611b64c9d31536ec8b4a89b1b05bf493b50a2a6c4eCarlos Valdivia        outState.putParcelableArrayList(KEY_INSTANCE_STATE_ACCOUNT_LIST, mAccounts);
262727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    }
263727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
264727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    public void onCancelButtonClicked(View view) {
265727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        onBackPressed();
266727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    }
267727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang
268727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    public void onOkButtonClicked(View view) {
269727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        if (mSelectedItemIndex == mAccounts.size()) {
270727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // Selected "Add New Account" option
271727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            startChooseAccountTypeActivity();
272727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        } else if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
273727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            onAccountSelected(mAccounts.get(mSelectedItemIndex));
274727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang        }
2751121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
2761121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
2771121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    // Called when the choose account type activity (for adding an account) returns.
2781121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    // If it was a success read the account and set it in the result. In all cases
2791121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    // return the result and finish this activity.
2801121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    @Override
2811121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    protected void onActivityResult(final int requestCode, final int resultCode,
2821121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana            final Intent data) {
283e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
284e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            if (data != null && data.getExtras() != null) data.getExtras().keySet();
285e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Bundle extras = data != null ? data.getExtras() : null;
286e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onActivityResult(reqCode=" + requestCode
287e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + ", resCode=" + resultCode + ", extras=" + extras + ")");
288e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
289e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
290e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        // we got our result, so clear the fact that we had a pending request
291e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        mPendingRequest = REQUEST_NULL;
292e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
293e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (resultCode == RESULT_CANCELED) {
294727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            // if canceling out of addAccount and the original state caused us to skip this,
2952becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana            // finish this activity
296727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang            if (mAccounts.isEmpty()) {
2972becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana                setResult(Activity.RESULT_CANCELED);
2982becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana                finish();
2992becf93d275a1e678abedd16b88225d6cecf49e2Fred Quintana            }
300e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            return;
301e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
302e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
303e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (resultCode == RESULT_OK) {
304e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            if (requestCode == REQUEST_CHOOSE_TYPE) {
305e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (data != null) {
306e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
307e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    if (accountType != null) {
308e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        runAddAccountForAuthenticator(accountType);
309e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        return;
310e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    }
311e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
312e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                Log.d(TAG, "ChooseTypeAndAccountActivity.onActivityResult: unable to find account "
313e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        + "type, pretending the request was canceled");
314e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            } else if (requestCode == REQUEST_ADD_ACCOUNT) {
315e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                String accountName = null;
316e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                String accountType = null;
317e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
318e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (data != null) {
319e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
320e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
321e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
322e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
323e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (accountName == null || accountType == null) {
32427db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                    Account[] currentAccounts = AccountManager.get(this).getAccountsForPackage(
32527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                            mCallingPackage, mCallingUid);
326e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    Set<Account> preExistingAccounts = new HashSet<Account>();
32701df6a8ee2fd0ec76bddaaa2e3e66f6e9748a4ceFred Quintana                    for (Parcelable accountParcel : mExistingAccounts) {
328e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        preExistingAccounts.add((Account) accountParcel);
329e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    }
330e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    for (Account account : currentAccounts) {
331e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        if (!preExistingAccounts.contains(account)) {
332e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                            accountName = account.name;
333e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                            accountType = account.type;
334e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                            break;
335e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                        }
336e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    }
337e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
338e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana
339e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                if (accountName != null || accountType != null) {
340e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    setResultAndFinish(accountName, accountType);
341e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    return;
342e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                }
3431121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana            }
344e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.d(TAG, "ChooseTypeAndAccountActivity.onActivityResult: unable to find added "
345e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + "account, pretending the request was canceled");
346e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
347e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
348e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.onActivityResult: canceled");
3491121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        }
3501121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        setResult(Activity.RESULT_CANCELED);
3511121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        finish();
3521121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
3531121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
3549bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    protected void runAddAccountForAuthenticator(String type) {
355e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
356e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "runAddAccountForAuthenticator: " + type);
357e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
3589bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        final Bundle options = getIntent().getBundleExtra(
3599bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE);
3609bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        final String[] requiredFeatures = getIntent().getStringArrayExtra(
3619bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY);
3629bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        final String authTokenType = getIntent().getStringExtra(
3639bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                ChooseTypeAndAccountActivity.EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING);
3649bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        AccountManager.get(this).addAccount(type, authTokenType, requiredFeatures,
365e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                options, null /* activity */, this /* callback */, null /* Handler */);
3669bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    }
3679bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana
368727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    @Override
3699bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    public void run(final AccountManagerFuture<Bundle> accountManagerFuture) {
3709bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        try {
3719bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            final Bundle accountManagerResult = accountManagerFuture.getResult();
372e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            final Intent intent = (Intent)accountManagerResult.getParcelable(
373e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    AccountManager.KEY_INTENT);
374e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            if (intent != null) {
375e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                mPendingRequest = REQUEST_ADD_ACCOUNT;
37627db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                mExistingAccounts = AccountManager.get(this).getAccountsForPackage(mCallingPackage,
37727db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                        mCallingUid);
378e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
379e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                startActivityForResult(intent, REQUEST_ADD_ACCOUNT);
3809bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana                return;
3819bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            }
3829bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        } catch (OperationCanceledException e) {
3839bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            setResult(Activity.RESULT_CANCELED);
3849bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            finish();
3859bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana            return;
3869bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        } catch (IOException e) {
3879bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        } catch (AuthenticatorException e) {
3889bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        }
3899bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        Bundle bundle = new Bundle();
3909bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        bundle.putString(AccountManager.KEY_ERROR_MESSAGE, "error communicating with server");
3919bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
3929bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        finish();
3939bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana    }
394b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana
395734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli    /**
396734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli     * The default activity theme shows label at the top. Set a theme which does
397734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli     * not show label, which effectively makes the activity invisible. Note that
398734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli     * no content is being set. If something gets set, using this theme may be
399734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli     * useless.
400734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli     */
401734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli    private void setNonLabelThemeAndCallSuperCreate(Bundle savedInstanceState) {
402734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        setTheme(R.style.Theme_Material_Light_Dialog_NoActionBar);
403734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        super.onCreate(savedInstanceState);
404734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli    }
405734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli
406727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang    private void onAccountSelected(Account account) {
407727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang      Log.d(TAG, "selected account " + account);
408727c599454b1e280a237b10fea4dd7f7cb1096e0Alice Yang      setResultAndFinish(account.name, account.type);
4091121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
4101121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
4111121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    private void setResultAndFinish(final String accountName, final String accountType) {
4121121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        Bundle bundle = new Bundle();
4131121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
4141121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
4151121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        setResult(Activity.RESULT_OK, new Intent().putExtras(bundle));
416e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
417e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseTypeAndAccountActivity.setResultAndFinish: "
418e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana                    + "selected account " + accountName + ", " + accountType);
419e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
4201121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        finish();
4211121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
4221121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana
4231121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    private void startChooseAccountTypeActivity() {
424e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        if (Log.isLoggable(TAG, Log.VERBOSE)) {
425e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana            Log.v(TAG, "ChooseAccountTypeActivity.startChooseAccountTypeActivity()");
426e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        }
4271121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        final Intent intent = new Intent(this, ChooseAccountTypeActivity.class);
4289bbdd0bf5006512a000b0d3e6bd6ee2998a2e48bFred Quintana        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
429a77253a417e885f87280901a3519412262758412Fred Quintana        intent.putExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY,
430a77253a417e885f87280901a3519412262758412Fred Quintana                getIntent().getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY));
4311121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana        intent.putExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE,
432b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana                getIntent().getBundleExtra(EXTRA_ADD_ACCOUNT_OPTIONS_BUNDLE));
433b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana        intent.putExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY,
434b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana                getIntent().getStringArrayExtra(EXTRA_ADD_ACCOUNT_REQUIRED_FEATURES_STRING_ARRAY));
435b04fe4e82abb073b4e5d82563b0882cea0dcc139Fred Quintana        intent.putExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING,
436a77253a417e885f87280901a3519412262758412Fred Quintana                getIntent().getStringExtra(EXTRA_ADD_ACCOUNT_AUTH_TOKEN_TYPE_STRING));
437e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        startActivityForResult(intent, REQUEST_CHOOSE_TYPE);
438e9095bd73795e3cf55cbeebaa5745f68b69819abFred Quintana        mPendingRequest = REQUEST_CHOOSE_TYPE;
4391121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana    }
4408d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4418d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
4428d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * @return a value between 0 (inclusive) and accounts.size() (inclusive) or SELECTED_ITEM_NONE.
4438d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     *      An index value of accounts.size() indicates 'Add account' option.
4448d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
4458d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private int getItemIndexToSelect(ArrayList<Account> accounts, String selectedAccountName,
4468d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        boolean selectedAddNewAccount) {
4478d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // If "Add account" option was previously selected by user, preserve it across
4488d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // orientation changes.
4498d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (selectedAddNewAccount) {
4508d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          return accounts.size();
4518d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
4528d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // search for the selected account name if present
4538d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      for (int i = 0; i < accounts.size(); i++) {
4548d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        if (accounts.get(i).name.equals(selectedAccountName)) {
4558d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          return i;
4568d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia        }
4578d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
4588d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // no account selected.
4598d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return SELECTED_ITEM_NONE;
4608d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
4618d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4628d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private String[] getListOfDisplayableOptions(ArrayList<Account> accounts) {
4638d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // List of options includes all accounts found together with "Add new account" as the
4648d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // last item in the list.
46527db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      String[] listItems = new String[accounts.size() + (mDisallowAddAccounts ? 0 : 1)];
4668d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      for (int i = 0; i < accounts.size(); i++) {
4678d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          listItems[i] = accounts.get(i).name;
4688d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
46927db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      if (!mDisallowAddAccounts) {
47027db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani          listItems[accounts.size()] = getResources().getString(
47127db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani                  R.string.add_account_button_label);
47227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      }
4738d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return listItems;
4748d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
4758d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4768d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
4778d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Create a list of Account objects for each account that is acceptable. Filter out
4788d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * accounts that don't match the allowable types, if provided, or that don't match the
4798d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * allowable accounts, if provided.
4808d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
4818d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private ArrayList<Account> getAcceptableAccountChoices(AccountManager accountManager) {
48227db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani      final Account[] accounts = accountManager.getAccountsForPackage(mCallingPackage,
48327db46850b708070452c0ce49daf5f79503fbde6Amith Yamasani              mCallingUid);
4848d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      ArrayList<Account> accountsToPopulate = new ArrayList<Account>(accounts.length);
4858d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      for (Account account : accounts) {
486734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli          if (mSetOfAllowableAccounts != null && !mSetOfAllowableAccounts.contains(account)) {
4878d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              continue;
4888d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
4898d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          if (mSetOfRelevantAccountTypes != null
4908d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  && !mSetOfRelevantAccountTypes.contains(account.type)) {
4918d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              continue;
4928d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
4938d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          accountsToPopulate.add(account);
4948d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
4958d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return accountsToPopulate;
4968d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
4978d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
4988d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
499734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli     * Return a set of account types specified by the intent as well as supported by the
5008d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * AccountManager.
5018d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5028d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<String> getReleventAccountTypes(final Intent intent) {
5038d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // An account type is relevant iff it is allowed by the caller and supported by the account
5048d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      // manager.
5058d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      Set<String> setOfRelevantAccountTypes = null;
5068d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      final String[] allowedAccountTypes =
5078d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              intent.getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY);
508734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes();
509734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        Set<String> supportedAccountTypes = new HashSet<String>(descs.length);
510734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        for (AuthenticatorDescription desc : descs) {
511734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli            supportedAccountTypes.add(desc.type);
512734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        }
513734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        if (allowedAccountTypes != null) {
514734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli            setOfRelevantAccountTypes = Sets.newHashSet(allowedAccountTypes);
515734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli            setOfRelevantAccountTypes.retainAll(supportedAccountTypes);
516734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli        } else {
517734f8fb69d0c8af7b10bded718897a55ced49bf0Simranjit Singh Kohli            setOfRelevantAccountTypes = supportedAccountTypes;
5188d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5198d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return setOfRelevantAccountTypes;
5208d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5218d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5228d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5238d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Returns a set of whitelisted accounts given by the intent or null if none specified by the
5248d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * intent.
5258d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5268d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private Set<Account> getAllowableAccountSet(final Intent intent) {
5278d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      Set<Account> setOfAllowableAccounts = null;
5288d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      final ArrayList<Parcelable> validAccounts =
5298d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              intent.getParcelableArrayListExtra(EXTRA_ALLOWABLE_ACCOUNTS_ARRAYLIST);
5308d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (validAccounts != null) {
5318d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          setOfAllowableAccounts = new HashSet<Account>(validAccounts.size());
5328d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          for (Parcelable parcelable : validAccounts) {
5338d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              setOfAllowableAccounts.add((Account)parcelable);
5348d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
5358d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5368d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      return setOfAllowableAccounts;
5378d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5388d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5398d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5408d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Overrides the description text view for the picker activity if specified by the intent.
5418d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * If not specified then makes the description invisible.
5428d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5438d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private void overrideDescriptionIfSupplied(String descriptionOverride) {
5448d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      TextView descriptionView = (TextView) findViewById(R.id.description);
5458d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (!TextUtils.isEmpty(descriptionOverride)) {
5468d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          descriptionView.setText(descriptionOverride);
5478d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      } else {
5488d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          descriptionView.setVisibility(View.GONE);
5498d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5508d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5518d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia
5528d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    /**
5538d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * Populates the UI ListView with the given list of items and selects an item
5548d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     * based on {@code mSelectedItemIndex} member variable.
5558d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia     */
5568d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    private final void populateUIAccountList(String[] listItems) {
5578d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      ListView list = (ListView) findViewById(android.R.id.list);
5588d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setAdapter(new ArrayAdapter<String>(this,
5598d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              android.R.layout.simple_list_item_single_choice, listItems));
5608d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
5618d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setItemsCanFocus(false);
5628d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      list.setOnItemClickListener(
5638d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              new AdapterView.OnItemClickListener() {
5648d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  @Override
5658d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
5668d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                      mSelectedItemIndex = position;
5678d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                      mOkButton.setEnabled(true);
5688d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia                  }
5698d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              });
5708d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
5718d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          list.setItemChecked(mSelectedItemIndex, true);
5728d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          if (Log.isLoggable(TAG, Log.VERBOSE)) {
5738d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia              Log.v(TAG, "List item " + mSelectedItemIndex + " should be selected");
5748d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia          }
5758d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia      }
5768d16778efdf46fa80a309456b722b333ec3e6756Jatin Lodhia    }
5771121bb5e6ff20a2c694225300507ed486e04fea2Fred Quintana}
578