ADD week 5

This commit is contained in:
2025-03-31 16:33:42 +02:00
parent 86f265f22d
commit bf645048e6
4927 changed files with 544053 additions and 0 deletions

View File

@ -0,0 +1,171 @@
package com.google.android.material.behavior;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.TimeInterpolator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.R;
import com.google.android.material.animation.AnimationUtils;
import com.google.android.material.motion.MotionUtils;
import java.util.Iterator;
import java.util.LinkedHashSet;
/* loaded from: classes.dex */
public class HideBottomViewOnScrollBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
private static final int DEFAULT_ENTER_ANIMATION_DURATION_MS = 225;
private static final int DEFAULT_EXIT_ANIMATION_DURATION_MS = 175;
public static final int STATE_SCROLLED_DOWN = 1;
public static final int STATE_SCROLLED_UP = 2;
private int additionalHiddenOffsetY;
private ViewPropertyAnimator currentAnimator;
private int currentState;
private int enterAnimDuration;
private TimeInterpolator enterAnimInterpolator;
private int exitAnimDuration;
private TimeInterpolator exitAnimInterpolator;
private int height;
private final LinkedHashSet<OnScrollStateChangedListener> onScrollStateChangedListeners;
private static final int ENTER_ANIM_DURATION_ATTR = R.attr.motionDurationLong2;
private static final int EXIT_ANIM_DURATION_ATTR = R.attr.motionDurationMedium4;
private static final int ENTER_EXIT_ANIM_EASING_ATTR = R.attr.motionEasingEmphasizedInterpolator;
public interface OnScrollStateChangedListener {
void onStateChanged(View view, int i);
}
public @interface ScrollState {
}
public boolean isScrolledDown() {
return this.currentState == 1;
}
public boolean isScrolledUp() {
return this.currentState == 2;
}
@Override // androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V v, View view, View view2, int i, int i2) {
return i == 2;
}
public HideBottomViewOnScrollBehavior() {
this.onScrollStateChangedListeners = new LinkedHashSet<>();
this.height = 0;
this.currentState = 2;
this.additionalHiddenOffsetY = 0;
}
public HideBottomViewOnScrollBehavior(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
this.onScrollStateChangedListeners = new LinkedHashSet<>();
this.height = 0;
this.currentState = 2;
this.additionalHiddenOffsetY = 0;
}
@Override // androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
public boolean onLayoutChild(CoordinatorLayout coordinatorLayout, V v, int i) {
this.height = v.getMeasuredHeight() + ((ViewGroup.MarginLayoutParams) v.getLayoutParams()).bottomMargin;
this.enterAnimDuration = MotionUtils.resolveThemeDuration(v.getContext(), ENTER_ANIM_DURATION_ATTR, DEFAULT_ENTER_ANIMATION_DURATION_MS);
this.exitAnimDuration = MotionUtils.resolveThemeDuration(v.getContext(), EXIT_ANIM_DURATION_ATTR, DEFAULT_EXIT_ANIMATION_DURATION_MS);
Context context = v.getContext();
int i2 = ENTER_EXIT_ANIM_EASING_ATTR;
this.enterAnimInterpolator = MotionUtils.resolveThemeInterpolator(context, i2, AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR);
this.exitAnimInterpolator = MotionUtils.resolveThemeInterpolator(v.getContext(), i2, AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR);
return super.onLayoutChild(coordinatorLayout, v, i);
}
public void setAdditionalHiddenOffsetY(V v, int i) {
this.additionalHiddenOffsetY = i;
if (this.currentState == 1) {
v.setTranslationY(this.height + i);
}
}
@Override // androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
public void onNestedScroll(CoordinatorLayout coordinatorLayout, V v, View view, int i, int i2, int i3, int i4, int i5, int[] iArr) {
if (i2 > 0) {
slideDown(v);
} else if (i2 < 0) {
slideUp(v);
}
}
public void slideUp(V v) {
slideUp(v, true);
}
public void slideUp(V v, boolean z) {
if (isScrolledUp()) {
return;
}
ViewPropertyAnimator viewPropertyAnimator = this.currentAnimator;
if (viewPropertyAnimator != null) {
viewPropertyAnimator.cancel();
v.clearAnimation();
}
updateCurrentState(v, 2);
if (z) {
animateChildTo(v, 0, this.enterAnimDuration, this.enterAnimInterpolator);
} else {
v.setTranslationY(0);
}
}
public void slideDown(V v) {
slideDown(v, true);
}
public void slideDown(V v, boolean z) {
if (isScrolledDown()) {
return;
}
ViewPropertyAnimator viewPropertyAnimator = this.currentAnimator;
if (viewPropertyAnimator != null) {
viewPropertyAnimator.cancel();
v.clearAnimation();
}
updateCurrentState(v, 1);
int i = this.height + this.additionalHiddenOffsetY;
if (z) {
animateChildTo(v, i, this.exitAnimDuration, this.exitAnimInterpolator);
} else {
v.setTranslationY(i);
}
}
private void updateCurrentState(V v, int i) {
this.currentState = i;
Iterator<OnScrollStateChangedListener> it = this.onScrollStateChangedListeners.iterator();
while (it.hasNext()) {
it.next().onStateChanged(v, this.currentState);
}
}
private void animateChildTo(V v, int i, long j, TimeInterpolator timeInterpolator) {
this.currentAnimator = v.animate().translationY(i).setInterpolator(timeInterpolator).setDuration(j).setListener(new AnimatorListenerAdapter() { // from class: com.google.android.material.behavior.HideBottomViewOnScrollBehavior.1
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
public void onAnimationEnd(Animator animator) {
HideBottomViewOnScrollBehavior.this.currentAnimator = null;
}
});
}
public void addOnScrollStateChangedListener(OnScrollStateChangedListener onScrollStateChangedListener) {
this.onScrollStateChangedListeners.add(onScrollStateChangedListener);
}
public void removeOnScrollStateChangedListener(OnScrollStateChangedListener onScrollStateChangedListener) {
this.onScrollStateChangedListeners.remove(onScrollStateChangedListener);
}
public void clearOnScrollStateChangedListeners() {
this.onScrollStateChangedListeners.clear();
}
}

