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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java

Issue 2779543005: Add support for highlighting menu items (Closed)
Patch Set: Cleaned up some comments and code Created 3 years, 9 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/appmenu/AppMenuAdapter.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
index 2518f4b0163b2ba0a8b05f7a02046d2bd50bf110..f1d4cffce0041792c566027243f2a089ccf1d180 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -9,6 +9,8 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.support.annotation.IdRes;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
@@ -97,12 +99,23 @@ class AppMenuAdapter extends BaseAdapter {
private final LayoutInflater mInflater;
private final List<MenuItem> mMenuItems;
private final int mNumMenuItems;
+ @IdRes
+ private final int mHighlightedItemId;
+ private final int mHighlightedColor;
private final float mDpToPx;
- public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInflater inflater) {
+ // Cached drawables to avoid animation glitches if views get rebuilt.
+ private Drawable mCachedHighlightIconDrawable;
+ private Drawable mCachedHighlightRowDrawable;
+
+ public AppMenuAdapter(AppMenu appMenu, List<MenuItem> menuItems, LayoutInflater inflater,
+ @IdRes int highlightedItemId) {
mAppMenu = appMenu;
mMenuItems = menuItems;
mInflater = inflater;
+ mHighlightedItemId = highlightedItemId;
+ mHighlightedColor = ApiCompatibilityUtils.getColor(
+ mInflater.getContext().getResources(), R.color.google_blue_500);
mNumMenuItems = menuItems.size();
mDpToPx = inflater.getContext().getResources().getDisplayMetrics().density;
}
@@ -161,6 +174,7 @@ class AppMenuAdapter extends BaseAdapter {
convertView = mInflater.inflate(R.layout.menu_item, parent, false);
holder.text = (TextView) convertView.findViewById(R.id.menu_item_text);
holder.image = (AppMenuItemIcon) convertView.findViewById(R.id.menu_item_icon);
+ holder.background = convertView.getBackground();
convertView.setTag(holder);
convertView.setTag(R.id.menu_item_enter_anim_id,
buildStandardItemEnterAnimator(convertView, position));
@@ -180,6 +194,7 @@ class AppMenuAdapter extends BaseAdapter {
holder.text = (TextView) convertView.findViewById(R.id.menu_item_text);
holder.image = (AppMenuItemIcon) convertView.findViewById(R.id.menu_item_icon);
holder.summary = (TextView) convertView.findViewById(R.id.menu_item_summary);
+ holder.background = convertView.getBackground();
convertView.setTag(holder);
convertView.setTag(R.id.menu_item_enter_anim_id,
buildStandardItemEnterAnimator(convertView, position));
@@ -217,7 +232,9 @@ class AppMenuAdapter extends BaseAdapter {
holder = new TitleButtonMenuItemViewHolder();
convertView = mInflater.inflate(R.layout.title_button_menu_item, parent, false);
holder.title = (TextView) convertView.findViewById(R.id.title);
- holder.button = (TintedImageButton) convertView.findViewById(R.id.button);
+ holder.background = convertView.getBackground();
+ holder.button.view = (TintedImageButton) convertView.findViewById(R.id.button);
+ holder.button.background = holder.button.view.getBackground();
View animatedView = convertView;
@@ -239,10 +256,10 @@ class AppMenuAdapter extends BaseAdapter {
});
if (item.getSubMenu().getItem(1).getIcon() != null) {
- holder.button.setVisibility(View.VISIBLE);
+ holder.button.view.setVisibility(View.VISIBLE);
setupImageButton(holder.button, item.getSubMenu().getItem(1));
} else {
- holder.button.setVisibility(View.GONE);
+ holder.button.view.setVisibility(View.GONE);
}
convertView.setFocusable(false);
convertView.setEnabled(false);
@@ -251,32 +268,39 @@ class AppMenuAdapter extends BaseAdapter {
default:
assert false : "Unexpected MenuItem type";
}
+
+ checkRowHighlight(item.getItemId(), convertView);
+
return convertView;
}
- private void setupImageButton(TintedImageButton button, final MenuItem item) {
+ private void setupImageButton(RowItemButton button, final MenuItem item) {
// Store and recover the level of image as button.setimageDrawable
// resets drawable to default level.
+ TintedImageButton view = button.view;
+
int currentLevel = item.getIcon().getLevel();
- button.setImageDrawable(item.getIcon());
+ view.setImageDrawable(item.getIcon());
item.getIcon().setLevel(currentLevel);
if (item.isChecked()) {
- button.setTint(ApiCompatibilityUtils.getColorStateList(
- button.getResources(), R.color.blue_mode_tint));
+ view.setTint(ApiCompatibilityUtils.getColorStateList(
+ view.getResources(), R.color.blue_mode_tint));
}
- button.setEnabled(item.isEnabled());
- button.setFocusable(item.isEnabled());
- button.setContentDescription(item.getTitleCondensed());
+ view.setEnabled(item.isEnabled());
+ view.setFocusable(item.isEnabled());
+ view.setContentDescription(item.getTitleCondensed());
- button.setOnClickListener(new OnClickListener() {
+ view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mAppMenu.onItemClick(item);
}
});
+ checkItemHighlight(item.getItemId(), view, button.background, true);
+
// Menu items may be hidden by command line flags before they get to this point.
- button.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
+ view.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
}
private void setupStandardMenuItemViewHolder(StandardMenuItemViewHolder holder,
@@ -336,21 +360,22 @@ class AppMenuAdapter extends BaseAdapter {
* This builds an {@link Animator} for the enter animation of icon row menu items. This means
* it will animate the alpha from 0 to 1 and translate the views from 10dp to 0dp on the x axis.
*
- * @param views The list if icons in the menu item that should be animated.
- * @return The {@link Animator}.
+ * @param buttons The list of icons in the menu item that should be animated.
+ * @return The {@link Animator}.
*/
- private Animator buildIconItemEnterAnimator(final ImageView[] views) {
+ private Animator buildIconItemEnterAnimator(final RowItemButton[] buttons) {
final boolean rtl = LocalizationUtils.isLayoutRtl();
final float offsetXPx = ENTER_STANDARD_ITEM_OFFSET_X_DP * mDpToPx * (rtl ? -1.f : 1.f);
- final int maxViewsToAnimate = views.length;
+ final int maxViewsToAnimate = buttons.length;
AnimatorSet animation = new AnimatorSet();
AnimatorSet.Builder builder = null;
for (int i = 0; i < maxViewsToAnimate; i++) {
final int startDelay = ENTER_ITEM_ADDL_DELAY_MS * i;
- Animator alpha = ObjectAnimator.ofFloat(views[i], View.ALPHA, 0.f, 1.f);
- Animator translate = ObjectAnimator.ofFloat(views[i], View.TRANSLATION_X, offsetXPx, 0);
+ ImageView view = buttons[i].view;
+ Animator alpha = ObjectAnimator.ofFloat(view, View.ALPHA, 0.f, 1.f);
+ Animator translate = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, offsetXPx, 0);
alpha.setStartDelay(startDelay);
translate.setStartDelay(startDelay);
alpha.setDuration(ENTER_ITEM_DURATION_MS);
@@ -370,7 +395,7 @@ class AppMenuAdapter extends BaseAdapter {
@Override
public void onAnimationStart(Animator animation) {
for (int i = 0; i < maxViewsToAnimate; i++) {
- views[i].setAlpha(0.f);
+ buttons[i].view.setAlpha(0.f);
}
}
});
@@ -385,11 +410,14 @@ class AppMenuAdapter extends BaseAdapter {
|| ((RowItemViewHolder) convertView.getTag()).buttons.length != numItems) {
holder = new RowItemViewHolder(numItems);
convertView = mInflater.inflate(R.layout.icon_row_menu_item, parent, false);
+ holder.background = convertView.getBackground();
// Save references to all the buttons.
for (int i = 0; i < numItems; i++) {
- holder.buttons[i] =
+ TintedImageButton view =
(TintedImageButton) convertView.findViewById(BUTTON_IDS[i]);
+ holder.buttons[i].view = view;
+ holder.buttons[i].background = view.getBackground();
}
// Remove unused menu items.
@@ -412,7 +440,46 @@ class AppMenuAdapter extends BaseAdapter {
return convertView;
}
- static class StandardMenuItemViewHolder {
+ private void checkRowHighlight(int itemId, View view) {
+ if (mHighlightedItemId == 0) return;
+
+ Object tag = view.getTag();
+ if (tag == null || !(tag instanceof MenuItemViewHolder)) return;
Ted C 2017/03/31 19:01:47 when isn't the tag a MenuItemViewHolder? It seems
+
+ Drawable background = ((MenuItemViewHolder) tag).background;
+
+ checkItemHighlight(itemId, view, background, false);
+ }
+
+ private void checkItemHighlight(
+ int itemId, View view, Drawable viewBackground, boolean isIcon) {
+ if (mHighlightedItemId == 0) return;
+
+ if (mHighlightedItemId == itemId) {
+ view.setBackground(new LayerDrawable(
+ new Drawable[] {getHighlightDrawable(isIcon), viewBackground}));
+ } else {
+ view.setBackground(viewBackground);
+ }
+ }
+
+ private Drawable getHighlightDrawable(boolean isIcon) {
+ if (isIcon) {
+ if (mCachedHighlightIconDrawable == null) {
+ mCachedHighlightIconDrawable = new IconHighlightDrawable(mHighlightedColor);
+ }
+ return mCachedHighlightIconDrawable;
+ } else {
+ if (mCachedHighlightRowDrawable == null) {
+ mCachedHighlightRowDrawable = new RowHighlightDrawable(mHighlightedColor);
+ }
+ return mCachedHighlightRowDrawable;
+ }
+ }
+
+ static class MenuItemViewHolder { public Drawable background; }
+
+ static class StandardMenuItemViewHolder extends MenuItemViewHolder {
public TextView text;
public AppMenuItemIcon image;
}
@@ -421,16 +488,24 @@ class AppMenuAdapter extends BaseAdapter {
public TextView summary;
}
- private static class RowItemViewHolder {
- public TintedImageButton[] buttons;
+ static class RowItemButton {
+ public TintedImageButton view;
+ public Drawable background;
+ }
+
+ private static class RowItemViewHolder extends MenuItemViewHolder {
+ public RowItemButton[] buttons;
RowItemViewHolder(int numButtons) {
- buttons = new TintedImageButton[numButtons];
+ buttons = new RowItemButton[numButtons];
+ for (int i = 0; i < numButtons; i++) {
+ buttons[i] = new RowItemButton();
+ }
}
}
- static class TitleButtonMenuItemViewHolder {
+ static class TitleButtonMenuItemViewHolder extends MenuItemViewHolder {
public TextView title;
- public TintedImageButton button;
+ public RowItemButton button = new RowItemButton();
}
}

Powered by Google App Engine
This is Rietveld 408576698