Loading core/java/android/widget/DropDownListView.java +17 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading core/java/android/widget/MenuItemHoverListener.java +1 −20 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); } core/java/android/widget/MenuPopupWindow.java +21 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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
core/java/android/widget/DropDownListView.java +17 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading
core/java/android/widget/MenuItemHoverListener.java +1 −20 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); }
core/java/android/widget/MenuPopupWindow.java +21 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading @@ -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); Loading Loading @@ -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(); Loading @@ -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