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
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index e9385d9..4ffe582 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -278,8 +278,6 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
}
mRecentsAnimationController.enableInputConsumer();
-
- // Start hiding the divider
- if (!mIsTransientTaskbar || mTaskbarAlreadyOpen || mIsTaskbarAllAppsOpen
- || mDividerHiddenBeforeAnimation) {
- setDividerShown(false /* shown */, true /* immediate */);
- }
}
private void computeRecentsScrollIfInvisible() {
@@ -2154,9 +2138,6 @@
@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 @@
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 @@
// "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 @@
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 725f9e7..dde5d55 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -188,12 +188,8 @@
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 da97df6..f0d0bdb 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -679,28 +679,36 @@
/**
* 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<ValueAnimator> animatorHandler) {
+ @Nullable RemoteAnimationTarget[] nonApps, boolean shown,
+ @Nullable Consumer<ValueAnimator> animatorHandler) {
if (nonApps == null || nonApps.length == 0) {
return null;
}
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
- List<SurfaceControl> 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<SurfaceControl> 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;
}