Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1aba36d7 authored by Alan Viverette's avatar Alan Viverette Committed by Android (Google) Code Review
Browse files

Merge "Revert "Reduce CascadingMenuPopup's reliance on internal ListView state""

parents b9f13b02 2ac975de
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -159,6 +159,23 @@ public class DropDownListView extends ListView {
        return super.onHoverEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        final int position = pointToPosition(x, y);
        if (position == INVALID_POSITION) {
            return super.onTouchEvent(event);
        }

        if (position != mSelectedPosition) {
            setSelectedPositionInt(position);
            setNextSelectedPositionInt(position);
        }

        return super.onTouchEvent(event);
    }

    /**
     * Handles forwarded events.
     *
+1 −20
Original line number Diff line number Diff line
@@ -2,8 +2,6 @@ package android.widget;

import com.android.internal.view.menu.MenuBuilder;

import android.annotation.NonNull;

/**
 * An interface notified when a menu item is hovered. Useful for cases when hover should trigger
 * some behavior at a higher level, like managing the opening and closing of submenus.
@@ -11,22 +9,5 @@ import android.annotation.NonNull;
 * @hide
 */
public interface MenuItemHoverListener {
    /**
     * Called when hover exits a menu item.
     * <p>
     * If hover is moving to another item, this method will be called before
     * {@link #onItemHoverEnter(MenuBuilder, int)} for the newly-hovered item.
     *
     * @param menu the item's parent menu
     * @param position the position of the item within the menu
     */
    void onItemHoverExit(@NonNull MenuBuilder menu, int position);

    /**
     * Called when hover enters a menu item.
     *
     * @param menu the item's parent menu
     * @param position the position of the item within the menu
     */
    void onItemHoverEnter(@NonNull MenuBuilder menu, int position);
    public void onItemHovered(MenuBuilder menu, int position);
}
+21 −32
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package android.widget;

import android.annotation.NonNull;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -73,18 +72,10 @@ public class MenuPopupWindow extends ListPopupWindow implements MenuItemHoverLis
    }

    @Override
    public void onItemHoverEnter(@NonNull MenuBuilder menu, int position) {
    public void onItemHovered(MenuBuilder menu, int position) {
        // Forward up the chain
        if (mHoverListener != null) {
            mHoverListener.onItemHoverEnter(menu, position);
        }
    }

    @Override
    public void onItemHoverExit(@NonNull MenuBuilder menu, int position) {
        // Forward up the chain
        if (mHoverListener != null) {
            mHoverListener.onItemHoverExit(menu, position);
            mHoverListener.onItemHovered(menu, position);
        }
    }

@@ -97,8 +88,6 @@ public class MenuPopupWindow extends ListPopupWindow implements MenuItemHoverLis

        private MenuItemHoverListener mHoverListener;

        private int mPreviouslyHoveredPosition = INVALID_POSITION;

        public MenuDropDownListView(Context context, boolean hijackFocus) {
            super(context, hijackFocus);

@@ -146,17 +135,25 @@ public class MenuPopupWindow extends ListPopupWindow implements MenuItemHoverLis

        @Override
        public boolean onHoverEvent(MotionEvent ev) {
            final int position;
            if (ev.getAction() == MotionEvent.ACTION_HOVER_EXIT) {
                position = INVALID_POSITION;
            } else {
                position = pointToPosition((int) ev.getX(), (int) ev.getY());
            boolean dispatchHover = false;
            final int position = pointToPosition((int) ev.getX(), (int) ev.getY());

            final int action = ev.getActionMasked();
            if (action == MotionEvent.ACTION_HOVER_ENTER
                    || action == MotionEvent.ACTION_HOVER_MOVE) {
                if (position != INVALID_POSITION && position != mSelectedPosition) {
                    final View hoveredItem = getChildAt(position - getFirstVisiblePosition());
                    if (hoveredItem.isEnabled()) {
                        dispatchHover = true;
                    }
                }
            }

            boolean superVal = super.onHoverEvent(ev);

            // Dispatch any changes in hovered position to the listener.
            if (mHoverListener != null && mPreviouslyHoveredPosition != position) {
                final ListAdapter adapter = getAdapter();
                final MenuAdapter menuAdapter;
            if (dispatchHover && mHoverListener != null) {
                ListAdapter adapter = getAdapter();
                MenuAdapter menuAdapter;
                if (adapter instanceof HeaderViewListAdapter) {
                    menuAdapter = (MenuAdapter) ((HeaderViewListAdapter) adapter)
                            .getWrappedAdapter();
@@ -164,18 +161,10 @@ public class MenuPopupWindow extends ListPopupWindow implements MenuItemHoverLis
                    menuAdapter = (MenuAdapter) adapter;
                }

                final MenuBuilder menu = menuAdapter.getAdapterMenu();
                if (mPreviouslyHoveredPosition != INVALID_POSITION) {
                    mHoverListener.onItemHoverExit(menu, mPreviouslyHoveredPosition);
                mHoverListener.onItemHovered(menuAdapter.getAdapterMenu(), position);
            }
                if (position != INVALID_POSITION) {
                    mHoverListener.onItemHoverEnter(menu, position);
                }
            }

            mPreviouslyHoveredPosition = position;

            return super.onHoverEvent(ev);
            return superVal;
        }
    }
}
 No newline at end of file
Loading