Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3838)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java

Issue 2704263004: bluetooth: Add connected icon to Bluetooth Chooser on Android (Closed)
Patch Set: Address juncai's comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..6bfb361ffdb8a5b51dea867f4866e4a317781eb9 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);
+ } 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 /* icon */);
+ }
+
+ /**
+ * 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);
}

Powered by Google App Engine
This is Rietveld 408576698