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

Commit 8a50a6d8 authored by Tony Wickham's avatar Tony Wickham
Browse files

Send home intent after reaching 3P launcher on swipe up

Also keep the 3P launcher's alpha at 0 during the gesture, and
don't send the home intent if user touches during the transition.

Bug: 139682945
Change-Id: Ie758f0b337bb173b34f5585ec1915b7ea1145094
parent 51a5bf15
Loading
Loading
Loading
Loading
+18 −14
Original line number Diff line number Diff line
@@ -430,20 +430,6 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
        final float windowAlphaThreshold = isFloatingIconView ? 1f - SHAPE_PROGRESS_DURATION : 1f;
        anim.addOnUpdateListener(new RectFSpringAnim.OnUpdateListener() {

            // Alpha interpolates between [1, 0] between progress values [start, end]
            final float start = 0f;
            final float end = 0.85f;

            private float getWindowAlpha(float progress) {
                if (progress <= start) {
                    return 1f;
                }
                if (progress >= end) {
                    return 0f;
                }
                return Utilities.mapToRange(progress, start, end, 1, 0, ACCEL_1_5);
            }

            @Override
            public void onUpdate(RectF currentRect, float progress) {
                homeAnim.setPlayFraction(progress);
@@ -484,6 +470,24 @@ public abstract class BaseSwipeUpHandler<T extends BaseDraggingActivity, Q exten
        return anim;
    }

    /**
     * @param progress The progress of the animation to the home screen.
     * @return The current alpha to set on the animating app window.
     */
    protected float getWindowAlpha(float progress) {
        // Alpha interpolates between [1, 0] between progress values [start, end]
        final float start = 0f;
        final float end = 0.85f;

        if (progress <= start) {
            return 1f;
        }
        if (progress >= end) {
            return 0f;
        }
        return Utilities.mapToRange(progress, start, end, 1, 0, ACCEL_1_5);
    }

    public interface Factory {

        BaseSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs,
+39 −6
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
package com.android.quickstep;

import static com.android.launcher3.anim.Interpolators.ACCEL_1_5;
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
import static com.android.quickstep.GestureState.GestureEndTarget.HOME;
import static com.android.quickstep.GestureState.GestureEndTarget.LAST_TASK;
import static com.android.quickstep.GestureState.GestureEndTarget.NEW_TASK;
@@ -34,6 +36,7 @@ import android.graphics.PointF;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.ArrayMap;
import android.view.MotionEvent;

import com.android.launcher3.R;
import com.android.launcher3.anim.AnimationSuccessListener;
@@ -97,6 +100,7 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
    private final boolean mContinuingLastGesture;
    private final boolean mRunningOverHome;
    private final boolean mSwipeUpOverHome;
    private boolean mTouchedHomeDuringTransition;

    private final PointF mEndVelocityPxPerMs = new PointF(0, 0.5f);
    private RunningWindowAnim mFinishAnimation;
@@ -105,13 +109,14 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
            GestureState gestureState, InputConsumerController inputConsumer,
            boolean isLikelyToStartNewTask, boolean continuingLastGesture) {
        super(context, deviceState, gestureState, inputConsumer);
        mLauncherAlpha.value = 1;

        mInQuickSwitchMode = isLikelyToStartNewTask || continuingLastGesture;
        mContinuingLastGesture = continuingLastGesture;
        mRunningOverHome = ActivityManagerWrapper.isHomeTask(mGestureState.getRunningTask());
        mSwipeUpOverHome = mRunningOverHome && !mInQuickSwitchMode;

        // Keep the home launcher invisible until we decide to land there.
        mLauncherAlpha.value = mRunningOverHome ? 1 : 0;
        if (mSwipeUpOverHome) {
            mAppWindowAnimationHelper.setBaseAlphaCallback((t, a) -> 1 - mLauncherAlpha.value);
        } else {
@@ -198,15 +203,27 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
    @Override
    protected InputConsumer createNewInputProxyHandler() {
        // Just consume all input on the active task
        return InputConsumer.NO_OP;
        return new InputConsumer() {
            @Override
            public int getType() {
                return InputConsumer.TYPE_NO_OP;
            }

            @Override
            public void onMotionEvent(MotionEvent ev) {
                mTouchedHomeDuringTransition = true;
            }
        };
    }

    @Override
    public void onMotionPauseChanged(boolean isPaused) {
        if (!mInQuickSwitchMode) {
            mIsMotionPaused = isPaused;
            if (mSwipeUpOverHome) {
                mLauncherAlpha.animateToValue(mLauncherAlpha.value, isPaused ? 0 : 1)
                        .setDuration(150).start();
            }
            performHapticFeedback();
        }
    }
@@ -315,7 +332,14 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
                    // Send a home intent to clear the task stack
                    mContext.startActivity(mGestureState.getHomeIntent());
                } else {
                    mRecentsAnimationController.finish(true, null, true);
                    mRecentsAnimationController.finish(true, () -> {
                        if (!mTouchedHomeDuringTransition) {
                            // If the user hasn't interacted with the screen during the transition,
                            // send a home intent so launcher can go to the default home screen.
                            // (If they are trying to touch something, we don't want to interfere.)
                            mContext.startActivity(mGestureState.getHomeIntent());
                        }
                    }, true);
                }
                break;
            }
@@ -389,6 +413,8 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
            };

            if (mGestureState.getEndTarget() == HOME && !mRunningOverHome) {
                mRecentsAnimationController.enableInputProxy(mInputConsumer,
                        this::createNewInputProxyHandler);
                RectFSpringAnim anim = createWindowAnimationToHome(mCurrentShift.value, duration);
                anim.addAnimatorListener(endListener);
                anim.start(mEndVelocityPxPerMs);
@@ -445,11 +471,18 @@ public class FallbackSwipeHandler extends BaseSwipeUpHandler<RecentsActivity, Fa
            @Override
            public AnimatorPlaybackController createActivityAnimationToHome() {
                AnimatorSet anim = new AnimatorSet();
                anim.play(mLauncherAlpha.animateToValue(mLauncherAlpha.value, 1));
                Animator fadeInLauncher = mLauncherAlpha.animateToValue(mLauncherAlpha.value, 1);
                fadeInLauncher.setInterpolator(ACCEL_2);
                anim.play(fadeInLauncher);
                anim.setDuration(duration);
                return AnimatorPlaybackController.wrap(anim, duration);
            }
        };
        return createWindowAnimationToHome(startProgress, factory);
    }

    @Override
    protected float getWindowAlpha(float progress) {
        return 1 - ACCEL_1_5.getInterpolation(progress);
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -558,6 +558,7 @@ public final class LauncherInstrumentation {
                dumpViewHierarchy();
                log(action = "swiping up to home from " + getVisibleStateMessage());
                final int finalState = mDevice.hasObject(By.pkg(getLauncherPackageName()))
                        || isFallbackOverview()
                        ? NORMAL_STATE_ORDINAL : BACKGROUND_APP_STATE_ORDINAL;

                try (LauncherInstrumentation.Closable c = addContextLayer(action)) {