Merge "Handling activity recreate due to configuration changes in the middle of the long fling" into ub-launcher3-edmonton
diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java
index 529a765..85106ba 100644
--- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java
+++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java
@@ -182,8 +182,8 @@
             return new AnimationFactory() {
                 @Override
                 public void createActivityController(long transitionLength) {
-                    createActivityControllerInternal(activity, activityVisible, transitionLength,
-                            callback);
+                    createActivityControllerInternal(activity, activityVisible, startState,
+                            transitionLength, callback);
                 }
 
                 @Override
@@ -194,10 +194,12 @@
         }
 
         private void createActivityControllerInternal(Launcher activity, boolean wasVisible,
-                long transitionLength, Consumer<AnimatorPlaybackController> callback) {
+                LauncherState startState, long transitionLength,
+                Consumer<AnimatorPlaybackController> callback) {
             if (wasVisible) {
                 DeviceProfile dp = activity.getDeviceProfile();
                 long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx);
+                activity.getStateManager().goToState(startState, false);
                 callback.accept(activity.getStateManager()
                         .createAnimationToNewWorkspace(OVERVIEW, accuracy));
                 return;
diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
index 4e17b4b..9fe1018 100644
--- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
@@ -163,10 +163,12 @@
     private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
 
     private final Context mContext;
-    private final int mRunningTaskId;
     private final ActivityControlHelper<T> mActivityControlHelper;
     private final ActivityInitListener mActivityInitListener;
 
+    private final int mRunningTaskId;
+    private ThumbnailData mTaskSnapshot;
+
     private MultiStateCallback mStateCallback;
     private AnimatorPlaybackController mLauncherTransitionController;
 
@@ -705,9 +707,11 @@
         synchronized (mRecentsAnimationWrapper) {
             if (mRecentsAnimationWrapper.controller != null) {
                 // Update the screenshot of the task
-                ThumbnailData thumbnail =
-                        mRecentsAnimationWrapper.controller.screenshotTask(mRunningTaskId);
-                final TaskView taskView = mRecentsView.updateThumbnail(mRunningTaskId, thumbnail);
+                if (mTaskSnapshot == null) {
+                    mTaskSnapshot = mRecentsAnimationWrapper.controller
+                            .screenshotTask(mRunningTaskId);
+                }
+                TaskView taskView = mRecentsView.updateThumbnail(mRunningTaskId, mTaskSnapshot);
                 mRecentsView.setRunningTaskHidden(false);
                 if (taskView != null) {
                     // Defer finishing the animation until the next launcher frame with the
@@ -880,10 +884,11 @@
 
     private void onLongSwipeGestureFinishUi(float velocity, boolean isFling) {
         if (!mUiLongSwipeMode || mLongSwipeController == null) {
+            mUiLongSwipeMode = false;
             handleNormalGestureEnd(velocity, isFling);
             return;
         }
-
+        mUiLongSwipeMode = false;
         finishCurrentTransitionToHome();
         mLongSwipeController.end(velocity, isFling,
                 () -> setStateOnUiThread(STATE_HANDLER_INVALIDATED));