Cancel exit spring loaded runnable when launcher state is set to APPS or WIDGETS b/29645452
am: 06ca7568c6

Change-Id: I17e8718fc30f3afe405b85095f30818e2369bd2f
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 5f5ac2e..1de8a68 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -348,6 +348,11 @@
         }
     }
 
+    // Exiting spring loaded mode happens with a delay. This runnable object triggers the
+    // state transition. If another state transition happened during this delay,
+    // simply unregister this runnable.
+    private Runnable mExitSpringLoadedModeRunnable;
+
     @Thunk Runnable mBuildLayersRunnable = new Runnable() {
         public void run() {
             if (mWorkspace != null) {
@@ -3416,6 +3421,12 @@
             return false;
         }
 
+        // This is a safe and supported transition to bypass spring_loaded mode.
+        if (mExitSpringLoadedModeRunnable != null) {
+            mHandler.removeCallbacks(mExitSpringLoadedModeRunnable);
+            mExitSpringLoadedModeRunnable = null;
+        }
+
         if (toState == State.APPS) {
             mStateTransitionAnimation.startAnimationToAllApps(mWorkspace.getState(), animated,
                     focusSearchBar);
@@ -3475,7 +3486,10 @@
             final Runnable onCompleteRunnable) {
         if (!isStateSpringLoaded()) return;
 
-        mHandler.postDelayed(new Runnable() {
+        if (mExitSpringLoadedModeRunnable != null) {
+            mHandler.removeCallbacks(mExitSpringLoadedModeRunnable);
+        }
+        mExitSpringLoadedModeRunnable = new Runnable() {
             @Override
             public void run() {
                 if (successfulDrop) {
@@ -3489,8 +3503,10 @@
                 } else {
                     exitSpringLoadedDragMode();
                 }
+                mExitSpringLoadedModeRunnable = null;
             }
-        }, delay);
+        };
+        mHandler.postDelayed(mExitSpringLoadedModeRunnable, delay);
     }
 
     boolean isStateSpringLoaded() {