From 46850fcaea40c63ba66dca8d492bc30b531ce104 Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Mon, 22 May 2017 15:20:18 +0100 Subject: [PATCH] Fix FloatingToolbar refresh on menu changes. Also includes some minor code clean ups. Fixes: 38465735 Test: bit FrameworksCoreTests:android.widget.TextViewActivityTest bit CtsWidgetTestCases:android.widget.cts.TextViewTest Change-Id: Ie87cc256b77b3ec5732f49c000ce4845130fc91c --- .../android/internal/widget/FloatingToolbar.java | 106 +++++++++------------ 1 file changed, 44 insertions(+), 62 deletions(-) diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 8c71cf7006ff..40796e156e49 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -52,7 +52,6 @@ import android.view.animation.AnimationSet; import android.view.animation.Transformation; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ImageView; @@ -67,6 +66,7 @@ import java.util.List; import com.android.internal.R; import com.android.internal.util.Preconditions; +import java.util.Objects; /** * A floating toolbar for showing contextual menu items. @@ -82,12 +82,7 @@ public final class FloatingToolbar { public static final String FLOATING_TOOLBAR_TAG = "floating_toolbar"; private static final MenuItem.OnMenuItemClickListener NO_OP_MENUITEM_CLICK_LISTENER = - new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - return false; - } - }; + item -> false; private final Context mContext; private final Window mWindow; @@ -97,7 +92,7 @@ public final class FloatingToolbar { private final Rect mPreviousContentRect = new Rect(); private Menu mMenu; - private List mShowingMenuItems = new ArrayList(); + private List mShowingMenuItems = new ArrayList<>(); private MenuItem.OnMenuItemClickListener mMenuItemClickListener = NO_OP_MENUITEM_CLICK_LISTENER; private int mSuggestedWidth; @@ -237,7 +232,7 @@ public final class FloatingToolbar { if (!isCurrentlyShowing(menuItems) || mWidthChanged) { mPopup.dismiss(); mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth); - mShowingMenuItems = getShowingMenuItemsReferences(menuItems); + mShowingMenuItems = menuItems; } if (!mPopup.isShowing()) { mPopup.show(mContentRect); @@ -252,7 +247,23 @@ public final class FloatingToolbar { * Returns true if this floating toolbar is currently showing the specified menu items. */ private boolean isCurrentlyShowing(List menuItems) { - return mShowingMenuItems.equals(getShowingMenuItemsReferences(menuItems)); + if (mShowingMenuItems == null || menuItems.size() != mShowingMenuItems.size()) { + return false; + } + + final int size = menuItems.size(); + for (int i = 0; i < size; i++) { + final MenuItem menuItem = menuItems.get(i); + final MenuItem showingItem = mShowingMenuItems.get(i); + if (menuItem.getItemId() != showingItem.getItemId() + || !TextUtils.equals(menuItem.getTitle(), showingItem.getTitle()) + || !Objects.equals(menuItem.getIcon(), showingItem.getIcon()) + || menuItem.getGroupId() != showingItem.getGroupId()) { + return false; + } + } + + return true; } /** @@ -260,7 +271,7 @@ public final class FloatingToolbar { * This method is recursive. */ private List getVisibleAndEnabledMenuItems(Menu menu) { - List menuItems = new ArrayList(); + List menuItems = new ArrayList<>(); for (int i = 0; (menu != null) && (i < menu.size()); i++) { MenuItem menuItem = menu.getItem(i); if (menuItem.isVisible() && menuItem.isEnabled()) { @@ -305,22 +316,6 @@ public final class FloatingToolbar { } } - private List getShowingMenuItemsReferences(List menuItems) { - List references = new ArrayList(); - for (MenuItem menuItem : menuItems) { - if (menuItem.getItemId() != Menu.NONE) { - references.add(menuItem.getItemId()); - } else if (!TextUtils.isEmpty(menuItem.getTitle())) { - references.add(menuItem.getTitle()); - } else if (menuItem.getIcon() != null){ - references.add(menuItem.getIcon()); - } else { - references.add(menuItem); - } - } - return references; - } - private void registerOrientationHandler() { unregisterOrientationHandler(); mWindow.getDecorView().addOnLayoutChangeListener(mOrientationChangeHandler); @@ -383,19 +378,15 @@ public final class FloatingToolbar { private final Point mCoordsOnWindow = new Point(); // popup window coordinates. /* Temporary data holders. Reset values before using. */ private final int[] mTmpCoords = new int[2]; - private final Rect mTmpRect = new Rect(); private final Region mTouchableRegion = new Region(); private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = - new ViewTreeObserver.OnComputeInternalInsetsListener() { - public void onComputeInternalInsets( - ViewTreeObserver.InternalInsetsInfo info) { - info.contentInsets.setEmpty(); - info.visibleInsets.setEmpty(); - info.touchableRegion.set(mTouchableRegion); - info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo - .TOUCHABLE_INSETS_REGION); - } + info -> { + info.contentInsets.setEmpty(); + info.visibleInsets.setEmpty(); + info.touchableRegion.set(mTouchableRegion); + info.setTouchableInsets( + ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); }; private final int mLineHeight; @@ -1407,18 +1398,15 @@ public final class FloatingToolbar { final ImageButton overflowButton = (ImageButton) LayoutInflater.from(mContext) .inflate(R.layout.floating_popup_overflow_button, null); overflowButton.setImageDrawable(mOverflow); - overflowButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mIsOverflowOpen) { - overflowButton.setImageDrawable(mToOverflow); - mToOverflow.start(); - closeOverflow(); - } else { - overflowButton.setImageDrawable(mToArrow); - mToArrow.start(); - openOverflow(); - } + overflowButton.setOnClickListener(v -> { + if (mIsOverflowOpen) { + overflowButton.setImageDrawable(mToOverflow); + mToOverflow.start(); + closeOverflow(); + } else { + overflowButton.setImageDrawable(mToArrow); + mToArrow.start(); + openOverflow(); } }); return overflowButton; @@ -1441,13 +1429,10 @@ public final class FloatingToolbar { }; overflowPanel.setAdapter(adapter); - overflowPanel.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position); - if (mOnMenuItemClickListener != null) { - mOnMenuItemClickListener.onMenuItemClick(menuItem); - } + overflowPanel.setOnItemClickListener((parent, view, position, id) -> { + MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position); + if (mOnMenuItemClickListener != null) { + mOnMenuItemClickListener.onMenuItemClick(menuItem); } }); @@ -1479,12 +1464,9 @@ public final class FloatingToolbar { public void onAnimationEnd(Animation animation) { // Posting this because it seems like this is called before the animation // actually ends. - mContentContainer.post(new Runnable() { - @Override - public void run() { - setPanelsStatesAtRestingPosition(); - setContentAreaAsTouchableSurface(); - } + mContentContainer.post(() -> { + setPanelsStatesAtRestingPosition(); + setContentAreaAsTouchableSurface(); }); } -- 2.11.0