Preserving the last state when going to overview.

> Resetting the state to NORMAL on every onStop so that the user
  never starts on the overview screen

Change-Id: If3c17693b7125a3969809e60891a2ab978fe83bc
diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java
index 777bcd3..5706d32 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java
@@ -36,7 +36,8 @@
  */
 public class OverviewState extends LauncherState {
 
-    private static final int STATE_FLAGS = FLAG_SHOW_SCRIM | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED;
+    private static final int STATE_FLAGS = FLAG_SHOW_SCRIM | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED
+            | FLAG_DISABLE_RESTORE;
 
     public OverviewState(int id) {
         super(id, ContainerType.WORKSPACE, OVERVIEW_TRANSITION_MS, STATE_FLAGS);
diff --git a/quickstep/src/com/android/quickstep/LauncherLayoutListener.java b/quickstep/src/com/android/quickstep/LauncherLayoutListener.java
index 40cd3e6..2a7e5c4 100644
--- a/quickstep/src/com/android/quickstep/LauncherLayoutListener.java
+++ b/quickstep/src/com/android/quickstep/LauncherLayoutListener.java
@@ -60,11 +60,21 @@
 
     @Override
     protected void handleClose(boolean animate) {
-        // We dont suupport animate.
-        mLauncher.getDragLayer().removeView(this);
+        if (mIsOpen) {
+            mIsOpen = false;
+            // We don't support animate.
+            mLauncher.getDragLayer().removeView(this);
 
-        if (mHandler != null) {
-            mHandler.layoutListenerClosed();
+            if (mHandler != null) {
+                mHandler.layoutListenerClosed();
+            }
+        }
+    }
+
+    public void open() {
+        if (!mIsOpen) {
+            mLauncher.getDragLayer().addView(this);
+            mIsOpen = true;
         }
     }
 
diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
index fbb6d74..ce6d016 100644
--- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
@@ -45,6 +45,7 @@
 import com.android.launcher3.Hotseat;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.LauncherState;
 import com.android.launcher3.MainThreadExecutor;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
@@ -65,7 +66,7 @@
 public class WindowTransformSwipeHandler extends BaseSwipeInteractionHandler {
 
     // Launcher UI related states
-    private static final int STATE_LAUNCHER_READY = 1 << 0;
+    private static final int STATE_LAUNCHER_PRESENT = 1 << 0;
     private static final int STATE_LAUNCHER_DRAWN = 1 << 1;
     private static final int STATE_ACTIVITY_MULTIPLIER_COMPLETE = 1 << 2;
 
@@ -73,11 +74,13 @@
     private static final int STATE_APP_CONTROLLER_RECEIVED = 1 << 3;
 
     // Interaction finish states
-    private static final int STATE_SCALED_SNAPSHOT_RECENTS = 1 << 4;
-    private static final int STATE_SCALED_SNAPSHOT_APP = 1 << 5;
+    private static final int STATE_SCALED_CONTROLLER_RECENTS = 1 << 4;
+    private static final int STATE_SCALED_CONTROLLER_APP = 1 << 5;
+
+    private static final int STATE_HANDLER_INVALIDATED = 1 << 6;
 
     private static final int LAUNCHER_UI_STATES =
-            STATE_LAUNCHER_READY | STATE_LAUNCHER_DRAWN | STATE_ACTIVITY_MULTIPLIER_COMPLETE;
+            STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_ACTIVITY_MULTIPLIER_COMPLETE;
 
     private static final long MAX_SWIPE_DURATION = 200;
     private static final long MIN_SWIPE_DURATION = 80;
@@ -144,22 +147,29 @@
 
     private void initStateCallbacks() {
         mStateCallback = new MultiStateCallback();
-        mStateCallback.addCallback(STATE_SCALED_SNAPSHOT_APP | STATE_APP_CONTROLLER_RECEIVED,
+        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN,
+                this::launcherFrameDrawn);
+
+        mStateCallback.addCallback(STATE_SCALED_CONTROLLER_APP | STATE_APP_CONTROLLER_RECEIVED,
                 this::resumeLastTask);
-        mStateCallback.addCallback(STATE_SCALED_SNAPSHOT_RECENTS
+
+        mStateCallback.addCallback(STATE_SCALED_CONTROLLER_RECENTS
                         | STATE_ACTIVITY_MULTIPLIER_COMPLETE
                         | STATE_APP_CONTROLLER_RECEIVED,
                 this::switchToScreenshot);
-        mStateCallback.addCallback(STATE_SCALED_SNAPSHOT_RECENTS
-                        | STATE_ACTIVITY_MULTIPLIER_COMPLETE,
-                this::animateFirstTaskIcon);
 
-        mStateCallback.addCallback(STATE_LAUNCHER_READY | STATE_SCALED_SNAPSHOT_APP,
+        mStateCallback.addCallback(STATE_SCALED_CONTROLLER_RECENTS
+                        | STATE_ACTIVITY_MULTIPLIER_COMPLETE,
+                this::setupLauncherUiAfterSwipeUpAnimation);
+
+        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_SCALED_CONTROLLER_APP,
                 this::reset);
-        mStateCallback.addCallback(STATE_LAUNCHER_READY | STATE_SCALED_SNAPSHOT_RECENTS,
+        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_SCALED_CONTROLLER_RECENTS,
                 this::reset);
-        mStateCallback.addCallback(STATE_LAUNCHER_READY | STATE_LAUNCHER_DRAWN,
-                this::launcherFrameDrawn);
+
+        mStateCallback.addCallback(STATE_HANDLER_INVALIDATED, this::invalidateHandler);
+        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED,
+                this::invalidateHandlerWithLauncher);
     }
 
     private void setStateOnUiThread(int stateFlag) {
@@ -203,6 +213,12 @@
         }
         mLauncher = launcher;
 
+        LauncherState startState = mLauncher.getStateManager().getState();
+        if (startState.disableRestore) {
+            startState = mLauncher.getStateManager().getRestState();
+        }
+        mLauncher.getStateManager().setRestState(startState);
+
         AbstractFloatingView.closeAllOpenViews(launcher, alreadyOnHome);
         mWasLauncherAlreadyVisible = alreadyOnHome;
 
@@ -219,7 +235,7 @@
             mLauncherTransitionController.setPlayFraction(mCurrentShift.value);
 
             state = STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_DRAWN
-                    | STATE_LAUNCHER_READY;
+                    | STATE_LAUNCHER_PRESENT;
         } else {
             TraceHelper.beginSection("WTS-init");
             launcher.getStateManager().goToState(OVERVIEW, false);
@@ -242,11 +258,11 @@
                     mStateCallback.setState(STATE_LAUNCHER_DRAWN);
                 }
             });
-            state = STATE_LAUNCHER_READY;
+            state = STATE_LAUNCHER_PRESENT;
         }
 
         mRecentsView.showTask(mRunningTaskId);
