291 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.appcompat.view.menu;
 | |
| 
 | |
| import android.content.Context;
 | |
| import android.content.res.Resources;
 | |
| import android.os.Parcelable;
 | |
| import android.view.Gravity;
 | |
| import android.view.KeyEvent;
 | |
| import android.view.LayoutInflater;
 | |
| import android.view.View;
 | |
| import android.view.ViewGroup;
 | |
| import android.view.ViewTreeObserver;
 | |
| import android.widget.AdapterView;
 | |
| import android.widget.FrameLayout;
 | |
| import android.widget.ListView;
 | |
| import android.widget.PopupWindow;
 | |
| import android.widget.TextView;
 | |
| import androidx.appcompat.R;
 | |
| import androidx.appcompat.view.menu.MenuPresenter;
 | |
| import androidx.appcompat.widget.MenuPopupWindow;
 | |
| import androidx.core.view.ViewCompat;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| final class StandardMenuPopup extends MenuPopup implements PopupWindow.OnDismissListener, AdapterView.OnItemClickListener, MenuPresenter, View.OnKeyListener {
 | |
|     private static final int ITEM_LAYOUT = R.layout.abc_popup_menu_item_layout;
 | |
|     private final MenuAdapter mAdapter;
 | |
|     private View mAnchorView;
 | |
|     private int mContentWidth;
 | |
|     private final Context mContext;
 | |
|     private boolean mHasContentWidth;
 | |
|     private final MenuBuilder mMenu;
 | |
|     private PopupWindow.OnDismissListener mOnDismissListener;
 | |
|     private final boolean mOverflowOnly;
 | |
|     final MenuPopupWindow mPopup;
 | |
|     private final int mPopupMaxWidth;
 | |
|     private final int mPopupStyleAttr;
 | |
|     private final int mPopupStyleRes;
 | |
|     private MenuPresenter.Callback mPresenterCallback;
 | |
|     private boolean mShowTitle;
 | |
|     View mShownAnchorView;
 | |
|     ViewTreeObserver mTreeObserver;
 | |
|     private boolean mWasDismissed;
 | |
|     final ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { // from class: androidx.appcompat.view.menu.StandardMenuPopup.1
 | |
|         @Override // android.view.ViewTreeObserver.OnGlobalLayoutListener
 | |
|         public void onGlobalLayout() {
 | |
|             if (!StandardMenuPopup.this.isShowing() || StandardMenuPopup.this.mPopup.isModal()) {
 | |
|                 return;
 | |
|             }
 | |
|             View view = StandardMenuPopup.this.mShownAnchorView;
 | |
|             if (view == null || !view.isShown()) {
 | |
|                 StandardMenuPopup.this.dismiss();
 | |
|             } else {
 | |
|                 StandardMenuPopup.this.mPopup.show();
 | |
|             }
 | |
|         }
 | |
|     };
 | |
|     private final View.OnAttachStateChangeListener mAttachStateChangeListener = new View.OnAttachStateChangeListener() { // from class: androidx.appcompat.view.menu.StandardMenuPopup.2
 | |
|         @Override // android.view.View.OnAttachStateChangeListener
 | |
|         public void onViewAttachedToWindow(View view) {
 | |
|         }
 | |
| 
 | |
|         @Override // android.view.View.OnAttachStateChangeListener
 | |
|         public void onViewDetachedFromWindow(View view) {
 | |
|             if (StandardMenuPopup.this.mTreeObserver != null) {
 | |
|                 if (!StandardMenuPopup.this.mTreeObserver.isAlive()) {
 | |
|                     StandardMenuPopup.this.mTreeObserver = view.getViewTreeObserver();
 | |
|                 }
 | |
|                 StandardMenuPopup.this.mTreeObserver.removeGlobalOnLayoutListener(StandardMenuPopup.this.mGlobalLayoutListener);
 | |
|             }
 | |
|             view.removeOnAttachStateChangeListener(this);
 | |
|         }
 | |
|     };
 | |
|     private int mDropDownGravity = 0;
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPopup
 | |
|     public void addMenu(MenuBuilder menuBuilder) {
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPresenter
 | |
|     public boolean flagActionItems() {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     @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.MenuPopup
 | |
|     public void setAnchorView(View view) {
 | |
|         this.mAnchorView = view;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPresenter
 | |
|     public void setCallback(MenuPresenter.Callback callback) {
 | |
|         this.mPresenterCallback = callback;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPopup
 | |
|     public void setGravity(int i) {
 | |
|         this.mDropDownGravity = 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 z) {
 | |
|         this.mShowTitle = z;
 | |
|     }
 | |
| 
 | |
|     public StandardMenuPopup(Context context, MenuBuilder menuBuilder, View view, int i, int i2, boolean z) {
 | |
|         this.mContext = context;
 | |
|         this.mMenu = menuBuilder;
 | |
|         this.mOverflowOnly = z;
 | |
|         this.mAdapter = new MenuAdapter(menuBuilder, LayoutInflater.from(context), z, ITEM_LAYOUT);
 | |
|         this.mPopupStyleAttr = i;
 | |
|         this.mPopupStyleRes = i2;
 | |
|         Resources resources = context.getResources();
 | |
|         this.mPopupMaxWidth = Math.max(resources.getDisplayMetrics().widthPixels / 2, resources.getDimensionPixelSize(R.dimen.abc_config_prefDialogWidth));
 | |
|         this.mAnchorView = view;
 | |
|         this.mPopup = new MenuPopupWindow(context, null, i, i2);
 | |
|         menuBuilder.addMenuPresenter(this, context);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPopup
 | |
|     public void setForceShowIcon(boolean z) {
 | |
|         this.mAdapter.setForceShowIcon(z);
 | |
|     }
 | |
| 
 | |
|     private boolean tryShow() {
 | |
|         View view;
 | |
|         if (isShowing()) {
 | |
|             return true;
 | |
|         }
 | |
|         if (this.mWasDismissed || (view = this.mAnchorView) == null) {
 | |
|             return false;
 | |
|         }
 | |
|         this.mShownAnchorView = view;
 | |
|         this.mPopup.setOnDismissListener(this);
 | |
|         this.mPopup.setOnItemClickListener(this);
 | |
|         this.mPopup.setModal(true);
 | |
|         View view2 = this.mShownAnchorView;
 | |
|         boolean z = this.mTreeObserver == null;
 | |
|         ViewTreeObserver viewTreeObserver = view2.getViewTreeObserver();
 | |
|         this.mTreeObserver = viewTreeObserver;
 | |
|         if (z) {
 | |
|             viewTreeObserver.addOnGlobalLayoutListener(this.mGlobalLayoutListener);
 | |
|         }
 | |
|         view2.addOnAttachStateChangeListener(this.mAttachStateChangeListener);
 | |
|         this.mPopup.setAnchorView(view2);
 | |
|         this.mPopup.setDropDownGravity(this.mDropDownGravity);
 | |
|         if (!this.mHasContentWidth) {
 | |
|             this.mContentWidth = measureIndividualMenuWidth(this.mAdapter, null, this.mContext, this.mPopupMaxWidth);
 | |
|             this.mHasContentWidth = true;
 | |
|         }
 | |
|         this.mPopup.setContentWidth(this.mContentWidth);
 | |
|         this.mPopup.setInputMethodMode(2);
 | |
|         this.mPopup.setEpicenterBounds(getEpicenterBounds());
 | |
|         this.mPopup.show();
 | |
|         ListView listView = this.mPopup.getListView();
 | |
|         listView.setOnKeyListener(this);
 | |
|         if (this.mShowTitle && this.mMenu.getHeaderTitle() != null) {
 | |
|             FrameLayout frameLayout = (FrameLayout) LayoutInflater.from(this.mContext).inflate(R.layout.abc_popup_menu_header_item_layout, (ViewGroup) listView, false);
 | |
|             TextView textView = (TextView) frameLayout.findViewById(android.R.id.title);
 | |
|             if (textView != null) {
 | |
|                 textView.setText(this.mMenu.getHeaderTitle());
 | |
|             }
 | |
|             frameLayout.setEnabled(false);
 | |
|             listView.addHeaderView(frameLayout, null, false);
 | |
|         }
 | |
|         this.mPopup.setAdapter(this.mAdapter);
 | |
|         this.mPopup.show();
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.ShowableListMenu
 | |
|     public void show() {
 | |
|         if (!tryShow()) {
 | |
|             throw new IllegalStateException("StandardMenuPopup cannot be used without an anchor");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.ShowableListMenu
 | |
|     public void dismiss() {
 | |
|         if (isShowing()) {
 | |
|             this.mPopup.dismiss();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.ShowableListMenu
 | |
|     public boolean isShowing() {
 | |
|         return !this.mWasDismissed && this.mPopup.isShowing();
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.PopupWindow.OnDismissListener
 | |
|     public void onDismiss() {
 | |
|         this.mWasDismissed = true;
 | |
|         this.mMenu.close();
 | |
|         ViewTreeObserver viewTreeObserver = this.mTreeObserver;
 | |
|         if (viewTreeObserver != null) {
 | |
|             if (!viewTreeObserver.isAlive()) {
 | |
|                 this.mTreeObserver = this.mShownAnchorView.getViewTreeObserver();
 | |
|             }
 | |
|             this.mTreeObserver.removeGlobalOnLayoutListener(this.mGlobalLayoutListener);
 | |
|             this.mTreeObserver = null;
 | |
|         }
 | |
|         this.mShownAnchorView.removeOnAttachStateChangeListener(this.mAttachStateChangeListener);
 | |
|         PopupWindow.OnDismissListener onDismissListener = this.mOnDismissListener;
 | |
|         if (onDismissListener != null) {
 | |
|             onDismissListener.onDismiss();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPresenter
 | |
|     public void updateMenuView(boolean z) {
 | |
|         this.mHasContentWidth = false;
 | |
|         MenuAdapter menuAdapter = this.mAdapter;
 | |
|         if (menuAdapter != null) {
 | |
|             menuAdapter.notifyDataSetChanged();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPresenter
 | |
|     public boolean onSubMenuSelected(SubMenuBuilder subMenuBuilder) {
 | |
|         if (subMenuBuilder.hasVisibleItems()) {
 | |
|             MenuPopupHelper menuPopupHelper = new MenuPopupHelper(this.mContext, subMenuBuilder, this.mShownAnchorView, this.mOverflowOnly, this.mPopupStyleAttr, this.mPopupStyleRes);
 | |
|             menuPopupHelper.setPresenterCallback(this.mPresenterCallback);
 | |
|             menuPopupHelper.setForceShowIcon(MenuPopup.shouldPreserveIconSpacing(subMenuBuilder));
 | |
|             menuPopupHelper.setOnDismissListener(this.mOnDismissListener);
 | |
|             this.mOnDismissListener = null;
 | |
|             this.mMenu.close(false);
 | |
|             int horizontalOffset = this.mPopup.getHorizontalOffset();
 | |
|             int verticalOffset = this.mPopup.getVerticalOffset();
 | |
|             if ((Gravity.getAbsoluteGravity(this.mDropDownGravity, ViewCompat.getLayoutDirection(this.mAnchorView)) & 7) == 5) {
 | |
|                 horizontalOffset += this.mAnchorView.getWidth();
 | |
|             }
 | |
|             if (menuPopupHelper.tryShow(horizontalOffset, verticalOffset)) {
 | |
|                 MenuPresenter.Callback callback = this.mPresenterCallback;
 | |
|                 if (callback == null) {
 | |
|                     return true;
 | |
|                 }
 | |
|                 callback.onOpenSubMenu(subMenuBuilder);
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPresenter
 | |
|     public void onCloseMenu(MenuBuilder menuBuilder, boolean z) {
 | |
|         if (menuBuilder != this.mMenu) {
 | |
|             return;
 | |
|         }
 | |
|         dismiss();
 | |
|         MenuPresenter.Callback callback = this.mPresenterCallback;
 | |
|         if (callback != null) {
 | |
|             callback.onCloseMenu(menuBuilder, z);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @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.ShowableListMenu
 | |
|     public ListView getListView() {
 | |
|         return this.mPopup.getListView();
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPopup
 | |
|     public void setHorizontalOffset(int i) {
 | |
|         this.mPopup.setHorizontalOffset(i);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.appcompat.view.menu.MenuPopup
 | |
|     public void setVerticalOffset(int i) {
 | |
|         this.mPopup.setVerticalOffset(i);
 | |
|     }
 | |
| }
 |