Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
| index 3ddfb79821af2d508304674fde109c920c626e65..8f2df73345979828e1bd5f9b71123485cad75e3d 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
| @@ -10,6 +10,8 @@ import android.content.Context; |
| import android.content.DialogInterface; |
| import android.graphics.Color; |
| import android.graphics.drawable.ColorDrawable; |
| +import android.graphics.drawable.Drawable; |
| +import android.support.annotation.Nullable; |
| import android.text.TextUtils; |
| import android.text.method.LinkMovementMethod; |
| import android.view.Gravity; |
| @@ -21,6 +23,7 @@ import android.view.Window; |
| import android.widget.AdapterView; |
| import android.widget.ArrayAdapter; |
| import android.widget.Button; |
| +import android.widget.ImageView; |
| import android.widget.LinearLayout; |
| import android.widget.ListView; |
| import android.widget.ProgressBar; |
| @@ -59,15 +62,49 @@ public class ItemChooserDialog { |
| } |
| /** |
| + * A class that contains a Drawable icon, a variant of this icon for when the row |
| + * is selected and a description of this icon. |
| + */ |
| + public static class ItemChooserRowIcon { |
| + private final Drawable mIcon; |
| + private final Drawable mSelected; |
| + private final String mDescription; |
| + |
| + public ItemChooserRowIcon(Drawable icon, Drawable selectedIcon, String iconDescription) { |
| + mIcon = icon; |
| + mSelected = selectedIcon; |
| + mDescription = iconDescription; |
| + } |
| + |
| + /** |
| + * Returns true if |icon1| is equal to |icon2| or all their members are equal. |
| + * |
| + * @param icon1 Icon object to compare. |
| + * @param icon2 Icon object to compare. |
| + */ |
| + public static boolean equals( |
| + @Nullable ItemChooserRowIcon icon1, @Nullable ItemChooserRowIcon icon2) { |
| + if (icon1 == icon2) return true; |
| + if (icon1 == null || icon2 == null) return false; |
| + if (icon1.mIcon != icon2.mIcon) return false; |
| + if (icon1.mSelected != icon2.mSelected) return false; |
| + if (!TextUtils.equals(icon1.mDescription, icon2.mDescription)) return false; |
| + return true; |
| + } |
| + } |
| + |
| + /** |
| * A class representing one data row in the picker. |
| */ |
| public static class ItemChooserRow { |
| private final String mKey; |
| private String mDescription; |
| + private ItemChooserRowIcon mIcon; |
| - public ItemChooserRow(String key, String description) { |
| + public ItemChooserRow(String key, String description, @Nullable ItemChooserRowIcon icon) { |
| mKey = key; |
| mDescription = description; |
| + mIcon = icon; |
| } |
| /** |
| @@ -75,12 +112,25 @@ public class ItemChooserDialog { |
| * |
| * @param key Expected item unique identifier. |
| * @param description Expected item description. |
| + * @param icon Expected item icon. |
| */ |
| - public boolean hasSameContents(String key, String description) { |
| + public boolean hasSameContents( |
| + String key, String description, @Nullable ItemChooserRowIcon icon) { |
| if (!TextUtils.equals(mKey, key)) return false; |
| if (!TextUtils.equals(mDescription, description)) return false; |
| + if (!ItemChooserRowIcon.equals(mIcon, icon)) return false; |
| return true; |
| } |
| + |
| + /** |
| + * Returns true if all parameters match the corresponding member. |
| + * |
| + * @param key Expected item unique identifier. |
| + * @param description Expected item description. |
| + */ |
| + public boolean hasSameContents(String key, String description) { |
| + return hasSameContents(key, description, null /* icon */); |
| + } |
| } |
| /** |
| @@ -123,8 +173,10 @@ public class ItemChooserDialog { |
| */ |
| private static class ViewHolder { |
| private TextView mTextView; |
| + private ImageView mImageView; |
| public ViewHolder(View view) { |
| + mImageView = (ImageView) view.findViewById(R.id.icon); |
| mTextView = (TextView) view.findViewById(R.id.description); |
| } |
| } |
| @@ -154,6 +206,9 @@ public class ItemChooserDialog { |
| // Map of keys to items so that we can access the items in O(1). |
| private Map<String, ItemChooserRow> mKeyToItemMap = new HashMap<>(); |
| + // Set of keys to items that have icons. |
| + private Set<String> mItemsWithIcons = new HashSet<String>(); |
| + |
| public ItemAdapter(Context context, int resource) { |
| super(context, resource); |
| @@ -167,6 +222,7 @@ public class ItemChooserDialog { |
| assert mKeyToItemMap.isEmpty(); |
| assert mDisabledEntries.isEmpty(); |
| assert mItemDescriptionMap.isEmpty(); |
| + assert mItemsWithIcons.isEmpty(); |
| } else { |
| assert !mKeyToItemMap.isEmpty(); |
| assert !mItemDescriptionMap.isEmpty(); |
| @@ -174,10 +230,10 @@ public class ItemChooserDialog { |
| return isEmpty; |
| } |
| - public void addOrUpdate(String key, String description) { |
| + public void addOrUpdate(String key, String description, @Nullable ItemChooserRowIcon icon) { |
| ItemChooserRow oldItem = mKeyToItemMap.get(key); |
| if (oldItem != null) { |
| - if (oldItem.hasSameContents(key, description)) { |
| + if (oldItem.hasSameContents(key, description, icon)) { |
| // No need to update anything. |
| return; |
| } |
| @@ -188,15 +244,21 @@ public class ItemChooserDialog { |
| addToDescriptionsMap(oldItem.mDescription); |
| } |
| + if (!ItemChooserRowIcon.equals(icon, oldItem.mIcon)) { |
| + oldItem.mIcon = icon; |
| + updateItemsWithIconsSet(oldItem.mKey, oldItem.mIcon); |
| + } |
| + |
| notifyDataSetChanged(); |
| return; |
| } |
| assert !mKeyToItemMap.containsKey(key); |
| - ItemChooserRow newItem = new ItemChooserRow(key, description); |
| + ItemChooserRow newItem = new ItemChooserRow(key, description, icon); |
| mKeyToItemMap.put(key, newItem); |
| addToDescriptionsMap(newItem.mDescription); |
| + updateItemsWithIconsSet(key, newItem.mIcon); |
| add(newItem); |
| } |
| @@ -215,6 +277,7 @@ public class ItemChooserDialog { |
| --mSelectedItem; |
| } |
| removeFromDescriptionsMap(oldItem.mDescription); |
| + updateItemsWithIconsSet(key, null /* newIcon */); |
| super.remove(oldItem); |
| } |
| @@ -239,6 +302,10 @@ public class ItemChooserDialog { |
| return row.mKey; |
| } |
| + private boolean isSelected(int position) { |
| + return mSelectedItem == position; |
| + } |
| + |
| /** |
| * Returns the text to be displayed on the chooser for an item. For items with the same |
| * description, their unique keys are appended to distinguish them. |
| @@ -305,6 +372,24 @@ public class ItemChooserDialog { |
| row.mTextView.setEnabled(isEnabled(position)); |
| row.mTextView.setText(getDisplayText(position)); |
| + // If there is at least one item with an icon then we set mImageView's |
| + // visibility to INVISIBLE for all items with no icons. We do this |
| + // so that all items' desriptions are aligned. |
| + if (mItemsWithIcons.isEmpty()) { |
| + row.mImageView.setVisibility(View.GONE); |
| + } else { |
| + ItemChooserRowIcon icon = getItem(position).mIcon; |
| + if (icon != null) { |
| + row.mImageView.setContentDescription(icon.mDescription); |
| + row.mImageView.setImageDrawable( |
| + isSelected(position) ? icon.mSelected : icon.mIcon); |
| + row.mImageView.setVisibility(View.VISIBLE); |
|
juncai
2017/02/22 22:22:57
nit: change these three lines to be the same order
ortuno
2017/02/28 01:42:48
The ones below are reversed because I think it mak
|
| + } else { |
| + row.mImageView.setVisibility(View.INVISIBLE); |
| + row.mImageView.setImageDrawable(null); |
| + row.mImageView.setContentDescription(null); |
| + } |
| + } |
| return convertView; |
| } |
| @@ -315,6 +400,14 @@ public class ItemChooserDialog { |
| notifyDataSetChanged(); |
| } |
| + private void updateItemsWithIconsSet(String key, @Nullable ItemChooserRowIcon newIcon) { |
| + if (newIcon == null) { |
| + mItemsWithIcons.remove(key); |
| + } else { |
| + mItemsWithIcons.add(key); |
| + } |
| + } |
| + |
| private void addToDescriptionsMap(String description) { |
| int count = mItemDescriptionMap.containsKey(description) |
| ? mItemDescriptionMap.get(description) |
| @@ -484,8 +577,20 @@ public class ItemChooserDialog { |
| * @param description Text in the row. |
| */ |
| public void addOrUpdateItem(String key, String description) { |
| + addOrUpdateItem(key, description, null); |
|
juncai
2017/02/22 22:22:57
nit: add comment for null.
ortuno
2017/02/28 01:42:48
Done.
|
| + } |
| + |
| + /** |
| + * Adds an item to the end of the list to show in the dialog if the item |
| + * was not in the chooser. Otherwise updates the items description or icon. |
| + * |
| + * @param key Unique identifier for that item. |
| + * @param description Text in the row. |
| + * @param icon Icon for the row. |
| + */ |
| + public void addOrUpdateItem(String key, String description, @Nullable ItemChooserRowIcon icon) { |
| mProgressBar.setVisibility(View.GONE); |
| - mItemAdapter.addOrUpdate(key, description); |
| + mItemAdapter.addOrUpdate(key, description, icon); |
| setState(State.PROGRESS_UPDATE_AVAILABLE); |
| } |