-        mLauncher.getDragLayer().addView(mLauncherLayoutListener);
+        mLauncherLayoutListener.open();
 
         // Optimization
         // We are using the internal device profile as launcher may not have got the insets yet.
@@ -452,7 +468,7 @@
             @Override
             public void onAnimationSuccess(Animator animator) {
                 setStateOnUiThread((Float.compare(mCurrentShift.value, 0) == 0)
-                        ? STATE_SCALED_SNAPSHOT_APP : STATE_SCALED_SNAPSHOT_RECENTS);
+                        ? STATE_SCALED_CONTROLLER_APP : STATE_SCALED_CONTROLLER_RECENTS);
             }
         });
         anim.start();
@@ -464,36 +480,32 @@
     }
 
     public void reset() {
+        setStateOnUiThread(STATE_HANDLER_INVALIDATED);
+    }
+
+    private void invalidateHandler() {
         mCurrentShift.cancelAnimation();
 
         if (mGestureEndCallback != null) {
             mGestureEndCallback.run();
         }
 
-        if (mLauncher != null) {
-            // TODO: These should be done as part of ActivityOptions#OnAnimationStarted
-            mLauncher.getStateManager().reapplyState();
-            mLauncher.setOnResumeCallback(() -> mLauncherLayoutListener.close(false));
-
-            if (mLauncherTransitionController != null) {
-                mLauncherTransitionController.setPlayFraction(1);
-            }
-        }
         clearReference();
     }
 
+    private void invalidateHandlerWithLauncher() {
+        mLauncherTransitionController = null;
+        mLauncherLayoutListener.setHandler(null);
+        mLauncherLayoutListener.close(false);
+    }
+
     public void layoutListenerClosed() {
-        if (mWasLauncherAlreadyVisible) {
+        if (mWasLauncherAlreadyVisible && mLauncherTransitionController != null) {
             mLauncherTransitionController.setPlayFraction(1);
         }
     }
 
     private void switchToScreenshot() {
-        mLauncherLayoutListener.close(false);
-        View currentRecentsPage = mRecentsView.getPageAt(mRecentsView.getCurrentPage());
-        if (currentRecentsPage instanceof TaskView) {
-            ((TaskView) currentRecentsPage).animateIconToScale(1f);
-        }
         if (mInteractionType == INTERACTION_QUICK_SWITCH) {
             for (int i = mRecentsView.getFirstTaskIndex(); i < mRecentsView.getPageCount(); i++) {
                 TaskView taskView = (TaskView) mRecentsView.getPageAt(i);
@@ -527,7 +539,12 @@
         }
     }
 
-    private void animateFirstTaskIcon() {
+    private void setupLauncherUiAfterSwipeUpAnimation() {
+        // Re apply state in case we did something funky during the transition.
+        mLauncher.getStateManager().reapplyState();
+
+
+        // Animate ui the first icon.
         View currentRecentsPage = mRecentsView.getPageAt(mRecentsView.getCurrentPage());
         if (currentRecentsPage instanceof TaskView) {
             ((TaskView) currentRecentsPage).animateIconToScale(1f);
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index b01b86c..5da4944 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -788,6 +788,7 @@
                     mStateManager.getState().containerType);
         }
         NotificationListener.removeNotificationsChangedListener();
+        getStateManager().moveToRestState();
     }
 
     @Override
diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java
index 6eafc89..4aed520 100644
--- a/src/com/android/launcher3/LauncherStateManager.java
+++ b/src/com/android/launcher3/LauncherStateManager.java
@@ -85,6 +85,8 @@
     private LauncherState mLastStableState = NORMAL;
     private LauncherState mCurrentStableState = NORMAL;
 
+    private LauncherState mRestState;
+
     private StateListener mStateListener;
 
     public LauncherStateManager(Launcher l) {
@@ -289,12 +291,32 @@
         mLauncher.getWorkspace().setClipChildren(!state.disablePageClipping);
         mLauncher.getUserEventDispatcher().resetElapsedContainerMillis();
         mLauncher.finishAutoCancelActionMode();
+
+        if (state == NORMAL) {
+            setRestState(null);
+        }
     }
 
     public LauncherState getLastState() {
         return mLastStableState;
     }
 
+    public void moveToRestState() {
+        if (mState.disableRestore) {
+            goToState(getRestState());
+            // Reset history
+            mLastStableState = NORMAL;
+        }
+    }
+
+    public LauncherState getRestState() {
+        return mRestState == null ? NORMAL : mRestState;
+    }
+
+    public void setRestState(LauncherState restState) {
+        mRestState = restState;
+    }
+
     /**
      * Cancels the current animation.
      */