CrackMe.apk
Download file
package androidx.customview.widget;
import android.content.Context;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.OverScroller;
import androidx.core.view.ViewCompat;
import java.util.Arrays;
public class ViewDragHelper {
private static final int BASE_SETTLE_DURATION = 256;
public static final int DIRECTION_ALL = 3;
public static final int DIRECTION_HORIZONTAL = 1;
public static final int DIRECTION_VERTICAL = 2;
public static final int EDGE_ALL = 15;
public static final int EDGE_BOTTOM = 8;
public static final int EDGE_LEFT = 1;
public static final int EDGE_RIGHT = 2;
private static final int EDGE_SIZE = 20;
public static final int EDGE_TOP = 4;
public static final int INVALID_POINTER = -1;
private static final int MAX_SETTLE_DURATION = 600;
public static final int STATE_DRAGGING = 1;
public static final int STATE_IDLE = 0;
public static final int STATE_SETTLING = 2;
private static final String TAG = "ViewDragHelper";
private static final Interpolator sInterpolator = new Interpolator() {
public float getInterpolation(float f) {
float f2 = f - 1.0f;
return (f2 * f2 * f2 * f2 * f2) + 1.0f;
}
};
private int mActivePointerId = -1;
private final Callback mCallback;
private View mCapturedView;
private int mDragState;
private int[] mEdgeDragsInProgress;
private int[] mEdgeDragsLocked;
private int mEdgeSize;
private int[] mInitialEdgesTouched;
private float[] mInitialMotionX;
private float[] mInitialMotionY;
private float[] mLastMotionX;
private float[] mLastMotionY;
private float mMaxVelocity;
private float mMinVelocity;
private final ViewGroup mParentView;
private int mPointersDown;
private boolean mReleaseInProgress;
private OverScroller mScroller;
private final Runnable mSetIdleRunnable = new Runnable() {
public void run() {
ViewDragHelper.this.setDragState(0);
}
};
private int mTouchSlop;
private int mTrackingEdges;
private VelocityTracker mVelocityTracker;
public static abstract class Callback {
public int clampViewPositionHorizontal(View view, int i, int i2) {
return 0;
}
public int clampViewPositionVertical(View view, int i, int i2) {
return 0;
}
public int getOrderedChildIndex(int i) {
return i;
}
public int getViewHorizontalDragRange(View view) {
return 0;
}
public int getViewVerticalDragRange(View view) {
return 0;
}
public void onEdgeDragStarted(int i, int i2) {
}
public boolean onEdgeLock(int i) {
return false;
}
public void onEdgeTouched(int i, int i2) {
}
public void onViewCaptured(View view, int i) {
}
public void onViewDragStateChanged(int i) {
}
public void onViewPositionChanged(View view, int i, int i2, int i3, int i4) {
}
public void onViewReleased(View view, float f, float f2) {
}
public abstract boolean tryCaptureView(View view, int i);
}
public static ViewDragHelper create(ViewGroup viewGroup, Callback callback) {
return new ViewDragHelper(viewGroup.getContext(), viewGroup, callback);
}
public static ViewDragHelper create(ViewGroup viewGroup, float f, Callback callback) {
ViewDragHelper create = create(viewGroup, callback);
create.mTouchSlop = (int) (((float) create.mTouchSlop) * (1.0f / f));
return create;
}
private ViewDragHelper(Context context, ViewGroup viewGroup, Callback callback) {
if (viewGroup == null) {
throw new IllegalArgumentException("Parent view may not be null");
} else if (callback != null) {
this.mParentView = viewGroup;
this.mCallback = callback;
ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
this.mEdgeSize = (int) ((context.getResources().getDisplayMetrics().density * 20.0f) + 0.5f);
this.mTouchSlop = viewConfiguration.getScaledTouchSlop();
this.mMaxVelocity = (float) viewConfiguration.getScaledMaximumFlingVelocity();
this.mMinVelocity = (float) viewConfiguration.getScaledMinimumFlingVelocity();
this.mScroller = new OverScroller(context, sInterpolator);
} else {
throw new IllegalArgumentException("Callback may not be null");
}
}
public void setMinVelocity(float f) {
this.mMinVelocity = f;
}
public float getMinVelocity() {
return this.mMinVelocity;
}
public int getViewDragState() {
return this.mDragState;
}
public void setEdgeTrackingEnabled(int i) {
this.mTrackingEdges = i;
}
public int getEdgeSize() {
return this.mEdgeSize;
}
public void captureChildView(View view, int i) {
if (view.getParent() == this.mParentView) {
this.mCapturedView = view;
this.mActivePointerId = i;
this.mCallback.onViewCaptured(view, i);
setDragState(1);
return;
}
throw new IllegalArgumentException("captureChildView: parameter must be a descendant of the ViewDragHelper's tracked parent view (" + this.mParentView + ")");
}
public View getCapturedView() {
return this.mCapturedView;
}
public int getActivePointerId() {
return this.mActivePointerId;
}
public int getTouchSlop() {
return this.mTouchSlop;
}
public void cancel() {
this.mActivePointerId = -1;
clearMotionHistory();
VelocityTracker velocityTracker = this.mVelocityTracker;
if (velocityTracker != null) {
velocityTracker.recycle();
this.mVelocityTracker = null;
}
}
public void abort() {
cancel();
if (this.mDragState == 2) {
int currX = this.mScroller.getCurrX();
int currY = this.mScroller.getCurrY();
this.mScroller.abortAnimation();
int currX2 = this.mScroller.getCurrX();
int currY2 = this.mScroller.getCurrY();
this.mCallback.onViewPositionChanged(this.mCapturedView, currX2, currY2, currX2 - currX, currY2 - currY);
}
setDragState(0);
}
public boolean smoothSlideViewTo(View view, int i, int i2) {
this.mCapturedView = view;
this.mActivePointerId = -1;
boolean forceSettleCapturedViewAt = forceSettleCapturedViewAt(i, i2, 0, 0);
if (!forceSettleCapturedViewAt && this.mDragState == 0 && this.mCapturedView != null) {
this.mCapturedView = null;
}
return forceSettleCapturedViewAt;
}
public boolean settleCapturedViewAt(int i, int i2) {
if (this.mReleaseInProgress) {
return forceSettleCapturedViewAt(i, i2, (int) this.mVelocityTracker.getXVelocity(this.mActivePointerId), (int) this.mVelocityTracker.getYVelocity(this.mActivePointerId));
}
throw new IllegalStateException("Cannot settleCapturedViewAt outside of a call to Callback#onViewReleased");
}
private boolean forceSettleCapturedViewAt(int i, int i2, int i3, int i4) {
int left = this.mCapturedView.getLeft();
int top = this.mCapturedView.getTop();
int i5 = i - left;
int i6 = i2 - top;
if (i5 == 0 && i6 == 0) {
this.mScroller.abortAnimation();
setDragState(0);
return false;
}
this.mScroller.startScroll(left, top, i5, i6, computeSettleDuration(this.mCapturedView, i5, i6, i3, i4));
setDragState(2);
return true;
}
private int computeSettleDuration(View view, int i, int i2, int i3, int i4) {
float f;
float f2;
float f3;
float f4;
int clampMag = clampMag(i3, (int) this.mMinVelocity, (int) this.mMaxVelocity);
int clampMag2 = clampMag(i4, (int) this.mMinVelocity, (int) this.mMaxVelocity);
int abs = Math.abs(i);
int abs2 = Math.abs(i2);
int abs3 = Math.abs(clampMag);
int abs4 = Math.abs(clampMag2);
int i5 = abs3 + abs4;
int i6 = abs + abs2;
if (clampMag != 0) {
f2 = (float) abs3;
f = (float) i5;
} else {
f2 = (float) abs;
f = (float) i6;
}
float f5 = f2 / f;
if (clampMag2 != 0) {
f4 = (float) abs4;
f3 = (float) i5;
} else {
f4 = (float) abs2;
f3 = (float) i6;
}
float f6 = f4 / f3;
return (int) ((((float) computeAxisDuration(i, clampMag, this.mCallback.getViewHorizontalDragRange(view))) * f5) + (((float) computeAxisDuration(i2, clampMag2, this.mCallback.getViewVerticalDragRange(view))) * f6));
}
private int computeAxisDuration(int i, int i2, int i3) {
int i4;
if (i == 0) {
return 0;
}
int width = this.mParentView.getWidth();
float f = (float) (width / 2);
float distanceInfluenceForSnapDuration = f + (distanceInfluenceForSnapDuration(Math.min(1.0f, ((float) Math.abs(i)) / ((float) width))) * f);
int abs = Math.abs(i2);
if (abs > 0) {
i4 = Math.round(Math.abs(distanceInfluenceForSnapDuration / ((float) abs)) * 1000.0f) * 4;
} else {
i4 = (int) (((((float) Math.abs(i)) / ((float) i3)) + 1.0f) * 256.0f);
}
return Math.min(i4, MAX_SETTLE_DURATION);
}
private int clampMag(int i, int i2, int i3) {
int abs = Math.abs(i);
if (abs < i2) {
return 0;
}
if (abs > i3) {
return i > 0 ? i3 : -i3;
}
return i;
}
private float clampMag(float f, float f2, float f3) {
float abs = Math.abs(f);
if (abs < f2) {
return 0.0f;
}
if (abs > f3) {
return f > 0.0f ? f3 : -f3;
}
return f;
}
private float distanceInfluenceForSnapDuration(float f) {
return (float) Math.sin((double) ((f - 0.5f) * 0.47123894f));
}
public void flingCapturedView(int i, int i2, int i3, int i4) {
if (this.mReleaseInProgress) {
this.mScroller.fling(this.mCapturedView.getLeft(), this.mCapturedView.getTop(), (int) this.mVelocityTracker.getXVelocity(this.mActivePointerId), (int) this.mVelocityTracker.getYVelocity(this.mActivePointerId), i, i3, i2, i4);
setDragState(2);
return;
}
throw new IllegalStateException("Cannot flingCapturedView outside of a call to Callback#onViewReleased");
}
public boolean continueSettling(boolean z) {
if (this.mDragState == 2) {
boolean computeScrollOffset = this.mScroller.computeScrollOffset();
int currX = this.mScroller.getCurrX();
int currY = this.mScroller.getCurrY();
int left = currX - this.mCapturedView.getLeft();
int top = currY - this.mCapturedView.getTop();
if (left != 0) {
ViewCompat.offsetLeftAndRight(this.mCapturedView, left);
}
if (top != 0) {
ViewCompat.offsetTopAndBottom(this.mCapturedView, top);
}
if (!(left == 0 && top == 0)) {
this.mCallback.onViewPositionChanged(this.mCapturedView, currX, currY, left, top);
}
if (computeScrollOffset && currX == this.mScroller.getFinalX() && currY == this.mScroller.getFinalY()) {
this.mScroller.abortAnimation();
computeScrollOffset = false;
}
if (!computeScrollOffset) {
if (z) {
this.mParentView.post(this.mSetIdleRunnable);
} else {
setDragState(0);
}
}
}
if (this.mDragState == 2) {
return true;
}
return false;
}
private void dispatchViewReleased(float f, float f2) {
this.mReleaseInProgress = true;
this.mCallback.onViewReleased(this.mCapturedView, f, f2);
this.mReleaseInProgress = false;
if (this.mDragState == 1) {
setDragState(0);
}
}
private void clearMotionHistory() {
float[] fArr = this.mInitialMotionX;
if (fArr != null) {
Arrays.fill(fArr, 0.0f);
Arrays.fill(this.mInitialMotionY, 0.0f);
Arrays.fill(this.mLastMotionX, 0.0f);
Arrays.fill(this.mLastMotionY, 0.0f);
Arrays.fill(this.mInitialEdgesTouched, 0);
Arrays.fill(this.mEdgeDragsInProgress, 0);
Arrays.fill(this.mEdgeDragsLocked, 0);
this.mPointersDown = 0;
}
}
private void clearMotionHistory(int i) {
if (this.mInitialMotionX != null && isPointerDown(i)) {
this.mInitialMotionX[i] = 0.0f;
this.mInitialMotionY[i] = 0.0f;
this.mLastMotionX[i] = 0.0f;
this.mLastMotionY[i] = 0.0f;
this.mInitialEdgesTouched[i] = 0;
this.mEdgeDragsInProgress[i] = 0;
this.mEdgeDragsLocked[i] = 0;
this.mPointersDown = (~(1 << i)) & this.mPointersDown;
}
}
private void ensureMotionHistorySizeForId(int i) {
float[] fArr = this.mInitialMotionX;
if (fArr == null || fArr.length <= i) {
int i2 = i + 1;
float[] fArr2 = new float[i2];
float[] fArr3 = new float[i2];
float[] fArr4 = new float[i2];
float[] fArr5 = new float[i2];
int[] iArr = new int[i2];
int[] iArr2 = new int[i2];
int[] iArr3 = new int[i2];
if (fArr != null) {
System.arraycopy(fArr, 0, fArr2, 0, fArr.length);
float[] fArr6 = this.mInitialMotionY;
System.arraycopy(fArr6, 0, fArr3, 0, fArr6.length);
float[] fArr7 = this.mLastMotionX;
System.arraycopy(fArr7, 0, fArr4, 0, fArr7.length);
float[] fArr8 = this.mLastMotionY;
System.arraycopy(fArr8, 0, fArr5, 0, fArr8.length);
int[] iArr4 = this.mInitialEdgesTouched;
System.arraycopy(iArr4, 0, iArr, 0, iArr4.length);
int[] iArr5 = this.mEdgeDragsInProgress;
System.arraycopy(iArr5, 0, iArr2, 0, iArr5.length);
int[] iArr6 = this.mEdgeDragsLocked;
System.arraycopy(iArr6, 0, iArr3, 0, iArr6.length);
}
this.mInitialMotionX = fArr2;
this.mInitialMotionY = fArr3;
this.mLastMotionX = fArr4;
this.mLastMotionY = fArr5;
this.mInitialEdgesTouched = iArr;
this.mEdgeDragsInProgress = iArr2;
this.mEdgeDragsLocked = iArr3;
}
}
private void saveInitialMotion(float f, float f2, int i) {
ensureMotionHistorySizeForId(i);
float[] fArr = this.mInitialMotionX;
this.mLastMotionX[i] = f;
fArr[i] = f;
float[] fArr2 = this.mInitialMotionY;
this.mLastMotionY[i] = f2;
fArr2[i] = f2;
this.mInitialEdgesTouched[i] = getEdgesTouched((int) f, (int) f2);
this.mPointersDown |= 1 << i;
}
private void saveLastMotion(MotionEvent motionEvent) {
int pointerCount = motionEvent.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
int pointerId = motionEvent.getPointerId(i);
if (isValidPointerForActionMove(pointerId)) {
float x = motionEvent.getX(i);
float y = motionEvent.getY(i);
this.mLastMotionX[pointerId] = x;
this.mLastMotionY[pointerId] = y;
}
}
}
public boolean isPointerDown(int i) {
return ((1 << i) & this.mPointersDown) != 0;
}
/* access modifiers changed from: package-private */
public void setDragState(int i) {
this.mParentView.removeCallbacks(this.mSetIdleRunnable);
if (this.mDragState != i) {
this.mDragState = i;
this.mCallback.onViewDragStateChanged(i);
if (this.mDragState == 0) {
this.mCapturedView = null;
}
}
}
/* access modifiers changed from: package-private */
public boolean tryCaptureViewForDrag(View view, int i) {
if (view == this.mCapturedView && this.mActivePointerId == i) {
return true;
}
if (view == null || !this.mCallback.tryCaptureView(view, i)) {
return false;
}
this.mActivePointerId = i;
captureChildView(view, i);
return true;
}
/* access modifiers changed from: protected */
public boolean canScroll(View view, boolean z, int i, int i2, int i3, int i4) {
int i5;
View view2 = view;
if (view2 instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view2;
int scrollX = view.getScrollX();
int scrollY = view.getScrollY();
for (int childCount = viewGroup.getChildCount() - 1; childCount >= 0; childCount--) {
View childAt = viewGroup.getChildAt(childCount);
int i6 = i3 + scrollX;
if (i6 >= childAt.getLeft() && i6 < childAt.getRight() && (i5 = i4 + scrollY) >= childAt.getTop() && i5 < childAt.getBottom()) {
if (canScroll(childAt, true, i, i2, i6 - childAt.getLeft(), i5 - childAt.getTop())) {
return true;
}
}
}
}
if (!z || (!view.canScrollHorizontally(-i) && !view.canScrollVertically(-i2))) {
return false;
}
return true;
}
/* JADX WARNING: Code restructure failed: missing block: B:45:0x00dd, code lost:
if (r12 != r11) goto L_0x00e6;
*/
/* Code decompiled incorrectly, please refer to instructions dump. */
public boolean shouldInterceptTouchEvent(android.view.MotionEvent r17) {
/*
r16 = this;
r0 = r16
r1 = r17
int r2 = r17.getActionMasked()
int r3 = r17.getActionIndex()
if (r2 != 0) goto L_0x0011
r16.cancel()
L_0x0011:
android.view.VelocityTracker r4 = r0.mVelocityTracker
if (r4 != 0) goto L_0x001b
android.view.VelocityTracker r4 = android.view.VelocityTracker.obtain()
r0.mVelocityTracker = r4
L_0x001b:
android.view.VelocityTracker r4 = r0.mVelocityTracker
r4.addMovement(r1)
r4 = 2
r6 = 1
if (r2 == 0) goto L_0x0104
if (r2 == r6) goto L_0x00ff
if (r2 == r4) goto L_0x0070
r7 = 3
if (r2 == r7) goto L_0x00ff
r7 = 5
if (r2 == r7) goto L_0x003c
r4 = 6
if (r2 == r4) goto L_0x0034
L_0x0031:
r5 = 0
goto L_0x0135
L_0x0034:
int r1 = r1.getPointerId(r3)
r0.clearMotionHistory(r1)
goto L_0x0031
L_0x003c:
int r2 = r1.getPointerId(r3)
float r7 = r1.getX(r3)
float r1 = r1.getY(r3)
r0.saveInitialMotion(r7, r1, r2)
int r3 = r0.mDragState
if (r3 != 0) goto L_0x0060
int[] r1 = r0.mInitialEdgesTouched
r1 = r1[r2]
int r3 = r0.mTrackingEdges
r4 = r1 & r3
if (r4 == 0) goto L_0x0031
androidx.customview.widget.ViewDragHelper$Callback r4 = r0.mCallback
r1 = r1 & r3
r4.onEdgeTouched(r1, r2)
goto L_0x0031
L_0x0060:
if (r3 != r4) goto L_0x0031
int r3 = (int) r7
int r1 = (int) r1
android.view.View r1 = r0.findTopChildUnder(r3, r1)
android.view.View r3 = r0.mCapturedView
if (r1 != r3) goto L_0x0031
r0.tryCaptureViewForDrag(r1, r2)
goto L_0x0031
L_0x0070:
float[] r2 = r0.mInitialMotionX
if (r2 == 0) goto L_0x0031
float[] r2 = r0.mInitialMotionY
if (r2 != 0) goto L_0x0079
goto L_0x0031
L_0x0079:
int r2 = r17.getPointerCount()
r3 = 0
L_0x007e:
if (r3 >= r2) goto L_0x00fa
int r4 = r1.getPointerId(r3)
boolean r7 = r0.isValidPointerForActionMove(r4)
if (r7 != 0) goto L_0x008c
goto L_0x00f7
L_0x008c:
float r7 = r1.getX(r3)
float r8 = r1.getY(r3)
float[] r9 = r0.mInitialMotionX
r9 = r9[r4]
float r9 = r7 - r9
float[] r10 = r0.mInitialMotionY
r10 = r10[r4]
float r10 = r8 - r10
int r7 = (int) r7
int r8 = (int) r8
android.view.View r7 = r0.findTopChildUnder(r7, r8)
if (r7 == 0) goto L_0x00b0
boolean r8 = r0.checkTouchSlop(r7, r9, r10)
if (r8 == 0) goto L_0x00b0
r8 = 1
goto L_0x00b1
L_0x00b0:
r8 = 0
L_0x00b1:
if (r8 == 0) goto L_0x00e6
int r11 = r7.getLeft()
int r12 = (int) r9
int r13 = r11 + r12
androidx.customview.widget.ViewDragHelper$Callback r14 = r0.mCallback
int r12 = r14.clampViewPositionHorizontal(r7, r13, r12)
int r13 = r7.getTop()
int r14 = (int) r10
int r15 = r13 + r14
androidx.customview.widget.ViewDragHelper$Callback r5 = r0.mCallback
int r5 = r5.clampViewPositionVertical(r7, r15, r14)
androidx.customview.widget.ViewDragHelper$Callback r14 = r0.mCallback
int r14 = r14.getViewHorizontalDragRange(r7)
androidx.customview.widget.ViewDragHelper$Callback r15 = r0.mCallback
int r15 = r15.getViewVerticalDragRange(r7)
if (r14 == 0) goto L_0x00df
if (r14 <= 0) goto L_0x00e6
if (r12 != r11) goto L_0x00e6
L_0x00df:
if (r15 == 0) goto L_0x00fa
if (r15 <= 0) goto L_0x00e6
if (r5 != r13) goto L_0x00e6
goto L_0x00fa
L_0x00e6:
r0.reportNewEdgeDrags(r9, r10, r4)
int r5 = r0.mDragState
if (r5 != r6) goto L_0x00ee
goto L_0x00fa
L_0x00ee:
if (r8 == 0) goto L_0x00f7
boolean r4 = r0.tryCaptureViewForDrag(r7, r4)
if (r4 == 0) goto L_0x00f7
goto L_0x00fa
L_0x00f7:
int r3 = r3 + 1
goto L_0x007e
L_0x00fa:
r16.saveLastMotion(r17)
goto L_0x0031
L_0x00ff:
r16.cancel()
goto L_0x0031
L_0x0104:
float r2 = r17.getX()
float r3 = r17.getY()
r5 = 0
int r1 = r1.getPointerId(r5)
r0.saveInitialMotion(r2, r3, r1)
int r2 = (int) r2
int r3 = (int) r3
android.view.View r2 = r0.findTopChildUnder(r2, r3)
android.view.View r3 = r0.mCapturedView
if (r2 != r3) goto L_0x0125
int r3 = r0.mDragState
if (r3 != r4) goto L_0x0125
r0.tryCaptureViewForDrag(r2, r1)
L_0x0125:
int[] r2 = r0.mInitialEdgesTouched
r2 = r2[r1]
int r3 = r0.mTrackingEdges
r4 = r2 & r3
if (r4 == 0) goto L_0x0135
androidx.customview.widget.ViewDragHelper$Callback r4 = r0.mCallback
r2 = r2 & r3
r4.onEdgeTouched(r2, r1)
L_0x0135:
int r1 = r0.mDragState
if (r1 != r6) goto L_0x013a
r5 = 1
L_0x013a:
return r5
*/
throw new UnsupportedOperationException("Method not decompiled: androidx.customview.widget.ViewDragHelper.shouldInterceptTouchEvent(android.view.MotionEvent):boolean");
}
public void processTouchEvent(MotionEvent motionEvent) {
int i;
int actionMasked = motionEvent.getActionMasked();
int actionIndex = motionEvent.getActionIndex();
if (actionMasked == 0) {
cancel();
}
if (this.mVelocityTracker == null) {
this.mVelocityTracker = VelocityTracker.obtain();
}
this.mVelocityTracker.addMovement(motionEvent);
int i2 = 0;
if (actionMasked == 0) {
float x = motionEvent.getX();
float y = motionEvent.getY();
int pointerId = motionEvent.getPointerId(0);
View findTopChildUnder = findTopChildUnder((int) x, (int) y);
saveInitialMotion(x, y, pointerId);
tryCaptureViewForDrag(findTopChildUnder, pointerId);
int i3 = this.mInitialEdgesTouched[pointerId];
int i4 = this.mTrackingEdges;
if ((i3 & i4) != 0) {
this.mCallback.onEdgeTouched(i3 & i4, pointerId);
}
} else if (actionMasked == 1) {
if (this.mDragState == 1) {
releaseViewForPointerUp();
}
cancel();
} else if (actionMasked != 2) {
if (actionMasked == 3) {
if (this.mDragState == 1) {
dispatchViewReleased(0.0f, 0.0f);
}
cancel();
} else if (actionMasked == 5) {
int pointerId2 = motionEvent.getPointerId(actionIndex);
float x2 = motionEvent.getX(actionIndex);
float y2 = motionEvent.getY(actionIndex);
saveInitialMotion(x2, y2, pointerId2);
if (this.mDragState == 0) {
tryCaptureViewForDrag(findTopChildUnder((int) x2, (int) y2), pointerId2);
int i5 = this.mInitialEdgesTouched[pointerId2];
int i6 = this.mTrackingEdges;
if ((i5 & i6) != 0) {
this.mCallback.onEdgeTouched(i5 & i6, pointerId2);
}
} else if (isCapturedViewUnder((int) x2, (int) y2)) {
tryCaptureViewForDrag(this.mCapturedView, pointerId2);
}
} else if (actionMasked == 6) {
int pointerId3 = motionEvent.getPointerId(actionIndex);
if (this.mDragState == 1 && pointerId3 == this.mActivePointerId) {
int pointerCount = motionEvent.getPointerCount();
while (true) {
if (i2 >= pointerCount) {
i = -1;
break;
}
int pointerId4 = motionEvent.getPointerId(i2);
if (pointerId4 != this.mActivePointerId) {
View findTopChildUnder2 = findTopChildUnder((int) motionEvent.getX(i2), (int) motionEvent.getY(i2));
View view = this.mCapturedView;
if (findTopChildUnder2 == view && tryCaptureViewForDrag(view, pointerId4)) {
i = this.mActivePointerId;
break;
}
}
i2++;
}
if (i == -1) {
releaseViewForPointerUp();
}
}
clearMotionHistory(pointerId3);
}
} else if (this.mDragState != 1) {
int pointerCount2 = motionEvent.getPointerCount();
while (i2 < pointerCount2) {
int pointerId5 = motionEvent.getPointerId(i2);
if (isValidPointerForActionMove(pointerId5)) {
float x3 = motionEvent.getX(i2);
float y3 = motionEvent.getY(i2);
float f = x3 - this.mInitialMotionX[pointerId5];
float f2 = y3 - this.mInitialMotionY[pointerId5];
reportNewEdgeDrags(f, f2, pointerId5);
if (this.mDragState != 1) {
View findTopChildUnder3 = findTopChildUnder((int) x3, (int) y3);
if (checkTouchSlop(findTopChildUnder3, f, f2) && tryCaptureViewForDrag(findTopChildUnder3, pointerId5)) {
break;
}
} else {
break;
}
}
i2++;
}
saveLastMotion(motionEvent);
} else if (isValidPointerForActionMove(this.mActivePointerId)) {
int findPointerIndex = motionEvent.findPointerIndex(this.mActivePointerId);
float x4 = motionEvent.getX(findPointerIndex);
float y4 = motionEvent.getY(findPointerIndex);
float[] fArr = this.mLastMotionX;
int i7 = this.mActivePointerId;
int i8 = (int) (x4 - fArr[i7]);
int i9 = (int) (y4 - this.mLastMotionY[i7]);
dragTo(this.mCapturedView.getLeft() + i8, this.mCapturedView.getTop() + i9, i8, i9);
saveLastMotion(motionEvent);
}
}
private void reportNewEdgeDrags(float f, float f2, int i) {
boolean checkNewEdgeDrag = checkNewEdgeDrag(f, f2, i, 1);
if (checkNewEdgeDrag(f2, f, i, 4)) {
checkNewEdgeDrag |= true;
}
if (checkNewEdgeDrag(f, f2, i, 2)) {
checkNewEdgeDrag |= true;
}
if (checkNewEdgeDrag(f2, f, i, 8)) {
checkNewEdgeDrag |= true;
}
if (checkNewEdgeDrag) {
int[] iArr = this.mEdgeDragsInProgress;
iArr[i] = iArr[i] | checkNewEdgeDrag;
this.mCallback.onEdgeDragStarted(checkNewEdgeDrag ? 1 : 0, i);
}
}
private boolean checkNewEdgeDrag(float f, float f2, int i, int i2) {
float abs = Math.abs(f);
float abs2 = Math.abs(f2);
if ((this.mInitialEdgesTouched[i] & i2) != i2 || (this.mTrackingEdges & i2) == 0 || (this.mEdgeDragsLocked[i] & i2) == i2 || (this.mEdgeDragsInProgress[i] & i2) == i2) {
return false;
}
int i3 = this.mTouchSlop;
if (abs <= ((float) i3) && abs2 <= ((float) i3)) {
return false;
}
if (abs < abs2 * 0.5f && this.mCallback.onEdgeLock(i2)) {
int[] iArr = this.mEdgeDragsLocked;
iArr[i] = iArr[i] | i2;
return false;
} else if ((this.mEdgeDragsInProgress[i] & i2) != 0 || abs <= ((float) this.mTouchSlop)) {
return false;
} else {
return true;
}
}
private boolean checkTouchSlop(View view, float f, float f2) {
if (view == null) {
return false;
}
boolean z = this.mCallback.getViewHorizontalDragRange(view) > 0;
boolean z2 = this.mCallback.getViewVerticalDragRange(view) > 0;
if (z && z2) {
int i = this.mTouchSlop;
if ((f * f) + (f2 * f2) > ((float) (i * i))) {
return true;
}
return false;
} else if (z) {
if (Math.abs(f) > ((float) this.mTouchSlop)) {
return true;
}
return false;
} else if (!z2 || Math.abs(f2) <= ((float) this.mTouchSlop)) {
return false;
} else {
return true;
}
}
public boolean checkTouchSlop(int i) {
int length = this.mInitialMotionX.length;
for (int i2 = 0; i2 < length; i2++) {
if (checkTouchSlop(i, i2)) {
return true;
}
}
return false;
}
public boolean checkTouchSlop(int i, int i2) {
if (!isPointerDown(i2)) {
return false;
}
boolean z = (i & 1) == 1;
boolean z2 = (i & 2) == 2;
float f = this.mLastMotionX[i2] - this.mInitialMotionX[i2];
float f2 = this.mLastMotionY[i2] - this.mInitialMotionY[i2];
if (z && z2) {
int i3 = this.mTouchSlop;
if ((f * f) + (f2 * f2) > ((float) (i3 * i3))) {
return true;
}
return false;
} else if (z) {
if (Math.abs(f) > ((float) this.mTouchSlop)) {
return true;
}
return false;
} else if (!z2 || Math.abs(f2) <= ((float) this.mTouchSlop)) {
return false;
} else {
return true;
}
}
public boolean isEdgeTouched(int i) {
int length = this.mInitialEdgesTouched.length;
for (int i2 = 0; i2 < length; i2++) {
if (isEdgeTouched(i, i2)) {
return true;
}
}
return false;
}
public boolean isEdgeTouched(int i, int i2) {
return isPointerDown(i2) && (i & this.mInitialEdgesTouched[i2]) != 0;
}
private void releaseViewForPointerUp() {
this.mVelocityTracker.computeCurrentVelocity(1000, this.mMaxVelocity);
dispatchViewReleased(clampMag(this.mVelocityTracker.getXVelocity(this.mActivePointerId), this.mMinVelocity, this.mMaxVelocity), clampMag(this.mVelocityTracker.getYVelocity(this.mActivePointerId), this.mMinVelocity, this.mMaxVelocity));
}
private void dragTo(int i, int i2, int i3, int i4) {
int left = this.mCapturedView.getLeft();
int top = this.mCapturedView.getTop();
if (i3 != 0) {
i = this.mCallback.clampViewPositionHorizontal(this.mCapturedView, i, i3);
ViewCompat.offsetLeftAndRight(this.mCapturedView, i - left);
}
int i5 = i;
if (i4 != 0) {
i2 = this.mCallback.clampViewPositionVertical(this.mCapturedView, i2, i4);
ViewCompat.offsetTopAndBottom(this.mCapturedView, i2 - top);
}
int i6 = i2;
if (i3 != 0 || i4 != 0) {
this.mCallback.onViewPositionChanged(this.mCapturedView, i5, i6, i5 - left, i6 - top);
}
}
public boolean isCapturedViewUnder(int i, int i2) {
return isViewUnder(this.mCapturedView, i, i2);
}
public boolean isViewUnder(View view, int i, int i2) {
if (view != null && i >= view.getLeft() && i < view.getRight() && i2 >= view.getTop() && i2 < view.getBottom()) {
return true;
}
return false;
}
public View findTopChildUnder(int i, int i2) {
for (int childCount = this.mParentView.getChildCount() - 1; childCount >= 0; childCount--) {
View childAt = this.mParentView.getChildAt(this.mCallback.getOrderedChildIndex(childCount));
if (i >= childAt.getLeft() && i < childAt.getRight() && i2 >= childAt.getTop() && i2 < childAt.getBottom()) {
return childAt;
}
}
return null;
}
private int getEdgesTouched(int i, int i2) {
int i3 = i < this.mParentView.getLeft() + this.mEdgeSize ? 1 : 0;
if (i2 < this.mParentView.getTop() + this.mEdgeSize) {
i3 |= 4;
}
if (i > this.mParentView.getRight() - this.mEdgeSize) {
i3 |= 2;
}
return i2 > this.mParentView.getBottom() - this.mEdgeSize ? i3 | 8 : i3;
}
private boolean isValidPointerForActionMove(int i) {
if (isPointerDown(i)) {
return true;
}
Log.e(TAG, "Ignoring pointerId=" + i + " because ACTION_DOWN was not received " + "for this pointer before ACTION_MOVE. It likely happened because " + " ViewDragHelper did not receive all the events in the event stream.");
return false;
}
}
Download file