| 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 a0f3ebdae3286ce1920f9d4a36aaacd22d30e230..96a9e8cff6cdcd17770810545cd668a6cdef6e59 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,11 +23,13 @@ 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;
|
| import android.widget.TextView;
|
|
|
| +import org.chromium.base.ApiCompatibilityUtils;
|
| import org.chromium.base.VisibleForTesting;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.util.MathUtils;
|
| @@ -64,10 +68,15 @@ public class ItemChooserDialog {
|
| public static class ItemChooserRow {
|
| private final String mKey;
|
| private String mDescription;
|
| + private Drawable mIcon;
|
| + private String mIconDescription;
|
|
|
| - public ItemChooserRow(String key, String description) {
|
| + public ItemChooserRow(String key, String description, @Nullable Drawable icon,
|
| + @Nullable String iconDescription) {
|
| mKey = key;
|
| mDescription = description;
|
| + mIcon = icon;
|
| + mIconDescription = iconDescription;
|
| }
|
|
|
| /**
|
| @@ -75,10 +84,14 @@ 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 Drawable icon,
|
| + @Nullable String iconDescription) {
|
| if (!TextUtils.equals(mKey, key)) return false;
|
| if (!TextUtils.equals(mDescription, description)) return false;
|
| + if (!ApiCompatibilityUtils.objectEquals(mIcon, icon)) return false;
|
| + if (!TextUtils.equals(mIconDescription, iconDescription)) return false;
|
| return true;
|
| }
|
| }
|
| @@ -123,8 +136,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 +169,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<>();
|
|
|
| + // True when there is at least one row with an icon.
|
| + private boolean mHasIcon;
|
| +
|
| public ItemAdapter(Context context, int resource) {
|
| super(context, resource);
|
|
|
| @@ -174,10 +192,20 @@ public class ItemChooserDialog {
|
| return isEmpty;
|
| }
|
|
|
| - public void addOrUpdate(String key, String description) {
|
| + /**
|
| + * Adds an item to the list to show in the dialog if the item
|
| + * was not in the chooser. Otherwise updates the items description, icon
|
| + * and icon description.
|
| + * @param key Unique identifier for that item.
|
| + * @param description Text in the row.
|
| + * @param icon Drawable to show next to the item.
|
| + * @param iconDescription Description of the icon.
|
| + */
|
| + public void addOrUpdate(String key, String description, @Nullable Drawable icon,
|
| + @Nullable String iconDescription) {
|
| ItemChooserRow oldItem = mKeyToItemMap.get(key);
|
| if (oldItem != null) {
|
| - if (oldItem.hasSameContents(key, description)) {
|
| + if (oldItem.hasSameContents(key, description, icon, iconDescription)) {
|
| // No need to update anything.
|
| return;
|
| }
|
| @@ -188,12 +216,17 @@ public class ItemChooserDialog {
|
| addToDescriptionsMap(oldItem.mDescription);
|
| }
|
|
|
| + if (!ApiCompatibilityUtils.objectEquals(icon, oldItem.mIcon)) {
|
| + oldItem.mIcon = icon;
|
| + oldItem.mIconDescription = iconDescription;
|
| + }
|
| +
|
| notifyDataSetChanged();
|
| return;
|
| }
|
|
|
| assert !mKeyToItemMap.containsKey(key);
|
| - ItemChooserRow newItem = new ItemChooserRow(key, description);
|
| + ItemChooserRow newItem = new ItemChooserRow(key, description, icon, iconDescription);
|
| mKeyToItemMap.put(key, newItem);
|
|
|
| addToDescriptionsMap(newItem.mDescription);
|
| @@ -307,10 +340,37 @@ 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 (!mHasIcon) {
|
| + row.mImageView.setVisibility(View.GONE);
|
| + } else {
|
| + ItemChooserRow item = getItem(position);
|
| + if (item.mIcon != null) {
|
| + row.mImageView.setContentDescription(item.mIconDescription);
|
| + row.mImageView.setImageDrawable(item.mIcon);
|
| + row.mImageView.setVisibility(View.VISIBLE);
|
| + } else {
|
| + row.mImageView.setVisibility(View.INVISIBLE);
|
| + row.mImageView.setImageDrawable(null);
|
| + row.mImageView.setContentDescription(null);
|
| + }
|
| + row.mImageView.setSelected(position == mSelectedItem);
|
| + }
|
| return convertView;
|
| }
|
|
|
| @Override
|
| + public void notifyDataSetChanged() {
|
| + mHasIcon = false;
|
| + for (ItemChooserRow row : mKeyToItemMap.values()) {
|
| + if (row.mIcon != null) mHasIcon = true;
|
| + }
|
| + super.notifyDataSetChanged();
|
| + }
|
| +
|
| + @Override
|
| public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
|
| mSelectedItem = position;
|
| mConfirmButton.setEnabled(true);
|
| @@ -504,8 +564,24 @@ public class ItemChooserDialog {
|
| * @param description Text in the row.
|
| */
|
| public void addOrUpdateItem(String key, String description) {
|
| + addOrUpdateItem(key, description, null /* icon */, null /* iconDescription */);
|
| + }
|
| +
|
| + /**
|
| + * 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.
|
| + * Note that as long as at least one item has an icon all rows will be inset
|
| + * with the icon dimensions.
|
| + *
|
| + * @param key Unique identifier for that item.
|
| + * @param description Text in the row.
|
| + * @param icon Drawable to show left of the description.
|
| + * @param iconDescription Description of the icon.
|
| + */
|
| + public void addOrUpdateItem(String key, String description, @Nullable Drawable icon,
|
| + @Nullable String iconDescription) {
|
| mProgressBar.setVisibility(View.GONE);
|
| - mItemAdapter.addOrUpdate(key, description);
|
| + mItemAdapter.addOrUpdate(key, description, icon, iconDescription);
|
| setState(State.PROGRESS_UPDATE_AVAILABLE);
|
| }
|
|
|
|
|