diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2022-02-28 00:37:13 -0800 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2022-02-28 00:37:13 -0800 |
commit | a5f4e7c5280d6a46cf7720472d63c91c404ed8e9 (patch) | |
tree | b86cb13df5b096cfe05edb81d0eb231416903829 | |
parent | 6cd77e393cc7736488391fe28355daeda8e59bda (diff) | |
parent | a1cc53127bc070cd70b06efe3f8e95d9d06e2a77 (diff) |
Merge a1cc53127bc070cd70b06efe3f8e95d9d06e2a77 on remote branch
Change-Id: Ic75496c1b2b0f7daa24b6b6400a9e7998f4dbf51
5 files changed, 31 insertions, 7 deletions
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index ac1772c300..97481233be 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -428,6 +428,10 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, mAnimationFactory = mActivityInterface.prepareRecentsUI(mDeviceState, mWasLauncherAlreadyVisible, this::onAnimatorPlaybackControllerCreated); maybeUpdateRecentsAttachedState(false /* animate */); + if (mGestureState.getEndTarget() != null) { + // Update the end target in case the gesture ended before we init. + mAnimationFactory.setEndTarget(mGestureState.getEndTarget()); + } }; if (mWasLauncherAlreadyVisible) { // Launcher is visible, but might be about to stop. Thus, if we prepare recents @@ -976,6 +980,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, isFling, isCancel); // Set the state, but don't notify until the animation completes mGestureState.setEndTarget(endTarget, false /* isAtomic */); + mAnimationFactory.setEndTarget(endTarget); float endShift = endTarget.isLauncher ? 1 : 0; final float startShift; @@ -1360,7 +1365,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, mActivity.clearRunOnceOnStartCallback(); resetLauncherListeners(); } - if (mGestureState.getEndTarget() != null && !mGestureState.isRunningAnimationToLauncher()) { + if (mGestureState.isRecentsAnimationRunning() && mGestureState.getEndTarget() != null + && !mGestureState.getEndTarget().isLauncher) { + // Continued quick switch. cancelCurrentAnimation(); } else { mStateCallback.setStateOnUiThread(STATE_FINISH_WITH_NO_END); diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index fac4d52826..923a959986 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -77,12 +77,14 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T public final boolean rotationSupportedByActivity; - private final STATE_TYPE mOverviewState, mBackgroundState; + private final STATE_TYPE mBackgroundState; + + private STATE_TYPE mTargetState; protected BaseActivityInterface(boolean rotationSupportedByActivity, STATE_TYPE overviewState, STATE_TYPE backgroundState) { this.rotationSupportedByActivity = rotationSupportedByActivity; - mOverviewState = overviewState; + mTargetState = overviewState; mBackgroundState = backgroundState; } @@ -399,6 +401,9 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T default boolean isRecentsAttachedToAppWindow() { return false; } + + /** Called when the gesture ends and we know what state it is going towards */ + default void setEndTarget(GestureState.GestureEndTarget endTarget) { } } class DefaultAnimationFactory implements AnimationFactory { @@ -435,7 +440,7 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T // Since we are changing the start position of the UI, reapply the state, at the end controller.setEndAction(() -> mActivity.getStateManager().goToState( - controller.getInterpolatedProgress() > 0.5 ? mOverviewState : mBackgroundState, + controller.getInterpolatedProgress() > 0.5 ? mTargetState : mBackgroundState, false)); RecentsView recentsView = mActivity.getOverviewPanel(); @@ -490,6 +495,11 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T return mIsAttachedToWindow; } + @Override + public void setEndTarget(GestureState.GestureEndTarget endTarget) { + mTargetState = stateFromGestureEndTarget(endTarget); + } + protected void createBackgroundToOverviewAnim(ACTIVITY_TYPE activity, PendingAnimation pa) { // Scale down recents from being full screen to being in overview. RecentsView recentsView = activity.getOverviewPanel(); diff --git a/quickstep/src/com/android/quickstep/GestureState.java b/quickstep/src/com/android/quickstep/GestureState.java index e3ae36182e..aabba66386 100644 --- a/quickstep/src/com/android/quickstep/GestureState.java +++ b/quickstep/src/com/android/quickstep/GestureState.java @@ -346,8 +346,8 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL * @return whether the recents animation is started but not yet ended */ public boolean isRecentsAnimationRunning() { - return mStateCallback.hasStates(STATE_RECENTS_ANIMATION_INITIALIZED) && - !mStateCallback.hasStates(STATE_RECENTS_ANIMATION_ENDED); + return mStateCallback.hasStates(STATE_RECENTS_ANIMATION_STARTED) + && !mStateCallback.hasStates(STATE_RECENTS_ANIMATION_ENDED); } @Override diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 67bd85fffe..d7af074954 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -106,6 +106,13 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn // But force-finish it anyways finishRunningRecentsAnimation(false /* toHome */); + if (mCallbacks != null) { + // If mCallbacks still != null, that means we are getting this startRecentsAnimation() + // before the previous one got onRecentsAnimationStart(). In that case, cleanup the + // previous animation so it doesn't mess up/listen to state changes in this animation. + cleanUpRecentsAnimation(); + } + final BaseActivityInterface activityInterface = gestureState.getActivityInterface(); mLastGestureState = gestureState; mCallbacks = new RecentsAnimationCallbacks(activityInterface.allowMinimizeSplitScreen()); diff --git a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java index dc73a9a51c..7c463a7b46 100644 --- a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java +++ b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java @@ -44,7 +44,7 @@ public abstract class AbstractQuickStepTest extends AbstractLauncherUiTest { protected void onLauncherActivityClose(Launcher launcher) { RecentsView recentsView = launcher.getOverviewPanel(); if (recentsView != null) { - recentsView.finishRecentsAnimation(true, null); + recentsView.finishRecentsAnimation(false /* toRecents */, null); } } |