package androidx.recyclerview.widget; 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.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.RecyclerView; @VisibleForTesting 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[] EMPTY_STATE_SET = new int[0]; 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[] PRESSED_STATE_SET = {16842919}; 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; public int mAnimationState; private int mDragState = 0; private final Runnable mHideRunnable; @VisibleForTesting public float mHorizontalDragX; private final int[] mHorizontalRange = new int[2]; @VisibleForTesting public int mHorizontalThumbCenterX; private final StateListDrawable mHorizontalThumbDrawable; private final int mHorizontalThumbHeight; @VisibleForTesting public int mHorizontalThumbWidth; private final Drawable mHorizontalTrackDrawable; private final int mHorizontalTrackHeight; private final int mMargin; private boolean mNeedHorizontalScrollbar = false; private boolean mNeedVerticalScrollbar = false; private final RecyclerView.OnScrollListener mOnScrollListener; private RecyclerView mRecyclerView; private int mRecyclerViewHeight = 0; private int mRecyclerViewWidth = 0; private final int mScrollbarMinimumRange; public final ValueAnimator mShowHideAnimator; private int mState = 0; @VisibleForTesting public float mVerticalDragY; private final int[] mVerticalRange = new int[2]; @VisibleForTesting public int mVerticalThumbCenterY; public final StateListDrawable mVerticalThumbDrawable; @VisibleForTesting public int mVerticalThumbHeight; private final int mVerticalThumbWidth; public final Drawable mVerticalTrackDrawable; private final int mVerticalTrackWidth; /* renamed from: androidx.recyclerview.widget.FastScroller$1 reason: invalid class name */ public class AnonymousClass1 implements Runnable { public AnonymousClass1() { } @Override // java.lang.Runnable public void run() { FastScroller.this.hide(500); } } /* renamed from: androidx.recyclerview.widget.FastScroller$2 reason: invalid class name */ public class AnonymousClass2 extends RecyclerView.OnScrollListener { public AnonymousClass2() { } @Override // androidx.recyclerview.widget.RecyclerView.OnScrollListener public void onScrolled(RecyclerView recyclerView, int i, int i2) { FastScroller.this.updateScrollPosition(recyclerView.computeHorizontalScrollOffset(), recyclerView.computeVerticalScrollOffset()); } } public class AnimatorListener extends AnimatorListenerAdapter { private boolean mCanceled = false; public AnimatorListener() { } @Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener public void onAnimationCancel(Animator animator) { this.mCanceled = true; } @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 fastScroller = FastScroller.this; fastScroller.mAnimationState = 0; fastScroller.setState(0); } else { FastScroller fastScroller2 = FastScroller.this; fastScroller2.mAnimationState = 2; fastScroller2.requestRedraw(); } } } public class AnimatorUpdater implements ValueAnimator.AnimatorUpdateListener { public 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(); } } 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 AnonymousClass1(); this.mOnScrollListener = new AnonymousClass2(); 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); } private void cancelHide() { this.mRecyclerView.removeCallbacks(this.mHideRunnable); } private void destroyCallbacks() { this.mRecyclerView.removeItemDecoration(this); this.mRecyclerView.removeOnItemTouchListener(this); this.mRecyclerView.removeOnScrollListener(this.mOnScrollListener); cancelHide(); } private void drawHorizontalScrollbar(Canvas canvas) { int i = this.mRecyclerViewHeight; int i2 = this.mHorizontalThumbHeight; int i3 = i - i2; int i4 = this.mHorizontalThumbCenterX; int i5 = this.mHorizontalThumbWidth; int i6 = i4 - (i5 / 2); this.mHorizontalThumbDrawable.setBounds(0, 0, i5, i2); this.mHorizontalTrackDrawable.setBounds(0, 0, this.mRecyclerViewWidth, this.mHorizontalTrackHeight); canvas.translate(0.0f, (float) i3); this.mHorizontalTrackDrawable.draw(canvas); canvas.translate((float) i6, 0.0f); this.mHorizontalThumbDrawable.draw(canvas); canvas.translate((float) (-i6), (float) (-i3)); } 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((float) this.mVerticalThumbWidth, (float) i6); canvas.scale(-1.0f, 1.0f); this.mVerticalThumbDrawable.draw(canvas); canvas.scale(1.0f, 1.0f); canvas.translate((float) (-this.mVerticalThumbWidth), (float) (-i6)); return; } canvas.translate((float) i3, 0.0f); this.mVerticalTrackDrawable.draw(canvas); canvas.translate(0.0f, (float) i6); this.mVerticalThumbDrawable.draw(canvas); canvas.translate((float) (-i3), (float) (-i6)); } private int[] getHorizontalRange() { int[] iArr = this.mHorizontalRange; int i = this.mMargin; iArr[0] = i; iArr[1] = this.mRecyclerViewWidth - i; return iArr; } private int[] getVerticalRange() { int[] iArr = this.mVerticalRange; int i = this.mMargin; iArr[0] = i; iArr[1] = this.mRecyclerViewHeight - i; return iArr; } private void horizontalScrollTo(float f) { int[] horizontalRange = getHorizontalRange(); float max = Math.max((float) horizontalRange[0], Math.min((float) horizontalRange[1], f)); if (Math.abs(((float) this.mHorizontalThumbCenterX) - max) >= 2.0f) { 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 boolean isLayoutRTL() { return ViewCompat.getLayoutDirection(this.mRecyclerView) == 1; } private void resetHideDelay(int i) { cancelHide(); this.mRecyclerView.postDelayed(this.mHideRunnable, (long) i); } 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) / ((float) i4)) * ((float) i5)); int i7 = i2 + i6; if (i7 >= i5 || i7 < 0) { return 0; } return i6; } private void setupCallbacks() { this.mRecyclerView.addItemDecoration(this); this.mRecyclerView.addOnItemTouchListener(this); this.mRecyclerView.addOnScrollListener(this.mOnScrollListener); } private void verticalScrollTo(float f) { int[] verticalRange = getVerticalRange(); float max = Math.max((float) verticalRange[0], Math.min((float) verticalRange[1], f)); if (Math.abs(((float) this.mVerticalThumbCenterY) - max) >= 2.0f) { 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; } } public void attachToRecyclerView(@Nullable RecyclerView recyclerView) { RecyclerView recyclerView2 = this.mRecyclerView; if (recyclerView2 != recyclerView) { if (recyclerView2 != null) { destroyCallbacks(); } this.mRecyclerView = recyclerView; if (recyclerView != null) { setupCallbacks(); } } } @VisibleForTesting public Drawable getHorizontalThumbDrawable() { return this.mHorizontalThumbDrawable; } @VisibleForTesting public Drawable getHorizontalTrackDrawable() { return this.mHorizontalTrackDrawable; } @VisibleForTesting public Drawable getVerticalThumbDrawable() { return this.mVerticalThumbDrawable; } @VisibleForTesting public Drawable getVerticalTrackDrawable() { return this.mVerticalTrackDrawable; } @VisibleForTesting public 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((long) i); this.mShowHideAnimator.start(); } public boolean isDragging() { return this.mState == 2; } @VisibleForTesting public boolean isPointInsideHorizontalThumb(float f, float f2) { if (f2 >= ((float) (this.mRecyclerViewHeight - this.mHorizontalThumbHeight))) { int i = this.mHorizontalThumbCenterX; int i2 = this.mHorizontalThumbWidth; if (f >= ((float) (i - (i2 / 2))) && f <= ((float) ((i2 / 2) + i))) { return true; } } return false; } @VisibleForTesting public boolean isPointInsideVerticalThumb(float f, float f2) { if (!isLayoutRTL() ? f >= ((float) (this.mRecyclerViewWidth - this.mVerticalThumbWidth)) : f <= ((float) (this.mVerticalThumbWidth / 2))) { int i = this.mVerticalThumbCenterY; int i2 = this.mVerticalThumbHeight; if (f2 >= ((float) (i - (i2 / 2))) && f2 <= ((float) ((i2 / 2) + i))) { return true; } } return false; } @VisibleForTesting public boolean isVisible() { return this.mState == 1; } @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); } } } @Override // androidx.recyclerview.widget.RecyclerView.OnItemTouchListener public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull 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 = (float) ((int) motionEvent.getX()); } else if (isPointInsideVerticalThumb) { this.mDragState = 2; this.mVerticalDragY = (float) ((int) motionEvent.getY()); } setState(2); } else if (i != 2) { return false; } return true; } @Override // androidx.recyclerview.widget.RecyclerView.OnItemTouchListener public void onRequestDisallowInterceptTouchEvent(boolean z2) { } @Override // androidx.recyclerview.widget.RecyclerView.OnItemTouchListener public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) { if (this.mState != 0) { 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 = (float) ((int) motionEvent.getX()); } else if (isPointInsideVerticalThumb) { this.mDragState = 2; this.mVerticalDragY = (float) ((int) motionEvent.getY()); } setState(2); } } else if (motionEvent.getAction() == 1 && this.mState == 2) { this.mVerticalDragY = 0.0f; this.mHorizontalDragX = 0.0f; setState(1); this.mDragState = 0; } else if (motionEvent.getAction() == 2 && this.mState == 2) { show(); if (this.mDragState == 1) { horizontalScrollTo(motionEvent.getX()); } if (this.mDragState == 2) { verticalScrollTo(motionEvent.getY()); } } } } public void requestRedraw() { this.mRecyclerView.invalidate(); } public 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(1200); } else if (i == 1) { resetHideDelay(1500); } this.mState = i; } public void show() { int i = this.mAnimationState; if (i != 0) { if (i == 3) { this.mShowHideAnimator.cancel(); } else { return; } } this.mAnimationState = 1; ValueAnimator valueAnimator = this.mShowHideAnimator; valueAnimator.setFloatValues(((Float) valueAnimator.getAnimatedValue()).floatValue(), 1.0f); this.mShowHideAnimator.setDuration(500L); this.mShowHideAnimator.setStartDelay(0); this.mShowHideAnimator.start(); } public 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 z2 = computeHorizontalScrollRange - i4 > 0 && i4 >= this.mScrollbarMinimumRange; this.mNeedHorizontalScrollbar = z2; boolean z3 = this.mNeedVerticalScrollbar; if (z3 || z2) { if (z3) { float f = (float) i3; this.mVerticalThumbCenterY = (int) ((((f / 2.0f) + ((float) i2)) * f) / ((float) computeVerticalScrollRange)); this.mVerticalThumbHeight = Math.min(i3, (i3 * i3) / computeVerticalScrollRange); } if (this.mNeedHorizontalScrollbar) { float f2 = (float) i4; this.mHorizontalThumbCenterX = (int) ((((f2 / 2.0f) + ((float) i)) * f2) / ((float) computeHorizontalScrollRange)); this.mHorizontalThumbWidth = Math.min(i4, (i4 * i4) / computeHorizontalScrollRange); } int i5 = this.mState; if (i5 == 0 || i5 == 1) { setState(1); } } else if (this.mState != 0) { setState(0); } } }