221 lines
9.2 KiB
Java
221 lines
9.2 KiB
Java
package androidx.appcompat.widget;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.Build;
|
|
import android.transition.Transition;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.view.KeyEvent;
|
|
import android.view.MenuItem;
|
|
import android.view.MotionEvent;
|
|
import android.widget.HeaderViewListAdapter;
|
|
import android.widget.ListAdapter;
|
|
import android.widget.PopupWindow;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.appcompat.view.menu.ListMenuItemView;
|
|
import androidx.appcompat.view.menu.MenuAdapter;
|
|
import androidx.appcompat.view.menu.MenuBuilder;
|
|
import androidx.appcompat.view.menu.MenuItemImpl;
|
|
import java.lang.reflect.Method;
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
|
|
public class MenuPopupWindow extends ListPopupWindow implements MenuItemHoverListener {
|
|
private static final String TAG = "MenuPopupWindow";
|
|
private static Method sSetTouchModalMethod;
|
|
private MenuItemHoverListener mHoverListener;
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
|
|
public static class MenuDropDownListView extends DropDownListView {
|
|
public final int mAdvanceKey;
|
|
private MenuItemHoverListener mHoverListener;
|
|
private MenuItem mHoveredMenuItem;
|
|
public final int mRetreatKey;
|
|
|
|
public MenuDropDownListView(Context context, boolean z2) {
|
|
super(context, z2);
|
|
if (1 == context.getResources().getConfiguration().getLayoutDirection()) {
|
|
this.mAdvanceKey = 21;
|
|
this.mRetreatKey = 22;
|
|
return;
|
|
}
|
|
this.mAdvanceKey = 22;
|
|
this.mRetreatKey = 21;
|
|
}
|
|
|
|
public void clearSelection() {
|
|
setSelection(-1);
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.view.ViewGroup, android.view.View
|
|
public /* bridge */ /* synthetic */ boolean hasFocus() {
|
|
return super.hasFocus();
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.view.View
|
|
public /* bridge */ /* synthetic */ boolean hasWindowFocus() {
|
|
return super.hasWindowFocus();
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.view.View
|
|
public /* bridge */ /* synthetic */ boolean isFocused() {
|
|
return super.isFocused();
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.view.View
|
|
public /* bridge */ /* synthetic */ boolean isInTouchMode() {
|
|
return super.isInTouchMode();
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView
|
|
public /* bridge */ /* synthetic */ int lookForSelectablePosition(int i, boolean z2) {
|
|
return super.lookForSelectablePosition(i, z2);
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView
|
|
public /* bridge */ /* synthetic */ int measureHeightOfChildrenCompat(int i, int i2, int i3, int i4, int i5) {
|
|
return super.measureHeightOfChildrenCompat(i, i2, i3, i4, i5);
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView
|
|
public /* bridge */ /* synthetic */ boolean onForwardedEvent(MotionEvent motionEvent, int i) {
|
|
return super.onForwardedEvent(motionEvent, i);
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.view.View
|
|
public boolean onHoverEvent(MotionEvent motionEvent) {
|
|
int i;
|
|
MenuAdapter menuAdapter;
|
|
int pointToPosition;
|
|
int i2;
|
|
if (this.mHoverListener != null) {
|
|
ListAdapter adapter = getAdapter();
|
|
if (adapter instanceof HeaderViewListAdapter) {
|
|
HeaderViewListAdapter headerViewListAdapter = (HeaderViewListAdapter) adapter;
|
|
i = headerViewListAdapter.getHeadersCount();
|
|
menuAdapter = (MenuAdapter) headerViewListAdapter.getWrappedAdapter();
|
|
} else {
|
|
i = 0;
|
|
menuAdapter = (MenuAdapter) adapter;
|
|
}
|
|
MenuItemImpl menuItemImpl = null;
|
|
if (motionEvent.getAction() != 10 && (pointToPosition = pointToPosition((int) motionEvent.getX(), (int) motionEvent.getY())) != -1 && (i2 = pointToPosition - i) >= 0 && i2 < menuAdapter.getCount()) {
|
|
menuItemImpl = menuAdapter.getItem(i2);
|
|
}
|
|
MenuItem menuItem = this.mHoveredMenuItem;
|
|
if (menuItem != menuItemImpl) {
|
|
MenuBuilder adapterMenu = menuAdapter.getAdapterMenu();
|
|
if (menuItem != null) {
|
|
this.mHoverListener.onItemHoverExit(adapterMenu, menuItem);
|
|
}
|
|
this.mHoveredMenuItem = menuItemImpl;
|
|
if (menuItemImpl != null) {
|
|
this.mHoverListener.onItemHoverEnter(adapterMenu, menuItemImpl);
|
|
}
|
|
}
|
|
}
|
|
return super.onHoverEvent(motionEvent);
|
|
}
|
|
|
|
@Override // android.widget.ListView, android.view.KeyEvent.Callback, android.widget.AbsListView, android.view.View
|
|
public boolean onKeyDown(int i, KeyEvent keyEvent) {
|
|
ListMenuItemView listMenuItemView = (ListMenuItemView) getSelectedView();
|
|
if (listMenuItemView != null && i == this.mAdvanceKey) {
|
|
if (listMenuItemView.isEnabled() && listMenuItemView.getItemData().hasSubMenu()) {
|
|
performItemClick(listMenuItemView, getSelectedItemPosition(), getSelectedItemId());
|
|
}
|
|
return true;
|
|
} else if (listMenuItemView == null || i != this.mRetreatKey) {
|
|
return super.onKeyDown(i, keyEvent);
|
|
} else {
|
|
setSelection(-1);
|
|
((MenuAdapter) getAdapter()).getAdapterMenu().close(false);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.widget.AbsListView, android.view.View
|
|
public /* bridge */ /* synthetic */ boolean onTouchEvent(MotionEvent motionEvent) {
|
|
return super.onTouchEvent(motionEvent);
|
|
}
|
|
|
|
public void setHoverListener(MenuItemHoverListener menuItemHoverListener) {
|
|
this.mHoverListener = menuItemHoverListener;
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.DropDownListView, android.widget.AbsListView
|
|
public /* bridge */ /* synthetic */ void setSelector(Drawable drawable) {
|
|
super.setSelector(drawable);
|
|
}
|
|
}
|
|
|
|
static {
|
|
try {
|
|
if (Build.VERSION.SDK_INT <= 28) {
|
|
sSetTouchModalMethod = PopupWindow.class.getDeclaredMethod("setTouchModal", Boolean.TYPE);
|
|
}
|
|
} catch (NoSuchMethodException unused) {
|
|
Log.i("MenuPopupWindow", "Could not find method setTouchModal() on PopupWindow. Oh well.");
|
|
}
|
|
}
|
|
|
|
public MenuPopupWindow(@NonNull Context context, @Nullable AttributeSet attributeSet, int i, int i2) {
|
|
super(context, attributeSet, i, i2);
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.ListPopupWindow
|
|
@NonNull
|
|
public DropDownListView createDropDownListView(Context context, boolean z2) {
|
|
MenuDropDownListView menuDropDownListView = new MenuDropDownListView(context, z2);
|
|
menuDropDownListView.setHoverListener(this);
|
|
return menuDropDownListView;
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.MenuItemHoverListener
|
|
public void onItemHoverEnter(@NonNull MenuBuilder menuBuilder, @NonNull MenuItem menuItem) {
|
|
MenuItemHoverListener menuItemHoverListener = this.mHoverListener;
|
|
if (menuItemHoverListener != null) {
|
|
menuItemHoverListener.onItemHoverEnter(menuBuilder, menuItem);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.MenuItemHoverListener
|
|
public void onItemHoverExit(@NonNull MenuBuilder menuBuilder, @NonNull MenuItem menuItem) {
|
|
MenuItemHoverListener menuItemHoverListener = this.mHoverListener;
|
|
if (menuItemHoverListener != null) {
|
|
menuItemHoverListener.onItemHoverExit(menuBuilder, menuItem);
|
|
}
|
|
}
|
|
|
|
public void setEnterTransition(Object obj) {
|
|
if (Build.VERSION.SDK_INT >= 23) {
|
|
this.mPopup.setEnterTransition((Transition) obj);
|
|
}
|
|
}
|
|
|
|
public void setExitTransition(Object obj) {
|
|
if (Build.VERSION.SDK_INT >= 23) {
|
|
this.mPopup.setExitTransition((Transition) obj);
|
|
}
|
|
}
|
|
|
|
public void setHoverListener(MenuItemHoverListener menuItemHoverListener) {
|
|
this.mHoverListener = menuItemHoverListener;
|
|
}
|
|
|
|
public void setTouchModal(boolean z2) {
|
|
if (Build.VERSION.SDK_INT <= 28) {
|
|
Method method = sSetTouchModalMethod;
|
|
if (method != null) {
|
|
try {
|
|
method.invoke(this.mPopup, Boolean.valueOf(z2));
|
|
} catch (Exception unused) {
|
|
Log.i("MenuPopupWindow", "Could not invoke setTouchModal() on PopupWindow. Oh well.");
|
|
}
|
|
}
|
|
} else {
|
|
this.mPopup.setTouchModal(z2);
|
|
}
|
|
}
|
|
}
|