[automerge] Prevent lingering divider animators in AbsSwipeUpHandler 2p: 7faaffa56a

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/16693066

Bug: 213403679
Change-Id: I628b14fb01461a103dd0cdd7168835197a28f1c5
Merged-In: I078a7d0f22c2ef2ba847796ec79e740c789ce1ae
This commit is contained in:
Presubmit Automerger Backend
2022-02-16 17:13:58 +00:00
3 changed files with 51 additions and 48 deletions

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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);