Index: chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java |
index ce4cd65badc3f0b64481b46a0613c53d93e3d47b..ec9fe27d01c9642f35562914325d2075d8b6ae1d 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java |
@@ -8,8 +8,11 @@ import android.graphics.drawable.Drawable; |
import android.view.LayoutInflater; |
import android.view.MenuItem; |
import android.view.View; |
+import android.view.View.OnClickListener; |
import android.view.ViewGroup; |
import android.widget.BaseAdapter; |
+import android.widget.Button; |
+import android.widget.ImageButton; |
import android.widget.ListView; |
import android.widget.TextView; |
@@ -21,14 +24,29 @@ import java.util.List; |
* ListAdapter to customize the view of items in the list. |
*/ |
class AppMenuAdapter extends BaseAdapter { |
- private static final int VIEW_TYPE_MENUITEM = 0; |
- private static final int VIEW_TYPE_COUNT = 1; |
- |
+ private static final int VIEW_TYPE_COUNT = 3; |
+ |
+ /** |
+ * Regular Android menu item that contains a title and an icon if icon is specified. |
+ */ |
+ private static final int STANDARD_MENU_ITEM = 0; |
+ /** |
+ * Menu item that has two buttons, the first one is a title and the second one is an icon. |
+ * It is different from the regular menu item because it contains two separate buttons. |
+ */ |
+ private static final int TITLE_BUTTON_MENU_ITEM = 1; |
+ /** |
+ * Menu item that has three buttons. Every one of these buttons is displayed as an icon. |
+ */ |
+ private static final int THREE_BUTTON_MENU_ITEM = 2; |
+ |
+ private final AppMenu mAppMenu; |
private final LayoutInflater mInflater; |
private final List<MenuItem> mMenuItems; |
private final int mNumMenuItems; |
- public AppMenuAdapter(List<MenuItem> menuItems, LayoutInflater inflater) { |
+ public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInflater inflater) { |
+ mAppMenu = appMenu; |
mMenuItems = menuItems; |
mInflater = inflater; |
mNumMenuItems = menuItems.size(); |
@@ -46,7 +64,14 @@ class AppMenuAdapter extends BaseAdapter { |
@Override |
public int getItemViewType(int position) { |
- return VIEW_TYPE_MENUITEM; |
+ if (getItem(position).hasSubMenu()) { |
+ if (getItem(position).getSubMenu().size() == 3) { |
+ return THREE_BUTTON_MENU_ITEM; |
+ } else if (getItem(position).getSubMenu().size() == 2) { |
+ return TITLE_BUTTON_MENU_ITEM; |
+ } |
+ } |
+ return STANDARD_MENU_ITEM; |
} |
@Override |
@@ -64,41 +89,117 @@ class AppMenuAdapter extends BaseAdapter { |
@Override |
public View getView(int position, View convertView, ViewGroup parent) { |
- View rowView = convertView; |
- // A ViewHolder keeps references to children views to avoid unneccessary calls |
- // to findViewById() on each row. |
- ViewHolder holder = null; |
- |
- // When convertView is not null, we can reuse it directly, there is no need |
- // to reinflate it. |
- if (rowView == null) { |
- holder = new ViewHolder(); |
- rowView = mInflater.inflate(R.layout.menu_item, null); |
- holder.text = (TextView) rowView.findViewById(R.id.menu_item_text); |
- holder.image = (AppMenuItemIcon) rowView.findViewById(R.id.menu_item_icon); |
- rowView.setTag(holder); |
- } else { |
- holder = (ViewHolder) convertView.getTag(); |
+ final MenuItem item = getItem(position); |
+ switch (getItemViewType(position)) { |
+ case STANDARD_MENU_ITEM: { |
+ StandardMenuItemViewHolder holder = null; |
+ if (convertView == null) { |
+ holder = new StandardMenuItemViewHolder(); |
+ convertView = mInflater.inflate(R.layout.menu_item, null); |
+ holder.text = (TextView) convertView.findViewById(R.id.menu_item_text); |
+ holder.image = (AppMenuItemIcon) convertView.findViewById(R.id.menu_item_icon); |
+ convertView.setTag(holder); |
+ } else { |
+ holder = (StandardMenuItemViewHolder) convertView.getTag(); |
+ } |
+ |
+ convertView.setOnClickListener(new OnClickListener() { |
+ @Override |
+ public void onClick(View v) { |
+ mAppMenu.onItemClick(item); |
+ } |
+ }); |
+ // Set up the icon. |
+ Drawable icon = item.getIcon(); |
+ holder.image.setImageDrawable(icon); |
+ holder.image.setVisibility(icon == null ? View.GONE : View.VISIBLE); |
+ holder.image.setChecked(item.isChecked()); |
+ |
+ holder.text.setText(item.getTitle()); |
+ boolean isEnabled = item.isEnabled(); |
+ // Set the text color (using a color state list). |
+ holder.text.setEnabled(isEnabled); |
+ // This will ensure that the item is not highlighted when selected. |
+ convertView.setEnabled(isEnabled); |
+ break; |
+ } |
+ case THREE_BUTTON_MENU_ITEM: { |
+ ThreeButtonMenuItemViewHolder holder = null; |
+ if (convertView == null) { |
+ holder = new ThreeButtonMenuItemViewHolder(); |
+ convertView = mInflater.inflate(R.layout.three_button_menu_item, null); |
+ holder.buttonOne = (ImageButton) convertView.findViewById(R.id.button_one); |
+ holder.buttonTwo = (ImageButton) convertView.findViewById(R.id.button_two); |
+ holder.buttonThree = (ImageButton) convertView.findViewById(R.id.button_three); |
+ convertView.setTag(holder); |
+ } else { |
+ holder = (ThreeButtonMenuItemViewHolder) convertView.getTag(); |
+ } |
+ setupImageButton(holder.buttonOne, item.getSubMenu().getItem(0)); |
+ setupImageButton(holder.buttonTwo, item.getSubMenu().getItem(1)); |
+ setupImageButton(holder.buttonThree, item.getSubMenu().getItem(2)); |
+ convertView.setFocusable(false); |
+ convertView.setEnabled(false); |
+ break; |
+ } |
+ case TITLE_BUTTON_MENU_ITEM: { |
+ TitleButtonMenuItemViewHolder holder = null; |
+ if (convertView == null) { |
+ holder = new TitleButtonMenuItemViewHolder(); |
+ convertView = mInflater.inflate(R.layout.title_button_menu_item, null); |
+ holder.title = (Button) convertView.findViewById(R.id.title); |
+ holder.button = (ImageButton) convertView.findViewById(R.id.button); |
+ convertView.setTag(holder); |
+ } else { |
+ holder = (TitleButtonMenuItemViewHolder) convertView.getTag(); |
+ } |
+ final MenuItem titleItem = item.getSubMenu().getItem(0); |
+ holder.title.setText(titleItem.getTitle()); |
+ holder.title.setEnabled(titleItem.isEnabled()); |
+ holder.title.setFocusable(titleItem.isEnabled()); |
+ holder.title.setOnClickListener(new OnClickListener() { |
+ @Override |
+ public void onClick(View v) { |
+ mAppMenu.onItemClick(titleItem); |
+ } |
+ }); |
+ setupImageButton(holder.button, item.getSubMenu().getItem(1)); |
+ convertView.setFocusable(false); |
+ convertView.setEnabled(false); |
+ break; |
+ } |
+ default: |
+ assert false : "Unexpected MenuItem type"; |
} |
- MenuItem item = getItem(position); |
- |
- // Set up the icon. |
- Drawable icon = item.getIcon(); |
- holder.image.setImageDrawable(icon); |
- holder.image.setVisibility(icon == null ? View.GONE : View.VISIBLE); |
- holder.image.setChecked(item.isChecked()); |
- |
- holder.text.setText(item.getTitle()); |
- boolean isEnabled = item.isEnabled(); |
- // Set the text color (using a color state list). |
- holder.text.setEnabled(isEnabled); |
- // This will ensure that the item is not highlighted when selected. |
- rowView.setEnabled(isEnabled); |
- return rowView; |
+ return convertView; |
+ } |
+ |
+ private void setupImageButton(ImageButton button, final MenuItem item) { |
+ button.setImageDrawable(item.getIcon()); |
+ button.setContentDescription(item.getTitle()); |
+ button.setEnabled(item.isEnabled()); |
+ button.setFocusable(item.isEnabled()); |
+ button.setOnClickListener(new OnClickListener() { |
+ @Override |
+ public void onClick(View v) { |
+ mAppMenu.onItemClick(item); |
+ } |
+ }); |
} |
- static class ViewHolder { |
+ static class StandardMenuItemViewHolder { |
public TextView text; |
public AppMenuItemIcon image; |
} |
+ |
+ static class ThreeButtonMenuItemViewHolder { |
+ public ImageButton buttonOne; |
+ public ImageButton buttonTwo; |
+ public ImageButton buttonThree; |
+ } |
+ |
+ static class TitleButtonMenuItemViewHolder { |
+ public Button title; |
+ public ImageButton button; |
+ } |
} |