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;
import com.android.internal.R;
import com.android.internal.util.Preconditions;
+import java.util.Objects;
/**
* A floating toolbar for showing contextual menu items.
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;
private final Rect mPreviousContentRect = new Rect();
private Menu mMenu;
- private List<Object> mShowingMenuItems = new ArrayList<Object>();
+ private List<MenuItem> mShowingMenuItems = new ArrayList<>();
private MenuItem.OnMenuItemClickListener mMenuItemClickListener = NO_OP_MENUITEM_CLICK_LISTENER;
private int mSuggestedWidth;
if (!isCurrentlyShowing(menuItems) || mWidthChanged) {
mPopup.dismiss();
mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth);
- mShowingMenuItems = getShowingMenuItemsReferences(menuItems);
+ mShowingMenuItems = menuItems;
}
if (!mPopup.isShowing()) {
mPopup.show(mContentRect);
* Returns true if this floating toolbar is currently showing the specified menu items.
*/
private boolean isCurrentlyShowing(List<MenuItem> 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;
}
/**
* This method is recursive.
*/
private List<MenuItem> getVisibleAndEnabledMenuItems(Menu menu) {
- List<MenuItem> menuItems = new ArrayList<MenuItem>();
+ List<MenuItem> menuItems = new ArrayList<>();
for (int i = 0; (menu != null) && (i < menu.size()); i++) {
MenuItem menuItem = menu.getItem(i);
if (menuItem.isVisible() && menuItem.isEnabled()) {
}
}
- private List<Object> getShowingMenuItemsReferences(List<MenuItem> menuItems) {
- List<Object> references = new ArrayList<Object>();
- 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);
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;
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;
};
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);
}
});
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();
});
}