463 lines
20 KiB
Java
463 lines
20 KiB
Java
package androidx.constraintlayout.helper.widget;
|
|
|
|
import android.content.Context;
|
|
import android.content.res.TypedArray;
|
|
import android.util.AttributeSet;
|
|
import android.util.Log;
|
|
import android.view.View;
|
|
import androidx.constraintlayout.motion.widget.MotionHelper;
|
|
import androidx.constraintlayout.motion.widget.MotionLayout;
|
|
import androidx.constraintlayout.motion.widget.MotionScene;
|
|
import androidx.constraintlayout.widget.ConstraintSet;
|
|
import androidx.constraintlayout.widget.R;
|
|
import androidx.recyclerview.widget.ItemTouchHelper;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
|
|
/* loaded from: classes.dex */
|
|
public class Carousel extends MotionHelper {
|
|
private static final boolean DEBUG = false;
|
|
private static final String TAG = "Carousel";
|
|
public static final int TOUCH_UP_CARRY_ON = 2;
|
|
public static final int TOUCH_UP_IMMEDIATE_STOP = 1;
|
|
private int backwardTransition;
|
|
private float dampening;
|
|
private int emptyViewBehavior;
|
|
private int firstViewReference;
|
|
private int forwardTransition;
|
|
private boolean infiniteCarousel;
|
|
private Adapter mAdapter;
|
|
private int mAnimateTargetDelay;
|
|
private int mIndex;
|
|
int mLastStartId;
|
|
private final ArrayList<View> mList;
|
|
private MotionLayout mMotionLayout;
|
|
private int mPreviousIndex;
|
|
private int mTargetIndex;
|
|
Runnable mUpdateRunnable;
|
|
private int nextState;
|
|
private int previousState;
|
|
private int startIndex;
|
|
private int touchUpMode;
|
|
private float velocityThreshold;
|
|
|
|
public interface Adapter {
|
|
int count();
|
|
|
|
void onNewItem(int index);
|
|
|
|
void populate(View view, int index);
|
|
}
|
|
|
|
public int getCurrentIndex() {
|
|
return this.mIndex;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.MotionHelper, androidx.constraintlayout.motion.widget.MotionLayout.TransitionListener
|
|
public void onTransitionChange(MotionLayout motionLayout, int startId, int endId, float progress) {
|
|
this.mLastStartId = startId;
|
|
}
|
|
|
|
public void setAdapter(Adapter adapter) {
|
|
this.mAdapter = adapter;
|
|
}
|
|
|
|
public Carousel(Context context) {
|
|
super(context);
|
|
this.mAdapter = null;
|
|
this.mList = new ArrayList<>();
|
|
this.mPreviousIndex = 0;
|
|
this.mIndex = 0;
|
|
this.firstViewReference = -1;
|
|
this.infiniteCarousel = false;
|
|
this.backwardTransition = -1;
|
|
this.forwardTransition = -1;
|
|
this.previousState = -1;
|
|
this.nextState = -1;
|
|
this.dampening = 0.9f;
|
|
this.startIndex = 0;
|
|
this.emptyViewBehavior = 4;
|
|
this.touchUpMode = 1;
|
|
this.velocityThreshold = 2.0f;
|
|
this.mTargetIndex = -1;
|
|
this.mAnimateTargetDelay = ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION;
|
|
this.mLastStartId = -1;
|
|
this.mUpdateRunnable = new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
Carousel.this.mMotionLayout.setProgress(0.0f);
|
|
Carousel.this.updateItems();
|
|
Carousel.this.mAdapter.onNewItem(Carousel.this.mIndex);
|
|
float velocity = Carousel.this.mMotionLayout.getVelocity();
|
|
if (Carousel.this.touchUpMode != 2 || velocity <= Carousel.this.velocityThreshold || Carousel.this.mIndex >= Carousel.this.mAdapter.count() - 1) {
|
|
return;
|
|
}
|
|
final float f = velocity * Carousel.this.dampening;
|
|
if (Carousel.this.mIndex != 0 || Carousel.this.mPreviousIndex <= Carousel.this.mIndex) {
|
|
if (Carousel.this.mIndex != Carousel.this.mAdapter.count() - 1 || Carousel.this.mPreviousIndex >= Carousel.this.mIndex) {
|
|
Carousel.this.mMotionLayout.post(new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel.1.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
Carousel.this.mMotionLayout.touchAnimateTo(5, 1.0f, f);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
public Carousel(Context context, AttributeSet attrs) {
|
|
super(context, attrs);
|
|
this.mAdapter = null;
|
|
this.mList = new ArrayList<>();
|
|
this.mPreviousIndex = 0;
|
|
this.mIndex = 0;
|
|
this.firstViewReference = -1;
|
|
this.infiniteCarousel = false;
|
|
this.backwardTransition = -1;
|
|
this.forwardTransition = -1;
|
|
this.previousState = -1;
|
|
this.nextState = -1;
|
|
this.dampening = 0.9f;
|
|
this.startIndex = 0;
|
|
this.emptyViewBehavior = 4;
|
|
this.touchUpMode = 1;
|
|
this.velocityThreshold = 2.0f;
|
|
this.mTargetIndex = -1;
|
|
this.mAnimateTargetDelay = ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION;
|
|
this.mLastStartId = -1;
|
|
this.mUpdateRunnable = new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
Carousel.this.mMotionLayout.setProgress(0.0f);
|
|
Carousel.this.updateItems();
|
|
Carousel.this.mAdapter.onNewItem(Carousel.this.mIndex);
|
|
float velocity = Carousel.this.mMotionLayout.getVelocity();
|
|
if (Carousel.this.touchUpMode != 2 || velocity <= Carousel.this.velocityThreshold || Carousel.this.mIndex >= Carousel.this.mAdapter.count() - 1) {
|
|
return;
|
|
}
|
|
final float f = velocity * Carousel.this.dampening;
|
|
if (Carousel.this.mIndex != 0 || Carousel.this.mPreviousIndex <= Carousel.this.mIndex) {
|
|
if (Carousel.this.mIndex != Carousel.this.mAdapter.count() - 1 || Carousel.this.mPreviousIndex >= Carousel.this.mIndex) {
|
|
Carousel.this.mMotionLayout.post(new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel.1.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
Carousel.this.mMotionLayout.touchAnimateTo(5, 1.0f, f);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
init(context, attrs);
|
|
}
|
|
|
|
public Carousel(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
super(context, attrs, defStyleAttr);
|
|
this.mAdapter = null;
|
|
this.mList = new ArrayList<>();
|
|
this.mPreviousIndex = 0;
|
|
this.mIndex = 0;
|
|
this.firstViewReference = -1;
|
|
this.infiniteCarousel = false;
|
|
this.backwardTransition = -1;
|
|
this.forwardTransition = -1;
|
|
this.previousState = -1;
|
|
this.nextState = -1;
|
|
this.dampening = 0.9f;
|
|
this.startIndex = 0;
|
|
this.emptyViewBehavior = 4;
|
|
this.touchUpMode = 1;
|
|
this.velocityThreshold = 2.0f;
|
|
this.mTargetIndex = -1;
|
|
this.mAnimateTargetDelay = ItemTouchHelper.Callback.DEFAULT_DRAG_ANIMATION_DURATION;
|
|
this.mLastStartId = -1;
|
|
this.mUpdateRunnable = new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
Carousel.this.mMotionLayout.setProgress(0.0f);
|
|
Carousel.this.updateItems();
|
|
Carousel.this.mAdapter.onNewItem(Carousel.this.mIndex);
|
|
float velocity = Carousel.this.mMotionLayout.getVelocity();
|
|
if (Carousel.this.touchUpMode != 2 || velocity <= Carousel.this.velocityThreshold || Carousel.this.mIndex >= Carousel.this.mAdapter.count() - 1) {
|
|
return;
|
|
}
|
|
final float f = velocity * Carousel.this.dampening;
|
|
if (Carousel.this.mIndex != 0 || Carousel.this.mPreviousIndex <= Carousel.this.mIndex) {
|
|
if (Carousel.this.mIndex != Carousel.this.mAdapter.count() - 1 || Carousel.this.mPreviousIndex >= Carousel.this.mIndex) {
|
|
Carousel.this.mMotionLayout.post(new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel.1.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
Carousel.this.mMotionLayout.touchAnimateTo(5, 1.0f, f);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
init(context, attrs);
|
|
}
|
|
|
|
private void init(Context context, AttributeSet attrs) {
|
|
if (attrs != null) {
|
|
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attrs, R.styleable.Carousel);
|
|
int indexCount = obtainStyledAttributes.getIndexCount();
|
|
for (int i = 0; i < indexCount; i++) {
|
|
int index = obtainStyledAttributes.getIndex(i);
|
|
if (index == R.styleable.Carousel_carousel_firstView) {
|
|
this.firstViewReference = obtainStyledAttributes.getResourceId(index, this.firstViewReference);
|
|
} else if (index == R.styleable.Carousel_carousel_backwardTransition) {
|
|
this.backwardTransition = obtainStyledAttributes.getResourceId(index, this.backwardTransition);
|
|
} else if (index == R.styleable.Carousel_carousel_forwardTransition) {
|
|
this.forwardTransition = obtainStyledAttributes.getResourceId(index, this.forwardTransition);
|
|
} else if (index == R.styleable.Carousel_carousel_emptyViewsBehavior) {
|
|
this.emptyViewBehavior = obtainStyledAttributes.getInt(index, this.emptyViewBehavior);
|
|
} else if (index == R.styleable.Carousel_carousel_previousState) {
|
|
this.previousState = obtainStyledAttributes.getResourceId(index, this.previousState);
|
|
} else if (index == R.styleable.Carousel_carousel_nextState) {
|
|
this.nextState = obtainStyledAttributes.getResourceId(index, this.nextState);
|
|
} else if (index == R.styleable.Carousel_carousel_touchUp_dampeningFactor) {
|
|
this.dampening = obtainStyledAttributes.getFloat(index, this.dampening);
|
|
} else if (index == R.styleable.Carousel_carousel_touchUpMode) {
|
|
this.touchUpMode = obtainStyledAttributes.getInt(index, this.touchUpMode);
|
|
} else if (index == R.styleable.Carousel_carousel_touchUp_velocityThreshold) {
|
|
this.velocityThreshold = obtainStyledAttributes.getFloat(index, this.velocityThreshold);
|
|
} else if (index == R.styleable.Carousel_carousel_infinite) {
|
|
this.infiniteCarousel = obtainStyledAttributes.getBoolean(index, this.infiniteCarousel);
|
|
}
|
|
}
|
|
obtainStyledAttributes.recycle();
|
|
}
|
|
}
|
|
|
|
public int getCount() {
|
|
Adapter adapter = this.mAdapter;
|
|
if (adapter != null) {
|
|
return adapter.count();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public void transitionToIndex(int index, int delay) {
|
|
this.mTargetIndex = Math.max(0, Math.min(getCount() - 1, index));
|
|
int max = Math.max(0, delay);
|
|
this.mAnimateTargetDelay = max;
|
|
this.mMotionLayout.setTransitionDuration(max);
|
|
if (index < this.mIndex) {
|
|
this.mMotionLayout.transitionToState(this.previousState, this.mAnimateTargetDelay);
|
|
} else {
|
|
this.mMotionLayout.transitionToState(this.nextState, this.mAnimateTargetDelay);
|
|
}
|
|
}
|
|
|
|
public void jumpToIndex(int index) {
|
|
this.mIndex = Math.max(0, Math.min(getCount() - 1, index));
|
|
refresh();
|
|
}
|
|
|
|
public void refresh() {
|
|
int size = this.mList.size();
|
|
for (int i = 0; i < size; i++) {
|
|
View view = this.mList.get(i);
|
|
if (this.mAdapter.count() == 0) {
|
|
updateViewVisibility(view, this.emptyViewBehavior);
|
|
} else {
|
|
updateViewVisibility(view, 0);
|
|
}
|
|
}
|
|
this.mMotionLayout.rebuildScene();
|
|
updateItems();
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.MotionHelper, androidx.constraintlayout.motion.widget.MotionLayout.TransitionListener
|
|
public void onTransitionCompleted(MotionLayout motionLayout, int currentId) {
|
|
int i = this.mIndex;
|
|
this.mPreviousIndex = i;
|
|
if (currentId == this.nextState) {
|
|
this.mIndex = i + 1;
|
|
} else if (currentId == this.previousState) {
|
|
this.mIndex = i - 1;
|
|
}
|
|
if (this.infiniteCarousel) {
|
|
if (this.mIndex >= this.mAdapter.count()) {
|
|
this.mIndex = 0;
|
|
}
|
|
if (this.mIndex < 0) {
|
|
this.mIndex = this.mAdapter.count() - 1;
|
|
}
|
|
} else {
|
|
if (this.mIndex >= this.mAdapter.count()) {
|
|
this.mIndex = this.mAdapter.count() - 1;
|
|
}
|
|
if (this.mIndex < 0) {
|
|
this.mIndex = 0;
|
|
}
|
|
}
|
|
if (this.mPreviousIndex != this.mIndex) {
|
|
this.mMotionLayout.post(this.mUpdateRunnable);
|
|
}
|
|
}
|
|
|
|
private void enableAllTransitions(boolean enable) {
|
|
Iterator<MotionScene.Transition> it = this.mMotionLayout.getDefinedTransitions().iterator();
|
|
while (it.hasNext()) {
|
|
it.next().setEnabled(enable);
|
|
}
|
|
}
|
|
|
|
private boolean enableTransition(int transitionID, boolean enable) {
|
|
MotionLayout motionLayout;
|
|
MotionScene.Transition transition;
|
|
if (transitionID == -1 || (motionLayout = this.mMotionLayout) == null || (transition = motionLayout.getTransition(transitionID)) == null || enable == transition.isEnabled()) {
|
|
return false;
|
|
}
|
|
transition.setEnabled(enable);
|
|
return true;
|
|
}
|
|
|
|
@Override // androidx.constraintlayout.widget.ConstraintHelper, android.view.View
|
|
protected void onAttachedToWindow() {
|
|
super.onAttachedToWindow();
|
|
if (getParent() instanceof MotionLayout) {
|
|
MotionLayout motionLayout = (MotionLayout) getParent();
|
|
for (int i = 0; i < this.mCount; i++) {
|
|
int i2 = this.mIds[i];
|
|
View viewById = motionLayout.getViewById(i2);
|
|
if (this.firstViewReference == i2) {
|
|
this.startIndex = i;
|
|
}
|
|
this.mList.add(viewById);
|
|
}
|
|
this.mMotionLayout = motionLayout;
|
|
if (this.touchUpMode == 2) {
|
|
MotionScene.Transition transition = motionLayout.getTransition(this.forwardTransition);
|
|
if (transition != null) {
|
|
transition.setOnTouchUp(5);
|
|
}
|
|
MotionScene.Transition transition2 = this.mMotionLayout.getTransition(this.backwardTransition);
|
|
if (transition2 != null) {
|
|
transition2.setOnTouchUp(5);
|
|
}
|
|
}
|
|
updateItems();
|
|
}
|
|
}
|
|
|
|
private boolean updateViewVisibility(View view, int visibility) {
|
|
MotionLayout motionLayout = this.mMotionLayout;
|
|
if (motionLayout == null) {
|
|
return false;
|
|
}
|
|
boolean z = false;
|
|
for (int i : motionLayout.getConstraintSetIds()) {
|
|
z |= updateViewVisibility(i, view, visibility);
|
|
}
|
|
return z;
|
|
}
|
|
|
|
private boolean updateViewVisibility(int constraintSetId, View view, int visibility) {
|
|
ConstraintSet.Constraint constraint;
|
|
ConstraintSet constraintSet = this.mMotionLayout.getConstraintSet(constraintSetId);
|
|
if (constraintSet == null || (constraint = constraintSet.getConstraint(view.getId())) == null) {
|
|
return false;
|
|
}
|
|
constraint.propertySet.mVisibilityMode = 1;
|
|
view.setVisibility(visibility);
|
|
return true;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void updateItems() {
|
|
Adapter adapter = this.mAdapter;
|
|
if (adapter == null || this.mMotionLayout == null || adapter.count() == 0) {
|
|
return;
|
|
}
|
|
int size = this.mList.size();
|
|
for (int i = 0; i < size; i++) {
|
|
View view = this.mList.get(i);
|
|
int i2 = (this.mIndex + i) - this.startIndex;
|
|
if (this.infiniteCarousel) {
|
|
if (i2 < 0) {
|
|
int i3 = this.emptyViewBehavior;
|
|
if (i3 != 4) {
|
|
updateViewVisibility(view, i3);
|
|
} else {
|
|
updateViewVisibility(view, 0);
|
|
}
|
|
if (i2 % this.mAdapter.count() == 0) {
|
|
this.mAdapter.populate(view, 0);
|
|
} else {
|
|
Adapter adapter2 = this.mAdapter;
|
|
adapter2.populate(view, adapter2.count() + (i2 % this.mAdapter.count()));
|
|
}
|
|
} else if (i2 >= this.mAdapter.count()) {
|
|
if (i2 == this.mAdapter.count()) {
|
|
i2 = 0;
|
|
} else if (i2 > this.mAdapter.count()) {
|
|
i2 %= this.mAdapter.count();
|
|
}
|
|
int i4 = this.emptyViewBehavior;
|
|
if (i4 != 4) {
|
|
updateViewVisibility(view, i4);
|
|
} else {
|
|
updateViewVisibility(view, 0);
|
|
}
|
|
this.mAdapter.populate(view, i2);
|
|
} else {
|
|
updateViewVisibility(view, 0);
|
|
this.mAdapter.populate(view, i2);
|
|
}
|
|
} else if (i2 < 0) {
|
|
updateViewVisibility(view, this.emptyViewBehavior);
|
|
} else if (i2 >= this.mAdapter.count()) {
|
|
updateViewVisibility(view, this.emptyViewBehavior);
|
|
} else {
|
|
updateViewVisibility(view, 0);
|
|
this.mAdapter.populate(view, i2);
|
|
}
|
|
}
|
|
int i5 = this.mTargetIndex;
|
|
if (i5 != -1 && i5 != this.mIndex) {
|
|
this.mMotionLayout.post(new Runnable() { // from class: androidx.constraintlayout.helper.widget.Carousel$$ExternalSyntheticLambda0
|
|
@Override // java.lang.Runnable
|
|
public final void run() {
|
|
Carousel.this.m48xc943cdea();
|
|
}
|
|
});
|
|
} else if (i5 == this.mIndex) {
|
|
this.mTargetIndex = -1;
|
|
}
|
|
if (this.backwardTransition == -1 || this.forwardTransition == -1) {
|
|
Log.w(TAG, "No backward or forward transitions defined for Carousel!");
|
|
return;
|
|
}
|
|
if (this.infiniteCarousel) {
|
|
return;
|
|
}
|
|
int count = this.mAdapter.count();
|
|
if (this.mIndex == 0) {
|
|
enableTransition(this.backwardTransition, false);
|
|
} else {
|
|
enableTransition(this.backwardTransition, true);
|
|
this.mMotionLayout.setTransition(this.backwardTransition);
|
|
}
|
|
if (this.mIndex == count - 1) {
|
|
enableTransition(this.forwardTransition, false);
|
|
} else {
|
|
enableTransition(this.forwardTransition, true);
|
|
this.mMotionLayout.setTransition(this.forwardTransition);
|
|
}
|
|
}
|
|
|
|
/* renamed from: lambda$updateItems$0$androidx-constraintlayout-helper-widget-Carousel, reason: not valid java name */
|
|
/* synthetic */ void m48xc943cdea() {
|
|
this.mMotionLayout.setTransitionDuration(this.mAnimateTargetDelay);
|
|
if (this.mTargetIndex < this.mIndex) {
|
|
this.mMotionLayout.transitionToState(this.previousState, this.mAnimateTargetDelay);
|
|
} else {
|
|
this.mMotionLayout.transitionToState(this.nextState, this.mAnimateTargetDelay);
|
|
}
|
|
}
|
|
}
|