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
+197 −279

File changed.

Preview size limit exceeded, changes collapsed.

+9 −8
Original line number Diff line number Diff line
@@ -936,14 +936,15 @@ public class MenuBuilder implements Menu {
    }
    
    /**
     * Closes the menu.
     * Closes the visible menu.
     * 
     * @param closeAllMenus {@code true} if all displayed menus and submenus
     *                      should be completely closed (as when a menu item is
     *                      selected) or {@code false} if only this menu should
     *                      be closed
     * @param allMenusAreClosing Whether the menus are completely closing (true),
     *            or whether there is another menu coming in this menu's place
     *            (false). For example, if the menu is closing because a
     *            sub menu is about to be shown, <var>allMenusAreClosing</var>
     *            is false.
     */
    public final void close(boolean closeAllMenus) {
    public final void close(boolean allMenusAreClosing) {
        if (mIsClosing) return;

        mIsClosing = true;
@@ -952,7 +953,7 @@ public class MenuBuilder implements Menu {
            if (presenter == null) {
                mPresenters.remove(ref);
            } else {
                presenter.onCloseMenu(this, closeAllMenus);
                presenter.onCloseMenu(this, allMenusAreClosing);
            }
        }
        mIsClosing = false;
Loading