482 lines
17 KiB
Java
482 lines
17 KiB
Java
package androidx.appcompat.widget;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Rect;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.Build;
|
|
import android.view.MotionEvent;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.AbsListView;
|
|
import android.widget.ListAdapter;
|
|
import android.widget.ListView;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.appcompat.R;
|
|
import androidx.appcompat.graphics.drawable.DrawableWrapper;
|
|
import androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure;
|
|
import androidx.core.graphics.drawable.DrawableCompat;
|
|
import androidx.core.view.ViewPropertyAnimatorCompat;
|
|
import androidx.core.widget.ListViewAutoScrollHelper;
|
|
import java.lang.reflect.Field;
|
|
public class DropDownListView extends ListView {
|
|
public static final int INVALID_POSITION = -1;
|
|
public static final int NO_POSITION = -1;
|
|
private ViewPropertyAnimatorCompat mClickAnimation;
|
|
private boolean mDrawsInPressedState;
|
|
private boolean mHijackFocus;
|
|
private Field mIsChildViewEnabled;
|
|
private boolean mListSelectionHidden;
|
|
private int mMotionPosition;
|
|
public ResolveHoverRunnable mResolveHoverRunnable;
|
|
private ListViewAutoScrollHelper mScrollHelper;
|
|
private int mSelectionBottomPadding = 0;
|
|
private int mSelectionLeftPadding = 0;
|
|
private int mSelectionRightPadding = 0;
|
|
private int mSelectionTopPadding = 0;
|
|
private GateKeeperDrawable mSelector;
|
|
private final Rect mSelectorRect = new Rect();
|
|
|
|
public static class GateKeeperDrawable extends DrawableWrapper {
|
|
private boolean mEnabled = true;
|
|
|
|
public GateKeeperDrawable(Drawable drawable) {
|
|
super(drawable);
|
|
}
|
|
|
|
@Override // androidx.appcompat.graphics.drawable.DrawableWrapper, android.graphics.drawable.Drawable
|
|
public void draw(Canvas canvas) {
|
|
if (this.mEnabled) {
|
|
super.draw(canvas);
|
|
}
|
|
}
|
|
|
|
public void setEnabled(boolean z2) {
|
|
this.mEnabled = z2;
|
|
}
|
|
|
|
@Override // androidx.appcompat.graphics.drawable.DrawableWrapper, android.graphics.drawable.Drawable
|
|
public void setHotspot(float f, float f2) {
|
|
if (this.mEnabled) {
|
|
super.setHotspot(f, f2);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.graphics.drawable.DrawableWrapper, android.graphics.drawable.Drawable
|
|
public void setHotspotBounds(int i, int i2, int i3, int i4) {
|
|
if (this.mEnabled) {
|
|
super.setHotspotBounds(i, i2, i3, i4);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.appcompat.graphics.drawable.DrawableWrapper, android.graphics.drawable.Drawable
|
|
public boolean setState(int[] iArr) {
|
|
if (this.mEnabled) {
|
|
return super.setState(iArr);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override // androidx.appcompat.graphics.drawable.DrawableWrapper, android.graphics.drawable.Drawable
|
|
public boolean setVisible(boolean z2, boolean z3) {
|
|
if (this.mEnabled) {
|
|
return super.setVisible(z2, z3);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public class ResolveHoverRunnable implements Runnable {
|
|
public ResolveHoverRunnable() {
|
|
}
|
|
|
|
public void cancel() {
|
|
DropDownListView dropDownListView = DropDownListView.this;
|
|
dropDownListView.mResolveHoverRunnable = null;
|
|
dropDownListView.removeCallbacks(this);
|
|
}
|
|
|
|
public void post() {
|
|
DropDownListView.this.post(this);
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
DropDownListView dropDownListView = DropDownListView.this;
|
|
dropDownListView.mResolveHoverRunnable = null;
|
|
dropDownListView.drawableStateChanged();
|
|
}
|
|
}
|
|
|
|
public DropDownListView(@NonNull Context context, boolean z2) {
|
|
super(context, null, R.attr.dropDownListViewStyle);
|
|
this.mHijackFocus = z2;
|
|
setCacheColorHint(0);
|
|
try {
|
|
Field declaredField = AbsListView.class.getDeclaredField("mIsChildViewEnabled");
|
|
this.mIsChildViewEnabled = declaredField;
|
|
declaredField.setAccessible(true);
|
|
} catch (NoSuchFieldException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private void clearPressedItem() {
|
|
this.mDrawsInPressedState = false;
|
|
setPressed(false);
|
|
drawableStateChanged();
|
|
View childAt = getChildAt(this.mMotionPosition - getFirstVisiblePosition());
|
|
if (childAt != null) {
|
|
childAt.setPressed(false);
|
|
}
|
|
ViewPropertyAnimatorCompat viewPropertyAnimatorCompat = this.mClickAnimation;
|
|
if (viewPropertyAnimatorCompat != null) {
|
|
viewPropertyAnimatorCompat.cancel();
|
|
this.mClickAnimation = null;
|
|
}
|
|
}
|
|
|
|
private void clickPressedItem(View view, int i) {
|
|
performItemClick(view, i, getItemIdAtPosition(i));
|
|
}
|
|
|
|
private void drawSelectorCompat(Canvas canvas) {
|
|
Drawable selector;
|
|
if (!this.mSelectorRect.isEmpty() && (selector = getSelector()) != null) {
|
|
selector.setBounds(this.mSelectorRect);
|
|
selector.draw(canvas);
|
|
}
|
|
}
|
|
|
|
private void positionSelectorCompat(int i, View view) {
|
|
Rect rect = this.mSelectorRect;
|
|
rect.set(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
|
|
rect.left -= this.mSelectionLeftPadding;
|
|
rect.top -= this.mSelectionTopPadding;
|
|
rect.right += this.mSelectionRightPadding;
|
|
rect.bottom += this.mSelectionBottomPadding;
|
|
try {
|
|
boolean z2 = this.mIsChildViewEnabled.getBoolean(this);
|
|
if (view.isEnabled() != z2) {
|
|
this.mIsChildViewEnabled.set(this, Boolean.valueOf(!z2));
|
|
if (i != -1) {
|
|
refreshDrawableState();
|
|
}
|
|
}
|
|
} catch (IllegalAccessException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
private void positionSelectorLikeFocusCompat(int i, View view) {
|
|
Drawable selector = getSelector();
|
|
boolean z2 = true;
|
|
boolean z3 = (selector == null || i == -1) ? false : true;
|
|
if (z3) {
|
|
selector.setVisible(false, false);
|
|
}
|
|
positionSelectorCompat(i, view);
|
|
if (z3) {
|
|
Rect rect = this.mSelectorRect;
|
|
float exactCenterX = rect.exactCenterX();
|
|
float exactCenterY = rect.exactCenterY();
|
|
if (getVisibility() != 0) {
|
|
z2 = false;
|
|
}
|
|
selector.setVisible(z2, false);
|
|
DrawableCompat.setHotspot(selector, exactCenterX, exactCenterY);
|
|
}
|
|
}
|
|
|
|
private void positionSelectorLikeTouchCompat(int i, View view, float f, float f2) {
|
|
positionSelectorLikeFocusCompat(i, view);
|
|
Drawable selector = getSelector();
|
|
if (selector != null && i != -1) {
|
|
DrawableCompat.setHotspot(selector, f, f2);
|
|
}
|
|
}
|
|
|
|
private void setPressedItem(View view, int i, float f, float f2) {
|
|
View childAt;
|
|
this.mDrawsInPressedState = true;
|
|
drawableHotspotChanged(f, f2);
|
|
if (!isPressed()) {
|
|
setPressed(true);
|
|
}
|
|
layoutChildren();
|
|
int i2 = this.mMotionPosition;
|
|
if (!(i2 == -1 || (childAt = getChildAt(i2 - getFirstVisiblePosition())) == null || childAt == view || !childAt.isPressed())) {
|
|
childAt.setPressed(false);
|
|
}
|
|
this.mMotionPosition = i;
|
|
view.drawableHotspotChanged(f - ((float) view.getLeft()), f2 - ((float) view.getTop()));
|
|
if (!view.isPressed()) {
|
|
view.setPressed(true);
|
|
}
|
|
positionSelectorLikeTouchCompat(i, view, f, f2);
|
|
setSelectorEnabled(false);
|
|
refreshDrawableState();
|
|
}
|
|
|
|
private void setSelectorEnabled(boolean z2) {
|
|
GateKeeperDrawable gateKeeperDrawable = this.mSelector;
|
|
if (gateKeeperDrawable != null) {
|
|
gateKeeperDrawable.setEnabled(z2);
|
|
}
|
|
}
|
|
|
|
private boolean touchModeDrawsInPressedStateCompat() {
|
|
return this.mDrawsInPressedState;
|
|
}
|
|
|
|
private void updateSelectorStateCompat() {
|
|
Drawable selector = getSelector();
|
|
if (selector != null && touchModeDrawsInPressedStateCompat() && isPressed()) {
|
|
selector.setState(getDrawableState());
|
|
}
|
|
}
|
|
|
|
@Override // android.widget.ListView, android.widget.AbsListView, android.view.ViewGroup, android.view.View
|
|
public void dispatchDraw(Canvas canvas) {
|
|
drawSelectorCompat(canvas);
|
|
super.dispatchDraw(canvas);
|
|
}
|
|
|
|
@Override // android.widget.AbsListView, android.view.ViewGroup, android.view.View
|
|
public void drawableStateChanged() {
|
|
if (this.mResolveHoverRunnable == null) {
|
|
super.drawableStateChanged();
|
|
setSelectorEnabled(true);
|
|
updateSelectorStateCompat();
|
|
}
|
|
}
|
|
|
|
@Override // android.view.ViewGroup, android.view.View
|
|
public boolean hasFocus() {
|
|
return this.mHijackFocus || super.hasFocus();
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public boolean hasWindowFocus() {
|
|
return this.mHijackFocus || super.hasWindowFocus();
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public boolean isFocused() {
|
|
return this.mHijackFocus || super.isFocused();
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public boolean isInTouchMode() {
|
|
return (this.mHijackFocus && this.mListSelectionHidden) || super.isInTouchMode();
|
|
}
|
|
|
|
public int lookForSelectablePosition(int i, boolean z2) {
|
|
int i2;
|
|
ListAdapter adapter = getAdapter();
|
|
if (adapter != null && !isInTouchMode()) {
|
|
int count = adapter.getCount();
|
|
if (!getAdapter().areAllItemsEnabled()) {
|
|
if (z2) {
|
|
i2 = Math.max(0, i);
|
|
while (i2 < count && !adapter.isEnabled(i2)) {
|
|
i2++;
|
|
}
|
|
} else {
|
|
i2 = Math.min(i, count - 1);
|
|
while (i2 >= 0 && !adapter.isEnabled(i2)) {
|
|
i2--;
|
|
}
|
|
}
|
|
if (i2 < 0 || i2 >= count) {
|
|
return -1;
|
|
}
|
|
return i2;
|
|
} else if (i >= 0 && i < count) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public int measureHeightOfChildrenCompat(int i, int i2, int i3, int i4, int i5) {
|
|
int listPaddingTop = getListPaddingTop();
|
|
int listPaddingBottom = getListPaddingBottom();
|
|
int dividerHeight = getDividerHeight();
|
|
Drawable divider = getDivider();
|
|
ListAdapter adapter = getAdapter();
|
|
if (adapter == null) {
|
|
return listPaddingTop + listPaddingBottom;
|
|
}
|
|
int i6 = listPaddingTop + listPaddingBottom;
|
|
if (dividerHeight <= 0 || divider == null) {
|
|
dividerHeight = 0;
|
|
}
|
|
int count = adapter.getCount();
|
|
View view = null;
|
|
int i7 = 0;
|
|
int i8 = 0;
|
|
int i9 = 0;
|
|
while (i7 < count) {
|
|
int itemViewType = adapter.getItemViewType(i7);
|
|
if (itemViewType != i8) {
|
|
view = null;
|
|
i8 = itemViewType;
|
|
}
|
|
view = adapter.getView(i7, view, this);
|
|
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
|
|
if (layoutParams == null) {
|
|
layoutParams = generateDefaultLayoutParams();
|
|
view.setLayoutParams(layoutParams);
|
|
}
|
|
int i10 = layoutParams.height;
|
|
view.measure(i, i10 > 0 ? View.MeasureSpec.makeMeasureSpec(i10, BasicMeasure.EXACTLY) : View.MeasureSpec.makeMeasureSpec(0, 0));
|
|
view.forceLayout();
|
|
if (i7 > 0) {
|
|
i6 += dividerHeight;
|
|
}
|
|
i6 += view.getMeasuredHeight();
|
|
if (i6 >= i4) {
|
|
return (i5 < 0 || i7 <= i5 || i9 <= 0 || i6 == i4) ? i4 : i9;
|
|
}
|
|
if (i5 >= 0 && i7 >= i5) {
|
|
i9 = i6;
|
|
}
|
|
i7++;
|
|
}
|
|
return i6;
|
|
}
|
|
|
|
@Override // android.widget.ListView, android.widget.AbsListView, android.view.ViewGroup, android.view.View, android.widget.AdapterView
|
|
public void onDetachedFromWindow() {
|
|
this.mResolveHoverRunnable = null;
|
|
super.onDetachedFromWindow();
|
|
}
|
|
|
|
/* JADX WARNING: Code restructure failed: missing block: B:5:0x000c, code lost:
|
|
if (r0 != 3) goto L_0x000e;
|
|
*/
|
|
/* JADX WARNING: Removed duplicated region for block: B:12:0x001e */
|
|
/* JADX WARNING: Removed duplicated region for block: B:22:0x004f */
|
|
/* JADX WARNING: Removed duplicated region for block: B:26:0x0065 */
|
|
public boolean onForwardedEvent(MotionEvent motionEvent, int i) {
|
|
boolean z2;
|
|
boolean z3;
|
|
int findPointerIndex;
|
|
int actionMasked = motionEvent.getActionMasked();
|
|
if (actionMasked == 1) {
|
|
z3 = false;
|
|
findPointerIndex = motionEvent.findPointerIndex(i);
|
|
if (findPointerIndex >= 0) {
|
|
}
|
|
z2 = false;
|
|
z3 = false;
|
|
clearPressedItem();
|
|
if (!z3) {
|
|
}
|
|
return z3;
|
|
} else if (actionMasked == 2) {
|
|
z3 = true;
|
|
findPointerIndex = motionEvent.findPointerIndex(i);
|
|
if (findPointerIndex >= 0) {
|
|
int x2 = (int) motionEvent.getX(findPointerIndex);
|
|
int y2 = (int) motionEvent.getY(findPointerIndex);
|
|
int pointToPosition = pointToPosition(x2, y2);
|
|
if (pointToPosition == -1) {
|
|
z2 = true;
|
|
if (!z3 || z2) {
|
|
clearPressedItem();
|
|
}
|
|
if (!z3) {
|
|
if (this.mScrollHelper == null) {
|
|
this.mScrollHelper = new ListViewAutoScrollHelper(this);
|
|
}
|
|
this.mScrollHelper.setEnabled(true);
|
|
this.mScrollHelper.onTouch(this, motionEvent);
|
|
} else {
|
|
ListViewAutoScrollHelper listViewAutoScrollHelper = this.mScrollHelper;
|
|
if (listViewAutoScrollHelper != null) {
|
|
listViewAutoScrollHelper.setEnabled(false);
|
|
}
|
|
}
|
|
return z3;
|
|
}
|
|
View childAt = getChildAt(pointToPosition - getFirstVisiblePosition());
|
|
setPressedItem(childAt, pointToPosition, (float) x2, (float) y2);
|
|
if (actionMasked == 1) {
|
|
clickPressedItem(childAt, pointToPosition);
|
|
}
|
|
}
|
|
z2 = false;
|
|
z3 = false;
|
|
clearPressedItem();
|
|
if (!z3) {
|
|
}
|
|
return z3;
|
|
}
|
|
z2 = false;
|
|
z3 = true;
|
|
clearPressedItem();
|
|
if (!z3) {
|
|
}
|
|
return z3;
|
|
}
|
|
|
|
@Override // android.view.View
|
|
public boolean onHoverEvent(@NonNull MotionEvent motionEvent) {
|
|
if (Build.VERSION.SDK_INT < 26) {
|
|
return super.onHoverEvent(motionEvent);
|
|
}
|
|
int actionMasked = motionEvent.getActionMasked();
|
|
if (actionMasked == 10 && this.mResolveHoverRunnable == null) {
|
|
ResolveHoverRunnable resolveHoverRunnable = new ResolveHoverRunnable();
|
|
this.mResolveHoverRunnable = resolveHoverRunnable;
|
|
resolveHoverRunnable.post();
|
|
}
|
|
boolean onHoverEvent = super.onHoverEvent(motionEvent);
|
|
if (actionMasked == 9 || actionMasked == 7) {
|
|
int pointToPosition = pointToPosition((int) motionEvent.getX(), (int) motionEvent.getY());
|
|
if (!(pointToPosition == -1 || pointToPosition == getSelectedItemPosition())) {
|
|
View childAt = getChildAt(pointToPosition - getFirstVisiblePosition());
|
|
if (childAt.isEnabled()) {
|
|
setSelectionFromTop(pointToPosition, childAt.getTop() - getTop());
|
|
}
|
|
updateSelectorStateCompat();
|
|
}
|
|
} else {
|
|
setSelection(-1);
|
|
}
|
|
return onHoverEvent;
|
|
}
|
|
|
|
@Override // android.widget.AbsListView, android.view.View
|
|
public boolean onTouchEvent(MotionEvent motionEvent) {
|
|
if (motionEvent.getAction() == 0) {
|
|
this.mMotionPosition = pointToPosition((int) motionEvent.getX(), (int) motionEvent.getY());
|
|
}
|
|
ResolveHoverRunnable resolveHoverRunnable = this.mResolveHoverRunnable;
|
|
if (resolveHoverRunnable != null) {
|
|
resolveHoverRunnable.cancel();
|
|
}
|
|
return super.onTouchEvent(motionEvent);
|
|
}
|
|
|
|
public void setListSelectionHidden(boolean z2) {
|
|
this.mListSelectionHidden = z2;
|
|
}
|
|
|
|
@Override // android.widget.AbsListView
|
|
public void setSelector(Drawable drawable) {
|
|
GateKeeperDrawable gateKeeperDrawable = drawable != null ? new GateKeeperDrawable(drawable) : null;
|
|
this.mSelector = gateKeeperDrawable;
|
|
super.setSelector(gateKeeperDrawable);
|
|
Rect rect = new Rect();
|
|
if (drawable != null) {
|
|
drawable.getPadding(rect);
|
|
}
|
|
this.mSelectionLeftPadding = rect.left;
|
|
this.mSelectionTopPadding = rect.top;
|
|
this.mSelectionRightPadding = rect.right;
|
|
this.mSelectionBottomPadding = rect.bottom;
|
|
}
|
|
}
|