View File

@ -0,0 +1,332 @@
package com.google.android.material.behavior;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.core.view.accessibility.AccessibilityViewCommand;
import androidx.customview.widget.ViewDragHelper;
/* loaded from: classes.dex */
public class SwipeDismissBehavior<V extends View> extends CoordinatorLayout.Behavior<V> {
private static final float DEFAULT_ALPHA_END_DISTANCE = 0.5f;
private static final float DEFAULT_ALPHA_START_DISTANCE = 0.0f;
private static final float DEFAULT_DRAG_DISMISS_THRESHOLD = 0.5f;
public static final int STATE_DRAGGING = 1;
public static final int STATE_IDLE = 0;
public static final int STATE_SETTLING = 2;
public static final int SWIPE_DIRECTION_ANY = 2;
public static final int SWIPE_DIRECTION_END_TO_START = 1;
public static final int SWIPE_DIRECTION_START_TO_END = 0;
private boolean interceptingEvents;
OnDismissListener listener;
private boolean requestingDisallowInterceptTouchEvent;
private boolean sensitivitySet;
ViewDragHelper viewDragHelper;
private float sensitivity = 0.0f;
int swipeDirection = 2;
float dragDismissThreshold = 0.5f;
float alphaStartSwipeDistance = 0.0f;
float alphaEndSwipeDistance = 0.5f;
private final ViewDragHelper.Callback dragCallback = new ViewDragHelper.Callback() { // from class: com.google.android.material.behavior.SwipeDismissBehavior.1
private static final int INVALID_POINTER_ID = -1;
private int activePointerId = -1;
private int originalCapturedViewLeft;
@Override // androidx.customview.widget.ViewDragHelper.Callback
public boolean tryCaptureView(View view, int i) {
int i2 = this.activePointerId;
return (i2 == -1 || i2 == i) && SwipeDismissBehavior.this.canSwipeDismissView(view);
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public void onViewCaptured(View view, int i) {
this.activePointerId = i;
this.originalCapturedViewLeft = view.getLeft();
ViewParent parent = view.getParent();
if (parent != null) {
SwipeDismissBehavior.this.requestingDisallowInterceptTouchEvent = true;
parent.requestDisallowInterceptTouchEvent(true);
SwipeDismissBehavior.this.requestingDisallowInterceptTouchEvent = false;
}
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public void onViewDragStateChanged(int i) {
if (SwipeDismissBehavior.this.listener != null) {
SwipeDismissBehavior.this.listener.onDragStateChanged(i);
}
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public void onViewReleased(View view, float f, float f2) {
int i;
boolean z;
this.activePointerId = -1;
int width = view.getWidth();
if (shouldDismiss(view, f)) {
if (f >= 0.0f) {
int left = view.getLeft();
int i2 = this.originalCapturedViewLeft;
if (left >= i2) {
i = i2 + width;
z = true;
}
}
i = this.originalCapturedViewLeft - width;
z = true;
} else {
i = this.originalCapturedViewLeft;
z = false;
}
if (SwipeDismissBehavior.this.viewDragHelper.settleCapturedViewAt(i, view.getTop())) {
ViewCompat.postOnAnimation(view, new SettleRunnable(view, z));
} else {
if (!z || SwipeDismissBehavior.this.listener == null) {
return;
}
SwipeDismissBehavior.this.listener.onDismiss(view);
}
}
private boolean shouldDismiss(View view, float f) {
if (f == 0.0f) {
return Math.abs(view.getLeft() - this.originalCapturedViewLeft) >= Math.round(((float) view.getWidth()) * SwipeDismissBehavior.this.dragDismissThreshold);
}
boolean z = ViewCompat.getLayoutDirection(view) == 1;
if (SwipeDismissBehavior.this.swipeDirection == 2) {
return true;
}
if (SwipeDismissBehavior.this.swipeDirection == 0) {
if (z) {
if (f >= 0.0f) {
return false;
}
} else if (f <= 0.0f) {
return false;
}
return true;
}
if (SwipeDismissBehavior.this.swipeDirection != 1) {
return false;
}
if (z) {
if (f <= 0.0f) {
return false;
}
} else if (f >= 0.0f) {
return false;
}
return true;
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public int getViewHorizontalDragRange(View view) {
return view.getWidth();
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public int clampViewPositionHorizontal(View view, int i, int i2) {
int width;
int width2;
int width3;
boolean z = ViewCompat.getLayoutDirection(view) == 1;
if (SwipeDismissBehavior.this.swipeDirection == 0) {
if (z) {
width = this.originalCapturedViewLeft - view.getWidth();
width2 = this.originalCapturedViewLeft;
} else {
width = this.originalCapturedViewLeft;
width3 = view.getWidth();
width2 = width3 + width;
}
} else if (SwipeDismissBehavior.this.swipeDirection != 1) {
width = this.originalCapturedViewLeft - view.getWidth();
width2 = view.getWidth() + this.originalCapturedViewLeft;
} else if (z) {
width = this.originalCapturedViewLeft;
width3 = view.getWidth();
width2 = width3 + width;
} else {
width = this.originalCapturedViewLeft - view.getWidth();
width2 = this.originalCapturedViewLeft;
}
return SwipeDismissBehavior.clamp(width, i, width2);
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public int clampViewPositionVertical(View view, int i, int i2) {
return view.getTop();
}
@Override // androidx.customview.widget.ViewDragHelper.Callback
public void onViewPositionChanged(View view, int i, int i2, int i3, int i4) {
float width = view.getWidth() * SwipeDismissBehavior.this.alphaStartSwipeDistance;
float width2 = view.getWidth() * SwipeDismissBehavior.this.alphaEndSwipeDistance;
float abs = Math.abs(i - this.originalCapturedViewLeft);
if (abs <= width) {
view.setAlpha(1.0f);
} else if (abs >= width2) {
view.setAlpha(0.0f);
} else {
view.setAlpha(SwipeDismissBehavior.clamp(0.0f, 1.0f - SwipeDismissBehavior.fraction(width, width2, abs), 1.0f));
}
}
};
public interface OnDismissListener {
void onDismiss(View view);
void onDragStateChanged(int i);
}
static float fraction(float f, float f2, float f3) {
return (f3 - f) / (f2 - f);
}
public boolean canSwipeDismissView(View view) {
return true;
}
public OnDismissListener getListener() {
return this.listener;
}
public void setListener(OnDismissListener onDismissListener) {
this.listener = onDismissListener;
}
public void setSensitivity(float f) {
this.sensitivity = f;
this.sensitivitySet = true;
}
public void setSwipeDirection(int i) {
this.swipeDirection = i;
}
public void setDragDismissDistance(float f) {
this.dragDismissThreshold = clamp(0.0f, f, 1.0f);
}
public void setStartAlphaSwipeDistance(float f) {
this.alphaStartSwipeDistance = clamp(0.0f, f, 1.0f);
}
public void setEndAlphaSwipeDistance(float f) {
this.alphaEndSwipeDistance = clamp(0.0f, f, 1.0f);
}
@Override // androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
public boolean onLayoutChild(CoordinatorLayout coordinatorLayout, V v, int i) {
boolean onLayoutChild = super.onLayoutChild(coordinatorLayout, v, i);
if (ViewCompat.getImportantForAccessibility(v) == 0) {
ViewCompat.setImportantForAccessibility(v, 1);
updateAccessibilityActions(v);
}
return onLayoutChild;
}
@Override // androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
public boolean onInterceptTouchEvent(CoordinatorLayout coordinatorLayout, V v, MotionEvent motionEvent) {
boolean z = this.interceptingEvents;
int actionMasked = motionEvent.getActionMasked();
if (actionMasked == 0) {
z = coordinatorLayout.isPointInChildBounds(v, (int) motionEvent.getX(), (int) motionEvent.getY());
this.interceptingEvents = z;
} else if (actionMasked == 1 || actionMasked == 3) {
this.interceptingEvents = false;
}
if (!z) {
return false;
}
ensureViewDragHelper(coordinatorLayout);
return !this.requestingDisallowInterceptTouchEvent && this.viewDragHelper.shouldInterceptTouchEvent(motionEvent);
}
@Override // androidx.coordinatorlayout.widget.CoordinatorLayout.Behavior
public boolean onTouchEvent(CoordinatorLayout coordinatorLayout, V v, MotionEvent motionEvent) {
if (this.viewDragHelper == null) {
return false;
}
if (this.requestingDisallowInterceptTouchEvent && motionEvent.getActionMasked() == 3) {
return true;
}
this.viewDragHelper.processTouchEvent(motionEvent);
return true;
}
private void ensureViewDragHelper(ViewGroup viewGroup) {
ViewDragHelper create;
if (this.viewDragHelper == null) {
if (this.sensitivitySet) {
create = ViewDragHelper.create(viewGroup, this.sensitivity, this.dragCallback);
} else {
create = ViewDragHelper.create(viewGroup, this.dragCallback);
}
this.viewDragHelper = create;
}
}
private class SettleRunnable implements Runnable {
private final boolean dismiss;
private final View view;
SettleRunnable(View view, boolean z) {
this.view = view;
this.dismiss = z;
}
@Override // java.lang.Runnable
public void run() {
if (SwipeDismissBehavior.this.viewDragHelper != null && SwipeDismissBehavior.this.viewDragHelper.continueSettling(true)) {
ViewCompat.postOnAnimation(this.view, this);
} else {
if (!this.dismiss || SwipeDismissBehavior.this.listener == null) {
return;
}
SwipeDismissBehavior.this.listener.onDismiss(this.view);
}
}
}
private void updateAccessibilityActions(View view) {
ViewCompat.removeAccessibilityAction(view, 1048576);
if (canSwipeDismissView(view)) {
ViewCompat.replaceAccessibilityAction(view, AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_DISMISS, null, new AccessibilityViewCommand() { // from class: com.google.android.material.behavior.SwipeDismissBehavior.2
@Override // androidx.core.view.accessibility.AccessibilityViewCommand
public boolean perform(View view2, AccessibilityViewCommand.CommandArguments commandArguments) {
if (!SwipeDismissBehavior.this.canSwipeDismissView(view2)) {
return false;
}
boolean z = ViewCompat.getLayoutDirection(view2) == 1;
ViewCompat.offsetLeftAndRight(view2, (!(SwipeDismissBehavior.this.swipeDirection == 0 && z) && (SwipeDismissBehavior.this.swipeDirection != 1 || z)) ? view2.getWidth() : -view2.getWidth());
view2.setAlpha(0.0f);
if (SwipeDismissBehavior.this.listener != null) {
SwipeDismissBehavior.this.listener.onDismiss(view2);
}
return true;
}
});
}
}
static float clamp(float f, float f2, float f3) {
return Math.min(Math.max(f, f2), f3);
}
static int clamp(int i, int i2, int i3) {
return Math.min(Math.max(i, i2), i3);
}
public int getDragState() {
ViewDragHelper viewDragHelper = this.viewDragHelper;
if (viewDragHelper != null) {
return viewDragHelper.getViewDragState();
}
return 0;
}
}