| 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 7bfe8655024710bcfa4fd91f2ae0d0cb21d45b67..7289cd3b0774592d5920fff196c69e3c69439ebd 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
|
| @@ -5,10 +5,13 @@
|
| package org.chromium.chrome.browser.infobar.translate;
|
|
|
| import android.content.Context;
|
| +import android.graphics.Rect;
|
| +import android.os.Build;
|
| import android.support.v4.content.ContextCompat;
|
| import android.view.ContextThemeWrapper;
|
| import android.view.LayoutInflater;
|
| import android.view.View;
|
| +import android.view.View.MeasureSpec;
|
| import android.view.ViewGroup;
|
| import android.widget.AdapterView;
|
| import android.widget.ArrayAdapter;
|
| @@ -16,8 +19,10 @@ import android.widget.ListPopupWindow;
|
| import android.widget.PopupWindow;
|
| import android.widget.TextView;
|
|
|
| +import org.chromium.base.ApiCompatibilityUtils;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.infobar.TranslateOptions;
|
| +import org.chromium.chrome.browser.widget.TintedImageView;
|
|
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| @@ -32,7 +37,6 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| private ContextThemeWrapper mContextWrapper;
|
| private TranslateMenuAdapter mAdapter;
|
| private View mAnchorView;
|
| -
|
| private ListPopupWindow mPopup;
|
|
|
| /**
|
| @@ -53,7 +57,7 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| }
|
|
|
| /**
|
| - * Build transalte menu by menu type.
|
| + * Build translate menu by menu type.
|
| */
|
| private List<TranslateMenu.MenuItem> getMenuList(int menuType) {
|
| List<TranslateMenu.MenuItem> menuList = new ArrayList<TranslateMenu.MenuItem>();
|
| @@ -86,15 +90,23 @@ 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.
|
| + // TODO(martiw): We might need a new menu background here.
|
| mPopup.setBackgroundDrawable(
|
| ContextCompat.getDrawable(mContextWrapper, R.drawable.edge_menu_bg));
|
|
|
| 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);
|
| + // The menu must be shifted down by the height of the anchor view in order to be
|
| + // displayed over and above it.
|
| + int anchorHeight = mAnchorView.getHeight();
|
| + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
| + // Setting a positive offset here shifts the menu down.
|
| + mPopup.setVerticalOffset(anchorHeight);
|
| + } else {
|
| + // The framework's PopupWindow positioning changed between N and M. Setting
|
| + // a negative offset here shifts the menu down rather than up.
|
| + mPopup.setVerticalOffset(-anchorHeight);
|
| + }
|
|
|
| mAdapter = new TranslateMenuAdapter(menuType);
|
| mPopup.setAdapter(mAdapter);
|
| @@ -102,12 +114,53 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| mAdapter.refreshMenu(menuType);
|
| }
|
|
|
| + if (menuType == TranslateMenu.MENU_OVERFLOW) {
|
| + // Use measured width when it is a overflow menu.
|
| + Rect bgPadding = new Rect();
|
| + mPopup.getBackground().getPadding(bgPadding);
|
| + mPopup.setWidth(measureMenuWidth(mAdapter) + bgPadding.left + bgPadding.right);
|
| + } else {
|
| + // Use fixed width otherwise.
|
| + int popupWidth = mContextWrapper.getResources().getDimensionPixelSize(
|
| + R.dimen.infobar_translate_menu_width);
|
| + mPopup.setWidth(popupWidth);
|
| + }
|
| +
|
| + // When layout is RTL, set the horizontal offset to align the menu with the left side of the
|
| + // screen.
|
| + if (ApiCompatibilityUtils.isLayoutRtl(mAnchorView)) {
|
| + int[] tempLocation = new int[2];
|
| + mAnchorView.getLocationOnScreen(tempLocation);
|
| + mPopup.setHorizontalOffset(-tempLocation[0]);
|
| + }
|
| +
|
| if (!mPopup.isShowing()) {
|
| mPopup.show();
|
| mPopup.getListView().setItemsCanFocus(true);
|
| }
|
| }
|
|
|
| + private int measureMenuWidth(TranslateMenuAdapter adapter) {
|
| + final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
|
| + final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
|
| +
|
| + final int count = adapter.getCount();
|
| + int width = 0;
|
| + int itemType = 0;
|
| + View itemView = null;
|
| + for (int i = 0; i < count; i++) {
|
| + final int positionType = adapter.getItemViewType(i);
|
| + if (positionType != itemType) {
|
| + itemType = positionType;
|
| + itemView = null;
|
| + }
|
| + itemView = adapter.getView(i, itemView, null);
|
| + itemView.measure(widthMeasureSpec, heightMeasureSpec);
|
| + width = Math.max(width, itemView.getMeasuredWidth());
|
| + }
|
| + return width;
|
| + }
|
| +
|
| @Override
|
| public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
| dismiss();
|
| @@ -151,9 +204,6 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| * The provides the views of the menu items and dividers.
|
| */
|
| 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"
|
| -
|
| private final LayoutInflater mInflater;
|
| private int mMenuType;
|
|
|
| @@ -195,7 +245,7 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| assert false : "Unexpected Overflow Item Id";
|
| }
|
| } else {
|
| - // Get source and tagert language menu items text by language code.
|
| + // Get source and target language menu items text by language code.
|
| return mOptions.getRepresentationFromCode(item.mCode);
|
| }
|
| return "";
|
| @@ -216,6 +266,16 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| return getItem(position).mId != TranslateMenu.ID_UNDEFINED;
|
| }
|
|
|
| + private View getItemView(
|
| + View menuItemView, int position, ViewGroup parent, int resourceId) {
|
| + if (menuItemView == null) {
|
| + menuItemView = mInflater.inflate(resourceId, parent, false);
|
| + }
|
| + ((TextView) menuItemView.findViewById(R.id.menu_item_text))
|
| + .setText(getItemViewText(getItem(position)));
|
| + return menuItemView;
|
| + }
|
| +
|
| @Override
|
| public View getView(int position, View convertView, ViewGroup parent) {
|
| View menuItemView = convertView;
|
| @@ -227,15 +287,20 @@ public class TranslateMenuHelper implements AdapterView.OnItemClickListener {
|
| }
|
| break;
|
| 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);
|
| + menuItemView = getItemView(
|
| + menuItemView, position, parent, R.layout.translate_menu_item_checked);
|
| + TintedImageView checkboxIcon =
|
| + (TintedImageView) menuItemView.findViewById(R.id.menu_item_icon);
|
| + if (getItem(position).mId == TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE
|
| + && mOptions.alwaysTranslateLanguageState()) {
|
| + checkboxIcon.setVisibility(View.VISIBLE);
|
| + } else {
|
| + checkboxIcon.setVisibility(View.INVISIBLE);
|
| }
|
| - ((TextView) menuItemView.findViewById(R.id.menu_item_text))
|
| - .setText(getItemViewText(getItem(position)));
|
| + break;
|
| + case TranslateMenu.ITEM_LANGUAGE:
|
| + menuItemView = getItemView(
|
| + menuItemView, position, parent, R.layout.translate_menu_item);
|
| break;
|
| default:
|
| assert false : "Unexpected MenuItem type";
|
|
|