200 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| 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;
 | |
|     }
 | |
| }
 |