diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java index 8babd3470b..3ae221bbeb 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/SplitScreenSelectState.java @@ -53,4 +53,9 @@ public class SplitScreenSelectState extends OverviewState { return SplitAnimationTimings.ABORT_DURATION; } } + + @Override + public boolean shouldPreserveDataStateOnReapply() { + return true; + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index e529b04577..b0bb9eb187 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -79,7 +79,6 @@ import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.WindowConfiguration; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.LocusId; @@ -4624,7 +4623,6 @@ public abstract class RecentsView { default boolean showTaskThumbnailSplash() { return false; } + + /** + * For this state, whether member variables and other forms of data state should be preserved + * or wiped when the state is reapplied. (See {@link StateManager#reapplyState()}) + */ + default boolean shouldPreserveDataStateOnReapply() { + return false; + } } diff --git a/src/com/android/launcher3/statemanager/StateManager.java b/src/com/android/launcher3/statemanager/StateManager.java index 34ac8c2ec3..89d89d6eca 100644 --- a/src/com/android/launcher3/statemanager/StateManager.java +++ b/src/com/android/launcher3/statemanager/StateManager.java @@ -184,6 +184,13 @@ public class StateManager> { public void reapplyState(boolean cancelCurrentAnimation) { boolean wasInAnimation = mConfig.currentAnimation != null; if (cancelCurrentAnimation) { + // Animation canceling can trigger a cleanup routine, causing problems when we are in a + // launcher state that relies on member variable data. So if we are in one of those + // states, accelerate the current animation to its end point rather than canceling it + // outright. + if (mState.shouldPreserveDataStateOnReapply() && mConfig.currentAnimation != null) { + mConfig.currentAnimation.end(); + } mAtomicAnimationFactory.cancelAllStateElementAnimation(); cancelAnimation(); }