| 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..aeb6d627dccb99e3cc2afd47a7ac9540464b3ca9 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,22 @@ 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 drawable to avoid animation glitches if views get rebuilt.
|
| + private LayerDrawable mCachedHighlightDrawable;
|
| +
|
| + 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;
|
| }
|
| @@ -164,6 +176,8 @@ class AppMenuAdapter extends BaseAdapter {
|
| convertView.setTag(holder);
|
| convertView.setTag(R.id.menu_item_enter_anim_id,
|
| buildStandardItemEnterAnimator(convertView, position));
|
| + convertView.setTag(
|
| + R.id.menu_item_original_background, convertView.getBackground());
|
| } else {
|
| holder = (StandardMenuItemViewHolder) convertView.getTag();
|
| }
|
| @@ -183,6 +197,8 @@ class AppMenuAdapter extends BaseAdapter {
|
| convertView.setTag(holder);
|
| convertView.setTag(R.id.menu_item_enter_anim_id,
|
| buildStandardItemEnterAnimator(convertView, position));
|
| + convertView.setTag(
|
| + R.id.menu_item_original_background, convertView.getBackground());
|
| } else {
|
| holder = (CustomMenuItemViewHolder) convertView.getTag();
|
| }
|
| @@ -218,12 +234,15 @@ class AppMenuAdapter extends BaseAdapter {
|
| 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.button.setTag(
|
| + R.id.menu_item_original_background, holder.button.getBackground());
|
| View animatedView = convertView;
|
|
|
| convertView.setTag(holder);
|
| convertView.setTag(R.id.menu_item_enter_anim_id,
|
| buildStandardItemEnterAnimator(animatedView, position));
|
| + convertView.setTag(
|
| + R.id.menu_item_original_background, convertView.getBackground());
|
| } else {
|
| holder = (TitleButtonMenuItemViewHolder) convertView.getTag();
|
| }
|
| @@ -251,6 +270,9 @@ class AppMenuAdapter extends BaseAdapter {
|
| default:
|
| assert false : "Unexpected MenuItem type";
|
| }
|
| +
|
| + checkHighlightDrawable(convertView, false, item.getItemId());
|
| +
|
| return convertView;
|
| }
|
|
|
| @@ -275,6 +297,8 @@ class AppMenuAdapter extends BaseAdapter {
|
| }
|
| });
|
|
|
| + checkHighlightDrawable(button, true, item.getItemId());
|
| +
|
| // Menu items may be hidden by command line flags before they get to this point.
|
| button.setVisibility(item.isVisible() ? View.VISIBLE : View.GONE);
|
| }
|
| @@ -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 ImageView[] 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];
|
| + 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].setAlpha(0.f);
|
| }
|
| }
|
| });
|
| @@ -385,11 +410,15 @@ 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);
|
| + convertView.setTag(R.id.menu_item_original_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;
|
| + holder.buttons[i].setTag(
|
| + R.id.menu_item_original_background, holder.buttons[i].getBackground());
|
| }
|
|
|
| // Remove unused menu items.
|
| @@ -412,6 +441,28 @@ class AppMenuAdapter extends BaseAdapter {
|
| return convertView;
|
| }
|
|
|
| + private void checkHighlightDrawable(View view, boolean isIcon, int itemId) {
|
| + Drawable background = (Drawable) view.getTag(R.id.menu_item_original_background);
|
| + if (background == null) return;
|
| +
|
| + if (itemId != mHighlightedItemId) {
|
| + view.setBackground(background);
|
| + return;
|
| + }
|
| +
|
| + if (mCachedHighlightDrawable == null) {
|
| + Drawable highlight = isIcon ? PulseDrawableFactory.createCircle()
|
| + : PulseDrawableFactory.createHighlight();
|
| + mCachedHighlightDrawable = new LayerDrawable(new Drawable[] {highlight, background});
|
| + mCachedHighlightDrawable.setId(1, R.id.menu_item_background_drawable_position);
|
| + } else {
|
| + mCachedHighlightDrawable.setDrawableByLayerId(
|
| + R.id.menu_item_background_drawable_position, background);
|
| + }
|
| +
|
| + view.setBackground(mCachedHighlightDrawable);
|
| + }
|
| +
|
| static class StandardMenuItemViewHolder {
|
| public TextView text;
|
| public AppMenuItemIcon image;
|
|
|