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

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

Issue 2824083003: Allow to use measured width in translate overflow menu (Closed)
Patch Set: sync 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
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenu.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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";
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenu.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698