354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			354 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.viewpager2.widget;
 | |
| 
 | |
| import android.view.View;
 | |
| import android.view.ViewGroup;
 | |
| import androidx.recyclerview.widget.LinearLayoutManager;
 | |
| import androidx.recyclerview.widget.RecyclerView;
 | |
| import androidx.viewpager2.widget.ViewPager2;
 | |
| import java.util.Locale;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| final class ScrollEventAdapter extends RecyclerView.OnScrollListener {
 | |
|     private static final int NO_POSITION = -1;
 | |
|     private static final int STATE_IDLE = 0;
 | |
|     private static final int STATE_IN_PROGRESS_FAKE_DRAG = 4;
 | |
|     private static final int STATE_IN_PROGRESS_IMMEDIATE_SCROLL = 3;
 | |
|     private static final int STATE_IN_PROGRESS_MANUAL_DRAG = 1;
 | |
|     private static final int STATE_IN_PROGRESS_SMOOTH_SCROLL = 2;
 | |
|     private int mAdapterState;
 | |
|     private ViewPager2.OnPageChangeCallback mCallback;
 | |
|     private boolean mDataSetChangeHappened;
 | |
|     private boolean mDispatchSelected;
 | |
|     private int mDragStartPosition;
 | |
|     private boolean mFakeDragging;
 | |
|     private final LinearLayoutManager mLayoutManager;
 | |
|     private final RecyclerView mRecyclerView;
 | |
|     private boolean mScrollHappened;
 | |
|     private int mScrollState;
 | |
|     private ScrollEventValues mScrollValues;
 | |
|     private int mTarget;
 | |
|     private final ViewPager2 mViewPager;
 | |
| 
 | |
|     private boolean isInAnyDraggingState() {
 | |
|         int i = this.mAdapterState;
 | |
|         return i == 1 || i == 4;
 | |
|     }
 | |
| 
 | |
|     int getScrollState() {
 | |
|         return this.mScrollState;
 | |
|     }
 | |
| 
 | |
|     boolean isDragging() {
 | |
|         return this.mScrollState == 1;
 | |
|     }
 | |
| 
 | |
|     boolean isFakeDragging() {
 | |
|         return this.mFakeDragging;
 | |
|     }
 | |
| 
 | |
|     boolean isIdle() {
 | |
|         return this.mScrollState == 0;
 | |
|     }
 | |
| 
 | |
|     void notifyDataSetChangeHappened() {
 | |
|         this.mDataSetChangeHappened = true;
 | |
|     }
 | |
| 
 | |
|     void setOnPageChangeCallback(ViewPager2.OnPageChangeCallback onPageChangeCallback) {
 | |
|         this.mCallback = onPageChangeCallback;
 | |
|     }
 | |
| 
 | |
|     ScrollEventAdapter(ViewPager2 viewPager2) {
 | |
|         this.mViewPager = viewPager2;
 | |
|         RecyclerView recyclerView = viewPager2.mRecyclerView;
 | |
|         this.mRecyclerView = recyclerView;
 | |
|         this.mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
 | |
|         this.mScrollValues = new ScrollEventValues();
 | |
|         resetState();
 | |
|     }
 | |
| 
 | |
|     private void resetState() {
 | |
|         this.mAdapterState = 0;
 | |
|         this.mScrollState = 0;
 | |
|         this.mScrollValues.reset();
 | |
|         this.mDragStartPosition = -1;
 | |
|         this.mTarget = -1;
 | |
|         this.mDispatchSelected = false;
 | |
|         this.mScrollHappened = false;
 | |
|         this.mFakeDragging = false;
 | |
|         this.mDataSetChangeHappened = false;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.recyclerview.widget.RecyclerView.OnScrollListener
 | |
|     public void onScrollStateChanged(RecyclerView recyclerView, int i) {
 | |
|         if ((this.mAdapterState != 1 || this.mScrollState != 1) && i == 1) {
 | |
|             startDrag(false);
 | |
|             return;
 | |
|         }
 | |
|         if (isInAnyDraggingState() && i == 2) {
 | |
|             if (this.mScrollHappened) {
 | |
|                 dispatchStateChanged(2);
 | |
|                 this.mDispatchSelected = true;
 | |
|                 return;
 | |
|             }
 | |
|             return;
 | |
|         }
 | |
|         if (isInAnyDraggingState() && i == 0) {
 | |
|             updateScrollEventValues();
 | |
|             if (!this.mScrollHappened) {
 | |
|                 if (this.mScrollValues.mPosition != -1) {
 | |
|                     dispatchScrolled(this.mScrollValues.mPosition, 0.0f, 0);
 | |
|                 }
 | |
|             } else if (this.mScrollValues.mOffsetPx == 0) {
 | |
|                 if (this.mDragStartPosition != this.mScrollValues.mPosition) {
 | |
|                     dispatchSelected(this.mScrollValues.mPosition);
 | |
|                 }
 | |
|             }
 | |
|             dispatchStateChanged(0);
 | |
|             resetState();
 | |
|         }
 | |
|         if (this.mAdapterState == 2 && i == 0 && this.mDataSetChangeHappened) {
 | |
|             updateScrollEventValues();
 | |
|             if (this.mScrollValues.mOffsetPx == 0) {
 | |
|                 if (this.mTarget != this.mScrollValues.mPosition) {
 | |
|                     dispatchSelected(this.mScrollValues.mPosition == -1 ? 0 : this.mScrollValues.mPosition);
 | |
|                 }
 | |
|                 dispatchStateChanged(0);
 | |
|                 resetState();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /* JADX WARN: Code restructure failed: missing block: B:9:0x001d, code lost:
 | |
|     
 | |
|         if ((r5 < 0) == r3.mViewPager.isRtl()) goto L12;
 | |
|      */
 | |
|     /* JADX WARN: Removed duplicated region for block: B:14:0x0035  */
 | |
|     @Override // androidx.recyclerview.widget.RecyclerView.OnScrollListener
 | |
|     /*
 | |
|         Code decompiled incorrectly, please refer to instructions dump.
 | |
|         To view partially-correct add '--show-bad-code' argument
 | |
|     */
 | |
|     public void onScrolled(androidx.recyclerview.widget.RecyclerView r4, int r5, int r6) {
 | |
|         /*
 | |
|             r3 = this;
 | |
|             r4 = 1
 | |
|             r3.mScrollHappened = r4
 | |
|             r3.updateScrollEventValues()
 | |
|             boolean r0 = r3.mDispatchSelected
 | |
|             r1 = -1
 | |
|             r2 = 0
 | |
|             if (r0 == 0) goto L39
 | |
|             r3.mDispatchSelected = r2
 | |
|             if (r6 > 0) goto L1f
 | |
|             if (r6 != 0) goto L2b
 | |
|             if (r5 >= 0) goto L16
 | |
|             r5 = 1
 | |
|             goto L17
 | |
|         L16:
 | |
|             r5 = 0
 | |
|         L17:
 | |
|             androidx.viewpager2.widget.ViewPager2 r6 = r3.mViewPager
 | |
|             boolean r6 = r6.isRtl()
 | |
|             if (r5 != r6) goto L2b
 | |
|         L1f:
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mOffsetPx
 | |
|             if (r5 == 0) goto L2b
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mPosition
 | |
|             int r5 = r5 + r4
 | |
|             goto L2f
 | |
|         L2b:
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mPosition
 | |
|         L2f:
 | |
|             r3.mTarget = r5
 | |
|             int r6 = r3.mDragStartPosition
 | |
|             if (r6 == r5) goto L47
 | |
|             r3.dispatchSelected(r5)
 | |
|             goto L47
 | |
|         L39:
 | |
|             int r5 = r3.mAdapterState
 | |
|             if (r5 != 0) goto L47
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mPosition
 | |
|             if (r5 != r1) goto L44
 | |
|             r5 = 0
 | |
|         L44:
 | |
|             r3.dispatchSelected(r5)
 | |
|         L47:
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mPosition
 | |
|             if (r5 != r1) goto L4f
 | |
|             r5 = 0
 | |
|             goto L53
 | |
|         L4f:
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mPosition
 | |
|         L53:
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r6 = r3.mScrollValues
 | |
|             float r6 = r6.mOffset
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r0 = r3.mScrollValues
 | |
|             int r0 = r0.mOffsetPx
 | |
|             r3.dispatchScrolled(r5, r6, r0)
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mPosition
 | |
|             int r6 = r3.mTarget
 | |
|             if (r5 == r6) goto L68
 | |
|             if (r6 != r1) goto L78
 | |
|         L68:
 | |
|             androidx.viewpager2.widget.ScrollEventAdapter$ScrollEventValues r5 = r3.mScrollValues
 | |
|             int r5 = r5.mOffsetPx
 | |
|             if (r5 != 0) goto L78
 | |
|             int r5 = r3.mScrollState
 | |
|             if (r5 == r4) goto L78
 | |
|             r3.dispatchStateChanged(r2)
 | |
|             r3.resetState()
 | |
|         L78:
 | |
|             return
 | |
|         */
 | |
|         throw new UnsupportedOperationException("Method not decompiled: androidx.viewpager2.widget.ScrollEventAdapter.onScrolled(androidx.recyclerview.widget.RecyclerView, int, int):void");
 | |
|     }
 | |
| 
 | |
|     private void updateScrollEventValues() {
 | |
|         int top;
 | |
|         ScrollEventValues scrollEventValues = this.mScrollValues;
 | |
|         scrollEventValues.mPosition = this.mLayoutManager.findFirstVisibleItemPosition();
 | |
|         if (scrollEventValues.mPosition == -1) {
 | |
|             scrollEventValues.reset();
 | |
|             return;
 | |
|         }
 | |
|         View findViewByPosition = this.mLayoutManager.findViewByPosition(scrollEventValues.mPosition);
 | |
|         if (findViewByPosition == null) {
 | |
|             scrollEventValues.reset();
 | |
|             return;
 | |
|         }
 | |
|         int leftDecorationWidth = this.mLayoutManager.getLeftDecorationWidth(findViewByPosition);
 | |
|         int rightDecorationWidth = this.mLayoutManager.getRightDecorationWidth(findViewByPosition);
 | |
|         int topDecorationHeight = this.mLayoutManager.getTopDecorationHeight(findViewByPosition);
 | |
|         int bottomDecorationHeight = this.mLayoutManager.getBottomDecorationHeight(findViewByPosition);
 | |
|         ViewGroup.LayoutParams layoutParams = findViewByPosition.getLayoutParams();
 | |
|         if (layoutParams instanceof ViewGroup.MarginLayoutParams) {
 | |
|             ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) layoutParams;
 | |
|             leftDecorationWidth += marginLayoutParams.leftMargin;
 | |
|             rightDecorationWidth += marginLayoutParams.rightMargin;
 | |
|             topDecorationHeight += marginLayoutParams.topMargin;
 | |
|             bottomDecorationHeight += marginLayoutParams.bottomMargin;
 | |
|         }
 | |
|         int height = findViewByPosition.getHeight() + topDecorationHeight + bottomDecorationHeight;
 | |
|         int width = findViewByPosition.getWidth() + leftDecorationWidth + rightDecorationWidth;
 | |
|         if (this.mLayoutManager.getOrientation() == 0) {
 | |
|             top = (findViewByPosition.getLeft() - leftDecorationWidth) - this.mRecyclerView.getPaddingLeft();
 | |
|             if (this.mViewPager.isRtl()) {
 | |
|                 top = -top;
 | |
|             }
 | |
|             height = width;
 | |
|         } else {
 | |
|             top = (findViewByPosition.getTop() - topDecorationHeight) - this.mRecyclerView.getPaddingTop();
 | |
|         }
 | |
|         scrollEventValues.mOffsetPx = -top;
 | |
|         if (scrollEventValues.mOffsetPx < 0) {
 | |
|             if (new AnimateLayoutChangeDetector(this.mLayoutManager).mayHaveInterferingAnimations()) {
 | |
|                 throw new IllegalStateException("Page(s) contain a ViewGroup with a LayoutTransition (or animateLayoutChanges=\"true\"), which interferes with the scrolling animation. Make sure to call getLayoutTransition().setAnimateParentHierarchy(false) on all ViewGroups with a LayoutTransition before an animation is started.");
 | |
|             }
 | |
|             throw new IllegalStateException(String.format(Locale.US, "Page can only be offset by a positive amount, not by %d", Integer.valueOf(scrollEventValues.mOffsetPx)));
 | |
|         }
 | |
|         scrollEventValues.mOffset = height == 0 ? 0.0f : scrollEventValues.mOffsetPx / height;
 | |
|     }
 | |
| 
 | |
|     private void startDrag(boolean z) {
 | |
|         this.mFakeDragging = z;
 | |
|         this.mAdapterState = z ? 4 : 1;
 | |
|         int i = this.mTarget;
 | |
|         if (i != -1) {
 | |
|             this.mDragStartPosition = i;
 | |
|             this.mTarget = -1;
 | |
|         } else if (this.mDragStartPosition == -1) {
 | |
|             this.mDragStartPosition = getPosition();
 | |
|         }
 | |
|         dispatchStateChanged(1);
 | |
|     }
 | |
| 
 | |
|     void notifyProgrammaticScroll(int i, boolean z) {
 | |
|         this.mAdapterState = z ? 2 : 3;
 | |
|         this.mFakeDragging = false;
 | |
|         boolean z2 = this.mTarget != i;
 | |
|         this.mTarget = i;
 | |
|         dispatchStateChanged(2);
 | |
|         if (z2) {
 | |
|             dispatchSelected(i);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void notifyBeginFakeDrag() {
 | |
|         this.mAdapterState = 4;
 | |
|         startDrag(true);
 | |
|     }
 | |
| 
 | |
|     void notifyEndFakeDrag() {
 | |
|         if (!isDragging() || this.mFakeDragging) {
 | |
|             this.mFakeDragging = false;
 | |
|             updateScrollEventValues();
 | |
|             if (this.mScrollValues.mOffsetPx == 0) {
 | |
|                 if (this.mScrollValues.mPosition != this.mDragStartPosition) {
 | |
|                     dispatchSelected(this.mScrollValues.mPosition);
 | |
|                 }
 | |
|                 dispatchStateChanged(0);
 | |
|                 resetState();
 | |
|                 return;
 | |
|             }
 | |
|             dispatchStateChanged(2);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     double getRelativeScrollPosition() {
 | |
|         updateScrollEventValues();
 | |
|         return this.mScrollValues.mPosition + this.mScrollValues.mOffset;
 | |
|     }
 | |
| 
 | |
|     private void dispatchStateChanged(int i) {
 | |
|         if ((this.mAdapterState == 3 && this.mScrollState == 0) || this.mScrollState == i) {
 | |
|             return;
 | |
|         }
 | |
|         this.mScrollState = i;
 | |
|         ViewPager2.OnPageChangeCallback onPageChangeCallback = this.mCallback;
 | |
|         if (onPageChangeCallback != null) {
 | |
|             onPageChangeCallback.onPageScrollStateChanged(i);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void dispatchSelected(int i) {
 | |
|         ViewPager2.OnPageChangeCallback onPageChangeCallback = this.mCallback;
 | |
|         if (onPageChangeCallback != null) {
 | |
|             onPageChangeCallback.onPageSelected(i);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void dispatchScrolled(int i, float f, int i2) {
 | |
|         ViewPager2.OnPageChangeCallback onPageChangeCallback = this.mCallback;
 | |
|         if (onPageChangeCallback != null) {
 | |
|             onPageChangeCallback.onPageScrolled(i, f, i2);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private int getPosition() {
 | |
|         return this.mLayoutManager.findFirstVisibleItemPosition();
 | |
|     }
 | |
| 
 | |
|     private static final class ScrollEventValues {
 | |
|         float mOffset;
 | |
|         int mOffsetPx;
 | |
|         int mPosition;
 | |
| 
 | |
|         void reset() {
 | |
|             this.mPosition = -1;
 | |
|             this.mOffset = 0.0f;
 | |
|             this.mOffsetPx = 0;
 | |
|         }
 | |
| 
 | |
|         ScrollEventValues() {
 | |
|         }
 | |
|     }
 | |
| }
 |