From 99696bcaf779d9c1a897f870bde3a193995b6e5c Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Wed, 15 Mar 2023 15:34:22 +0000 Subject: [PATCH] Consolidate split divider show/hide behavior Consolidate split divider show/hide behavior by hiding the divider bar at a single point where the tasks actually start moving. So it won't need to deal with hiding the divider before the animation targets ready. Also prevents to hide the divider too early when users were just unstashing the taskbar. Fix: 261376202 Test: http://recall/-/fLARJNt42LVxc3tt86SneW/colHl9bXqOzppYV5o2Hmjh Change-Id: I2b7b37c2b20cc379581b34c0104fa45246c27e8f --- .../android/quickstep/AbsSwipeUpHandler.java | 62 +++++-------------- .../quickstep/TaskAnimationManager.java | 8 +-- .../com/android/quickstep/TaskViewUtils.java | 30 +++++---- 3 files changed, 38 insertions(+), 62 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index e9385d9fd1..4ffe582f8b 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -278,8 +278,6 @@ public abstract class AbsSwipeUpHandler, 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; @@ -325,8 +323,8 @@ public abstract class AbsSwipeUpHandler, private final boolean mIsTransientTaskbar; // May be set to false when mIsTransientTaskbar is true. private boolean mCanSlowSwipeGoHome = true; - private boolean mHasReachedOverviewThreshold = false; - private boolean mDividerHiddenBeforeAnimation = false; + // Indicates whether the divider is shown, only used when split screen is activated. + private boolean mIsDividerShown = true; @Nullable private RemoteAnimationTargets.ReleaseCheck mSwipePipToHomeReleaseCheck = null; @@ -767,10 +765,6 @@ public abstract class AbsSwipeUpHandler, private void setIsLikelyToStartNewTask(boolean isLikelyToStartNewTask, boolean animate) { if (mIsLikelyToStartNewTask != isLikelyToStartNewTask) { - if (isLikelyToStartNewTask && mIsTransientTaskbar) { - setDividerShown(false /* shown */, true /* immediate */); - } - mIsLikelyToStartNewTask = isLikelyToStartNewTask; maybeUpdateRecentsAttachedState(animate); } @@ -1110,9 +1104,8 @@ public abstract class AbsSwipeUpHandler, } else { mStateCallback.setState(STATE_RESUME_LAST_TASK); } - if (mRecentsAnimationTargets != null) { - setDividerShown(true /* shown */, true /* immediate */); - } + // Restore the divider as it resumes the last top-tasks. + setDividerShown(true); break; } ActiveGestureLog.INSTANCE.addLog( @@ -1284,9 +1277,6 @@ public abstract class AbsSwipeUpHandler, if (mRecentsAnimationController != null) { mRecentsAnimationController.detachNavigationBarFromApp(true); } - if (mIsTransientTaskbar) { - setDividerShown(false /* shown */, true /* immediate */); - } } else if (endTarget == RECENTS) { if (mRecentsView != null) { int nearestPage = mRecentsView.getDestinationPage(); @@ -1685,12 +1675,6 @@ public abstract class AbsSwipeUpHandler, } mRecentsAnimationController.enableInputConsumer(); - - // Start hiding the divider - if (!mIsTransientTaskbar || mTaskbarAlreadyOpen || mIsTaskbarAllAppsOpen - || mDividerHiddenBeforeAnimation) { - setDividerShown(false /* shown */, true /* immediate */); - } } private void computeRecentsScrollIfInvisible() { @@ -2154,9 +2138,6 @@ public abstract class AbsSwipeUpHandler, @Override public void onRecentsAnimationFinished(RecentsAnimationController controller) { - if (!controller.getFinishTargetIsLauncher()) { - setDividerShown(true /* shown */, false /* immediate */); - } mRecentsAnimationController = null; mRecentsAnimationTargets = null; if (mRecentsView != null) { @@ -2256,18 +2237,23 @@ public abstract class AbsSwipeUpHandler, boolean notSwipingToHome = mRecentsAnimationTargets != null && mGestureState.getEndTarget() != HOME; boolean setRecentsScroll = mRecentsViewScrollLinked && mRecentsView != null; + float progress = Math.max(mCurrentShift.value, getScaleProgressDueToScroll()); + int scrollOffset = setRecentsScroll ? mRecentsView.getScrollOffset() : 0; + if (progress > 0 || scrollOffset != 0) { + // Hide the divider as the tasks start moving. + setDividerShown(false); + } for (RemoteTargetHandle remoteHandle : mRemoteTargetHandles) { AnimatorControllerWithResistance playbackController = remoteHandle.getPlaybackController(); if (playbackController != null) { - playbackController.setProgress(Math.max(mCurrentShift.value, - getScaleProgressDueToScroll()), mDragLengthFactor); + playbackController.setProgress(progress, mDragLengthFactor); } if (notSwipingToHome) { TaskViewSimulator taskViewSimulator = remoteHandle.getTaskViewSimulator(); if (setRecentsScroll) { - taskViewSimulator.setScroll(mRecentsView.getScrollOffset()); + taskViewSimulator.setScroll(scrollOffset); } taskViewSimulator.apply(remoteHandle.getTransformParams()); } @@ -2326,10 +2312,6 @@ public abstract class AbsSwipeUpHandler, // "Catch up" with the displacement at mTaskbarCatchUpThreshold. if (displacement < mTaskbarCatchUpThreshold) { - if (!mHasReachedOverviewThreshold) { - setDividerShown(false /* shown */, true /* immediate */); - mHasReachedOverviewThreshold = true; - } return Utilities.mapToRange(displacement, mTaskbarAppWindowThreshold, mTaskbarCatchUpThreshold, 0, mTaskbarCatchUpThreshold, ACCEL_DEACCEL); } @@ -2337,23 +2319,13 @@ public abstract class AbsSwipeUpHandler, return displacement; } - private void setDividerShown(boolean shown, boolean immediate) { - if (mRecentsAnimationTargets == null) { - if (!shown) { - mDividerHiddenBeforeAnimation = true; - } + private void setDividerShown(boolean shown) { + if (mRecentsAnimationTargets == null || mIsDividerShown == shown) { return; } - if (mDividerAnimator != null) { - mDividerAnimator.cancel(); - } - mDividerAnimator = TaskViewUtils.createSplitAuxiliarySurfacesAnimator( - mRecentsAnimationTargets.nonApps, shown, (dividerAnimator) -> { - dividerAnimator.start(); - if (immediate) { - dividerAnimator.end(); - } - }); + mIsDividerShown = shown; + TaskViewUtils.createSplitAuxiliarySurfacesAnimator( + mRecentsAnimationTargets.nonApps, shown, null /* animatorHandler */); } /** diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 725f9e72ed..dde5d55de4 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -188,12 +188,8 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn return; } } else if (nonAppTargets.length > 0) { - TaskViewUtils.createSplitAuxiliarySurfacesAnimator( - nonAppTargets /* nonApps */, - true /*shown*/, dividerAnimator -> { - dividerAnimator.start(); - dividerAnimator.end(); - }); + TaskViewUtils.createSplitAuxiliarySurfacesAnimator(nonAppTargets /* nonApps */, + true /*shown*/, null /* animatorHandler */); } if (mController != null) { if (mLastAppearedTaskTarget == null diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java index da97df6dd5..f0d0bdb0ed 100644 --- a/quickstep/src/com/android/quickstep/TaskViewUtils.java +++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java @@ -679,28 +679,36 @@ public final class TaskViewUtils { /** * Creates an animation to show/hide the auxiliary surfaces (aka. divider bar), only calling * {@param animatorHandler} if there are valid surfaces to animate. + * Passing null handler to apply the visibility immediately. * * @return the animator animating the surfaces */ public static ValueAnimator createSplitAuxiliarySurfacesAnimator( - RemoteAnimationTarget[] nonApps, boolean shown, - Consumer animatorHandler) { + @Nullable RemoteAnimationTarget[] nonApps, boolean shown, + @Nullable Consumer animatorHandler) { if (nonApps == null || nonApps.length == 0) { return null; } - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - List auxiliarySurfaces = new ArrayList<>(nonApps.length); - boolean hasSurfaceToAnimate = false; - for (int i = 0; i < nonApps.length; ++i) { - final RemoteAnimationTarget targ = nonApps[i]; - final SurfaceControl leash = targ.leash; - if (targ.windowType == TYPE_DOCK_DIVIDER && leash != null && leash.isValid()) { + List auxiliarySurfaces = new ArrayList<>(); + for (RemoteAnimationTarget target : nonApps) { + final SurfaceControl leash = target.leash; + if (target.windowType == TYPE_DOCK_DIVIDER && leash != null && leash.isValid()) { auxiliarySurfaces.add(leash); - hasSurfaceToAnimate = true; } } - if (!hasSurfaceToAnimate) { + if (auxiliarySurfaces.isEmpty()) { + return null; + } + + SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + if (animatorHandler == null) { + // Apply the visibility directly without fade animation. + for (SurfaceControl leash : auxiliarySurfaces) { + t.setVisibility(leash, shown); + } + t.apply(); + t.close(); return null; }