mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-27 01:22:33 -06:00
490 lines
19 KiB
Java
490 lines
19 KiB
Java
package androidx.recyclerview.widget;
|
|
|
|
import android.R;
|
|
import android.animation.Animator;
|
|
import android.animation.AnimatorListenerAdapter;
|
|
import android.animation.ValueAnimator;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.graphics.drawable.StateListDrawable;
|
|
import android.view.MotionEvent;
|
|
import androidx.core.view.ViewCompat;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import io.sentry.HttpStatusCodeRange;
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes2.dex */
|
|
public class FastScroller extends RecyclerView.ItemDecoration implements RecyclerView.OnItemTouchListener {
|
|
private static final int ANIMATION_STATE_FADING_IN = 1;
|
|
private static final int ANIMATION_STATE_FADING_OUT = 3;
|
|
private static final int ANIMATION_STATE_IN = 2;
|
|
private static final int ANIMATION_STATE_OUT = 0;
|
|
private static final int DRAG_NONE = 0;
|
|
private static final int DRAG_X = 1;
|
|
private static final int DRAG_Y = 2;
|
|
private static final int HIDE_DELAY_AFTER_DRAGGING_MS = 1200;
|
|
private static final int HIDE_DELAY_AFTER_VISIBLE_MS = 1500;
|
|
private static final int HIDE_DURATION_MS = 500;
|
|
private static final int SCROLLBAR_FULL_OPAQUE = 255;
|
|
private static final int SHOW_DURATION_MS = 500;
|
|
private static final int STATE_DRAGGING = 2;
|
|
private static final int STATE_HIDDEN = 0;
|
|
private static final int STATE_VISIBLE = 1;
|
|
int mAnimationState;
|
|
private final Runnable mHideRunnable;
|
|
float mHorizontalDragX;
|
|
int mHorizontalThumbCenterX;
|
|
private final StateListDrawable mHorizontalThumbDrawable;
|
|
private final int mHorizontalThumbHeight;
|
|
int mHorizontalThumbWidth;
|
|
private final Drawable mHorizontalTrackDrawable;
|
|
private final int mHorizontalTrackHeight;
|
|
private final int mMargin;
|
|
private final RecyclerView.OnScrollListener mOnScrollListener;
|
|
private RecyclerView mRecyclerView;
|
|
private final int mScrollbarMinimumRange;
|
|
final ValueAnimator mShowHideAnimator;
|
|
float mVerticalDragY;
|
|
int mVerticalThumbCenterY;
|
|
final StateListDrawable mVerticalThumbDrawable;
|
|
int mVerticalThumbHeight;
|
|
private final int mVerticalThumbWidth;
|
|
final Drawable mVerticalTrackDrawable;
|
|
private final int mVerticalTrackWidth;
|
|
private static final int[] PRESSED_STATE_SET = {R.attr.state_pressed};
|
|
private static final int[] EMPTY_STATE_SET = new int[0];
|
|
private int mRecyclerViewWidth = 0;
|
|
private int mRecyclerViewHeight = 0;
|
|
private boolean mNeedVerticalScrollbar = false;
|
|
private boolean mNeedHorizontalScrollbar = false;
|
|
private int mState = 0;
|
|
private int mDragState = 0;
|
|
private final int[] mVerticalRange = new int[2];
|
|
private final int[] mHorizontalRange = new int[2];
|
|
|
|
Drawable getHorizontalThumbDrawable() {
|
|
return this.mHorizontalThumbDrawable;
|
|
}
|
|
|
|
Drawable getHorizontalTrackDrawable() {
|
|
return this.mHorizontalTrackDrawable;
|
|
}
|
|
|
|
Drawable getVerticalThumbDrawable() {
|
|
return this.mVerticalThumbDrawable;
|
|
}
|
|
|
|
Drawable getVerticalTrackDrawable() {
|
|
return this.mVerticalTrackDrawable;
|
|
}
|
|
|
|
public boolean isDragging() {
|
|
return this.mState == 2;
|
|
}
|
|
|
|
boolean isVisible() {
|
|
return this.mState == 1;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.OnItemTouchListener
|
|
public void onRequestDisallowInterceptTouchEvent(boolean z) {
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public FastScroller(RecyclerView recyclerView, StateListDrawable stateListDrawable, Drawable drawable, StateListDrawable stateListDrawable2, Drawable drawable2, int i, int i2, int i3) {
|
|
ValueAnimator ofFloat = ValueAnimator.ofFloat(0.0f, 1.0f);
|
|
this.mShowHideAnimator = ofFloat;
|
|
this.mAnimationState = 0;
|
|
this.mHideRunnable = new Runnable() { // from class: androidx.recyclerview.widget.FastScroller.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
FastScroller.this.hide(HttpStatusCodeRange.DEFAULT_MIN);
|
|
}
|
|
};
|
|
this.mOnScrollListener = new RecyclerView.OnScrollListener() { // from class: androidx.recyclerview.widget.FastScroller.2
|
|
@Override // androidx.recyclerview.widget.RecyclerView.OnScrollListener
|
|
public void onScrolled(RecyclerView recyclerView2, int i4, int i5) {
|
|
FastScroller.this.updateScrollPosition(recyclerView2.computeHorizontalScrollOffset(), recyclerView2.computeVerticalScrollOffset());
|
|
}
|
|
};
|
|
this.mVerticalThumbDrawable = stateListDrawable;
|
|
this.mVerticalTrackDrawable = drawable;
|
|
this.mHorizontalThumbDrawable = stateListDrawable2;
|
|
this.mHorizontalTrackDrawable = drawable2;
|
|
this.mVerticalThumbWidth = Math.max(i, stateListDrawable.getIntrinsicWidth());
|
|
this.mVerticalTrackWidth = Math.max(i, drawable.getIntrinsicWidth());
|
|
this.mHorizontalThumbHeight = Math.max(i, stateListDrawable2.getIntrinsicWidth());
|
|
this.mHorizontalTrackHeight = Math.max(i, drawable2.getIntrinsicWidth());
|
|
this.mScrollbarMinimumRange = i2;
|
|
this.mMargin = i3;
|
|
stateListDrawable.setAlpha(255);
|
|
drawable.setAlpha(255);
|
|
ofFloat.addListener(new AnimatorListener());
|
|
ofFloat.addUpdateListener(new AnimatorUpdater());
|
|
attachToRecyclerView(recyclerView);
|
|
}
|
|
|
|
public void attachToRecyclerView(RecyclerView recyclerView) {
|
|
RecyclerView recyclerView2 = this.mRecyclerView;
|
|
if (recyclerView2 == recyclerView) {
|
|
return;
|
|
}
|
|
if (recyclerView2 != null) {
|
|
destroyCallbacks();
|
|
}
|
|
this.mRecyclerView = recyclerView;
|
|
if (recyclerView != null) {
|
|
setupCallbacks();
|
|
}
|
|
}
|
|
|
|
private void setupCallbacks() {
|
|
this.mRecyclerView.addItemDecoration(this);
|
|
this.mRecyclerView.addOnItemTouchListener(this);
|
|
this.mRecyclerView.addOnScrollListener(this.mOnScrollListener);
|
|
}
|
|
|
|
private void destroyCallbacks() {
|
|
this.mRecyclerView.removeItemDecoration(this);
|
|
this.mRecyclerView.removeOnItemTouchListener(this);
|
|
this.mRecyclerView.removeOnScrollListener(this.mOnScrollListener);
|
|
cancelHide();
|
|
}
|
|
|
|
void requestRedraw() {
|
|
this.mRecyclerView.invalidate();
|
|
}
|
|
|
|
void setState(int i) {
|
|
if (i == 2 && this.mState != 2) {
|
|
this.mVerticalThumbDrawable.setState(PRESSED_STATE_SET);
|
|
cancelHide();
|
|
}
|
|
if (i == 0) {
|
|
requestRedraw();
|
|
} else {
|
|
show();
|
|
}
|
|
if (this.mState == 2 && i != 2) {
|
|
this.mVerticalThumbDrawable.setState(EMPTY_STATE_SET);
|
|
resetHideDelay(HIDE_DELAY_AFTER_DRAGGING_MS);
|
|
} else if (i == 1) {
|
|
resetHideDelay(HIDE_DELAY_AFTER_VISIBLE_MS);
|
|
}
|
|
this.mState = i;
|
|
}
|
|
|
|
private boolean isLayoutRTL() {
|
|
return ViewCompat.getLayoutDirection(this.mRecyclerView) == 1;
|
|
}
|
|
|
|
public void show() {
|
|
int i = this.mAnimationState;
|
|
if (i != 0) {
|
|
if (i != 3) {
|
|
return;
|
|
} else {
|
|
this.mShowHideAnimator.cancel();
|
|
}
|
|
}
|
|
this.mAnimationState = 1;
|
|
ValueAnimator valueAnimator = this.mShowHideAnimator;
|
|
valueAnimator.setFloatValues(((Float) valueAnimator.getAnimatedValue()).floatValue(), 1.0f);
|
|
this.mShowHideAnimator.setDuration(500L);
|
|
this.mShowHideAnimator.setStartDelay(0L);
|
|
this.mShowHideAnimator.start();
|
|
}
|
|
|
|
void hide(int i) {
|
|
int i2 = this.mAnimationState;
|
|
if (i2 == 1) {
|
|
this.mShowHideAnimator.cancel();
|
|
} else if (i2 != 2) {
|
|
return;
|
|
}
|
|
this.mAnimationState = 3;
|
|
ValueAnimator valueAnimator = this.mShowHideAnimator;
|
|
valueAnimator.setFloatValues(((Float) valueAnimator.getAnimatedValue()).floatValue(), 0.0f);
|
|
this.mShowHideAnimator.setDuration(i);
|
|
this.mShowHideAnimator.start();
|
|
}
|
|
|
|
private void cancelHide() {
|
|
this.mRecyclerView.removeCallbacks(this.mHideRunnable);
|
|
}
|
|
|
|
private void resetHideDelay(int i) {
|
|
cancelHide();
|
|
this.mRecyclerView.postDelayed(this.mHideRunnable, i);
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.ItemDecoration
|
|
public void onDrawOver(Canvas canvas, RecyclerView recyclerView, RecyclerView.State state) {
|
|
if (this.mRecyclerViewWidth != this.mRecyclerView.getWidth() || this.mRecyclerViewHeight != this.mRecyclerView.getHeight()) {
|
|
this.mRecyclerViewWidth = this.mRecyclerView.getWidth();
|
|
this.mRecyclerViewHeight = this.mRecyclerView.getHeight();
|
|
setState(0);
|
|
} else if (this.mAnimationState != 0) {
|
|
if (this.mNeedVerticalScrollbar) {
|
|
drawVerticalScrollbar(canvas);
|
|
}
|
|
if (this.mNeedHorizontalScrollbar) {
|
|
drawHorizontalScrollbar(canvas);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawVerticalScrollbar(Canvas canvas) {
|
|
int i = this.mRecyclerViewWidth;
|
|
int i2 = this.mVerticalThumbWidth;
|
|
int i3 = i - i2;
|
|
int i4 = this.mVerticalThumbCenterY;
|
|
int i5 = this.mVerticalThumbHeight;
|
|
int i6 = i4 - (i5 / 2);
|
|
this.mVerticalThumbDrawable.setBounds(0, 0, i2, i5);
|
|
this.mVerticalTrackDrawable.setBounds(0, 0, this.mVerticalTrackWidth, this.mRecyclerViewHeight);
|
|
if (isLayoutRTL()) {
|
|
this.mVerticalTrackDrawable.draw(canvas);
|
|
canvas.translate(this.mVerticalThumbWidth, i6);
|
|
canvas.scale(-1.0f, 1.0f);
|
|
this.mVerticalThumbDrawable.draw(canvas);
|
|
canvas.scale(-1.0f, 1.0f);
|
|
canvas.translate(-this.mVerticalThumbWidth, -i6);
|
|
return;
|
|
}
|
|
canvas.translate(i3, 0.0f);
|
|
this.mVerticalTrackDrawable.draw(canvas);
|
|
canvas.translate(0.0f, i6);
|
|
this.mVerticalThumbDrawable.draw(canvas);
|
|
canvas.translate(-i3, -i6);
|
|
}
|
|
|
|
private void drawHorizontalScrollbar(Canvas canvas) {
|
|
int i = this.mRecyclerViewHeight;
|
|
int i2 = this.mHorizontalThumbHeight;
|
|
int i3 = this.mHorizontalThumbCenterX;
|
|
int i4 = this.mHorizontalThumbWidth;
|
|
this.mHorizontalThumbDrawable.setBounds(0, 0, i4, i2);
|
|
this.mHorizontalTrackDrawable.setBounds(0, 0, this.mRecyclerViewWidth, this.mHorizontalTrackHeight);
|
|
canvas.translate(0.0f, i - i2);
|
|
this.mHorizontalTrackDrawable.draw(canvas);
|
|
canvas.translate(i3 - (i4 / 2), 0.0f);
|
|
this.mHorizontalThumbDrawable.draw(canvas);
|
|
canvas.translate(-r2, -r0);
|
|
}
|
|
|
|
void updateScrollPosition(int i, int i2) {
|
|
int computeVerticalScrollRange = this.mRecyclerView.computeVerticalScrollRange();
|
|
int i3 = this.mRecyclerViewHeight;
|
|
this.mNeedVerticalScrollbar = computeVerticalScrollRange - i3 > 0 && i3 >= this.mScrollbarMinimumRange;
|
|
int computeHorizontalScrollRange = this.mRecyclerView.computeHorizontalScrollRange();
|
|
int i4 = this.mRecyclerViewWidth;
|
|
boolean z = computeHorizontalScrollRange - i4 > 0 && i4 >= this.mScrollbarMinimumRange;
|
|
this.mNeedHorizontalScrollbar = z;
|
|
boolean z2 = this.mNeedVerticalScrollbar;
|
|
if (!z2 && !z) {
|
|
if (this.mState != 0) {
|
|
setState(0);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
if (z2) {
|
|
float f = i3;
|
|
this.mVerticalThumbCenterY = (int) ((f * (i2 + (f / 2.0f))) / computeVerticalScrollRange);
|
|
this.mVerticalThumbHeight = Math.min(i3, (i3 * i3) / computeVerticalScrollRange);
|
|
}
|
|
if (this.mNeedHorizontalScrollbar) {
|
|
float f2 = i4;
|
|
this.mHorizontalThumbCenterX = (int) ((f2 * (i + (f2 / 2.0f))) / computeHorizontalScrollRange);
|
|
this.mHorizontalThumbWidth = Math.min(i4, (i4 * i4) / computeHorizontalScrollRange);
|
|
}
|
|
int i5 = this.mState;
|
|
if (i5 == 0 || i5 == 1) {
|
|
setState(1);
|
|
}
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.OnItemTouchListener
|
|
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
|
|
int i = this.mState;
|
|
if (i == 1) {
|
|
boolean isPointInsideVerticalThumb = isPointInsideVerticalThumb(motionEvent.getX(), motionEvent.getY());
|
|
boolean isPointInsideHorizontalThumb = isPointInsideHorizontalThumb(motionEvent.getX(), motionEvent.getY());
|
|
if (motionEvent.getAction() != 0) {
|
|
return false;
|
|
}
|
|
if (!isPointInsideVerticalThumb && !isPointInsideHorizontalThumb) {
|
|
return false;
|
|
}
|
|
if (isPointInsideHorizontalThumb) {
|
|
this.mDragState = 1;
|
|
this.mHorizontalDragX = (int) motionEvent.getX();
|
|
} else if (isPointInsideVerticalThumb) {
|
|
this.mDragState = 2;
|
|
this.mVerticalDragY = (int) motionEvent.getY();
|
|
}
|
|
setState(2);
|
|
} else if (i != 2) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override // androidx.recyclerview.widget.RecyclerView.OnItemTouchListener
|
|
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
|
|
if (this.mState == 0) {
|
|
return;
|
|
}
|
|
if (motionEvent.getAction() == 0) {
|
|
boolean isPointInsideVerticalThumb = isPointInsideVerticalThumb(motionEvent.getX(), motionEvent.getY());
|
|
boolean isPointInsideHorizontalThumb = isPointInsideHorizontalThumb(motionEvent.getX(), motionEvent.getY());
|
|
if (isPointInsideVerticalThumb || isPointInsideHorizontalThumb) {
|
|
if (isPointInsideHorizontalThumb) {
|
|
this.mDragState = 1;
|
|
this.mHorizontalDragX = (int) motionEvent.getX();
|
|
} else if (isPointInsideVerticalThumb) {
|
|
this.mDragState = 2;
|
|
this.mVerticalDragY = (int) motionEvent.getY();
|
|
}
|
|
setState(2);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
if (motionEvent.getAction() == 1 && this.mState == 2) {
|
|
this.mVerticalDragY = 0.0f;
|
|
this.mHorizontalDragX = 0.0f;
|
|
setState(1);
|
|
this.mDragState = 0;
|
|
return;
|
|
}
|
|
if (motionEvent.getAction() == 2 && this.mState == 2) {
|
|
show();
|
|
if (this.mDragState == 1) {
|
|
horizontalScrollTo(motionEvent.getX());
|
|
}
|
|
if (this.mDragState == 2) {
|
|
verticalScrollTo(motionEvent.getY());
|
|
}
|
|
}
|
|
}
|
|
|
|
private void verticalScrollTo(float f) {
|
|
int[] verticalRange = getVerticalRange();
|
|
float max = Math.max(verticalRange[0], Math.min(verticalRange[1], f));
|
|
if (Math.abs(this.mVerticalThumbCenterY - max) < 2.0f) {
|
|
return;
|
|
}
|
|
int scrollTo = scrollTo(this.mVerticalDragY, max, verticalRange, this.mRecyclerView.computeVerticalScrollRange(), this.mRecyclerView.computeVerticalScrollOffset(), this.mRecyclerViewHeight);
|
|
if (scrollTo != 0) {
|
|
this.mRecyclerView.scrollBy(0, scrollTo);
|
|
}
|
|
this.mVerticalDragY = max;
|
|
}
|
|
|
|
private void horizontalScrollTo(float f) {
|
|
int[] horizontalRange = getHorizontalRange();
|
|
float max = Math.max(horizontalRange[0], Math.min(horizontalRange[1], f));
|
|
if (Math.abs(this.mHorizontalThumbCenterX - max) < 2.0f) {
|
|
return;
|
|
}
|
|
int scrollTo = scrollTo(this.mHorizontalDragX, max, horizontalRange, this.mRecyclerView.computeHorizontalScrollRange(), this.mRecyclerView.computeHorizontalScrollOffset(), this.mRecyclerViewWidth);
|
|
if (scrollTo != 0) {
|
|
this.mRecyclerView.scrollBy(scrollTo, 0);
|
|
}
|
|
this.mHorizontalDragX = max;
|
|
}
|
|
|
|
private int scrollTo(float f, float f2, int[] iArr, int i, int i2, int i3) {
|
|
int i4 = iArr[1] - iArr[0];
|
|
if (i4 == 0) {
|
|
return 0;
|
|
}
|
|
int i5 = i - i3;
|
|
int i6 = (int) (((f2 - f) / i4) * i5);
|
|
int i7 = i2 + i6;
|
|
if (i7 >= i5 || i7 < 0) {
|
|
return 0;
|
|
}
|
|
return i6;
|
|
}
|
|
|
|
boolean isPointInsideVerticalThumb(float f, float f2) {
|
|
if (!isLayoutRTL() ? f >= this.mRecyclerViewWidth - this.mVerticalThumbWidth : f <= this.mVerticalThumbWidth) {
|
|
int i = this.mVerticalThumbCenterY;
|
|
int i2 = this.mVerticalThumbHeight;
|
|
if (f2 >= i - (i2 / 2) && f2 <= i + (i2 / 2)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
boolean isPointInsideHorizontalThumb(float f, float f2) {
|
|
if (f2 >= this.mRecyclerViewHeight - this.mHorizontalThumbHeight) {
|
|
int i = this.mHorizontalThumbCenterX;
|
|
int i2 = this.mHorizontalThumbWidth;
|
|
if (f >= i - (i2 / 2) && f <= i + (i2 / 2)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private int[] getVerticalRange() {
|
|
int[] iArr = this.mVerticalRange;
|
|
int i = this.mMargin;
|
|
iArr[0] = i;
|
|
iArr[1] = this.mRecyclerViewHeight - i;
|
|
return iArr;
|
|
}
|
|
|
|
private int[] getHorizontalRange() {
|
|
int[] iArr = this.mHorizontalRange;
|
|
int i = this.mMargin;
|
|
iArr[0] = i;
|
|
iArr[1] = this.mRecyclerViewWidth - i;
|
|
return iArr;
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
private class AnimatorListener extends AnimatorListenerAdapter {
|
|
private boolean mCanceled = false;
|
|
|
|
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
|
public void onAnimationCancel(Animator animator) {
|
|
this.mCanceled = true;
|
|
}
|
|
|
|
AnimatorListener() {
|
|
}
|
|
|
|
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
|
public void onAnimationEnd(Animator animator) {
|
|
if (this.mCanceled) {
|
|
this.mCanceled = false;
|
|
} else if (((Float) FastScroller.this.mShowHideAnimator.getAnimatedValue()).floatValue() == 0.0f) {
|
|
FastScroller.this.mAnimationState = 0;
|
|
FastScroller.this.setState(0);
|
|
} else {
|
|
FastScroller.this.mAnimationState = 2;
|
|
FastScroller.this.requestRedraw();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
private class AnimatorUpdater implements ValueAnimator.AnimatorUpdateListener {
|
|
AnimatorUpdater() {
|
|
}
|
|
|
|
@Override // android.animation.ValueAnimator.AnimatorUpdateListener
|
|
public void onAnimationUpdate(ValueAnimator valueAnimator) {
|
|
int floatValue = (int) (((Float) valueAnimator.getAnimatedValue()).floatValue() * 255.0f);
|
|
FastScroller.this.mVerticalThumbDrawable.setAlpha(floatValue);
|
|
FastScroller.this.mVerticalTrackDrawable.setAlpha(floatValue);
|
|
FastScroller.this.requestRedraw();
|
|
}
|
|
}
|
|
}
|