Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02f12006 authored by Jonathan Miranda's avatar Jonathan Miranda Committed by Android (Google) Code Review
Browse files

Merge "Add new app close implementation." into sc-dev

parents b2a72da3 c9ad2dd6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -693,7 +693,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
                            matrix.postTranslate(windowTransX0, windowTransY0);
                        }

                        floatingView.update(floatingIconBounds, mIconAlpha.value, percent, 0f,
                        floatingView.update(mIconAlpha.value, 255, floatingIconBounds, percent, 0f,
                                mWindowRadius.value * scale, true /* isOpening */);
                        builder.withMatrix(matrix)
                                .withWindowCrop(crop)
+1 −1
Original line number Diff line number Diff line
@@ -1252,7 +1252,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
            HomeAnimationFactory homeAnimationFactory) {
        RectFSpringAnim anim =
                super.createWindowAnimationToHome(startProgress, homeAnimationFactory);
        anim.addOnUpdateListener((r, p) -> {
        anim.addOnUpdateListener((v, r, p) -> {
            updateSysUiFlags(Math.max(p, mCurrentShift.value));
        });
        anim.addAnimatorListener(new AnimationSuccessListener() {
+4 −1
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Utilities;
@@ -56,6 +57,7 @@ import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.anim.SpringAnimationBuilder;
import com.android.quickstep.fallback.FallbackRecentsView;
import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.util.AppCloseConfig;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.TransformParams;
import com.android.quickstep.util.TransformParams.BuilderProxy;
@@ -298,7 +300,8 @@ public class FallbackSwipeHandler extends
        }

        @Override
        public void update(RectF currentRect, float progress, float radius) {
        public void update(@Nullable AppCloseConfig config, RectF currentRect, float progress,
                 float radius) {
            if (mSurfaceControl != null) {
                currentRect.roundOut(mTempRect);
                Transaction t = new Transaction();
+119 −8
Original line number Diff line number Diff line
@@ -15,26 +15,45 @@
 */
package com.android.quickstep;

import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.Utilities.dpToPx;
import static com.android.launcher3.Utilities.mapToRange;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.config.FeatureFlags.PROTOTYPE_APP_CLOSE;
import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION;
import static com.android.launcher3.views.FloatingIconView.getFloatingIconView;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.RectF;
import android.os.UserHandle;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.launcher3.BaseQuickstepLauncher;
import com.android.launcher3.Hotseat;
import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.Workspace;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.SpringAnimationBuilder;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.states.StateAnimationConfig;
import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.views.FloatingIconView;
import com.android.quickstep.util.AppCloseConfig;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.StaggeredWorkspaceAnim;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
import com.android.systemui.plugins.ResourceProvider;
import com.android.systemui.shared.system.InputConsumerController;

/**
@@ -66,24 +85,41 @@ public class LauncherSwipeHandlerV2 extends
            } else {
                workspaceView = null;
            }
            final RectF iconLocation = new RectF();
            boolean canUseWorkspaceView =
                    workspaceView != null && workspaceView.isAttachedToWindow();
            FloatingIconView floatingIconView = canUseWorkspaceView
                    ? FloatingIconView.getFloatingIconView(mActivity, workspaceView,
                    true /* hideOriginal */, iconLocation, false /* isOpening */)
                    : null;

            mActivity.getRootView().setForceHideBackArrow(true);
            mActivity.setHintUserWillBeActive();

            if (canUseWorkspaceView) {
                final ResourceProvider rp = DynamicResource.provider(mActivity);
                final float transY = dpToPx(rp.getFloat(R.dimen.swipe_up_trans_y_dp));
                float dpPerSecond = dpToPx(rp.getFloat(R.dimen.swipe_up_trans_y_dp_per_s));
                final float launcherAlphaMax =
                        rp.getFloat(R.dimen.swipe_up_launcher_alpha_max_progress);

                RectF iconLocation = new RectF();
                FloatingIconView floatingIconView = getFloatingIconView(mActivity, workspaceView,
                        true /* hideOriginal */, iconLocation, false /* isOpening */);

                // We want the window alpha to be 0 once this threshold is met, so that the
                // FolderIconView can be seen morphing into the icon shape.
                float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION;
                homeAnimFactory = new LauncherHomeAnimationFactory() {

                    // There is a delay in loading the icon, so we need to keep the window
                    // opaque until it is ready.
                    private boolean mIsFloatingIconReady = false;

                    private @Nullable ValueAnimator mBounceBackAnimator;

                    @Override
                    public RectF getWindowTargetRect() {
                        if (PROTOTYPE_APP_CLOSE.get()) {
                            // We want the target rect to be at this offset position, so that all
                            // launcher content can spring back upwards.
                            floatingIconView.setPositionOffsetY(transY);
                        }
                        return iconLocation;
                    }

@@ -92,17 +128,92 @@ public class LauncherSwipeHandlerV2 extends
                        anim.addAnimatorListener(floatingIconView);
                        floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged);
                        floatingIconView.setFastFinishRunnable(anim::end);
                        if (PROTOTYPE_APP_CLOSE.get()) {
                            mBounceBackAnimator = bounceBackToRestingPosition();
                            // Use a spring to put drag layer translation back to 0.
                            anim.addAnimatorListener(new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationEnd(Animator animation) {
                                    floatingIconView.setPositionOffsetY(0);
                                    mBounceBackAnimator.start();
                                }
                            });

                            Workspace workspace = mActivity.getWorkspace();
                            workspace.setPivotToScaleWithSelf(mActivity.getHotseat());
                        }
                    }

                    private ValueAnimator bounceBackToRestingPosition() {
                        DragLayer dl = mActivity.getDragLayer();
                        Workspace workspace = mActivity.getWorkspace();
                        Hotseat hotseat = mActivity.getHotseat();

                        final float startValue = transY;
                        final float endValue = 0;
                        // Ensures the velocity is always aligned with the direction.
                        float pixelPerSecond = Math.abs(dpPerSecond)
                                * Math.signum(endValue - transY);

                        ValueAnimator springTransY = new SpringAnimationBuilder(dl.getContext())
                                .setStiffness(rp.getFloat(R.dimen.swipe_up_trans_y_stiffness))
                                .setDampingRatio(rp.getFloat(R.dimen.swipe_up_trans_y_damping))
                                .setMinimumVisibleChange(1f)
                                .setStartValue(startValue)
                                .setEndValue(endValue)
                                .setStartVelocity(pixelPerSecond)
                                .build(dl, VIEW_TRANSLATE_Y);
                        springTransY.addListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                dl.setTranslationY(0f);
                                dl.setAlpha(1f);
                                SCALE_PROPERTY.set(workspace, 1f);
                                SCALE_PROPERTY.set(hotseat, 1f);
                            }
                        });
                        return springTransY;
                    }

                    @Override
                    public void update(RectF currentRect, float progress, float radius) {
                        floatingIconView.update(currentRect, 1f, progress, windowAlphaThreshold,
                                radius, false);
                    public boolean keepWindowOpaque() {
                        if (mIsFloatingIconReady || floatingIconView.isVisibleToUser()) {
                            mIsFloatingIconReady = true;
                            return false;
                        }
                        return true;
                    }

                    @Override
                    public void update(@Nullable AppCloseConfig config, RectF currentRect,
                            float progress, float radius) {
                        int fgAlpha = 255;
                        if (config != null && PROTOTYPE_APP_CLOSE.get()) {
                            DragLayer dl = mActivity.getDragLayer();
                            float translationY = config.getWorkspaceTransY();
                            dl.setTranslationY(translationY);

                            float alpha = mapToRange(progress, 0, launcherAlphaMax, 0, 1f, LINEAR);
                            dl.setAlpha(Math.min(alpha, 1f));

                            float scale = Math.min(1f, config.getWorkspaceScale());
                            SCALE_PROPERTY.set(mActivity.getWorkspace(), scale);
                            SCALE_PROPERTY.set(mActivity.getHotseat(), scale);
                            SCALE_PROPERTY.set(mActivity.getAppsView(), scale);

                            progress = config.getInterpolatedProgress();
                            fgAlpha = config.getFgAlpha();
                        }
                        floatingIconView.update(1f, fgAlpha, currentRect, progress,
                                windowAlphaThreshold, radius, false);
                    }

                    @Override
                    public void onCancel() {
                        floatingIconView.fastFinish();
                        if (mBounceBackAnimator != null) {
                            mBounceBackAnimator.cancel();
                        }
                    }
                };
            } else {
+28 −6
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package com.android.quickstep;

import static com.android.launcher3.anim.Interpolators.ACCEL_1_5;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.config.FeatureFlags.PROTOTYPE_APP_CLOSE;

import android.animation.Animator;
import android.content.Context;
@@ -26,6 +27,7 @@ import android.graphics.Rect;
import android.graphics.RectF;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;

import com.android.launcher3.DeviceProfile;
@@ -35,7 +37,9 @@ import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.AppCloseConfig;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.RectFSpringAnim2;
import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.util.TransformParams;
import com.android.quickstep.util.TransformParams.BuilderProxy;
@@ -149,7 +153,10 @@ public abstract class SwipeUpAnimationLogic {

        public void setAnimation(RectFSpringAnim anim) { }

        public void update(RectF currentRect, float progress, float radius) { }
        public boolean keepWindowOpaque() { return false; }

        public void update(@Nullable AppCloseConfig config, RectF currentRect, float progress,
                float radius) { }

        public void onCancel() { }

@@ -199,7 +206,14 @@ public abstract class SwipeUpAnimationLogic {
        homeToWindowPositionMap.invert(windowToHomePositionMap);
        windowToHomePositionMap.mapRect(startRect);

        RectFSpringAnim anim = new RectFSpringAnim(startRect, targetRect, mContext);
        RectFSpringAnim anim;
        if (PROTOTYPE_APP_CLOSE.get()) {
            anim = new RectFSpringAnim2(startRect, targetRect, mContext,
                    mTaskViewSimulator.getCurrentCornerRadius(),
                    cropRectF.width() / 2f);
        } else {
            anim = new RectFSpringAnim(startRect, targetRect, mContext);
        }
        homeAnimationFactory.setAnimation(anim);

        SpringAnimationRunner runner = new SpringAnimationRunner(
@@ -259,18 +273,26 @@ public abstract class SwipeUpAnimationLogic {
        }

        @Override
        public void onUpdate(RectF currentRect, float progress) {
        public void onUpdate(@Nullable AppCloseConfig config, RectF currentRect, float progress) {
            mHomeAnim.setPlayFraction(progress);
            mHomeToWindowPositionMap.mapRect(mWindowCurrentRect, currentRect);

            mMatrix.setRectToRect(mCropRectF, mWindowCurrentRect, ScaleToFit.FILL);
            float cornerRadius = Utilities.mapRange(progress, mStartRadius, mEndRadius);
            float alpha = getWindowAlpha(progress);
            if (config != null && PROTOTYPE_APP_CLOSE.get()) {
                alpha = config.getWindowAlpha();
                cornerRadius = config.getCornerRadius();
            }
            if (mAnimationFactory.keepWindowOpaque()) {
                alpha = 1f;
            }
            mTransformParams
                    .setTargetAlpha(getWindowAlpha(progress))
                    .setTargetAlpha(alpha)
                    .setCornerRadius(cornerRadius);

            mTransformParams.applySurfaceParams(mTransformParams.createSurfaceParams(this));
            mAnimationFactory.update(currentRect, progress, mMatrix.mapRadius(cornerRadius));
            mAnimationFactory.update(config, currentRect, progress,
                    mMatrix.mapRadius(cornerRadius));
        }

        @Override
Loading