331 lines
14 KiB
Java
331 lines
14 KiB
Java
package androidx.recyclerview.widget;
|
|
|
|
import android.animation.Animator;
|
|
import android.graphics.Canvas;
|
|
import android.view.View;
|
|
import android.view.animation.Interpolator;
|
|
import androidx.core.view.ViewCompat;
|
|
import androidx.recyclerview.R$dimen;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
import java.util.List;
|
|
|
|
/* loaded from: classes.dex */
|
|
public class ItemTouchHelper extends RecyclerView.ItemDecoration implements RecyclerView.OnChildAttachStateChangeListener {
|
|
|
|
public static abstract class Callback {
|
|
private static final int ABS_HORIZONTAL_DIR_FLAGS = 789516;
|
|
public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200;
|
|
public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250;
|
|
private static final long DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS = 2000;
|
|
static final int RELATIVE_DIR_FLAGS = 3158064;
|
|
private static final Interpolator sDragScrollInterpolator = new Interpolator() { // from class: androidx.recyclerview.widget.ItemTouchHelper.Callback.1
|
|
@Override // android.animation.TimeInterpolator
|
|
public float getInterpolation(float f) {
|
|
return f * f * f * f * f;
|
|
}
|
|
};
|
|
private static final Interpolator sDragViewScrollCapInterpolator = new Interpolator() { // from class: androidx.recyclerview.widget.ItemTouchHelper.Callback.2
|
|
@Override // android.animation.TimeInterpolator
|
|
public float getInterpolation(float f) {
|
|
float f2 = f - 1.0f;
|
|
return (f2 * f2 * f2 * f2 * f2) + 1.0f;
|
|
}
|
|
};
|
|
private int mCachedMaxScrollSpeed = -1;
|
|
|
|
public static int convertToRelativeDirection(int i, int i2) {
|
|
int i3;
|
|
int i4 = i & ABS_HORIZONTAL_DIR_FLAGS;
|
|
if (i4 == 0) {
|
|
return i;
|
|
}
|
|
int i5 = i & (~i4);
|
|
if (i2 == 0) {
|
|
i3 = i4 << 2;
|
|
} else {
|
|
int i6 = i4 << 1;
|
|
i5 |= (-789517) & i6;
|
|
i3 = (i6 & ABS_HORIZONTAL_DIR_FLAGS) << 2;
|
|
}
|
|
return i5 | i3;
|
|
}
|
|
|
|
public static ItemTouchUIUtil getDefaultUIUtil() {
|
|
return ItemTouchUIUtilImpl.a;
|
|
}
|
|
|
|
private int getMaxDragScroll(RecyclerView recyclerView) {
|
|
if (this.mCachedMaxScrollSpeed == -1) {
|
|
this.mCachedMaxScrollSpeed = recyclerView.getResources().getDimensionPixelSize(R$dimen.item_touch_helper_max_drag_scroll_per_frame);
|
|
}
|
|
return this.mCachedMaxScrollSpeed;
|
|
}
|
|
|
|
public static int makeFlag(int i, int i2) {
|
|
return i2 << (i * 8);
|
|
}
|
|
|
|
public static int makeMovementFlags(int i, int i2) {
|
|
return makeFlag(2, i) | makeFlag(1, i2) | makeFlag(0, i2 | i);
|
|
}
|
|
|
|
public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder viewHolder2) {
|
|
return true;
|
|
}
|
|
|
|
public RecyclerView.ViewHolder chooseDropTarget(RecyclerView.ViewHolder viewHolder, List<RecyclerView.ViewHolder> list, int i, int i2) {
|
|
int i3;
|
|
int bottom;
|
|
int top;
|
|
int abs;
|
|
int left;
|
|
int abs2;
|
|
int right;
|
|
int width = i + viewHolder.itemView.getWidth();
|
|
int height = i2 + viewHolder.itemView.getHeight();
|
|
int left2 = i - viewHolder.itemView.getLeft();
|
|
int top2 = i2 - viewHolder.itemView.getTop();
|
|
int size = list.size();
|
|
RecyclerView.ViewHolder viewHolder2 = null;
|
|
int i4 = -1;
|
|
for (int i5 = 0; i5 < size; i5++) {
|
|
RecyclerView.ViewHolder viewHolder3 = list.get(i5);
|
|
if (left2 <= 0 || (right = viewHolder3.itemView.getRight() - width) >= 0 || viewHolder3.itemView.getRight() <= viewHolder.itemView.getRight() || (i3 = Math.abs(right)) <= i4) {
|
|
i3 = i4;
|
|
} else {
|
|
viewHolder2 = viewHolder3;
|
|
}
|
|
if (left2 < 0 && (left = viewHolder3.itemView.getLeft() - i) > 0 && viewHolder3.itemView.getLeft() < viewHolder.itemView.getLeft() && (abs2 = Math.abs(left)) > i3) {
|
|
i3 = abs2;
|
|
viewHolder2 = viewHolder3;
|
|
}
|
|
if (top2 < 0 && (top = viewHolder3.itemView.getTop() - i2) > 0 && viewHolder3.itemView.getTop() < viewHolder.itemView.getTop() && (abs = Math.abs(top)) > i3) {
|
|
i3 = abs;
|
|
viewHolder2 = viewHolder3;
|
|
}
|
|
if (top2 <= 0 || (bottom = viewHolder3.itemView.getBottom() - height) >= 0 || viewHolder3.itemView.getBottom() <= viewHolder.itemView.getBottom() || (i4 = Math.abs(bottom)) <= i3) {
|
|
i4 = i3;
|
|
} else {
|
|
viewHolder2 = viewHolder3;
|
|
}
|
|
}
|
|
return viewHolder2;
|
|
}
|
|
|
|
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
|
ItemTouchUIUtilImpl.a.a(viewHolder.itemView);
|
|
}
|
|
|
|
public int convertToAbsoluteDirection(int i, int i2) {
|
|
int i3;
|
|
int i4 = i & RELATIVE_DIR_FLAGS;
|
|
if (i4 == 0) {
|
|
return i;
|
|
}
|
|
int i5 = i & (~i4);
|
|
if (i2 == 0) {
|
|
i3 = i4 >> 2;
|
|
} else {
|
|
int i6 = i4 >> 1;
|
|
i5 |= (-3158065) & i6;
|
|
i3 = (i6 & RELATIVE_DIR_FLAGS) >> 2;
|
|
}
|
|
return i5 | i3;
|
|
}
|
|
|
|
final int getAbsoluteMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
|
return convertToAbsoluteDirection(getMovementFlags(recyclerView, viewHolder), ViewCompat.k(recyclerView));
|
|
}
|
|
|
|
public long getAnimationDuration(RecyclerView recyclerView, int i, float f, float f2) {
|
|
RecyclerView.ItemAnimator itemAnimator = recyclerView.getItemAnimator();
|
|
return itemAnimator == null ? i == 8 ? 200L : 250L : i == 8 ? itemAnimator.e() : itemAnimator.f();
|
|
}
|
|
|
|
public int getBoundingBoxMargin() {
|
|
return 0;
|
|
}
|
|
|
|
public abstract float getMoveThreshold(RecyclerView.ViewHolder viewHolder);
|
|
|
|
public abstract int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder);
|
|
|
|
public float getSwipeEscapeVelocity(float f) {
|
|
return f;
|
|
}
|
|
|
|
public abstract float getSwipeThreshold(RecyclerView.ViewHolder viewHolder);
|
|
|
|
public float getSwipeVelocityThreshold(float f) {
|
|
return f;
|
|
}
|
|
|
|
boolean hasDragFlag(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
|
return (getAbsoluteMovementFlags(recyclerView, viewHolder) & 16711680) != 0;
|
|
}
|
|
|
|
boolean hasSwipeFlag(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
|
|
return (getAbsoluteMovementFlags(recyclerView, viewHolder) & 65280) != 0;
|
|
}
|
|
|
|
public int interpolateOutOfBoundsScroll(RecyclerView recyclerView, int i, int i2, int i3, long j) {
|
|
int signum = (int) (((int) (((int) Math.signum(i2)) * getMaxDragScroll(recyclerView) * sDragViewScrollCapInterpolator.getInterpolation(Math.min(1.0f, (Math.abs(i2) * 1.0f) / i)))) * sDragScrollInterpolator.getInterpolation(j <= DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS ? j / 2000.0f : 1.0f));
|
|
return signum == 0 ? i2 > 0 ? 1 : -1 : signum;
|
|
}
|
|
|
|
public abstract boolean isItemViewSwipeEnabled();
|
|
|
|
public abstract boolean isLongPressDragEnabled();
|
|
|
|
public void onChildDraw(Canvas canvas, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float f, float f2, int i, boolean z) {
|
|
ItemTouchUIUtilImpl.a.b(canvas, recyclerView, viewHolder.itemView, f, f2, i, z);
|
|
}
|
|
|
|
public void onChildDrawOver(Canvas canvas, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float f, float f2, int i, boolean z) {
|
|
ItemTouchUIUtilImpl.a.a(canvas, recyclerView, viewHolder.itemView, f, f2, i, z);
|
|
}
|
|
|
|
void onDraw(Canvas canvas, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, List<RecoverAnimation> list, int i, float f, float f2) {
|
|
int size = list.size();
|
|
for (int i2 = 0; i2 < size; i2++) {
|
|
RecoverAnimation recoverAnimation = list.get(i2);
|
|
recoverAnimation.a();
|
|
int save = canvas.save();
|
|
onChildDraw(canvas, recyclerView, recoverAnimation.e, recoverAnimation.h, recoverAnimation.i, recoverAnimation.f, false);
|
|
canvas.restoreToCount(save);
|
|
}
|
|
if (viewHolder != null) {
|
|
int save2 = canvas.save();
|
|
onChildDraw(canvas, recyclerView, viewHolder, f, f2, i, true);
|
|
canvas.restoreToCount(save2);
|
|
}
|
|
}
|
|
|
|
void onDrawOver(Canvas canvas, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, List<RecoverAnimation> list, int i, float f, float f2) {
|
|
int size = list.size();
|
|
boolean z = false;
|
|
for (int i2 = 0; i2 < size; i2++) {
|
|
RecoverAnimation recoverAnimation = list.get(i2);
|
|
int save = canvas.save();
|
|
onChildDrawOver(canvas, recyclerView, recoverAnimation.e, recoverAnimation.h, recoverAnimation.i, recoverAnimation.f, false);
|
|
canvas.restoreToCount(save);
|
|
}
|
|
if (viewHolder != null) {
|
|
int save2 = canvas.save();
|
|
onChildDrawOver(canvas, recyclerView, viewHolder, f, f2, i, true);
|
|
canvas.restoreToCount(save2);
|
|
}
|
|
for (int i3 = size - 1; i3 >= 0; i3--) {
|
|
RecoverAnimation recoverAnimation2 = list.get(i3);
|
|
if (recoverAnimation2.j && !recoverAnimation2.g) {
|
|
list.remove(i3);
|
|
} else if (!recoverAnimation2.j) {
|
|
z = true;
|
|
}
|
|
}
|
|
if (z) {
|
|
recyclerView.invalidate();
|
|
}
|
|
}
|
|
|
|
public abstract boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder viewHolder2);
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int i, RecyclerView.ViewHolder viewHolder2, int i2, int i3, int i4) {
|
|
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
|
|
if (layoutManager instanceof ViewDropHandler) {
|
|
((ViewDropHandler) layoutManager).a(viewHolder.itemView, viewHolder2.itemView, i3, i4);
|
|
return;
|
|
}
|
|
if (layoutManager.a()) {
|
|
if (layoutManager.f(viewHolder2.itemView) <= recyclerView.getPaddingLeft()) {
|
|
recyclerView.j(i2);
|
|
}
|
|
if (layoutManager.i(viewHolder2.itemView) >= recyclerView.getWidth() - recyclerView.getPaddingRight()) {
|
|
recyclerView.j(i2);
|
|
}
|
|
}
|
|
if (layoutManager.b()) {
|
|
if (layoutManager.j(viewHolder2.itemView) <= recyclerView.getPaddingTop()) {
|
|
recyclerView.j(i2);
|
|
}
|
|
if (layoutManager.e(viewHolder2.itemView) >= recyclerView.getHeight() - recyclerView.getPaddingBottom()) {
|
|
recyclerView.j(i2);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int i) {
|
|
if (viewHolder != null) {
|
|
ItemTouchUIUtilImpl.a.b(viewHolder.itemView);
|
|
}
|
|
}
|
|
|
|
public abstract void onSwiped(RecyclerView.ViewHolder viewHolder, int i);
|
|
}
|
|
|
|
private static class RecoverAnimation implements Animator.AnimatorListener {
|
|
final float a;
|
|
final float b;
|
|
final float c;
|
|
final float d;
|
|
final RecyclerView.ViewHolder e;
|
|
final int f;
|
|
boolean g;
|
|
float h;
|
|
float i;
|
|
boolean j;
|
|
private float k;
|
|
|
|
public void a(float f) {
|
|
this.k = f;
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationCancel(Animator animator) {
|
|
a(1.0f);
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationEnd(Animator animator) {
|
|
if (!this.j) {
|
|
this.e.setIsRecyclable(true);
|
|
}
|
|
this.j = true;
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationRepeat(Animator animator) {
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationStart(Animator animator) {
|
|
}
|
|
|
|
public void a() {
|
|
float f = this.a;
|
|
float f2 = this.c;
|
|
if (f == f2) {
|
|
this.h = this.e.itemView.getTranslationX();
|
|
} else {
|
|
this.h = f + (this.k * (f2 - f));
|
|
}
|
|
float f3 = this.b;
|
|
float f4 = this.d;
|
|
if (f3 == f4) {
|
|
this.i = this.e.itemView.getTranslationY();
|
|
} else {
|
|
this.i = f3 + (this.k * (f4 - f3));
|
|
}
|
|
}
|
|
}
|
|
|
|
public interface ViewDropHandler {
|
|
void a(View view, View view2, int i, int i2);
|
|
}
|
|
|
|
public void a(RecyclerView.ViewHolder viewHolder) {
|
|
throw null;
|
|
}
|
|
}
|