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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..24bbc3c3f1cbc8dba2ae170a0ae967f9ffc2a017 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java |
@@ -0,0 +1,240 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.infobar.translate; |
+ |
+import android.content.Context; |
+import android.support.v4.content.ContextCompat; |
+import android.view.ContextThemeWrapper; |
+import android.view.LayoutInflater; |
+import android.view.View; |
+import android.view.ViewGroup; |
+import android.widget.AdapterView; |
+import android.widget.ArrayAdapter; |
+import android.widget.ListPopupWindow; |
+import android.widget.PopupWindow; |
+import android.widget.TextView; |
+ |
+import org.chromium.chrome.R; |
+ |
+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; |
+ |
+ /** |
+ * 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)); |
+ } |
+ |
+ /** |
+ * 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); |
+ } |
+ |
+ public TranslateMenuHelper( |
+ Context context, View anchorView, TranslateMenuItemListener itemListener) { |
+ mWrapper = new ContextThemeWrapper(context, R.style.OverflowMenuTheme); |
+ mAnchorView = anchorView; |
+ mItemListener = itemListener; |
+ } |
+ |
+ /** |
+ * Show the overflow menu. |
+ * @param list List of menuitems. |
+ */ |
+ public void show(List<TranslateMenuElement> list) { |
+ if (mPopup == null) { |
+ mPopup = new ListPopupWindow(mWrapper, null, android.R.attr.popupMenuStyle); |
+ mPopup.setModal(true); |
+ mPopup.setAnchorView(mAnchorView); |
+ mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); |
+ |
+ // 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)); |
+ |
+ int popupWidth = mWrapper.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)); |
+ mPopup.setAdapter(mAdapter); |
+ |
+ mPopup.setOnItemClickListener(this); |
+ } else { |
+ mAdapter.clear(); |
+ mAdapter.addAll(list); |
+ } |
+ |
+ if (!mPopup.isShowing()) { |
+ mPopup.show(); |
+ mPopup.getListView().setItemsCanFocus(true); |
+ } |
+ } |
+ |
+ @Override |
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
+ if (mItemListener.onTranslateMenuItemClicked( |
+ mAdapter.getItem(position).getCode(), mAdapter.getItemViewType(position))) { |
+ dismiss(); |
+ } |
+ } |
+ |
+ /** |
+ * Dismisses the app menu. |
+ */ |
+ void dismiss() { |
+ if (isShowing()) { |
+ mPopup.dismiss(); |
+ } |
+ } |
+ |
+ /** |
+ * @return Whether the app menu is currently showing. |
+ */ |
+ boolean isShowing() { |
+ if (mPopup == null) { |
+ return false; |
+ } |
+ return mPopup.isShowing(); |
+ } |
+ |
+ /** |
+ * 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; |
+ // TODO(martiw) create OVERFLOW_MENU_ITEM_WITH_CHECKBOX_CHECKED and |
+ // OVERFLOW_MENU_ITEM_WITH_CHECKBOX_UNCHECKED for "Always Translate Language" |
+ |
+ LayoutInflater mInflater; |
+ |
+ public TranslateMenuAdapter(Context context, int textViewResourceId, |
+ List<TranslateMenuElement> items, LayoutInflater inflater) { |
+ super(context, textViewResourceId, items); |
+ mInflater = inflater; |
+ } |
+ |
+ @Override |
+ public int getItemViewType(int position) { |
+ return getItem(position).getType(); |
+ } |
+ |
+ @Override |
+ public boolean isEnabled(int position) { |
+ return getItemViewType(position) != 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); |
+ 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()); |
+ 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; |
+ } |
+ } |
+} |