Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java |
| index 24bbc3c3f1cbc8dba2ae170a0ae967f9ffc2a017..22146a603a5a389731b0eb597806c030b6334aa5 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java |
| @@ -24,81 +24,43 @@ import java.util.List; |
| * A Helper class for managing the Translate Overflow Menu. |
| */ |
| public class TranslateMenuHelper implements AdapterView.OnItemClickListener { |
| - private static final String EMPTY_STRING = ""; |
| private final TranslateMenuItemListener mItemListener; |
| - private ContextThemeWrapper mWrapper; |
| - private View mAnchorView; |
| + |
| + private ContextThemeWrapper mContextWrapper; |
| private TranslateMenuAdapter mAdapter; |
| private ListPopupWindow mPopup; |
| + private View mAnchorView; |
| + private String mSourceLanguage; |
| - /** |
| - * Add a divider menu item to list. |
| - * @param list The list of items to show in the menu. |
| - */ |
| - public static void addDivider(List<TranslateMenuElement> list) { |
| - list.add(new TranslateMenuElement( |
| - EMPTY_STRING, EMPTY_STRING, TranslateMenuAdapter.MENU_DIVIDER)); |
| - } |
| - |
| - /** |
| - * Add an overflow menu item to list. |
| - * @param title Title of the menu item |
| - * @param code Code of the menu item |
| - * @param list The list of items to show in the menu. |
| - */ |
| - public static void addOverflowMenuItem( |
| - String title, String code, List<TranslateMenuElement> list) { |
| - list.add(new TranslateMenuElement(title, code, TranslateMenuAdapter.OVERFLOW_MENU_ITEM)); |
| - } |
| - |
| - /** |
| - * Add a source language menu item to list. |
| - * @param title Title of the language |
| - * @param code ISO code of the language |
| - * @param list The list of items to show in the menu. |
| - */ |
| - public static void addSourceLanguageMenuItem( |
| - String title, String code, List<TranslateMenuElement> list) { |
| - list.add(new TranslateMenuElement( |
| - title, code, TranslateMenuAdapter.SOURCE_LANGUAGE_MENU_ITEM)); |
| - } |
| - |
| - /** |
| - * Add a target language menu item to list. |
| - * @param title Title of the language |
| - * @param code ISO code of the language |
| - * @param list The list of items to show in the menu. |
| - */ |
| - public static void addTargetLanguageMenuItem( |
| - String title, String code, List<TranslateMenuElement> list) { |
| - list.add(new TranslateMenuElement( |
| - title, code, TranslateMenuAdapter.TARGET_LANGUAGE_MENU_ITEM)); |
| - } |
| + private List<TranslateMenu.TranslateMenuItem> mMenuList; |
| /** |
| * Interface for receiving the click event of menu item. |
| */ |
| public interface TranslateMenuItemListener { |
| - // return true if the menu is dismissed after clicking on the item; return false otherwise. |
| - // (when clicking on 'More languages' or 'Page not in this language', we show the language |
| - // menu by keeping the menu but replace the items inside.) |
| - boolean onTranslateMenuItemClicked(String code, int type); |
| + void onTranslateMenuItemClicked(int itemType, String code); |
| } |
| - public TranslateMenuHelper( |
| - Context context, View anchorView, TranslateMenuItemListener itemListener) { |
| - mWrapper = new ContextThemeWrapper(context, R.style.OverflowMenuTheme); |
| + public TranslateMenuHelper(Context context, View anchorView, |
| + TranslateMenuItemListener itemListener, String sourceLanguage, |
| + List<TranslateMenu.TranslateMenuItem> menuList) { |
| + mContextWrapper = new ContextThemeWrapper(context, R.style.OverflowMenuTheme); |
| mAnchorView = anchorView; |
| mItemListener = itemListener; |
| + mSourceLanguage = sourceLanguage; |
| + mMenuList = menuList; |
| } |
| /** |
| * Show the overflow menu. |
| - * @param list List of menuitems. |
| */ |
| - public void show(List<TranslateMenuElement> list) { |
| + public void show() { |
| + if (mMenuList.isEmpty()) { |
| + return; |
| + } |
| + |
| if (mPopup == null) { |
| - mPopup = new ListPopupWindow(mWrapper, null, android.R.attr.popupMenuStyle); |
| + mPopup = new ListPopupWindow(mContextWrapper, null, android.R.attr.popupMenuStyle); |
| mPopup.setModal(true); |
| mPopup.setAnchorView(mAnchorView); |
| mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); |
| @@ -106,22 +68,17 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener { |
| // Need to explicitly set the background here. Relying on it being set in the style |
| // caused an incorrectly drawn background. |
| mPopup.setBackgroundDrawable( |
| - ContextCompat.getDrawable(mWrapper, R.drawable.edge_menu_bg)); |
| + ContextCompat.getDrawable(mContextWrapper, R.drawable.edge_menu_bg)); |
| - int popupWidth = mWrapper.getResources().getDimensionPixelSize( |
| - R.dimen.infobar_translate_menu_width); |
| + mPopup.setOnItemClickListener(this); |
| + int popupWidth = mContextWrapper.getResources().getDimensionPixelSize( |
| + R.dimen.infobar_translate_menu_width); |
| // TODO (martiw) make the width dynamic to handle longer items. |
| mPopup.setWidth(popupWidth); |
| - mAdapter = new TranslateMenuAdapter( |
| - mWrapper, R.id.menu_item_text, list, LayoutInflater.from(mWrapper)); |
| + mAdapter = new TranslateMenuAdapter(); |
| mPopup.setAdapter(mAdapter); |
| - |
| - mPopup.setOnItemClickListener(this); |
| - } else { |
| - mAdapter.clear(); |
| - mAdapter.addAll(list); |
| } |
| if (!mPopup.isShowing()) { |
| @@ -132,14 +89,13 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener { |
| @Override |
| public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
| - if (mItemListener.onTranslateMenuItemClicked( |
| - mAdapter.getItem(position).getCode(), mAdapter.getItemViewType(position))) { |
| - dismiss(); |
| - } |
| + dismiss(); |
| + mItemListener.onTranslateMenuItemClicked( |
| + mAdapter.getItemViewType(position), mAdapter.getItem(position).mCode); |
| } |
| /** |
| - * Dismisses the app menu. |
| + * Dismisses the translate option menu. |
| */ |
| void dismiss() { |
| if (isShowing()) { |
| @@ -160,81 +116,60 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener { |
| /** |
| * The provides the views of the menu items and dividers. |
| */ |
| - public static final class TranslateMenuAdapter extends ArrayAdapter<TranslateMenuElement> { |
| - public static final int MENU_DIVIDER = 0; |
| - public static final int OVERFLOW_MENU_ITEM = 1; |
| - public static final int SOURCE_LANGUAGE_MENU_ITEM = 2; |
| - public static final int TARGET_LANGUAGE_MENU_ITEM = 3; |
| + private final class TranslateMenuAdapter extends ArrayAdapter<TranslateMenu.TranslateMenuItem> { |
| // TODO(martiw) create OVERFLOW_MENU_ITEM_WITH_CHECKBOX_CHECKED and |
| // OVERFLOW_MENU_ITEM_WITH_CHECKBOX_UNCHECKED for "Always Translate Language" |
| - LayoutInflater mInflater; |
| + private final LayoutInflater mInflater; |
| - public TranslateMenuAdapter(Context context, int textViewResourceId, |
| - List<TranslateMenuElement> items, LayoutInflater inflater) { |
| - super(context, textViewResourceId, items); |
| - mInflater = inflater; |
| + public TranslateMenuAdapter() { |
| + super(mContextWrapper, R.layout.translate_menu_item, mMenuList); |
| + mInflater = LayoutInflater.from(mContextWrapper); |
| } |
| @Override |
| public int getItemViewType(int position) { |
| - return getItem(position).getType(); |
| + return getItem(position).mType; |
| + } |
| + |
| + @Override |
| + public int getViewTypeCount() { |
| + return TranslateMenu.MENU_ITEM_TYPE_COUNT; |
| } |
| @Override |
| public boolean isEnabled(int position) { |
| - return getItemViewType(position) != MENU_DIVIDER; |
| + return getItemViewType(position) != TranslateMenu.MENU_DIVIDER; |
| } |
| @Override |
| public View getView(int position, View convertView, ViewGroup parent) { |
| - switch (getItemViewType(position)) { |
| - case MENU_DIVIDER: |
| - convertView = mInflater.inflate(R.layout.translate_menu_divider, parent, false); |
| + final int itemViewType = getItemViewType(position); |
| + View menuItemView = convertView; |
| + switch (itemViewType) { |
| + case TranslateMenu.MENU_DIVIDER: |
| + if (convertView == null) { |
|
gone
2017/04/19 23:21:13
if (menuItemView == null)
you already set menuIte
Leo
2017/04/20 01:17:21
Done.
|
| + menuItemView = |
| + mInflater.inflate(R.layout.translate_menu_divider, parent, false); |
| + } |
| break; |
| - case OVERFLOW_MENU_ITEM: |
| - case SOURCE_LANGUAGE_MENU_ITEM: |
| - case TARGET_LANGUAGE_MENU_ITEM: |
| - convertView = mInflater.inflate(R.layout.translate_menu_item, parent, false); |
| - ((TextView) convertView.findViewById(R.id.menu_item_text)) |
| - .setText(getItem(position).toString()); |
| + case TranslateMenu.OVERFLOW_MENU_ITEM: |
| + case TranslateMenu.SOURCE_LANGUAGE_MENU_ITEM: |
| + case TranslateMenu.TARGET_LANGUAGE_MENU_ITEM: |
| + if (convertView == null) { |
| + menuItemView = |
| + mInflater.inflate(R.layout.translate_menu_item, parent, false); |
| + } |
| + |
| + ((TextView) menuItemView.findViewById(R.id.menu_item_text)) |
| + .setText(getItem(position).getTitle(mContextWrapper, mSourceLanguage)); |
| break; |
| // TODO(martiw) create the layout for OVERFLOW_MENU_ITEM_WITH_CHECKBOX_CHECKED and |
| // OVERFLOW_MENU_ITEM_WITH_CHECKBOX_UNCHECKED for "Always Translate Language" |
| default: |
| assert false : "Unexpected MenuItem type"; |
| } |
| - return convertView; |
| - } |
| - } |
| - |
| - /** |
| - * The element that goes inside the menu. |
| - */ |
| - public static final class TranslateMenuElement { |
| - private final String mTitle; |
| - private final String mCode; |
| - private final int mType; |
| - |
| - public TranslateMenuElement(String title, String code, int type) { |
| - mTitle = title; |
| - mCode = code; |
| - mType = type; |
| - } |
| - |
| - public String getCode() { |
| - return mCode; |
| - } |
| - |
| - public int getType() { |
| - return mType; |
| - } |
| - |
| - /** |
| - * This is the text displayed in the menu item. |
| - */ |
| - public String toString() { |
| - return mTitle; |
| + return menuItemView; |
| } |
| } |
| } |