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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java

Issue 2830543003: Re-fact TranslateMenuHelper. (Closed)
Patch Set: remove both target and source Created 3 years, 8 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/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..7f46bbef9922b3cb8f834439a9260124c5514ba3 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
@@ -17,88 +17,69 @@ import android.widget.PopupWindow;
import android.widget.TextView;
import org.chromium.chrome.R;
+import org.chromium.chrome.browser.infobar.TranslateOptions;
+import java.util.ArrayList;
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 TranslateMenuAdapter mAdapter;
- private ListPopupWindow mPopup;
+ private final TranslateMenuListener mMenuListener;
+ private final TranslateOptions mOptions;
- /**
- * 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));
- }
+ private ContextThemeWrapper mContextWrapper;
+ private TranslateMenuAdapter mAdapter;
+ private View mAnchorView;
- /**
- * 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));
- }
+ private ListPopupWindow mPopup;
/**
- * 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.
+ * Interface for receiving the click event of menu item.
*/
- public static void addSourceLanguageMenuItem(
- String title, String code, List<TranslateMenuElement> list) {
- list.add(new TranslateMenuElement(
- title, code, TranslateMenuAdapter.SOURCE_LANGUAGE_MENU_ITEM));
+ public interface TranslateMenuListener {
+ void onOverflowMenuItemClicked(int itemId);
+ void onTargetMenuItemClicked(String code);
+ void onSourceMenuItemClicked(String code);
}
- /**
- * 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));
+ public TranslateMenuHelper(Context context, View anchorView, TranslateOptions options,
+ TranslateMenuListener itemListener) {
+ mContextWrapper = new ContextThemeWrapper(context, R.style.OverflowMenuTheme);
+ mAnchorView = anchorView;
+ mOptions = options;
+ mMenuListener = itemListener;
}
/**
- * Interface for receiving the click event of menu item.
+ * Build transalte menu by menu type.
*/
- 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);
- }
-
- public TranslateMenuHelper(
- Context context, View anchorView, TranslateMenuItemListener itemListener) {
- mWrapper = new ContextThemeWrapper(context, R.style.OverflowMenuTheme);
- mAnchorView = anchorView;
- mItemListener = itemListener;
+ private List<TranslateMenu.MenuItem> getMenuList(int menuType) {
+ List<TranslateMenu.MenuItem> menuList = new ArrayList<TranslateMenu.MenuItem>();
+ if (menuType == TranslateMenu.MENU_OVERFLOW) {
+ // TODO(googleo): Add language short list above static menu after its data is ready.
+ menuList.addAll(TranslateMenu.getOverflowMenu());
+ } else {
+ for (int i = 0; i < mOptions.allLanguages().size(); ++i) {
+ String code = mOptions.allLanguages().get(i).mLanguageCode;
+ // Don't show target or source language in the menu list.
+ if (code.equals(mOptions.targetLanguageCode())
+ || code.equals(mOptions.sourceLanguageCode())) {
+ continue;
+ }
+ menuList.add(new TranslateMenu.MenuItem(TranslateMenu.ITEM_LANGUAGE, i, code));
+ }
+ }
+ return menuList;
}
/**
* Show the overflow menu.
- * @param list List of menuitems.
*/
- public void show(List<TranslateMenuElement> list) {
+ public void show(int menuType) {
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 +87,19 @@ 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(menuType);
mPopup.setAdapter(mAdapter);
-
- mPopup.setOnItemClickListener(this);
} else {
- mAdapter.clear();
- mAdapter.addAll(list);
+ mAdapter.refreshMenu(menuType);
}
if (!mPopup.isShowing()) {
@@ -132,16 +110,28 @@ 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();
+
+ TranslateMenu.MenuItem item = mAdapter.getItem(position);
+ switch (mAdapter.mMenuType) {
+ case TranslateMenu.MENU_OVERFLOW:
+ mMenuListener.onOverflowMenuItemClicked(item.mId);
+ return;
+ case TranslateMenu.MENU_TARGET_LANGUAGE:
+ mMenuListener.onTargetMenuItemClicked(item.mCode);
+ return;
+ case TranslateMenu.MENU_SOURCE_LANGUAGE:
+ mMenuListener.onSourceMenuItemClicked(item.mCode);
+ return;
+ default:
+ assert false : "Unsupported Menu Item Id";
}
}
/**
- * Dismisses the app menu.
+ * Dismisses the translate option menu.
*/
- void dismiss() {
+ private void dismiss() {
if (isShowing()) {
mPopup.dismiss();
}
@@ -150,7 +140,7 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
/**
* @return Whether the app menu is currently showing.
*/
- boolean isShowing() {
+ private boolean isShowing() {
if (mPopup == null) {
return false;
}
@@ -160,81 +150,99 @@ 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.MenuItem> {
// 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;
+ private int mMenuType;
- public TranslateMenuAdapter(Context context, int textViewResourceId,
- List<TranslateMenuElement> items, LayoutInflater inflater) {
- super(context, textViewResourceId, items);
- mInflater = inflater;
+ public TranslateMenuAdapter(int menuType) {
+ super(mContextWrapper, R.layout.translate_menu_item, getMenuList(menuType));
+ mInflater = LayoutInflater.from(mContextWrapper);
+ mMenuType = menuType;
+ }
+
+ private void refreshMenu(int menuType) {
+ // Don't refresh if the type is same as previous.
+ if (menuType == mMenuType) {
gone 2017/04/24 20:12:19 for simple conditionals in java, you can put it on
Leo 2017/04/25 14:08:05 Acknowledged.
+ return;
+ }
+
+ clear();
+
+ mMenuType = menuType;
+ addAll(getMenuList(menuType));
+ notifyDataSetChanged();
+ }
+
+ private String getItemViewText(TranslateMenu.MenuItem item) {
+ if (mMenuType == TranslateMenu.MENU_OVERFLOW) {
+ // Overflow menu items are manually defined one by one.
+ String source = mOptions.sourceLanguageName();
+ switch (item.mId) {
+ case TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE:
+ return mContextWrapper.getString(R.string.translate_always_text, source);
+ case TranslateMenu.ID_OVERFLOW_MORE_LANGUAGE:
+ return mContextWrapper.getString(R.string.translate_infobar_more_language);
+ case TranslateMenu.ID_OVERFLOW_NEVER_SITE:
+ return mContextWrapper.getString(R.string.translate_never_translate_site);
+ case TranslateMenu.ID_OVERFLOW_NEVER_LANGUAGE:
+ return mContextWrapper.getString(
+ R.string.translate_never_translate_language, source);
+ case TranslateMenu.ID_OVERFLOW_NOT_THIS_LANGUAGE:
+ return mContextWrapper.getString(
+ R.string.translate_infobar_not_source_language, source);
+ default:
+ assert false : "Unexpected Overflow Item Id";
+ }
+ } else {
+ // Get source and tagert language menu items text by language code.
+ return mOptions.getRepresentationByCode(item.mCode);
+ }
+ return "";
}
@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 getItem(position).mId != TranslateMenu.ID_UNDEFINED;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
+ View menuItemView = convertView;
switch (getItemViewType(position)) {
- case MENU_DIVIDER:
- convertView = mInflater.inflate(R.layout.translate_menu_divider, parent, false);
+ case TranslateMenu.ITEM_DIVIDER:
+ if (menuItemView == null) {
+ 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.ITEM_CHECKBOX_OPTION:
+ case TranslateMenu.ITEM_TEXT_OPTION:
+ // TODO(martiw) create the layout for ITEM_TEXT_OPTION and ITEM_CHECKBOX_OPTION
+ case TranslateMenu.ITEM_LANGUAGE:
+ if (menuItemView == null) {
+ menuItemView =
+ mInflater.inflate(R.layout.translate_menu_item, parent, false);
+ }
+ ((TextView) menuItemView.findViewById(R.id.menu_item_text))
+ .setText(getItemViewText(getItem(position)));
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;
}
}
}

Powered by Google App Engine
This is Rietveld 408576698