555 lines
18 KiB
Java
555 lines
18 KiB
Java
package androidx.appcompat.view.menu;
|
|
|
|
import android.R;
|
|
import android.content.Context;
|
|
import android.content.res.Resources;
|
|
import android.graphics.Rect;
|
|
import android.os.Build;
|
|
import android.os.Handler;
|
|
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.AdapterView;
|
|
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.appcompat.R$dimen;
|
|
import androidx.appcompat.R$layout;
|
|
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.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
|
|
/* loaded from: classes.dex */
|
|
final class CascadingMenuPopup extends MenuPopup implements MenuPresenter, View.OnKeyListener, PopupWindow.OnDismissListener {
|
|
private static final int C = R$layout.abc_cascading_menu_item_layout;
|
|
private PopupWindow.OnDismissListener A;
|
|
boolean B;
|
|
private final Context b;
|
|
private final int c;
|
|
private final int d;
|
|
private final int e;
|
|
private final boolean f;
|
|
final Handler g;
|
|
private View o;
|
|
View p;
|
|
private boolean r;
|
|
private boolean s;
|
|
private int t;
|
|
private int u;
|
|
private boolean x;
|
|
private MenuPresenter.Callback y;
|
|
ViewTreeObserver z;
|
|
private final List<MenuBuilder> h = new ArrayList();
|
|
final List<CascadingMenuInfo> i = new ArrayList();
|
|
final ViewTreeObserver.OnGlobalLayoutListener j = new ViewTreeObserver.OnGlobalLayoutListener() { // from class: androidx.appcompat.view.menu.CascadingMenuPopup.1
|
|
@Override // android.view.ViewTreeObserver.OnGlobalLayoutListener
|
|
public void onGlobalLayout() {
|
|
if (!CascadingMenuPopup.this.c() || CascadingMenuPopup.this.i.size() <= 0 || CascadingMenuPopup.this.i.get(0).a.k()) {
|
|
return;
|
|
}
|
|
View view = CascadingMenuPopup.this.p;
|
|
if (view == null || !view.isShown()) {
|
|
CascadingMenuPopup.this.dismiss();
|
|
return;
|
|
}
|
|
Iterator<CascadingMenuInfo> it = CascadingMenuPopup.this.i.iterator();
|
|
while (it.hasNext()) {
|
|
it.next().a.a();
|
|
}
|
|
}
|
|
};
|
|
private final View.OnAttachStateChangeListener k = new View.OnAttachStateChangeListener() { // from class: androidx.appcompat.view.menu.CascadingMenuPopup.2
|
|
@Override // android.view.View.OnAttachStateChangeListener
|
|
public void onViewAttachedToWindow(View view) {
|
|
}
|
|
|
|
@Override // android.view.View.OnAttachStateChangeListener
|
|
public void onViewDetachedFromWindow(View view) {
|
|
ViewTreeObserver viewTreeObserver = CascadingMenuPopup.this.z;
|
|
if (viewTreeObserver != null) {
|
|
if (!viewTreeObserver.isAlive()) {
|
|
CascadingMenuPopup.this.z = view.getViewTreeObserver();
|
|
}
|
|
CascadingMenuPopup cascadingMenuPopup = CascadingMenuPopup.this;
|
|
cascadingMenuPopup.z.removeGlobalOnLayoutListener(cascadingMenuPopup.j);
|
|
}
|
|
view.removeOnAttachStateChangeListener(this);
|
|
}
|
|
};
|
|
private final MenuItemHoverListener l = new MenuItemHoverListener() { // from class: androidx.appcompat.view.menu.CascadingMenuPopup.3
|
|
@Override // androidx.appcompat.widget.MenuItemHoverListener
|
|
public void a(final MenuBuilder menuBuilder, final MenuItem menuItem) {
|
|
CascadingMenuPopup.this.g.removeCallbacksAndMessages(null);
|
|
int size = CascadingMenuPopup.this.i.size();
|
|
int i = 0;
|
|
while (true) {
|
|
if (i >= size) {
|
|
i = -1;
|
|
break;
|
|
} else if (menuBuilder == CascadingMenuPopup.this.i.get(i).b) {
|
|
break;
|
|
} else {
|
|
i++;
|
|
}
|
|
}
|
|
if (i == -1) {
|
|
return;
|
|
}
|
|
int i2 = i + 1;
|
|
final CascadingMenuInfo cascadingMenuInfo = i2 < CascadingMenuPopup.this.i.size() ? CascadingMenuPopup.this.i.get(i2) : null;
|
|
CascadingMenuPopup.this.g.postAtTime(new Runnable() { // from class: androidx.appcompat.view.menu.CascadingMenuPopup.3.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
CascadingMenuInfo cascadingMenuInfo2 = cascadingMenuInfo;
|
|
if (cascadingMenuInfo2 != null) {
|
|
CascadingMenuPopup.this.B = true;
|
|
cascadingMenuInfo2.b.a(false);
|
|
CascadingMenuPopup.this.B = false;
|
|
}
|
|
if (menuItem.isEnabled() && menuItem.hasSubMenu()) {
|
|
menuBuilder.a(menuItem, 4);
|
|
}
|
|
}
|
|
}, menuBuilder, SystemClock.uptimeMillis() + 200);
|
|
}
|
|
|
|
@Override // androidx.appcompat.widget.MenuItemHoverListener
|
|
public void b(MenuBuilder menuBuilder, MenuItem menuItem) {
|
|
CascadingMenuPopup.this.g.removeCallbacksAndMessages(menuBuilder);
|
|
}
|
|
};
|
|
private int m = 0;
|
|
private int n = 0;
|
|
private boolean v = false;
|
|
private int q = h();
|
|
|
|
private static class CascadingMenuInfo {
|
|
public final MenuPopupWindow a;
|
|
public final MenuBuilder b;
|
|
public final int c;
|
|
|
|
public CascadingMenuInfo(MenuPopupWindow menuPopupWindow, MenuBuilder menuBuilder, int i) {
|
|
this.a = menuPopupWindow;
|
|
this.b = menuBuilder;
|
|
this.c = i;
|
|
}
|
|
|
|
public ListView a() {
|
|
return this.a.d();
|
|
}
|
|
}
|
|
|
|
public CascadingMenuPopup(Context context, View view, int i, int i2, boolean z) {
|
|
this.b = context;
|
|
this.o = view;
|
|
this.d = i;
|
|
this.e = i2;
|
|
this.f = z;
|
|
Resources resources = context.getResources();
|
|
this.c = Math.max(resources.getDisplayMetrics().widthPixels / 2, resources.getDimensionPixelSize(R$dimen.abc_config_prefDialogWidth));
|
|
this.g = new Handler();
|
|
}
|
|
|
|
private int d(int i) {
|
|
List<CascadingMenuInfo> list = this.i;
|
|
ListView a = list.get(list.size() - 1).a();
|
|
int[] iArr = new int[2];
|
|
a.getLocationOnScreen(iArr);
|
|
Rect rect = new Rect();
|
|
this.p.getWindowVisibleDisplayFrame(rect);
|
|
return this.q == 1 ? (iArr[0] + a.getWidth()) + i > rect.right ? 0 : 1 : iArr[0] - i < 0 ? 1 : 0;
|
|
}
|
|
|
|
private MenuPopupWindow g() {
|
|
MenuPopupWindow menuPopupWindow = new MenuPopupWindow(this.b, null, this.d, this.e);
|
|
menuPopupWindow.a(this.l);
|
|
menuPopupWindow.a((AdapterView.OnItemClickListener) this);
|
|
menuPopupWindow.a((PopupWindow.OnDismissListener) this);
|
|
menuPopupWindow.a(this.o);
|
|
menuPopupWindow.c(this.n);
|
|
menuPopupWindow.a(true);
|
|
menuPopupWindow.e(2);
|
|
return menuPopupWindow;
|
|
}
|
|
|
|
private int h() {
|
|
return ViewCompat.k(this.o) == 1 ? 0 : 1;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
|
public void a() {
|
|
if (c()) {
|
|
return;
|
|
}
|
|
Iterator<MenuBuilder> it = this.h.iterator();
|
|
while (it.hasNext()) {
|
|
d(it.next());
|
|
}
|
|
this.h.clear();
|
|
this.p = this.o;
|
|
if (this.p != null) {
|
|
boolean z = this.z == null;
|
|
this.z = this.p.getViewTreeObserver();
|
|
if (z) {
|
|
this.z.addOnGlobalLayoutListener(this.j);
|
|
}
|
|
this.p.addOnAttachStateChangeListener(this.k);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void b(boolean z) {
|
|
this.v = z;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
|
public boolean b() {
|
|
return false;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
|
public boolean c() {
|
|
return this.i.size() > 0 && this.i.get(0).a.c();
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
|
public void dismiss() {
|
|
int size = this.i.size();
|
|
if (size > 0) {
|
|
CascadingMenuInfo[] cascadingMenuInfoArr = (CascadingMenuInfo[]) this.i.toArray(new CascadingMenuInfo[size]);
|
|
for (int i = size - 1; i >= 0; i--) {
|
|
CascadingMenuInfo cascadingMenuInfo = cascadingMenuInfoArr[i];
|
|
if (cascadingMenuInfo.a.c()) {
|
|
cascadingMenuInfo.a.dismiss();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
protected boolean e() {
|
|
return false;
|
|
}
|
|
|
|
@Override // android.widget.PopupWindow.OnDismissListener
|
|
public void onDismiss() {
|
|
CascadingMenuInfo cascadingMenuInfo;
|
|
int size = this.i.size();
|
|
int i = 0;
|
|
while (true) {
|
|
if (i >= size) {
|
|
cascadingMenuInfo = null;
|
|
break;
|
|
}
|
|
cascadingMenuInfo = this.i.get(i);
|
|
if (!cascadingMenuInfo.a.c()) {
|
|
break;
|
|
} else {
|
|
i++;
|
|
}
|
|
}
|
|
if (cascadingMenuInfo != null) {
|
|
cascadingMenuInfo.b.a(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;
|
|
}
|
|
|
|
private int c(MenuBuilder menuBuilder) {
|
|
int size = this.i.size();
|
|
for (int i = 0; i < size; i++) {
|
|
if (menuBuilder == this.i.get(i).b) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void b(int i) {
|
|
this.r = true;
|
|
this.t = i;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void c(int i) {
|
|
this.s = true;
|
|
this.u = i;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void c(boolean z) {
|
|
this.x = z;
|
|
}
|
|
|
|
private void d(MenuBuilder menuBuilder) {
|
|
CascadingMenuInfo cascadingMenuInfo;
|
|
View view;
|
|
int i;
|
|
int i2;
|
|
int i3;
|
|
LayoutInflater from = LayoutInflater.from(this.b);
|
|
MenuAdapter menuAdapter = new MenuAdapter(menuBuilder, from, this.f, C);
|
|
if (!c() && this.v) {
|
|
menuAdapter.a(true);
|
|
} else if (c()) {
|
|
menuAdapter.a(MenuPopup.b(menuBuilder));
|
|
}
|
|
int a = MenuPopup.a(menuAdapter, null, this.b, this.c);
|
|
MenuPopupWindow g = g();
|
|
g.a((ListAdapter) menuAdapter);
|
|
g.b(a);
|
|
g.c(this.n);
|
|
if (this.i.size() > 0) {
|
|
List<CascadingMenuInfo> list = this.i;
|
|
cascadingMenuInfo = list.get(list.size() - 1);
|
|
view = a(cascadingMenuInfo, menuBuilder);
|
|
} else {
|
|
cascadingMenuInfo = null;
|
|
view = null;
|
|
}
|
|
if (view != null) {
|
|
g.c(false);
|
|
g.a((Object) null);
|
|
int d = d(a);
|
|
boolean z = d == 1;
|
|
this.q = d;
|
|
if (Build.VERSION.SDK_INT >= 26) {
|
|
g.a(view);
|
|
i2 = 0;
|
|
i = 0;
|
|
} else {
|
|
int[] iArr = new int[2];
|
|
this.o.getLocationOnScreen(iArr);
|
|
int[] iArr2 = new int[2];
|
|
view.getLocationOnScreen(iArr2);
|
|
if ((this.n & 7) == 5) {
|
|
iArr[0] = iArr[0] + this.o.getWidth();
|
|
iArr2[0] = iArr2[0] + view.getWidth();
|
|
}
|
|
i = iArr2[0] - iArr[0];
|
|
i2 = iArr2[1] - iArr[1];
|
|
}
|
|
if ((this.n & 5) == 5) {
|
|
if (!z) {
|
|
a = view.getWidth();
|
|
i3 = i - a;
|
|
}
|
|
i3 = i + a;
|
|
} else {
|
|
if (z) {
|
|
a = view.getWidth();
|
|
i3 = i + a;
|
|
}
|
|
i3 = i - a;
|
|
}
|
|
g.d(i3);
|
|
g.b(true);
|
|
g.h(i2);
|
|
} else {
|
|
if (this.r) {
|
|
g.d(this.t);
|
|
}
|
|
if (this.s) {
|
|
g.h(this.u);
|
|
}
|
|
g.a(f());
|
|
}
|
|
this.i.add(new CascadingMenuInfo(g, menuBuilder, this.q));
|
|
g.a();
|
|
ListView d2 = g.d();
|
|
d2.setOnKeyListener(this);
|
|
if (cascadingMenuInfo == null && this.x && menuBuilder.h() != null) {
|
|
FrameLayout frameLayout = (FrameLayout) from.inflate(R$layout.abc_popup_menu_header_item_layout, (ViewGroup) d2, false);
|
|
TextView textView = (TextView) frameLayout.findViewById(R.id.title);
|
|
frameLayout.setEnabled(false);
|
|
textView.setText(menuBuilder.h());
|
|
d2.addHeaderView(frameLayout, null, false);
|
|
g.a();
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void a(MenuBuilder menuBuilder) {
|
|
menuBuilder.a(this, this.b);
|
|
if (c()) {
|
|
d(menuBuilder);
|
|
} else {
|
|
this.h.add(menuBuilder);
|
|
}
|
|
}
|
|
|
|
private MenuItem a(MenuBuilder menuBuilder, 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;
|
|
}
|
|
|
|
private View a(CascadingMenuInfo cascadingMenuInfo, MenuBuilder menuBuilder) {
|
|
MenuAdapter menuAdapter;
|
|
int i;
|
|
int firstVisiblePosition;
|
|
MenuItem a = a(cascadingMenuInfo.b, menuBuilder);
|
|
if (a == null) {
|
|
return null;
|
|
}
|
|
ListView a2 = cascadingMenuInfo.a();
|
|
ListAdapter adapter = a2.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;
|
|
}
|
|
if (a == menuAdapter.getItem(i2)) {
|
|
break;
|
|
}
|
|
i2++;
|
|
}
|
|
if (i2 != -1 && (firstVisiblePosition = (i2 + i) - a2.getFirstVisiblePosition()) >= 0 && firstVisiblePosition < a2.getChildCount()) {
|
|
return a2.getChildAt(firstVisiblePosition);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
|
public void a(boolean z) {
|
|
Iterator<CascadingMenuInfo> it = this.i.iterator();
|
|
while (it.hasNext()) {
|
|
MenuPopup.a(it.next().a().getAdapter()).notifyDataSetChanged();
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
|
public void a(MenuPresenter.Callback callback) {
|
|
this.y = callback;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
|
public boolean a(SubMenuBuilder subMenuBuilder) {
|
|
for (CascadingMenuInfo cascadingMenuInfo : this.i) {
|
|
if (subMenuBuilder == cascadingMenuInfo.b) {
|
|
cascadingMenuInfo.a().requestFocus();
|
|
return true;
|
|
}
|
|
}
|
|
if (!subMenuBuilder.hasVisibleItems()) {
|
|
return false;
|
|
}
|
|
a((MenuBuilder) subMenuBuilder);
|
|
MenuPresenter.Callback callback = this.y;
|
|
if (callback != null) {
|
|
callback.a(subMenuBuilder);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPresenter
|
|
public void a(MenuBuilder menuBuilder, boolean z) {
|
|
int c = c(menuBuilder);
|
|
if (c < 0) {
|
|
return;
|
|
}
|
|
int i = c + 1;
|
|
if (i < this.i.size()) {
|
|
this.i.get(i).b.a(false);
|
|
}
|
|
CascadingMenuInfo remove = this.i.remove(c);
|
|
remove.b.b(this);
|
|
if (this.B) {
|
|
remove.a.b((Object) null);
|
|
remove.a.a(0);
|
|
}
|
|
remove.a.dismiss();
|
|
int size = this.i.size();
|
|
if (size > 0) {
|
|
this.q = this.i.get(size - 1).c;
|
|
} else {
|
|
this.q = h();
|
|
}
|
|
if (size != 0) {
|
|
if (z) {
|
|
this.i.get(0).b.a(false);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
dismiss();
|
|
MenuPresenter.Callback callback = this.y;
|
|
if (callback != null) {
|
|
callback.a(menuBuilder, true);
|
|
}
|
|
ViewTreeObserver viewTreeObserver = this.z;
|
|
if (viewTreeObserver != null) {
|
|
if (viewTreeObserver.isAlive()) {
|
|
this.z.removeGlobalOnLayoutListener(this.j);
|
|
}
|
|
this.z = null;
|
|
}
|
|
this.p.removeOnAttachStateChangeListener(this.k);
|
|
this.A.onDismiss();
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.ShowableListMenu
|
|
public ListView d() {
|
|
if (this.i.isEmpty()) {
|
|
return null;
|
|
}
|
|
return this.i.get(r0.size() - 1).a();
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void a(int i) {
|
|
if (this.m != i) {
|
|
this.m = i;
|
|
this.n = GravityCompat.a(i, ViewCompat.k(this.o));
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void a(View view) {
|
|
if (this.o != view) {
|
|
this.o = view;
|
|
this.n = GravityCompat.a(this.m, ViewCompat.k(this.o));
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.view.menu.MenuPopup
|
|
public void a(PopupWindow.OnDismissListener onDismissListener) {
|
|
this.A = onDismissListener;
|
|
}
|
|
}
|