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