ADD week 5
This commit is contained in:
@ -0,0 +1,64 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import androidx.activity.BackEventCompat;
|
||||
import androidx.core.view.animation.PathInterpolatorCompat;
|
||||
import com.google.android.material.R;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public abstract class MaterialBackAnimationHelper<V extends View> {
|
||||
private static final int CANCEL_DURATION_DEFAULT = 100;
|
||||
private static final int HIDE_DURATION_MAX_DEFAULT = 300;
|
||||
private static final int HIDE_DURATION_MIN_DEFAULT = 150;
|
||||
private static final String TAG = "MaterialBackHelper";
|
||||
private BackEventCompat backEvent;
|
||||
protected final int cancelDuration;
|
||||
protected final int hideDurationMax;
|
||||
protected final int hideDurationMin;
|
||||
private final TimeInterpolator progressInterpolator;
|
||||
protected final V view;
|
||||
|
||||
public BackEventCompat onHandleBackInvoked() {
|
||||
BackEventCompat backEventCompat = this.backEvent;
|
||||
this.backEvent = null;
|
||||
return backEventCompat;
|
||||
}
|
||||
|
||||
protected void onStartBackProgress(BackEventCompat backEventCompat) {
|
||||
this.backEvent = backEventCompat;
|
||||
}
|
||||
|
||||
public MaterialBackAnimationHelper(V v) {
|
||||
this.view = v;
|
||||
Context context = v.getContext();
|
||||
this.progressInterpolator = MotionUtils.resolveThemeInterpolator(context, R.attr.motionEasingStandardDecelerateInterpolator, PathInterpolatorCompat.create(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
this.hideDurationMax = MotionUtils.resolveThemeDuration(context, R.attr.motionDurationMedium2, 300);
|
||||
this.hideDurationMin = MotionUtils.resolveThemeDuration(context, R.attr.motionDurationShort3, HIDE_DURATION_MIN_DEFAULT);
|
||||
this.cancelDuration = MotionUtils.resolveThemeDuration(context, R.attr.motionDurationShort2, 100);
|
||||
}
|
||||
|
||||
protected float interpolateProgress(float f) {
|
||||
return this.progressInterpolator.getInterpolation(f);
|
||||
}
|
||||
|
||||
protected BackEventCompat onUpdateBackProgress(BackEventCompat backEventCompat) {
|
||||
if (this.backEvent == null) {
|
||||
Log.w(TAG, "Must call startBackProgress() before updateBackProgress()");
|
||||
}
|
||||
BackEventCompat backEventCompat2 = this.backEvent;
|
||||
this.backEvent = backEventCompat;
|
||||
return backEventCompat2;
|
||||
}
|
||||
|
||||
protected BackEventCompat onCancelBackProgress() {
|
||||
if (this.backEvent == null) {
|
||||
Log.w(TAG, "Must call startBackProgress() and updateBackProgress() before cancelBackProgress()");
|
||||
}
|
||||
BackEventCompat backEventCompat = this.backEvent;
|
||||
this.backEvent = null;
|
||||
return backEventCompat;
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import androidx.activity.BackEventCompat;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public interface MaterialBackHandler {
|
||||
void cancelBackProgress();
|
||||
|
||||
void handleBackInvoked();
|
||||
|
||||
void startBackProgress(BackEventCompat backEventCompat);
|
||||
|
||||
void updateBackProgress(BackEventCompat backEventCompat);
|
||||
}
|
@ -0,0 +1,172 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
import android.window.BackEvent;
|
||||
import android.window.OnBackAnimationCallback;
|
||||
import android.window.OnBackInvokedCallback;
|
||||
import android.window.OnBackInvokedDispatcher;
|
||||
import androidx.activity.BackEventCompat;
|
||||
import java.util.Objects;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public final class MaterialBackOrchestrator {
|
||||
private final BackCallbackDelegate backCallbackDelegate;
|
||||
private final MaterialBackHandler backHandler;
|
||||
private final View view;
|
||||
|
||||
private interface BackCallbackDelegate {
|
||||
void startListeningForBackCallbacks(MaterialBackHandler materialBackHandler, View view, boolean z);
|
||||
|
||||
void stopListeningForBackCallbacks(View view);
|
||||
}
|
||||
|
||||
public boolean shouldListenForBackCallbacks() {
|
||||
return this.backCallbackDelegate != null;
|
||||
}
|
||||
|
||||
public <T extends View & MaterialBackHandler> MaterialBackOrchestrator(T t) {
|
||||
this(t, t);
|
||||
}
|
||||
|
||||
public MaterialBackOrchestrator(MaterialBackHandler materialBackHandler, View view) {
|
||||
this.backCallbackDelegate = createBackCallbackDelegate();
|
||||
this.backHandler = materialBackHandler;
|
||||
this.view = view;
|
||||
}
|
||||
|
||||
public void startListeningForBackCallbacksWithPriorityOverlay() {
|
||||
startListeningForBackCallbacks(true);
|
||||
}
|
||||
|
||||
public void startListeningForBackCallbacks() {
|
||||
startListeningForBackCallbacks(false);
|
||||
}
|
||||
|
||||
private void startListeningForBackCallbacks(boolean z) {
|
||||
BackCallbackDelegate backCallbackDelegate = this.backCallbackDelegate;
|
||||
if (backCallbackDelegate != null) {
|
||||
backCallbackDelegate.startListeningForBackCallbacks(this.backHandler, this.view, z);
|
||||
}
|
||||
}
|
||||
|
||||
public void stopListeningForBackCallbacks() {
|
||||
BackCallbackDelegate backCallbackDelegate = this.backCallbackDelegate;
|
||||
if (backCallbackDelegate != null) {
|
||||
backCallbackDelegate.stopListeningForBackCallbacks(this.view);
|
||||
}
|
||||
}
|
||||
|
||||
private static BackCallbackDelegate createBackCallbackDelegate() {
|
||||
if (Build.VERSION.SDK_INT >= 34) {
|
||||
return new Api34BackCallbackDelegate();
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= 33) {
|
||||
return new Api33BackCallbackDelegate();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static class Api34BackCallbackDelegate extends Api33BackCallbackDelegate {
|
||||
private Api34BackCallbackDelegate() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override // com.google.android.material.motion.MaterialBackOrchestrator.Api33BackCallbackDelegate
|
||||
OnBackInvokedCallback createOnBackInvokedCallback(final MaterialBackHandler materialBackHandler) {
|
||||
return new OnBackAnimationCallback() { // from class: com.google.android.material.motion.MaterialBackOrchestrator.Api34BackCallbackDelegate.1
|
||||
@Override // android.window.OnBackAnimationCallback
|
||||
public void onBackStarted(BackEvent backEvent) {
|
||||
if (Api34BackCallbackDelegate.this.isListeningForBackCallbacks()) {
|
||||
materialBackHandler.startBackProgress(new BackEventCompat(backEvent));
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.window.OnBackAnimationCallback
|
||||
public void onBackProgressed(BackEvent backEvent) {
|
||||
if (Api34BackCallbackDelegate.this.isListeningForBackCallbacks()) {
|
||||
materialBackHandler.updateBackProgress(new BackEventCompat(backEvent));
|
||||
}
|
||||
}
|
||||
|
||||
@Override // android.window.OnBackInvokedCallback
|
||||
public void onBackInvoked() {
|
||||
materialBackHandler.handleBackInvoked();
|
||||
}
|
||||
|
||||
@Override // android.window.OnBackAnimationCallback
|
||||
public void onBackCancelled() {
|
||||
if (Api34BackCallbackDelegate.this.isListeningForBackCallbacks()) {
|
||||
materialBackHandler.cancelBackProgress();
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static class Api33BackCallbackDelegate implements BackCallbackDelegate {
|
||||
private OnBackInvokedCallback onBackInvokedCallback;
|
||||
|
||||
boolean isListeningForBackCallbacks() {
|
||||
return this.onBackInvokedCallback != null;
|
||||
}
|
||||
|
||||
private Api33BackCallbackDelegate() {
|
||||
}
|
||||
|
||||
/* JADX WARN: Code restructure failed: missing block: B:5:0x0005, code lost:
|
||||
|
||||
r3 = r3.findOnBackInvokedDispatcher();
|
||||
*/
|
||||
@Override // com.google.android.material.motion.MaterialBackOrchestrator.BackCallbackDelegate
|
||||
/*
|
||||
Code decompiled incorrectly, please refer to instructions dump.
|
||||
To view partially-correct add '--show-bad-code' argument
|
||||
*/
|
||||
public void startListeningForBackCallbacks(com.google.android.material.motion.MaterialBackHandler r2, android.view.View r3, boolean r4) {
|
||||
/*
|
||||
r1 = this;
|
||||
android.window.OnBackInvokedCallback r0 = r1.onBackInvokedCallback
|
||||
if (r0 == 0) goto L5
|
||||
return
|
||||
L5:
|
||||
android.window.OnBackInvokedDispatcher r3 = kotlin.io.path.PathTreeWalk$$ExternalSyntheticApiModelOutline0.m(r3)
|
||||
if (r3 != 0) goto Lc
|
||||
return
|
||||
Lc:
|
||||
android.window.OnBackInvokedCallback r2 = r1.createOnBackInvokedCallback(r2)
|
||||
r1.onBackInvokedCallback = r2
|
||||
if (r4 == 0) goto L18
|
||||
r4 = 1000000(0xf4240, float:1.401298E-39)
|
||||
goto L19
|
||||
L18:
|
||||
r4 = 0
|
||||
L19:
|
||||
androidx.activity.ComponentDialog$$ExternalSyntheticApiModelOutline0.m(r3, r4, r2)
|
||||
return
|
||||
*/
|
||||
throw new UnsupportedOperationException("Method not decompiled: com.google.android.material.motion.MaterialBackOrchestrator.Api33BackCallbackDelegate.startListeningForBackCallbacks(com.google.android.material.motion.MaterialBackHandler, android.view.View, boolean):void");
|
||||
}
|
||||
|
||||
@Override // com.google.android.material.motion.MaterialBackOrchestrator.BackCallbackDelegate
|
||||
public void stopListeningForBackCallbacks(View view) {
|
||||
OnBackInvokedDispatcher findOnBackInvokedDispatcher;
|
||||
findOnBackInvokedDispatcher = view.findOnBackInvokedDispatcher();
|
||||
if (findOnBackInvokedDispatcher == null) {
|
||||
return;
|
||||
}
|
||||
findOnBackInvokedDispatcher.unregisterOnBackInvokedCallback(this.onBackInvokedCallback);
|
||||
this.onBackInvokedCallback = null;
|
||||
}
|
||||
|
||||
OnBackInvokedCallback createOnBackInvokedCallback(final MaterialBackHandler materialBackHandler) {
|
||||
Objects.requireNonNull(materialBackHandler);
|
||||
return new OnBackInvokedCallback() { // from class: com.google.android.material.motion.MaterialBackOrchestrator$Api33BackCallbackDelegate$$ExternalSyntheticLambda1
|
||||
@Override // android.window.OnBackInvokedCallback
|
||||
public final void onBackInvoked() {
|
||||
MaterialBackHandler.this.handleBackInvoked();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.res.Resources;
|
||||
import android.util.Property;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.activity.BackEventCompat;
|
||||
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
|
||||
import com.google.android.material.R;
|
||||
import com.google.android.material.animation.AnimationUtils;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class MaterialBottomContainerBackHelper extends MaterialBackAnimationHelper<View> {
|
||||
private final float maxScaleXDistance;
|
||||
private final float maxScaleYDistance;
|
||||
|
||||
public MaterialBottomContainerBackHelper(View view) {
|
||||
super(view);
|
||||
Resources resources = view.getResources();
|
||||
this.maxScaleXDistance = resources.getDimension(R.dimen.m3_back_progress_bottom_container_max_scale_x_distance);
|
||||
this.maxScaleYDistance = resources.getDimension(R.dimen.m3_back_progress_bottom_container_max_scale_y_distance);
|
||||
}
|
||||
|
||||
public void startBackProgress(BackEventCompat backEventCompat) {
|
||||
super.onStartBackProgress(backEventCompat);
|
||||
}
|
||||
|
||||
public void updateBackProgress(BackEventCompat backEventCompat) {
|
||||
if (super.onUpdateBackProgress(backEventCompat) == null) {
|
||||
return;
|
||||
}
|
||||
updateBackProgress(backEventCompat.getProgress());
|
||||
}
|
||||
|
||||
public void updateBackProgress(float f) {
|
||||
float interpolateProgress = interpolateProgress(f);
|
||||
float width = this.view.getWidth();
|
||||
float height = this.view.getHeight();
|
||||
if (width <= 0.0f || height <= 0.0f) {
|
||||
return;
|
||||
}
|
||||
float f2 = this.maxScaleXDistance / width;
|
||||
float f3 = this.maxScaleYDistance / height;
|
||||
float lerp = 1.0f - AnimationUtils.lerp(0.0f, f2, interpolateProgress);
|
||||
float lerp2 = 1.0f - AnimationUtils.lerp(0.0f, f3, interpolateProgress);
|
||||
this.view.setScaleX(lerp);
|
||||
this.view.setPivotY(height);
|
||||
this.view.setScaleY(lerp2);
|
||||
if (this.view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) this.view;
|
||||
for (int i = 0; i < viewGroup.getChildCount(); i++) {
|
||||
View childAt = viewGroup.getChildAt(i);
|
||||
childAt.setPivotY(-childAt.getTop());
|
||||
childAt.setScaleY(lerp2 != 0.0f ? lerp / lerp2 : 1.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void finishBackProgressPersistent(BackEventCompat backEventCompat, Animator.AnimatorListener animatorListener) {
|
||||
Animator createResetScaleAnimator = createResetScaleAnimator();
|
||||
createResetScaleAnimator.setDuration(AnimationUtils.lerp(this.hideDurationMax, this.hideDurationMin, backEventCompat.getProgress()));
|
||||
if (animatorListener != null) {
|
||||
createResetScaleAnimator.addListener(animatorListener);
|
||||
}
|
||||
createResetScaleAnimator.start();
|
||||
}
|
||||
|
||||
public void finishBackProgressNotPersistent(BackEventCompat backEventCompat, Animator.AnimatorListener animatorListener) {
|
||||
ObjectAnimator ofFloat = ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.TRANSLATION_Y, this.view.getHeight() * this.view.getScaleY());
|
||||
ofFloat.setInterpolator(new FastOutSlowInInterpolator());
|
||||
ofFloat.setDuration(AnimationUtils.lerp(this.hideDurationMax, this.hideDurationMin, backEventCompat.getProgress()));
|
||||
ofFloat.addListener(new AnimatorListenerAdapter() { // from class: com.google.android.material.motion.MaterialBottomContainerBackHelper.1
|
||||
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
||||
public void onAnimationEnd(Animator animator) {
|
||||
MaterialBottomContainerBackHelper.this.view.setTranslationY(0.0f);
|
||||
MaterialBottomContainerBackHelper.this.updateBackProgress(0.0f);
|
||||
}
|
||||
});
|
||||
if (animatorListener != null) {
|
||||
ofFloat.addListener(animatorListener);
|
||||
}
|
||||
ofFloat.start();
|
||||
}
|
||||
|
||||
public void cancelBackProgress() {
|
||||
if (super.onCancelBackProgress() == null) {
|
||||
return;
|
||||
}
|
||||
Animator createResetScaleAnimator = createResetScaleAnimator();
|
||||
createResetScaleAnimator.setDuration(this.cancelDuration);
|
||||
createResetScaleAnimator.start();
|
||||
}
|
||||
|
||||
private Animator createResetScaleAnimator() {
|
||||
AnimatorSet animatorSet = new AnimatorSet();
|
||||
animatorSet.playTogether(ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.SCALE_X, 1.0f), ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.SCALE_Y, 1.0f));
|
||||
if (this.view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) this.view;
|
||||
for (int i = 0; i < viewGroup.getChildCount(); i++) {
|
||||
animatorSet.playTogether(ObjectAnimator.ofFloat(viewGroup.getChildAt(i), (Property<View, Float>) View.SCALE_Y, 1.0f));
|
||||
}
|
||||
}
|
||||
animatorSet.setInterpolator(new FastOutSlowInInterpolator());
|
||||
return animatorSet;
|
||||
}
|
||||
}
|
@ -0,0 +1,199 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Rect;
|
||||
import android.util.Property;
|
||||
import android.view.RoundedCorner;
|
||||
import android.view.View;
|
||||
import android.view.WindowInsets;
|
||||
import androidx.activity.BackEventCompat;
|
||||
import com.google.android.material.R;
|
||||
import com.google.android.material.animation.AnimationUtils;
|
||||
import com.google.android.material.internal.ClippableRoundedCornerLayout;
|
||||
import com.google.android.material.internal.ViewUtils;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class MaterialMainContainerBackHelper extends MaterialBackAnimationHelper<View> {
|
||||
private static final float MIN_SCALE = 0.9f;
|
||||
private Integer expandedCornerSize;
|
||||
private Rect initialHideFromClipBounds;
|
||||
private Rect initialHideToClipBounds;
|
||||
private float initialTouchY;
|
||||
private final float maxTranslationY;
|
||||
private final float minEdgeGap;
|
||||
|
||||
private void resetInitialValues() {
|
||||
this.initialTouchY = 0.0f;
|
||||
this.initialHideToClipBounds = null;
|
||||
this.initialHideFromClipBounds = null;
|
||||
}
|
||||
|
||||
public Rect getInitialHideFromClipBounds() {
|
||||
return this.initialHideFromClipBounds;
|
||||
}
|
||||
|
||||
public Rect getInitialHideToClipBounds() {
|
||||
return this.initialHideToClipBounds;
|
||||
}
|
||||
|
||||
public MaterialMainContainerBackHelper(View view) {
|
||||
super(view);
|
||||
Resources resources = view.getResources();
|
||||
this.minEdgeGap = resources.getDimension(R.dimen.m3_back_progress_main_container_min_edge_gap);
|
||||
this.maxTranslationY = resources.getDimension(R.dimen.m3_back_progress_main_container_max_translation_y);
|
||||
}
|
||||
|
||||
public void startBackProgress(BackEventCompat backEventCompat, View view) {
|
||||
super.onStartBackProgress(backEventCompat);
|
||||
startBackProgress(backEventCompat.getTouchY(), view);
|
||||
}
|
||||
|
||||
public void startBackProgress(float f, View view) {
|
||||
this.initialHideToClipBounds = ViewUtils.calculateRectFromBounds(this.view);
|
||||
if (view != null) {
|
||||
this.initialHideFromClipBounds = ViewUtils.calculateOffsetRectFromBounds(this.view, view);
|
||||
}
|
||||
this.initialTouchY = f;
|
||||
}
|
||||
|
||||
public void updateBackProgress(BackEventCompat backEventCompat, View view, float f) {
|
||||
if (super.onUpdateBackProgress(backEventCompat) == null) {
|
||||
return;
|
||||
}
|
||||
if (view != null && view.getVisibility() != 4) {
|
||||
view.setVisibility(4);
|
||||
}
|
||||
updateBackProgress(backEventCompat.getProgress(), backEventCompat.getSwipeEdge() == 0, backEventCompat.getTouchY(), f);
|
||||
}
|
||||
|
||||
public void updateBackProgress(float f, boolean z, float f2, float f3) {
|
||||
float interpolateProgress = interpolateProgress(f);
|
||||
float width = this.view.getWidth();
|
||||
float height = this.view.getHeight();
|
||||
if (width <= 0.0f || height <= 0.0f) {
|
||||
return;
|
||||
}
|
||||
float lerp = AnimationUtils.lerp(1.0f, MIN_SCALE, interpolateProgress);
|
||||
float lerp2 = AnimationUtils.lerp(0.0f, Math.max(0.0f, ((width - (MIN_SCALE * width)) / 2.0f) - this.minEdgeGap), interpolateProgress) * (z ? 1 : -1);
|
||||
float min = Math.min(Math.max(0.0f, ((height - (lerp * height)) / 2.0f) - this.minEdgeGap), this.maxTranslationY);
|
||||
float f4 = f2 - this.initialTouchY;
|
||||
float lerp3 = AnimationUtils.lerp(0.0f, min, Math.abs(f4) / height) * Math.signum(f4);
|
||||
this.view.setScaleX(lerp);
|
||||
this.view.setScaleY(lerp);
|
||||
this.view.setTranslationX(lerp2);
|
||||
this.view.setTranslationY(lerp3);
|
||||
if (this.view instanceof ClippableRoundedCornerLayout) {
|
||||
((ClippableRoundedCornerLayout) this.view).updateCornerRadius(AnimationUtils.lerp(getExpandedCornerSize(), f3, interpolateProgress));
|
||||
}
|
||||
}
|
||||
|
||||
public void finishBackProgress(long j, View view) {
|
||||
AnimatorSet createResetScaleAndTranslationAnimator = createResetScaleAndTranslationAnimator(view);
|
||||
createResetScaleAndTranslationAnimator.setDuration(j);
|
||||
createResetScaleAndTranslationAnimator.start();
|
||||
resetInitialValues();
|
||||
}
|
||||
|
||||
public void cancelBackProgress(View view) {
|
||||
if (super.onCancelBackProgress() == null) {
|
||||
return;
|
||||
}
|
||||
AnimatorSet createResetScaleAndTranslationAnimator = createResetScaleAndTranslationAnimator(view);
|
||||
if (this.view instanceof ClippableRoundedCornerLayout) {
|
||||
createResetScaleAndTranslationAnimator.playTogether(createCornerAnimator((ClippableRoundedCornerLayout) this.view));
|
||||
}
|
||||
createResetScaleAndTranslationAnimator.setDuration(this.cancelDuration);
|
||||
createResetScaleAndTranslationAnimator.start();
|
||||
resetInitialValues();
|
||||
}
|
||||
|
||||
private AnimatorSet createResetScaleAndTranslationAnimator(final View view) {
|
||||
AnimatorSet animatorSet = new AnimatorSet();
|
||||
animatorSet.playTogether(ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.SCALE_X, 1.0f), ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.SCALE_Y, 1.0f), ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.TRANSLATION_X, 0.0f), ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.TRANSLATION_Y, 0.0f));
|
||||
animatorSet.addListener(new AnimatorListenerAdapter() { // from class: com.google.android.material.motion.MaterialMainContainerBackHelper.1
|
||||
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
||||
public void onAnimationEnd(Animator animator) {
|
||||
View view2 = view;
|
||||
if (view2 != null) {
|
||||
view2.setVisibility(0);
|
||||
}
|
||||
}
|
||||
});
|
||||
return animatorSet;
|
||||
}
|
||||
|
||||
private ValueAnimator createCornerAnimator(final ClippableRoundedCornerLayout clippableRoundedCornerLayout) {
|
||||
ValueAnimator ofFloat = ValueAnimator.ofFloat(clippableRoundedCornerLayout.getCornerRadius(), getExpandedCornerSize());
|
||||
ofFloat.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { // from class: com.google.android.material.motion.MaterialMainContainerBackHelper$$ExternalSyntheticLambda0
|
||||
@Override // android.animation.ValueAnimator.AnimatorUpdateListener
|
||||
public final void onAnimationUpdate(ValueAnimator valueAnimator) {
|
||||
ClippableRoundedCornerLayout.this.updateCornerRadius(((Float) valueAnimator.getAnimatedValue()).floatValue());
|
||||
}
|
||||
});
|
||||
return ofFloat;
|
||||
}
|
||||
|
||||
public int getExpandedCornerSize() {
|
||||
if (this.expandedCornerSize == null) {
|
||||
this.expandedCornerSize = Integer.valueOf(isAtTopOfScreen() ? getMaxDeviceCornerRadius() : 0);
|
||||
}
|
||||
return this.expandedCornerSize.intValue();
|
||||
}
|
||||
|
||||
private boolean isAtTopOfScreen() {
|
||||
int[] iArr = new int[2];
|
||||
this.view.getLocationOnScreen(iArr);
|
||||
return iArr[1] == 0;
|
||||
}
|
||||
|
||||
/* JADX WARN: Code restructure failed: missing block: B:3:0x0007, code lost:
|
||||
|
||||
r0 = r4.view.getRootWindowInsets();
|
||||
*/
|
||||
/*
|
||||
Code decompiled incorrectly, please refer to instructions dump.
|
||||
To view partially-correct add '--show-bad-code' argument
|
||||
*/
|
||||
private int getMaxDeviceCornerRadius() {
|
||||
/*
|
||||
r4 = this;
|
||||
int r0 = android.os.Build.VERSION.SDK_INT
|
||||
r1 = 31
|
||||
r2 = 0
|
||||
if (r0 < r1) goto L2f
|
||||
V extends android.view.View r0 = r4.view
|
||||
android.view.WindowInsets r0 = androidx.tracing.Trace$$ExternalSyntheticApiModelOutline0.m173m(r0)
|
||||
if (r0 == 0) goto L2f
|
||||
int r1 = r4.getRoundedCornerRadius(r0, r2)
|
||||
r2 = 1
|
||||
int r2 = r4.getRoundedCornerRadius(r0, r2)
|
||||
int r1 = java.lang.Math.max(r1, r2)
|
||||
r2 = 3
|
||||
int r2 = r4.getRoundedCornerRadius(r0, r2)
|
||||
r3 = 2
|
||||
int r0 = r4.getRoundedCornerRadius(r0, r3)
|
||||
int r0 = java.lang.Math.max(r2, r0)
|
||||
int r0 = java.lang.Math.max(r1, r0)
|
||||
return r0
|
||||
L2f:
|
||||
return r2
|
||||
*/
|
||||
throw new UnsupportedOperationException("Method not decompiled: com.google.android.material.motion.MaterialMainContainerBackHelper.getMaxDeviceCornerRadius():int");
|
||||
}
|
||||
|
||||
private int getRoundedCornerRadius(WindowInsets windowInsets, int i) {
|
||||
RoundedCorner roundedCorner;
|
||||
int radius;
|
||||
roundedCorner = windowInsets.getRoundedCorner(i);
|
||||
if (roundedCorner == null) {
|
||||
return 0;
|
||||
}
|
||||
radius = roundedCorner.getRadius();
|
||||
return radius;
|
||||
}
|
||||
}
|
@ -0,0 +1,151 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.content.res.Resources;
|
||||
import android.util.Property;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.activity.BackEventCompat;
|
||||
import androidx.core.view.GravityCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
|
||||
import com.google.android.material.R;
|
||||
import com.google.android.material.animation.AnimationUtils;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class MaterialSideContainerBackHelper extends MaterialBackAnimationHelper<View> {
|
||||
private final float maxScaleXDistanceGrow;
|
||||
private final float maxScaleXDistanceShrink;
|
||||
private final float maxScaleYDistance;
|
||||
|
||||
public MaterialSideContainerBackHelper(View view) {
|
||||
super(view);
|
||||
Resources resources = view.getResources();
|
||||
this.maxScaleXDistanceShrink = resources.getDimension(R.dimen.m3_back_progress_side_container_max_scale_x_distance_shrink);
|
||||
this.maxScaleXDistanceGrow = resources.getDimension(R.dimen.m3_back_progress_side_container_max_scale_x_distance_grow);
|
||||
this.maxScaleYDistance = resources.getDimension(R.dimen.m3_back_progress_side_container_max_scale_y_distance);
|
||||
}
|
||||
|
||||
public void startBackProgress(BackEventCompat backEventCompat) {
|
||||
super.onStartBackProgress(backEventCompat);
|
||||
}
|
||||
|
||||
public void updateBackProgress(BackEventCompat backEventCompat, int i) {
|
||||
if (super.onUpdateBackProgress(backEventCompat) == null) {
|
||||
return;
|
||||
}
|
||||
updateBackProgress(backEventCompat.getProgress(), backEventCompat.getSwipeEdge() == 0, i);
|
||||
}
|
||||
|
||||
public void updateBackProgress(float f, boolean z, int i) {
|
||||
int i2;
|
||||
float interpolateProgress = interpolateProgress(f);
|
||||
boolean checkAbsoluteGravity = checkAbsoluteGravity(i, 3);
|
||||
boolean z2 = z == checkAbsoluteGravity;
|
||||
int width = this.view.getWidth();
|
||||
int height = this.view.getHeight();
|
||||
float f2 = width;
|
||||
if (f2 > 0.0f) {
|
||||
float f3 = height;
|
||||
if (f3 <= 0.0f) {
|
||||
return;
|
||||
}
|
||||
float f4 = this.maxScaleXDistanceShrink / f2;
|
||||
float f5 = this.maxScaleXDistanceGrow / f2;
|
||||
float f6 = this.maxScaleYDistance / f3;
|
||||
V v = this.view;
|
||||
if (checkAbsoluteGravity) {
|
||||
f2 = 0.0f;
|
||||
}
|
||||
v.setPivotX(f2);
|
||||
if (!z2) {
|
||||
f5 = -f4;
|
||||
}
|
||||
float lerp = AnimationUtils.lerp(0.0f, f5, interpolateProgress);
|
||||
float f7 = lerp + 1.0f;
|
||||
this.view.setScaleX(f7);
|
||||
float lerp2 = 1.0f - AnimationUtils.lerp(0.0f, f6, interpolateProgress);
|
||||
this.view.setScaleY(lerp2);
|
||||
if (this.view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) this.view;
|
||||
for (int i3 = 0; i3 < viewGroup.getChildCount(); i3++) {
|
||||
View childAt = viewGroup.getChildAt(i3);
|
||||
if (checkAbsoluteGravity) {
|
||||
i2 = (width - childAt.getRight()) + childAt.getWidth();
|
||||
} else {
|
||||
i2 = -childAt.getLeft();
|
||||
}
|
||||
childAt.setPivotX(i2);
|
||||
childAt.setPivotY(-childAt.getTop());
|
||||
float f8 = z2 ? 1.0f - lerp : 1.0f;
|
||||
float f9 = lerp2 != 0.0f ? (f7 / lerp2) * f8 : 1.0f;
|
||||
childAt.setScaleX(f8);
|
||||
childAt.setScaleY(f9);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void finishBackProgress(BackEventCompat backEventCompat, final int i, Animator.AnimatorListener animatorListener, ValueAnimator.AnimatorUpdateListener animatorUpdateListener) {
|
||||
final boolean z = backEventCompat.getSwipeEdge() == 0;
|
||||
boolean checkAbsoluteGravity = checkAbsoluteGravity(i, 3);
|
||||
float width = (this.view.getWidth() * this.view.getScaleX()) + getEdgeMargin(checkAbsoluteGravity);
|
||||
V v = this.view;
|
||||
Property property = View.TRANSLATION_X;
|
||||
float[] fArr = new float[1];
|
||||
if (checkAbsoluteGravity) {
|
||||
width = -width;
|
||||
}
|
||||
fArr[0] = width;
|
||||
ObjectAnimator ofFloat = ObjectAnimator.ofFloat(v, (Property<V, Float>) property, fArr);
|
||||
if (animatorUpdateListener != null) {
|
||||
ofFloat.addUpdateListener(animatorUpdateListener);
|
||||
}
|
||||
ofFloat.setInterpolator(new FastOutSlowInInterpolator());
|
||||
ofFloat.setDuration(AnimationUtils.lerp(this.hideDurationMax, this.hideDurationMin, backEventCompat.getProgress()));
|
||||
ofFloat.addListener(new AnimatorListenerAdapter() { // from class: com.google.android.material.motion.MaterialSideContainerBackHelper.1
|
||||
@Override // android.animation.AnimatorListenerAdapter, android.animation.Animator.AnimatorListener
|
||||
public void onAnimationEnd(Animator animator) {
|
||||
MaterialSideContainerBackHelper.this.view.setTranslationX(0.0f);
|
||||
MaterialSideContainerBackHelper.this.updateBackProgress(0.0f, z, i);
|
||||
}
|
||||
});
|
||||
if (animatorListener != null) {
|
||||
ofFloat.addListener(animatorListener);
|
||||
}
|
||||
ofFloat.start();
|
||||
}
|
||||
|
||||
public void cancelBackProgress() {
|
||||
if (super.onCancelBackProgress() == null) {
|
||||
return;
|
||||
}
|
||||
AnimatorSet animatorSet = new AnimatorSet();
|
||||
animatorSet.playTogether(ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.SCALE_X, 1.0f), ObjectAnimator.ofFloat(this.view, (Property<V, Float>) View.SCALE_Y, 1.0f));
|
||||
if (this.view instanceof ViewGroup) {
|
||||
ViewGroup viewGroup = (ViewGroup) this.view;
|
||||
for (int i = 0; i < viewGroup.getChildCount(); i++) {
|
||||
animatorSet.playTogether(ObjectAnimator.ofFloat(viewGroup.getChildAt(i), (Property<View, Float>) View.SCALE_Y, 1.0f));
|
||||
}
|
||||
}
|
||||
animatorSet.setDuration(this.cancelDuration);
|
||||
animatorSet.start();
|
||||
}
|
||||
|
||||
private boolean checkAbsoluteGravity(int i, int i2) {
|
||||
return (GravityCompat.getAbsoluteGravity(i, ViewCompat.getLayoutDirection(this.view)) & i2) == i2;
|
||||
}
|
||||
|
||||
private int getEdgeMargin(boolean z) {
|
||||
ViewGroup.LayoutParams layoutParams = this.view.getLayoutParams();
|
||||
if (!(layoutParams instanceof ViewGroup.MarginLayoutParams)) {
|
||||
return 0;
|
||||
}
|
||||
ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) layoutParams;
|
||||
return z ? marginLayoutParams.leftMargin : marginLayoutParams.rightMargin;
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package com.google.android.material.motion;
|
||||
|
||||
import android.animation.TimeInterpolator;
|
||||
import android.content.Context;
|
||||
import android.util.TypedValue;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import androidx.core.graphics.PathParser;
|
||||
import androidx.core.view.animation.PathInterpolatorCompat;
|
||||
import com.google.android.material.resources.MaterialAttributes;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class MotionUtils {
|
||||
private static final String EASING_TYPE_CUBIC_BEZIER = "cubic-bezier";
|
||||
private static final String EASING_TYPE_FORMAT_END = ")";
|
||||
private static final String EASING_TYPE_FORMAT_START = "(";
|
||||
private static final String EASING_TYPE_PATH = "path";
|
||||
|
||||
private MotionUtils() {
|
||||
}
|
||||
|
||||
public static int resolveThemeDuration(Context context, int i, int i2) {
|
||||
return MaterialAttributes.resolveInteger(context, i, i2);
|
||||
}
|
||||
|
||||
public static TimeInterpolator resolveThemeInterpolator(Context context, int i, TimeInterpolator timeInterpolator) {
|
||||
TypedValue typedValue = new TypedValue();
|
||||
if (!context.getTheme().resolveAttribute(i, typedValue, true)) {
|
||||
return timeInterpolator;
|
||||
}
|
||||
if (typedValue.type != 3) {
|
||||
throw new IllegalArgumentException("Motion easing theme attribute must be an @interpolator resource for ?attr/motionEasing*Interpolator attributes or a string for ?attr/motionEasing* attributes.");
|
||||
}
|
||||
String valueOf = String.valueOf(typedValue.string);
|
||||
if (isLegacyEasingAttribute(valueOf)) {
|
||||
return getLegacyThemeInterpolator(valueOf);
|
||||
}
|
||||
return AnimationUtils.loadInterpolator(context, typedValue.resourceId);
|
||||
}
|
||||
|
||||
private static TimeInterpolator getLegacyThemeInterpolator(String str) {
|
||||
if (isLegacyEasingType(str, EASING_TYPE_CUBIC_BEZIER)) {
|
||||
String[] split = getLegacyEasingContent(str, EASING_TYPE_CUBIC_BEZIER).split(",");
|
||||
if (split.length != 4) {
|
||||
throw new IllegalArgumentException("Motion easing theme attribute must have 4 control points if using bezier curve format; instead got: " + split.length);
|
||||
}
|
||||
return PathInterpolatorCompat.create(getLegacyControlPoint(split, 0), getLegacyControlPoint(split, 1), getLegacyControlPoint(split, 2), getLegacyControlPoint(split, 3));
|
||||
}
|
||||
if (isLegacyEasingType(str, EASING_TYPE_PATH)) {
|
||||
return PathInterpolatorCompat.create(PathParser.createPathFromPathData(getLegacyEasingContent(str, EASING_TYPE_PATH)));
|
||||
}
|
||||
throw new IllegalArgumentException("Invalid motion easing type: " + str);
|
||||
}
|
||||
|
||||
private static boolean isLegacyEasingAttribute(String str) {
|
||||
return isLegacyEasingType(str, EASING_TYPE_CUBIC_BEZIER) || isLegacyEasingType(str, EASING_TYPE_PATH);
|
||||
}
|
||||
|
||||
private static boolean isLegacyEasingType(String str, String str2) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(str2);
|
||||
sb.append(EASING_TYPE_FORMAT_START);
|
||||
return str.startsWith(sb.toString()) && str.endsWith(EASING_TYPE_FORMAT_END);
|
||||
}
|
||||
|
||||
private static String getLegacyEasingContent(String str, String str2) {
|
||||
return str.substring(str2.length() + 1, str.length() - 1);
|
||||
}
|
||||
|
||||
private static float getLegacyControlPoint(String[] strArr, int i) {
|
||||
float parseFloat = Float.parseFloat(strArr[i]);
|
||||
if (parseFloat >= 0.0f && parseFloat <= 1.0f) {
|
||||
return parseFloat;
|
||||
}
|
||||
throw new IllegalArgumentException("Motion easing control point value must be between 0 and 1; instead got: " + parseFloat);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user