607 lines
24 KiB
Java
607 lines
24 KiB
Java
|
package androidx.appcompat.view.menu;
|
||
|
|
||
|
import android.content.Context;
|
||
|
import android.content.res.Resources;
|
||
|
import android.graphics.Rect;
|
||
|
import android.os.Build;
|
||
|
import android.os.Handler;
|
||
|
import android.os.Parcelable;
|
||
|
import android.os.SystemClock;
|
||
|
import android.view.KeyEvent;
|
||
|
import android.view.LayoutInflater;
|
||
|
import android.view.MenuItem;
|
||
|
import android.view.View;
|
||
|
import android.view.ViewGroup;
|
||
|
import android.view.ViewTreeObserver;
|
||
|
import android.widget.FrameLayout;
|
||
|
import android.widget.HeaderViewListAdapter;
|
||
|
import android.widget.ListAdapter;
|
||
|
import android.widget.ListView;
|
||
|
import android.widget.PopupWindow;
|
||
|
import android.widget.TextView;
|
||
|
import androidx.annotation.AttrRes;
|
||
|
import androidx.annotation.NonNull;
|
||
|
import androidx.annotation.Nullable;
|
||
|
import androidx.annotation.StyleRes;
|
||
|
import androidx.appcompat.R;
|
||
|
import androidx.appcompat.view.menu.MenuPresenter;
|
||
|
import androidx.appcompat.widget.MenuItemHoverListener;
|
||
|
import androidx.appcompat.widget.MenuPopupWindow;
|
||
|
import androidx.core.view.GravityCompat;
|
||
|
import androidx.core.view.ViewCompat;
|
||
|
import java.lang.annotation.Retention;
|
||
|
import java.lang.annotation.RetentionPolicy;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.List;
|
||
|
public final class CascadingMenuPopup extends MenuPopup implements MenuPresenter, View.OnKeyListener, PopupWindow.OnDismissListener {
|
||
|
public static final int HORIZ_POSITION_LEFT = 0;
|
||
|
public static final int HORIZ_POSITION_RIGHT = 1;
|
||
|
private static final int ITEM_LAYOUT = R.layout.abc_cascading_menu_item_layout;
|
||
|
public static final int SUBMENU_TIMEOUT_MS = 200;
|
||
|
private View mAnchorView;
|
||
|
private final View.OnAttachStateChangeListener mAttachStateChangeListener = new AnonymousClass2();
|
||
|
private final Context mContext;
|
||
|
private int mDropDownGravity = 0;
|
||
|
private boolean mForceShowIcon;
|
||
|
public final ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new AnonymousClass1();
|
||
|
private boolean mHasXOffset;
|
||
|
private boolean mHasYOffset;
|
||
|
private int mLastPosition;
|
||
|
private final MenuItemHoverListener mMenuItemHoverListener = new AnonymousClass3();
|
||
|
private final int mMenuMaxWidth;
|
||
|
private PopupWindow.OnDismissListener mOnDismissListener;
|
||
|
private final boolean mOverflowOnly;
|
||
|
private final List<MenuBuilder> mPendingMenus = new ArrayList();
|
||
|
private final int mPopupStyleAttr;
|
||
|
private final int mPopupStyleRes;
|
||
|
private MenuPresenter.Callback mPresenterCallback;
|
||
|
private int mRawDropDownGravity = 0;
|
||
|
public boolean mShouldCloseImmediately;
|
||
|
private boolean mShowTitle;
|
||
|
public final List<CascadingMenuInfo> mShowingMenus = new ArrayList();
|
||
|
public View mShownAnchorView;
|
||
|
public final Handler mSubMenuHoverHandler;
|
||
|
public ViewTreeObserver mTreeObserver;
|
||
|
private int mXOffset;
|
||
|
private int mYOffset;
|
||
|
|
||
|
/* renamed from: androidx.appcompat.view.menu.CascadingMenuPopup$1 reason: invalid class name */
|
||
|
public class AnonymousClass1 implements ViewTreeObserver.OnGlobalLayoutListener {
|
||
|
public AnonymousClass1() {
|
||
|
}
|
||
|
|
||
|
@Override // android.view.ViewTreeObserver.OnGlobalLayoutListener
|
||
|
public void onGlobalLayout() {
|
||
|
if (CascadingMenuPopup.this.isShowing() && CascadingMenuPopup.this.mShowingMenus.size() > 0 && !CascadingMenuPopup.this.mShowingMenus.get(0).window.isModal()) {
|
||
|
View view = CascadingMenuPopup.this.mShownAnchorView;
|
||
|
if (view == null || !view.isShown()) {
|
||
|
CascadingMenuPopup.this.dismiss();
|
||
|
return;
|
||
|
}
|
||
|
for (CascadingMenuInfo cascadingMenuInfo : CascadingMenuPopup.this.mShowingMenus) {
|
||
|
cascadingMenuInfo.window.show();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* renamed from: androidx.appcompat.view.menu.CascadingMenuPopup$2 reason: invalid class name */
|
||
|
public class AnonymousClass2 implements View.OnAttachStateChangeListener {
|
||
|
public AnonymousClass2() {
|
||
|
}
|
||
|
|
||
|
@Override // android.view.View.OnAttachStateChangeListener
|
||
|
public void onViewAttachedToWindow(View view) {
|
||
|
}
|
||
|
|
||
|
@Override // android.view.View.OnAttachStateChangeListener
|
||
|
public void onViewDetachedFromWindow(View view) {
|
||
|
ViewTreeObserver viewTreeObserver = CascadingMenuPopup.this.mTreeObserver;
|
||
|
if (viewTreeObserver != null) {
|
||
|
if (!viewTreeObserver.isAlive()) {
|
||
|
CascadingMenuPopup.this.mTreeObserver = view.getViewTreeObserver();
|
||
|
}
|
||
|
CascadingMenuPopup cascadingMenuPopup = CascadingMenuPopup.this;
|
||
|
cascadingMenuPopup.mTreeObserver.removeGlobalOnLayoutListener(cascadingMenuPopup.mGlobalLayoutListener);
|
||
|
}
|
||
|
view.removeOnAttachStateChangeListener(this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* renamed from: androidx.appcompat.view.menu.CascadingMenuPopup$3 reason: invalid class name */
|
||
|
public class AnonymousClass3 implements MenuItemHoverListener {
|
||
|
|
||
|
/* renamed from: androidx.appcompat.view.menu.CascadingMenuPopup$3$1 reason: invalid class name */
|
||
|
public class AnonymousClass1 implements Runnable {
|
||
|
public final /* synthetic */ MenuItem val$item;
|
||
|
public final /* synthetic */ MenuBuilder val$menu;
|
||
|
public final /* synthetic */ CascadingMenuInfo val$nextInfo;
|
||
|
|
||
|
public AnonymousClass1(CascadingMenuInfo cascadingMenuInfo, MenuItem menuItem, MenuBuilder menuBuilder) {
|
||
|
this.val$nextInfo = cascadingMenuInfo;
|
||
|
this.val$item = menuItem;
|
||
|
this.val$menu = menuBuilder;
|
||
|
}
|
||
|
|
||
|
@Override // java.lang.Runnable
|
||
|
public void run() {
|
||
|
CascadingMenuInfo cascadingMenuInfo = this.val$nextInfo;
|
||
|
if (cascadingMenuInfo != null) {
|
||
|
CascadingMenuPopup.this.mShouldCloseImmediately = true;
|
||
|
cascadingMenuInfo.menu.close(false);
|
||
|
CascadingMenuPopup.this.mShouldCloseImmediately = false;
|
||
|
}
|
||
|
if (this.val$item.isEnabled() && this.val$item.hasSubMenu()) {
|
||
|
this.val$menu.performItemAction(this.val$item, 4);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public AnonymousClass3() {
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.widget.MenuItemHoverListener
|
||
|
public void onItemHoverEnter(@NonNull MenuBuilder menuBuilder, @NonNull MenuItem menuItem) {
|
||
|
CascadingMenuInfo cascadingMenuInfo = null;
|
||
|
CascadingMenuPopup.this.mSubMenuHoverHandler.removeCallbacksAndMessages(null);
|
||
|
int size = CascadingMenuPopup.this.mShowingMenus.size();
|
||
|
int i = 0;
|
||
|
while (true) {
|
||
|
if (i >= size) {
|
||
|
i = -1;
|
||
|
break;
|
||
|
} else if (menuBuilder == CascadingMenuPopup.this.mShowingMenus.get(i).menu) {
|
||
|
break;
|
||
|
} else {
|
||
|
i++;
|
||
|
}
|
||
|
}
|
||
|
if (i != -1) {
|
||
|
int i2 = i + 1;
|
||
|
if (i2 < CascadingMenuPopup.this.mShowingMenus.size()) {
|
||
|
cascadingMenuInfo = CascadingMenuPopup.this.mShowingMenus.get(i2);
|
||
|
}
|
||
|
CascadingMenuPopup.this.mSubMenuHoverHandler.postAtTime(new AnonymousClass1(cascadingMenuInfo, menuItem, menuBuilder), menuBuilder, SystemClock.uptimeMillis() + 200);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.widget.MenuItemHoverListener
|
||
|
public void onItemHoverExit(@NonNull MenuBuilder menuBuilder, @NonNull MenuItem menuItem) {
|
||
|
CascadingMenuPopup.this.mSubMenuHoverHandler.removeCallbacksAndMessages(menuBuilder);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static class CascadingMenuInfo {
|
||
|
public final MenuBuilder menu;
|
||
|
public final int position;
|
||
|
public final MenuPopupWindow window;
|
||
|
|
||
|
public CascadingMenuInfo(@NonNull MenuPopupWindow menuPopupWindow, @NonNull MenuBuilder menuBuilder, int i) {
|
||
|
this.window = menuPopupWindow;
|
||
|
this.menu = menuBuilder;
|
||
|
this.position = i;
|
||
|
}
|
||
|
|
||
|
public ListView getListView() {
|
||
|
return this.window.getListView();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Retention(RetentionPolicy.SOURCE)
|
||
|
public @interface HorizPosition {
|
||
|
}
|
||
|
|
||
|
public CascadingMenuPopup(@NonNull Context context, @NonNull View view, @AttrRes int i, @StyleRes int i2, boolean z2) {
|
||
|
this.mContext = context;
|
||
|
this.mAnchorView = view;
|
||
|
this.mPopupStyleAttr = i;
|
||
|
this.mPopupStyleRes = i2;
|
||
|
this.mOverflowOnly = z2;
|
||
|
this.mForceShowIcon = false;
|
||
|
this.mLastPosition = getInitialMenuPosition();
|
||
|
Resources resources = context.getResources();
|
||
|
this.mMenuMaxWidth = Math.max(resources.getDisplayMetrics().widthPixels / 2, resources.getDimensionPixelSize(R.dimen.abc_config_prefDialogWidth));
|
||
|
this.mSubMenuHoverHandler = new Handler();
|
||
|
}
|
||
|
|
||
|
private MenuPopupWindow createPopupWindow() {
|
||
|
MenuPopupWindow menuPopupWindow = new MenuPopupWindow(this.mContext, null, this.mPopupStyleAttr, this.mPopupStyleRes);
|
||
|
menuPopupWindow.setHoverListener(this.mMenuItemHoverListener);
|
||
|
menuPopupWindow.setOnItemClickListener(this);
|
||
|
menuPopupWindow.setOnDismissListener(this);
|
||
|
menuPopupWindow.setAnchorView(this.mAnchorView);
|
||
|
menuPopupWindow.setDropDownGravity(this.mDropDownGravity);
|
||
|
menuPopupWindow.setModal(true);
|
||
|
menuPopupWindow.setInputMethodMode(2);
|
||
|
return menuPopupWindow;
|
||
|
}
|
||
|
|
||
|
private int findIndexOfAddedMenu(@NonNull MenuBuilder menuBuilder) {
|
||
|
int size = this.mShowingMenus.size();
|
||
|
for (int i = 0; i < size; i++) {
|
||
|
if (menuBuilder == this.mShowingMenus.get(i).menu) {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
private MenuItem findMenuItemForSubmenu(@NonNull MenuBuilder menuBuilder, @NonNull MenuBuilder menuBuilder2) {
|
||
|
int size = menuBuilder.size();
|
||
|
for (int i = 0; i < size; i++) {
|
||
|
MenuItem item = menuBuilder.getItem(i);
|
||
|
if (item.hasSubMenu() && menuBuilder2 == item.getSubMenu()) {
|
||
|
return item;
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Nullable
|
||
|
private View findParentViewForSubmenu(@NonNull CascadingMenuInfo cascadingMenuInfo, @NonNull MenuBuilder menuBuilder) {
|
||
|
int i;
|
||
|
MenuAdapter menuAdapter;
|
||
|
int firstVisiblePosition;
|
||
|
MenuItem findMenuItemForSubmenu = findMenuItemForSubmenu(cascadingMenuInfo.menu, menuBuilder);
|
||
|
if (findMenuItemForSubmenu == null) {
|
||
|
return null;
|
||
|
}
|
||
|
ListView listView = cascadingMenuInfo.getListView();
|
||
|
ListAdapter adapter = listView.getAdapter();
|
||
|
int i2 = 0;
|
||
|
if (adapter instanceof HeaderViewListAdapter) {
|
||
|
HeaderViewListAdapter headerViewListAdapter = (HeaderViewListAdapter) adapter;
|
||
|
i = headerViewListAdapter.getHeadersCount();
|
||
|
menuAdapter = (MenuAdapter) headerViewListAdapter.getWrappedAdapter();
|
||
|
} else {
|
||
|
menuAdapter = (MenuAdapter) adapter;
|
||
|
i = 0;
|
||
|
}
|
||
|
int count = menuAdapter.getCount();
|
||
|
while (true) {
|
||
|
if (i2 >= count) {
|
||
|
i2 = -1;
|
||
|
break;
|
||
|
} else if (findMenuItemForSubmenu == menuAdapter.getItem(i2)) {
|
||
|
break;
|
||
|
} else {
|
||
|
i2++;
|
||
|
}
|
||
|
}
|
||
|
if (i2 != -1 && (firstVisiblePosition = (i2 + i) - listView.getFirstVisiblePosition()) >= 0 && firstVisiblePosition < listView.getChildCount()) {
|
||
|
return listView.getChildAt(firstVisiblePosition);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
private int getInitialMenuPosition() {
|
||
|
return ViewCompat.getLayoutDirection(this.mAnchorView) == 1 ? 0 : 1;
|
||
|
}
|
||
|
|
||
|
private int getNextMenuPosition(int i) {
|
||
|
List<CascadingMenuInfo> list = this.mShowingMenus;
|
||
|
ListView listView = list.get(list.size() - 1).getListView();
|
||
|
int[] iArr = new int[2];
|
||
|
listView.getLocationOnScreen(iArr);
|
||
|
Rect rect = new Rect();
|
||
|
this.mShownAnchorView.getWindowVisibleDisplayFrame(rect);
|
||
|
if (this.mLastPosition != 1) {
|
||
|
return iArr[0] - i < 0 ? 1 : 0;
|
||
|
}
|
||
|
return (listView.getWidth() + iArr[0]) + i > rect.right ? 0 : 1;
|
||
|
}
|
||
|
|
||
|
private void showMenu(@NonNull MenuBuilder menuBuilder) {
|
||
|
View view;
|
||
|
CascadingMenuInfo cascadingMenuInfo;
|
||
|
int i;
|
||
|
int i2;
|
||
|
int i3;
|
||
|
LayoutInflater from = LayoutInflater.from(this.mContext);
|
||
|
MenuAdapter menuAdapter = new MenuAdapter(menuBuilder, from, this.mOverflowOnly, ITEM_LAYOUT);
|
||
|
if (!isShowing() && this.mForceShowIcon) {
|
||
|
menuAdapter.setForceShowIcon(true);
|
||
|
} else if (isShowing()) {
|
||
|
menuAdapter.setForceShowIcon(MenuPopup.shouldPreserveIconSpacing(menuBuilder));
|
||
|
}
|
||
|
int measureIndividualMenuWidth = MenuPopup.measureIndividualMenuWidth(menuAdapter, null, this.mContext, this.mMenuMaxWidth);
|
||
|
MenuPopupWindow createPopupWindow = createPopupWindow();
|
||
|
createPopupWindow.setAdapter(menuAdapter);
|
||
|
createPopupWindow.setContentWidth(measureIndividualMenuWidth);
|
||
|
createPopupWindow.setDropDownGravity(this.mDropDownGravity);
|
||
|
if (this.mShowingMenus.size() > 0) {
|
||
|
List<CascadingMenuInfo> list = this.mShowingMenus;
|
||
|
cascadingMenuInfo = list.get(list.size() - 1);
|
||
|
view = findParentViewForSubmenu(cascadingMenuInfo, menuBuilder);
|
||
|
} else {
|
||
|
cascadingMenuInfo = null;
|
||
|
view = null;
|
||
|
}
|
||
|
if (view != null) {
|
||
|
createPopupWindow.setTouchModal(false);
|
||
|
createPopupWindow.setEnterTransition(null);
|
||
|
int nextMenuPosition = getNextMenuPosition(measureIndividualMenuWidth);
|
||
|
boolean z2 = nextMenuPosition == 1;
|
||
|
this.mLastPosition = nextMenuPosition;
|
||
|
if (Build.VERSION.SDK_INT >= 26) {
|
||
|
createPopupWindow.setAnchorView(view);
|
||
|
i2 = 0;
|
||
|
i = 0;
|
||
|
} else {
|
||
|
int[] iArr = new int[2];
|
||
|
this.mAnchorView.getLocationOnScreen(iArr);
|
||
|
int[] iArr2 = new int[2];
|
||
|
view.getLocationOnScreen(iArr2);
|
||
|
if ((this.mDropDownGravity & 7) == 5) {
|
||
|
iArr[0] = this.mAnchorView.getWidth() + iArr[0];
|
||
|
iArr2[0] = view.getWidth() + iArr2[0];
|
||
|
}
|
||
|
i2 = iArr2[1] - iArr[1];
|
||
|
i = iArr2[0] - iArr[0];
|
||
|
}
|
||
|
if ((this.mDropDownGravity & 5) == 5) {
|
||
|
if (z2) {
|
||
|
i3 = i + measureIndividualMenuWidth;
|
||
|
createPopupWindow.setHorizontalOffset(i3);
|
||
|
createPopupWindow.setOverlapAnchor(true);
|
||
|
createPopupWindow.setVerticalOffset(i2);
|
||
|
} else {
|
||
|
measureIndividualMenuWidth = view.getWidth();
|
||
|
}
|
||
|
} else if (z2) {
|
||
|
i3 = i + view.getWidth();
|
||
|
createPopupWindow.setHorizontalOffset(i3);
|
||
|
createPopupWindow.setOverlapAnchor(true);
|
||
|
createPopupWindow.setVerticalOffset(i2);
|
||
|
}
|
||
|
i3 = i - measureIndividualMenuWidth;
|
||
|
createPopupWindow.setHorizontalOffset(i3);
|
||
|
createPopupWindow.setOverlapAnchor(true);
|
||
|
createPopupWindow.setVerticalOffset(i2);
|
||
|
} else {
|
||
|
if (this.mHasXOffset) {
|
||
|
createPopupWindow.setHorizontalOffset(this.mXOffset);
|
||
|
}
|
||
|
if (this.mHasYOffset) {
|
||
|
createPopupWindow.setVerticalOffset(this.mYOffset);
|
||
|
}
|
||
|
createPopupWindow.setEpicenterBounds(getEpicenterBounds());
|
||
|
}
|
||
|
this.mShowingMenus.add(new CascadingMenuInfo(createPopupWindow, menuBuilder, this.mLastPosition));
|
||
|
createPopupWindow.show();
|
||
|
ListView listView = createPopupWindow.getListView();
|
||
|
listView.setOnKeyListener(this);
|
||
|
if (cascadingMenuInfo == null && this.mShowTitle && menuBuilder.getHeaderTitle() != null) {
|
||
|
FrameLayout frameLayout = (FrameLayout) from.inflate(R.layout.abc_popup_menu_header_item_layout, (ViewGroup) listView, false);
|
||
|
frameLayout.setEnabled(false);
|
||
|
((TextView) frameLayout.findViewById(16908310)).setText(menuBuilder.getHeaderTitle());
|
||
|
listView.addHeaderView(frameLayout, null, false);
|
||
|
createPopupWindow.show();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void addMenu(MenuBuilder menuBuilder) {
|
||
|
menuBuilder.addMenuPresenter(this, this.mContext);
|
||
|
if (isShowing()) {
|
||
|
showMenu(menuBuilder);
|
||
|
} else {
|
||
|
this.mPendingMenus.add(menuBuilder);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public boolean closeMenuOnSubMenuOpened() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
||
|
public void dismiss() {
|
||
|
int size = this.mShowingMenus.size();
|
||
|
if (size > 0) {
|
||
|
CascadingMenuInfo[] cascadingMenuInfoArr = (CascadingMenuInfo[]) this.mShowingMenus.toArray(new CascadingMenuInfo[size]);
|
||
|
for (int i = size - 1; i >= 0; i--) {
|
||
|
CascadingMenuInfo cascadingMenuInfo = cascadingMenuInfoArr[i];
|
||
|
if (cascadingMenuInfo.window.isShowing()) {
|
||
|
cascadingMenuInfo.window.dismiss();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public boolean flagActionItems() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
||
|
public ListView getListView() {
|
||
|
if (this.mShowingMenus.isEmpty()) {
|
||
|
return null;
|
||
|
}
|
||
|
List<CascadingMenuInfo> list = this.mShowingMenus;
|
||
|
return list.get(list.size() - 1).getListView();
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
||
|
public boolean isShowing() {
|
||
|
return this.mShowingMenus.size() > 0 && this.mShowingMenus.get(0).window.isShowing();
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public void onCloseMenu(MenuBuilder menuBuilder, boolean z2) {
|
||
|
int findIndexOfAddedMenu = findIndexOfAddedMenu(menuBuilder);
|
||
|
if (findIndexOfAddedMenu >= 0) {
|
||
|
int i = findIndexOfAddedMenu + 1;
|
||
|
if (i < this.mShowingMenus.size()) {
|
||
|
this.mShowingMenus.get(i).menu.close(false);
|
||
|
}
|
||
|
CascadingMenuInfo remove = this.mShowingMenus.remove(findIndexOfAddedMenu);
|
||
|
remove.menu.removeMenuPresenter(this);
|
||
|
if (this.mShouldCloseImmediately) {
|
||
|
remove.window.setExitTransition(null);
|
||
|
remove.window.setAnimationStyle(0);
|
||
|
}
|
||
|
remove.window.dismiss();
|
||
|
int size = this.mShowingMenus.size();
|
||
|
if (size > 0) {
|
||
|
this.mLastPosition = this.mShowingMenus.get(size - 1).position;
|
||
|
} else {
|
||
|
this.mLastPosition = getInitialMenuPosition();
|
||
|
}
|
||
|
if (size == 0) {
|
||
|
dismiss();
|
||
|
MenuPresenter.Callback callback = this.mPresenterCallback;
|
||
|
if (callback != null) {
|
||
|
callback.onCloseMenu(menuBuilder, true);
|
||
|
}
|
||
|
ViewTreeObserver viewTreeObserver = this.mTreeObserver;
|
||
|
if (viewTreeObserver != null) {
|
||
|
if (viewTreeObserver.isAlive()) {
|
||
|
this.mTreeObserver.removeGlobalOnLayoutListener(this.mGlobalLayoutListener);
|
||
|
}
|
||
|
this.mTreeObserver = null;
|
||
|
}
|
||
|
this.mShownAnchorView.removeOnAttachStateChangeListener(this.mAttachStateChangeListener);
|
||
|
this.mOnDismissListener.onDismiss();
|
||
|
} else if (z2) {
|
||
|
this.mShowingMenus.get(0).menu.close(false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // android.widget.PopupWindow.OnDismissListener
|
||
|
public void onDismiss() {
|
||
|
CascadingMenuInfo cascadingMenuInfo;
|
||
|
int size = this.mShowingMenus.size();
|
||
|
int i = 0;
|
||
|
while (true) {
|
||
|
if (i >= size) {
|
||
|
cascadingMenuInfo = null;
|
||
|
break;
|
||
|
}
|
||
|
cascadingMenuInfo = this.mShowingMenus.get(i);
|
||
|
if (!cascadingMenuInfo.window.isShowing()) {
|
||
|
break;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
if (cascadingMenuInfo != null) {
|
||
|
cascadingMenuInfo.menu.close(false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // android.view.View.OnKeyListener
|
||
|
public boolean onKey(View view, int i, KeyEvent keyEvent) {
|
||
|
if (keyEvent.getAction() != 1 || i != 82) {
|
||
|
return false;
|
||
|
}
|
||
|
dismiss();
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public void onRestoreInstanceState(Parcelable parcelable) {
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public Parcelable onSaveInstanceState() {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public boolean onSubMenuSelected(SubMenuBuilder subMenuBuilder) {
|
||
|
for (CascadingMenuInfo cascadingMenuInfo : this.mShowingMenus) {
|
||
|
if (subMenuBuilder == cascadingMenuInfo.menu) {
|
||
|
cascadingMenuInfo.getListView().requestFocus();
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
if (!subMenuBuilder.hasVisibleItems()) {
|
||
|
return false;
|
||
|
}
|
||
|
addMenu(subMenuBuilder);
|
||
|
MenuPresenter.Callback callback = this.mPresenterCallback;
|
||
|
if (callback != null) {
|
||
|
callback.onOpenSubMenu(subMenuBuilder);
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setAnchorView(@NonNull View view) {
|
||
|
if (this.mAnchorView != view) {
|
||
|
this.mAnchorView = view;
|
||
|
this.mDropDownGravity = GravityCompat.getAbsoluteGravity(this.mRawDropDownGravity, ViewCompat.getLayoutDirection(view));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public void setCallback(MenuPresenter.Callback callback) {
|
||
|
this.mPresenterCallback = callback;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setForceShowIcon(boolean z2) {
|
||
|
this.mForceShowIcon = z2;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setGravity(int i) {
|
||
|
if (this.mRawDropDownGravity != i) {
|
||
|
this.mRawDropDownGravity = i;
|
||
|
this.mDropDownGravity = GravityCompat.getAbsoluteGravity(i, ViewCompat.getLayoutDirection(this.mAnchorView));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setHorizontalOffset(int i) {
|
||
|
this.mHasXOffset = true;
|
||
|
this.mXOffset = i;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setOnDismissListener(PopupWindow.OnDismissListener onDismissListener) {
|
||
|
this.mOnDismissListener = onDismissListener;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setShowTitle(boolean z2) {
|
||
|
this.mShowTitle = z2;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
||
|
public void setVerticalOffset(int i) {
|
||
|
this.mHasYOffset = true;
|
||
|
this.mYOffset = i;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
||
|
public void show() {
|
||
|
if (!isShowing()) {
|
||
|
for (MenuBuilder menuBuilder : this.mPendingMenus) {
|
||
|
showMenu(menuBuilder);
|
||
|
}
|
||
|
this.mPendingMenus.clear();
|
||
|
View view = this.mAnchorView;
|
||
|
this.mShownAnchorView = view;
|
||
|
if (view != null) {
|
||
|
boolean z2 = this.mTreeObserver == null;
|
||
|
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
|
||
|
this.mTreeObserver = viewTreeObserver;
|
||
|
if (z2) {
|
||
|
viewTreeObserver.addOnGlobalLayoutListener(this.mGlobalLayoutListener);
|
||
|
}
|
||
|
this.mShownAnchorView.addOnAttachStateChangeListener(this.mAttachStateChangeListener);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
||
|
public void updateMenuView(boolean z2) {
|
||
|
for (CascadingMenuInfo cascadingMenuInfo : this.mShowingMenus) {
|
||
|
MenuPopup.toMenuAdapter(cascadingMenuInfo.getListView().getAdapter()).notifyDataSetChanged();
|
||
|
}
|
||
|
}
|
||
|
}
|