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

Commit 144b0504 authored by Winson Chung's avatar Winson Chung Committed by Android (Google) Code Review
Browse files

Merge "Prevent lingering divider animators in AbsSwipeUpHandler" into sc-v2-dev

parents a6c2e3f2 7faaffa5
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -249,6 +249,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    private RunningWindowAnim[] mRunningWindowAnim;
    // Possible second animation running at the same time as mRunningWindowAnim
    private Animator mParallelRunningAnim;
    // Current running divider animation
    private ValueAnimator mDividerAnimator;
    private boolean mIsMotionPaused;
    private boolean mHasMotionEverBeenPaused;

@@ -831,8 +833,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        // Notify when the animation starts
        flushOnRecentsAnimationAndLauncherBound();

        TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps,
                false /*shown*/, true /*animate*/);
        // Start hiding the divider
        setDividerShown(false, false /* immediate */);

        // Only add the callback to enable the input consumer after we actually have the controller
        mStateCallback.runOnceAtState(STATE_APP_CONTROLLER_RECEIVED | STATE_GESTURE_STARTED,
@@ -849,8 +851,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED);

        if (mRecentsAnimationTargets != null) {
            TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps,
                    true /*shown*/, true /*animate*/);
            setDividerShown(true, false /* immediate */);
        }

        // Defer clearing the controller and the targets until after we've updated the state
@@ -1000,8 +1001,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
                    mStateCallback.setState(STATE_RESUME_LAST_TASK);
                }
                if (mRecentsAnimationTargets != null) {
                    TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps,
                            true /*shown*/, false /*animate*/);
                    setDividerShown(true, true /* immediate */);
                }
                break;
        }
@@ -1653,8 +1653,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        mActivityInterface.onTransitionCancelled(wasVisible, mGestureState.getEndTarget());

        if (mRecentsAnimationTargets != null) {
            TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps,
                    true /*shown*/, false /*animate*/);
            setDividerShown(true, true /* immediate */);
        }

        // Leave the pending invisible flag, as it may be used by wallpaper open animation.
@@ -1920,8 +1919,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    @Override
    public void onRecentsAnimationFinished(RecentsAnimationController controller) {
        if (!controller.getFinishTargetIsLauncher()) {
            TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps,
                    true /*shown*/, true /*animate*/);
            setDividerShown(true, false /* immediate */);
        }
        mRecentsAnimationController = null;
        mRecentsAnimationTargets = null;
@@ -2026,6 +2024,19 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        return scaleProgress;
    }

    private void setDividerShown(boolean shown, boolean immediate) {
        if (mDividerAnimator != null) {
            mDividerAnimator.cancel();
        }
        mDividerAnimator = TaskViewUtils.createSplitAuxiliarySurfacesAnimator(
                mRecentsAnimationTargets.nonApps, shown, (dividerAnimator) -> {
                    dividerAnimator.start();
                    if (immediate) {
                        dividerAnimator.end();
                    }
                });
    }

    /**
     * Used for winscope tracing, see launcher_trace.proto
     * @see com.android.systemui.shared.tracing.ProtoTraceable#writeToProto
+24 −35
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * Utility class for helpful methods related to {@link TaskView} objects and their tasks.
@@ -538,8 +539,16 @@ public final class TaskViewUtils {
                nonAppTargets, depthController, pa);
        if (launcherClosing) {
            // TODO(b/182592057): differentiate between "restore split" vs "launch fullscreen app"
            TaskViewUtils.setSplitAuxiliarySurfacesShown(nonAppTargets,
                    true /*shown*/, true /*animate*/, pa);
            TaskViewUtils.createSplitAuxiliarySurfacesAnimator(nonAppTargets, true /*shown*/,
                    (dividerAnimator) -> {
                        // If split apps are launching, we want to delay showing the divider bar
                        // until the very end once the apps are mostly in place. This is because we
                        // aren't moving the divider leash in the relative position with the
                        // launching apps.
                        dividerAnimator.setStartDelay(pa.getDuration()
                                - SPLIT_DIVIDER_ANIM_DURATION);
                        pa.add(dividerAnimator);
                    });
        }

        Animator childStateAnimation = null;
@@ -594,16 +603,17 @@ public final class TaskViewUtils {
        anim.addListener(windowAnimEndListener);
    }

    public static void setSplitAuxiliarySurfacesShown(RemoteAnimationTargetCompat[] nonApps,
            boolean shown, boolean animate) {
        setSplitAuxiliarySurfacesShown(nonApps, shown, animate,null);
    }

    private static void setSplitAuxiliarySurfacesShown(
            @NonNull RemoteAnimationTargetCompat[] nonApps, boolean shown, boolean animate,
            @Nullable PendingAnimation splitLaunchAnimation) {
    /**
     * Creates an animation to show/hide the auxiliary surfaces (aka. divider bar), only calling
     * {@param animatorHandler} if there are valid surfaces to animate.
     *
     * @return the animator animating the surfaces
     */
    public static ValueAnimator createSplitAuxiliarySurfacesAnimator(
            RemoteAnimationTargetCompat[] nonApps, boolean shown,
            Consumer<ValueAnimator> animatorHandler) {
        if (nonApps == null || nonApps.length == 0) {
            return;
            return null;
        }

        SurfaceControl.Transaction t = new SurfaceControl.Transaction();
@@ -618,20 +628,7 @@ public final class TaskViewUtils {
            }
        }
        if (!hasSurfaceToAnimate) {
            return;
        }

        if (!animate) {
            for (SurfaceControl leash : auxiliarySurfaces) {
                t.setAlpha(leash, shown ? 1 : 0);
                if (shown) {
                    t.show(leash);
                } else {
                    t.hide(leash);
                }
            }
            t.apply();
            return;
            return null;
        }

        ValueAnimator dockFadeAnimator = ValueAnimator.ofFloat(0f, 1f);
@@ -668,15 +665,7 @@ public final class TaskViewUtils {
            }
        });
        dockFadeAnimator.setDuration(SPLIT_DIVIDER_ANIM_DURATION);
        if (splitLaunchAnimation != null) {
            // If split apps are launching, we want to delay showing the divider bar until the very
            // end once the apps are mostly in place. This is because we aren't moving the divider
            // leash in the relative position with the launching apps.
            dockFadeAnimator.setStartDelay(
                    splitLaunchAnimation.getDuration() - SPLIT_DIVIDER_ANIM_DURATION);
            splitLaunchAnimation.add(dockFadeAnimator);
        } else {
            dockFadeAnimator.start();
        }
        animatorHandler.accept(dockFadeAnimator);
        return dockFadeAnimator;
    }
}
+6 −3
Original line number Diff line number Diff line
@@ -4241,9 +4241,12 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
            if (isSuccess) {
                if (tv.getTaskIds()[1] != -1) {
                    // TODO(b/194414938): make this part of the animations instead.
                    TaskViewUtils.setSplitAuxiliarySurfacesShown(mRemoteTargetHandles[0]
                            .getTransformParams().getTargetSet().nonApps,
                            true /*shown*/, false /*animate*/);
                    TaskViewUtils.createSplitAuxiliarySurfacesAnimator(
                            mRemoteTargetHandles[0].getTransformParams().getTargetSet().nonApps,
                            true /*shown*/, (dividerAnimator) -> {
                                dividerAnimator.start();
                                dividerAnimator.end();
                            });
                }
                if (ENABLE_QUICKSTEP_LIVE_TILE.get() && tv.isRunningTask()) {
                    finishRecentsAnimation(false /* toRecents */, null);