13326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana/* 23326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * Copyright (C) 2009 The Android Open Source Project 33326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * 43326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License"); 53326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * you may not use this file except in compliance with the License. 63326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * You may obtain a copy of the License at 73326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * 83326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * http://www.apache.org/licenses/LICENSE-2.0 93326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * 103326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * Unless required by applicable law or agreed to in writing, software 113326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS, 123326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * See the License for the specific language governing permissions and 143326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana * limitations under the License. 153326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana */ 163326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanapackage android.accounts; 173326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 18795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.app.Activity; 19795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.content.Context; 20795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.content.pm.PackageManager; 2146703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstromimport android.content.res.Resources; 22795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.graphics.drawable.Drawable; 233326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.os.Bundle; 243326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.os.Parcelable; 25795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.util.Log; 26795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.view.LayoutInflater; 27795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.view.View; 28795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.view.ViewGroup; 29795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.widget.AdapterView; 303326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.widget.ArrayAdapter; 31795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.widget.ImageView; 323326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintanaimport android.widget.ListView; 33795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport android.widget.TextView; 34795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport com.android.internal.R; 35795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 36795f135a08b6db7372935fa15874723307748fecFabrice Di Meglioimport java.util.HashMap; 373326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 38f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana/** 39f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana * @hide 40f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana */ 41795f135a08b6db7372935fa15874723307748fecFabrice Di Megliopublic class ChooseAccountActivity extends Activity { 42795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 433326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana private static final String TAG = "AccountManager"; 44795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 453326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana private Parcelable[] mAccounts = null; 463326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana private AccountManagerResponse mAccountManagerResponse = null; 473326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana private Bundle mResult; 483326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 49795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private HashMap<String, AuthenticatorDescription> mTypeToAuthDescription 50795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio = new HashMap<String, AuthenticatorDescription>(); 51795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 523326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana @Override 533326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana public void onCreate(Bundle savedInstanceState) { 543326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana super.onCreate(savedInstanceState); 553326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 56262226137de1007a6373666b792ebed6eb4c03deFred Quintana mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS); 57262226137de1007a6373666b792ebed6eb4c03deFred Quintana mAccountManagerResponse = 58262226137de1007a6373666b792ebed6eb4c03deFred Quintana getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE); 59262226137de1007a6373666b792ebed6eb4c03deFred Quintana 60262226137de1007a6373666b792ebed6eb4c03deFred Quintana // KEY_ACCOUNTS is a required parameter 61262226137de1007a6373666b792ebed6eb4c03deFred Quintana if (mAccounts == null) { 62262226137de1007a6373666b792ebed6eb4c03deFred Quintana setResult(RESULT_CANCELED); 63262226137de1007a6373666b792ebed6eb4c03deFred Quintana finish(); 64262226137de1007a6373666b792ebed6eb4c03deFred Quintana return; 653326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 663326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 67795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio getAuthDescriptions(); 68795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 69795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio AccountInfo[] mAccountInfos = new AccountInfo[mAccounts.length]; 703326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana for (int i = 0; i < mAccounts.length; i++) { 71795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio mAccountInfos[i] = new AccountInfo(((Account) mAccounts[i]).name, 72795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio getDrawableForType(((Account) mAccounts[i]).type)); 733326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 743326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 75795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio setContentView(R.layout.choose_account); 76795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 77795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio // Setup the list 78795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio ListView list = (ListView) findViewById(android.R.id.list); 79795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio // Use an existing ListAdapter that will map an array of strings to TextViews 80795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio list.setAdapter(new AccountArrayAdapter(this, 81795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio android.R.layout.simple_list_item_1, mAccountInfos)); 82795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 83795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio list.setTextFilterEnabled(true); 84795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 85795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 86795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio onListItemClick((ListView)parent, v, position, id); 87795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 88795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio }); 89795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 90795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 91795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private void getAuthDescriptions() { 92795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio for(AuthenticatorDescription desc : AccountManager.get(this).getAuthenticatorTypes()) { 93795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio mTypeToAuthDescription.put(desc.type, desc); 94795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 95795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 96795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 97795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private Drawable getDrawableForType(String accountType) { 98795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio Drawable icon = null; 99795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio if(mTypeToAuthDescription.containsKey(accountType)) { 100795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio try { 101795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType); 102795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio Context authContext = createPackageContext(desc.packageName, 0); 103795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio icon = authContext.getResources().getDrawable(desc.iconId); 104795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } catch (PackageManager.NameNotFoundException e) { 105795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio // Nothing we can do much here, just log 106795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio if (Log.isLoggable(TAG, Log.WARN)) { 10746703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom Log.w(TAG, "No icon name for account type " + accountType); 10846703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom } 10946703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom } catch (Resources.NotFoundException e) { 11046703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom // Nothing we can do much here, just log 11146703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom if (Log.isLoggable(TAG, Log.WARN)) { 11246703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom Log.w(TAG, "No icon resource for account type " + accountType); 113795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 114795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 115795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 116795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio return icon; 1173326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 1183326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 1193326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana protected void onListItemClick(ListView l, View v, int position, long id) { 1203326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana Account account = (Account) mAccounts[position]; 1213326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana Log.d(TAG, "selected account " + account); 1223326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana Bundle bundle = new Bundle(); 123f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); 124f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); 1253326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana mResult = bundle; 1263326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana finish(); 1273326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 1283326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana 1293326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana public void finish() { 1303326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana if (mAccountManagerResponse != null) { 1313326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana if (mResult != null) { 1323326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana mAccountManagerResponse.onResult(mResult); 1333326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } else { 134f7ae77cd67f1a3993b8e56c1af4720a7adf4e69dFred Quintana mAccountManagerResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled"); 1353326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 1363326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 1373326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana super.finish(); 1383326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana } 139795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 140795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private static class AccountInfo { 141795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio final String name; 142795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio final Drawable drawable; 143795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 144795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio AccountInfo(String name, Drawable drawable) { 145795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio this.name = name; 146795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio this.drawable = drawable; 147795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 148795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 149795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 150795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private static class ViewHolder { 151795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio ImageView icon; 152795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio TextView text; 153795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 154795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 155795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> { 156795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private LayoutInflater mLayoutInflater; 157795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio private AccountInfo[] mInfos; 158795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 159795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio public AccountArrayAdapter(Context context, int textViewResourceId, AccountInfo[] infos) { 160795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio super(context, textViewResourceId, infos); 161795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio mInfos = infos; 162795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio mLayoutInflater = (LayoutInflater) context.getSystemService( 163795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio Context.LAYOUT_INFLATER_SERVICE); 164795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 165795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 166795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio @Override 167795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio public View getView(int position, View convertView, ViewGroup parent) { 168795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio ViewHolder holder; 169795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 170795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio if (convertView == null) { 171795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio convertView = mLayoutInflater.inflate(R.layout.choose_account_row, null); 172795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio holder = new ViewHolder(); 173795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio holder.text = (TextView) convertView.findViewById(R.id.account_row_text); 174795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon); 175795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio convertView.setTag(holder); 176795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } else { 177795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio holder = (ViewHolder) convertView.getTag(); 178795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 179795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 180795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio holder.text.setText(mInfos[position].name); 181795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio holder.icon.setImageDrawable(mInfos[position].drawable); 182795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio 183795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio return convertView; 184795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 185795f135a08b6db7372935fa15874723307748fecFabrice Di Meglio } 1863326920329cecb57c7ff1fc5c6add5c98aab9ed9Fred Quintana} 187