143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani/*
243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Copyright (C) 2010 The Android Open Source Project
343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *
443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * you may not use this file except in compliance with the License.
643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * You may obtain a copy of the License at
743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *
843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani *
1043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Unless required by applicable law or agreed to in writing, software
1143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
1243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * See the License for the specific language governing permissions and
1443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * limitations under the License.
1543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani */
1643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
1743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipackage com.android.settings.accounts;
1843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
1943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.accounts.AccountManager;
2043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.accounts.AuthenticatorDescription;
2143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.ContentResolver;
2243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.Context;
2343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.Intent;
2443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.SyncAdapterType;
2543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.content.pm.PackageManager;
26d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstromimport android.content.res.Resources;
2743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.graphics.drawable.Drawable;
2843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.os.Bundle;
297d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghinaimport android.os.UserHandle;
307d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghinaimport android.os.UserManager;
3143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.Preference;
3274309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglioimport android.preference.PreferenceActivity;
3343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.PreferenceGroup;
3443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.PreferenceScreen;
3543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.util.Log;
367d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina
378a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
38ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglioimport com.android.internal.util.CharSequences;
398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.settings.InstrumentedPreferenceActivity;
40ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglioimport com.android.settings.R;
417d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghinaimport com.android.settings.Utils;
427d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina
43ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglioimport com.google.android.collect.Maps;
4443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
4543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport java.util.ArrayList;
46ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglioimport java.util.Collections;
4743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport java.util.HashMap;
4843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport java.util.HashSet;
4943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport java.util.Map;
5043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
517d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghinaimport static android.content.Intent.EXTRA_USER;
527d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina
5343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani/**
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani * Activity asking a user to select an account to be set up.
557d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina *
567d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina * An extra {@link UserHandle} can be specified in the intent as {@link EXTRA_USER}, if the user for
577d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina * which the action needs to be performed is different to the one the Settings App will run in.
5843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani */
598a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenpublic class ChooseAccountActivity extends InstrumentedPreferenceActivity {
6043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
6174309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio    private static final String TAG = "ChooseAccountActivity";
6243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private String[] mAuthorities;
6343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private PreferenceGroup mAddAccountGroup;
6443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private final ArrayList<ProviderEntry> mProviderList = new ArrayList<ProviderEntry>();
6543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public HashSet<String> mAccountTypesFilter;
6643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private AuthenticatorDescription[] mAuthDescs;
6743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private HashMap<String, ArrayList<String>> mAccountTypeToAuthorities = null;
6843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private Map<String, AuthenticatorDescription> mTypeToAuthDescription
6943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            = new HashMap<String, AuthenticatorDescription>();
707d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina    // The UserHandle of the user we are choosing an account for
717d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina    private UserHandle mUserHandle;
727d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina    private UserManager mUm;
737d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina
74ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio    private static class ProviderEntry implements Comparable<ProviderEntry> {
7543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        private final CharSequence name;
7643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        private final String type;
7743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        ProviderEntry(CharSequence providerName, String accountType) {
7843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            name = providerName;
7943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            type = accountType;
8043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
81ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio
82ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio        public int compareTo(ProviderEntry another) {
83ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio            if (name == null) {
84ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio                return -1;
85ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio            }
86ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio            if (another.name == null) {
87ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio                return +1;
88ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio            }
89ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio            return CharSequences.compareToIgnoreCase(name, another.name);
90ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio        }
9143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
9243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
9343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
948a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
958a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        return MetricsLogger.ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY;
968a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
978a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
988a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
9974309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio    protected void onCreate(Bundle icicle) {
10043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        super.onCreate(icicle);
10143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
10274309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio        setContentView(R.layout.add_account_screen);
10343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        addPreferencesFromResource(R.xml.add_account_settings);
10474309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio        mAuthorities = getIntent().getStringArrayExtra(
10543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                AccountPreferenceBase.AUTHORITIES_FILTER_KEY);
10674309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio        String[] accountTypesFilter = getIntent().getStringArrayExtra(
10743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                AccountPreferenceBase.ACCOUNT_TYPES_FILTER_KEY);
10843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (accountTypesFilter != null) {
10943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            mAccountTypesFilter = new HashSet<String>();
11043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            for (String accountType : accountTypesFilter) {
11143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                mAccountTypesFilter.add(accountType);
11243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
11343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
11443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        mAddAccountGroup = getPreferenceScreen();
1157d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina        mUm = UserManager.get(this);
1167d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina        mUserHandle = Utils.getSecureTargetUser(getActivityToken(), mUm, null /* arguments */,
1177d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina                getIntent().getExtras());
11843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        updateAuthDescriptions();
11943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
12043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
12143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
12243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Updates provider icons. Subclasses should call this in onCreate()
12343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * and update any UI that depends on AuthenticatorDescriptions in onAuthDescriptionsUpdated().
12443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
12543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private void updateAuthDescriptions() {
1267d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina        mAuthDescs = AccountManager.get(this).getAuthenticatorTypesAsUser(
1277d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina                mUserHandle.getIdentifier());
12843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        for (int i = 0; i < mAuthDescs.length; i++) {
12943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            mTypeToAuthDescription.put(mAuthDescs[i].type, mAuthDescs[i]);
13043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
13143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        onAuthDescriptionsUpdated();
13243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
13343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
13443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private void onAuthDescriptionsUpdated() {
13543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        // Create list of providers to show on preference screen
13643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        for (int i = 0; i < mAuthDescs.length; i++) {
13743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            String accountType = mAuthDescs[i].type;
13843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            CharSequence providerName = getLabelForType(accountType);
13943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
14043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            // Skip preferences for authorities not specified. If no authorities specified,
14143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            // then include them all.
14243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            ArrayList<String> accountAuths = getAuthoritiesForAccountType(accountType);
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            boolean addAccountPref = true;
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            if (mAuthorities != null && mAuthorities.length > 0 && accountAuths != null) {
14543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                addAccountPref = false;
14643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                for (int k = 0; k < mAuthorities.length; k++) {
14743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    if (accountAuths.contains(mAuthorities[k])) {
14843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                        addAccountPref = true;
14943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                        break;
15043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    }
15143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                }
15243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
15343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            if (addAccountPref && mAccountTypesFilter != null
15443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    && !mAccountTypesFilter.contains(accountType)) {
15543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                addAccountPref = false;
15643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
15743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            if (addAccountPref) {
15843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                mProviderList.add(new ProviderEntry(providerName, accountType));
15943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            } else {
16043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                if (Log.isLoggable(TAG, Log.VERBOSE)) {
16143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    Log.v(TAG, "Skipped pref " + providerName + ": has no authority we need");
16243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                }
16343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
16443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
16543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
16643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mProviderList.size() == 1) {
16743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            // If there's only one provider that matches, just run it.
16843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            finishWithAccountType(mProviderList.get(0).type);
16943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else if (mProviderList.size() > 0) {
170ab58d933a7cb00261f9746a9361447ad23d75ee4Fabrice Di Meglio            Collections.sort(mProviderList);
17143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            mAddAccountGroup.removeAll();
17243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            for (ProviderEntry pref : mProviderList) {
17343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                Drawable drawable = getDrawableForType(pref.type);
17443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                ProviderPreference p =
17574309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio                        new ProviderPreference(this, pref.type, drawable, pref.name);
17643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                mAddAccountGroup.addPreference(p);
17743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
17843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        } else {
17943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            if (Log.isLoggable(TAG, Log.VERBOSE)) {
18043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                final StringBuilder auths = new StringBuilder();
18143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                for (String a : mAuthorities) {
18243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    auths.append(a);
18343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    auths.append(' ');
18443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                }
18543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                Log.v(TAG, "No providers found for authorities: " + auths);
18643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
18774309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio            setResult(RESULT_CANCELED);
18843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            finish();
18943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
19043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
19143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
19243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public ArrayList<String> getAuthoritiesForAccountType(String type) {
19343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mAccountTypeToAuthorities == null) {
19443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            mAccountTypeToAuthorities = Maps.newHashMap();
1957d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina            SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
1967d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina                    mUserHandle.getIdentifier());
19743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            for (int i = 0, n = syncAdapters.length; i < n; i++) {
19843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                final SyncAdapterType sa = syncAdapters[i];
19943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                ArrayList<String> authorities = mAccountTypeToAuthorities.get(sa.accountType);
20043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                if (authorities == null) {
20143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    authorities = new ArrayList<String>();
20243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    mAccountTypeToAuthorities.put(sa.accountType, authorities);
20343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                }
20443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                if (Log.isLoggable(TAG, Log.VERBOSE)) {
20543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                    Log.d(TAG, "added authority " + sa.authority + " to accountType "
20643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                            + sa.accountType);
20743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                }
20843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                authorities.add(sa.authority);
20943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
21043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
21143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return mAccountTypeToAuthorities.get(type);
21243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
21343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
21443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
21543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets an icon associated with a particular account type. If none found, return null.
21643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param accountType the type of account
217d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu     * @return a drawable for the icon or a default icon returned by
218d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu     * {@link PackageManager#getDefaultActivityIcon} if one cannot be found.
21943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
22043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected Drawable getDrawableForType(final String accountType) {
22143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        Drawable icon = null;
22243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mTypeToAuthDescription.containsKey(accountType)) {
22343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            try {
22443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
2257d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina                Context authContext = createPackageContextAsUser(desc.packageName, 0, mUserHandle);
22630c50b15d0d716567c71d590aa835dc4a27591d6Amith Yamasani                icon = getPackageManager().getUserBadgedIcon(
2270ba89bd54c4b44b3803342da10b0c08b0bf76ad4Alan Viverette                        authContext.getDrawable(desc.iconId), mUserHandle);
22843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            } catch (PackageManager.NameNotFoundException e) {
229d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstrom                Log.w(TAG, "No icon name for account type " + accountType);
230d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstrom            } catch (Resources.NotFoundException e) {
231d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstrom                Log.w(TAG, "No icon resource for account type " + accountType);
23243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
23343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
234d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu        if (icon != null) {
235d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu            return icon;
236d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu        } else {
237d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu            return getPackageManager().getDefaultActivityIcon();
238d1ce82ae8b5ff9c32480234ceab84f6679fe2885Rubin Xu        }
23943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
24043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
24143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    /**
24243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * Gets the label associated with a particular account type. If none found, return null.
24343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @param accountType the type of account
24443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     * @return a CharSequence for the label or null if one cannot be found.
24543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani     */
24643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected CharSequence getLabelForType(final String accountType) {
24743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        CharSequence label = null;
24843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (mTypeToAuthDescription.containsKey(accountType)) {
24943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            try {
25043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
2517d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina                Context authContext = createPackageContextAsUser(desc.packageName, 0, mUserHandle);
25243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                label = authContext.getResources().getText(desc.labelId);
25343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            } catch (PackageManager.NameNotFoundException e) {
254d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstrom                Log.w(TAG, "No label name for account type " + accountType);
255d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstrom            } catch (Resources.NotFoundException e) {
256d26321eecb481528c5e54a608f2f3c4cc26d8a77Brian Carlstrom                Log.w(TAG, "No label resource for account type " + accountType);
25743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
25843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
25943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return label;
26043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
26143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
26243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    @Override
26343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
26443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        if (preference instanceof ProviderPreference) {
26543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            ProviderPreference pref = (ProviderPreference) preference;
26643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            if (Log.isLoggable(TAG, Log.VERBOSE)) {
26743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                Log.v(TAG, "Attempting to add account of type " + pref.getAccountType());
26843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            }
26943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            finishWithAccountType(pref.getAccountType());
27043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        }
27143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        return true;
27243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
27343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
27443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private void finishWithAccountType(String accountType) {
27543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        Intent intent = new Intent();
27643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        intent.putExtra(AddAccountSettings.EXTRA_SELECTED_ACCOUNT, accountType);
2777d748c0267b7d499309464ebae168be01e136b4cAlexandra Gherghina        intent.putExtra(EXTRA_USER, mUserHandle);
27874309ea53a5a72430bafaa8cea4d82d4e24f61bdFabrice Di Meglio        setResult(RESULT_OK, intent);
27943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        finish();
28043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
28143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani}
282