diff options
| author | Fabrice Di Meglio <fdimeglio@google.com> | 2011-01-20 16:12:36 -0800 |
|---|---|---|
| committer | Fabrice Di Meglio <fdimeglio@google.com> | 2011-01-21 14:58:02 -0800 |
| commit | 795f135a08b6db7372935fa15874723307748fec (patch) | |
| tree | 8e988eaf0ad0cd4271551ac1d9dc4471516f1eae /core/java/android/accounts | |
| parent | d8b9d7cd1b2327b02e41edcddf94e64d481419d1 (diff) | |
| download | frameworks_base-795f135a08b6db7372935fa15874723307748fec.zip frameworks_base-795f135a08b6db7372935fa15874723307748fec.tar.gz frameworks_base-795f135a08b6db7372935fa15874723307748fec.tar.bz2 | |
Fix bug #3338957 (Account Picker and Account type picker need love)
- update UI to match design requirements
Change-Id: Idb5dbea876eb7170a8c1f077a99cfe168d41f1e1
Diffstat (limited to 'core/java/android/accounts')
| -rw-r--r-- | core/java/android/accounts/ChooseAccountActivity.java | 120 |
1 files changed, 109 insertions, 11 deletions
diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java index 0bbb6fc..293df78 100644 --- a/core/java/android/accounts/ChooseAccountActivity.java +++ b/core/java/android/accounts/ChooseAccountActivity.java @@ -15,23 +15,39 @@ */ package android.accounts; -import android.app.ListActivity; +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcelable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.ImageView; import android.widget.ListView; -import android.view.View; -import android.util.Log; +import android.widget.TextView; +import com.android.internal.R; + +import java.util.HashMap; /** * @hide */ -public class ChooseAccountActivity extends ListActivity { +public class ChooseAccountActivity extends Activity { + private static final String TAG = "AccountManager"; + private Parcelable[] mAccounts = null; private AccountManagerResponse mAccountManagerResponse = null; private Bundle mResult; + private HashMap<String, AuthenticatorDescription> mTypeToAuthDescription + = new HashMap<String, AuthenticatorDescription>(); + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -47,16 +63,51 @@ public class ChooseAccountActivity extends ListActivity { return; } - String[] mAccountNames = new String[mAccounts.length]; + getAuthDescriptions(); + + AccountInfo[] mAccountInfos = new AccountInfo[mAccounts.length]; for (int i = 0; i < mAccounts.length; i++) { - mAccountNames[i] = ((Account) mAccounts[i]).name; + mAccountInfos[i] = new AccountInfo(((Account) mAccounts[i]).name, + getDrawableForType(((Account) mAccounts[i]).type)); } - // Use an existing ListAdapter that will map an array - // of strings to TextViews - setListAdapter(new ArrayAdapter<String>(this, - android.R.layout.simple_list_item_1, mAccountNames)); - getListView().setTextFilterEnabled(true); + setContentView(R.layout.choose_account); + + // Setup the list + ListView list = (ListView) findViewById(android.R.id.list); + // Use an existing ListAdapter that will map an array of strings to TextViews + list.setAdapter(new AccountArrayAdapter(this, + android.R.layout.simple_list_item_1, mAccountInfos)); + list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); + list.setTextFilterEnabled(true); + list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + public void onItemClick(AdapterView<?> parent, View v, int position, long id) { + onListItemClick((ListView)parent, v, position, id); + } + }); + } + + private void getAuthDescriptions() { + for(AuthenticatorDescription desc : AccountManager.get(this).getAuthenticatorTypes()) { + mTypeToAuthDescription.put(desc.type, desc); + } + } + + private Drawable getDrawableForType(String accountType) { + Drawable icon = null; + if(mTypeToAuthDescription.containsKey(accountType)) { + try { + AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType); + Context authContext = createPackageContext(desc.packageName, 0); + icon = authContext.getResources().getDrawable(desc.iconId); + } catch (PackageManager.NameNotFoundException e) { + // Nothing we can do much here, just log + if (Log.isLoggable(TAG, Log.WARN)) { + Log.w(TAG, "No icon for account type " + accountType); + } + } + } + return icon; } protected void onListItemClick(ListView l, View v, int position, long id) { @@ -79,4 +130,51 @@ public class ChooseAccountActivity extends ListActivity { } super.finish(); } + + private static class AccountInfo { + final String name; + final Drawable drawable; + + AccountInfo(String name, Drawable drawable) { + this.name = name; + this.drawable = drawable; + } + } + + private static class ViewHolder { + ImageView icon; + TextView text; + } + + private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> { + private LayoutInflater mLayoutInflater; + private AccountInfo[] mInfos; + + public AccountArrayAdapter(Context context, int textViewResourceId, AccountInfo[] infos) { + super(context, textViewResourceId, infos); + mInfos = infos; + mLayoutInflater = (LayoutInflater) context.getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + + if (convertView == null) { + convertView = mLayoutInflater.inflate(R.layout.choose_account_row, null); + holder = new ViewHolder(); + holder.text = (TextView) convertView.findViewById(R.id.account_row_text); + holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + holder.text.setText(mInfos[position].name); + holder.icon.setImageDrawable(mInfos[position].drawable); + + return convertView; + } + } } |
