Merge "All Apps physics polish." into ub-launcher3-dorval-polish
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 2095192..0083d47 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -21,7 +21,6 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.InsetDrawable;
 import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
 import android.text.Selection;
 import android.text.SpannableStringBuilder;
 import android.util.AttributeSet;
@@ -227,7 +226,6 @@
         mAppsRecyclerView.setHasFixedSize(true);
         if (FeatureFlags.LAUNCHER3_PHYSICS) {
             mAppsRecyclerView.setSpringAnimationHandler(mSpringAnimationHandler);
-            mAppsRecyclerView.addOnScrollListener(new SpringMotionOnScrollListener());
         }
 
         mSearchContainer = findViewById(R.id.search_container_all_apps);
@@ -403,33 +401,4 @@
     public SpringAnimationHandler getSpringAnimationHandler() {
         return mSpringAnimationHandler;
     }
-
-    public class SpringMotionOnScrollListener extends RecyclerView.OnScrollListener {
-
-        private int mScrollState = RecyclerView.SCROLL_STATE_IDLE;
-
-        @Override
-        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-            if (mScrollState == RecyclerView.SCROLL_STATE_DRAGGING || (dx == 0 && dy == 0)) {
-                if (mSpringAnimationHandler.isRunning()){
-                    mSpringAnimationHandler.skipToEnd();
-                }
-                return;
-            }
-
-            // We only start the spring animation when we fling and hit the top/bottom, to ensure
-            // that all of the animations start at the same time.
-            if (dy < 0 && !mAppsRecyclerView.canScrollVertically(-1)) {
-                mSpringAnimationHandler.animateToFinalPosition(0, 1);
-            } else if (dy > 0 && !mAppsRecyclerView.canScrollVertically(1)) {
-                mSpringAnimationHandler.animateToFinalPosition(0, -1);
-            }
-        }
-
-        @Override
-        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-            super.onScrollStateChanged(recyclerView, newState);
-            mScrollState = newState;
-        }
-    }
 }
diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
index 2514458..701402b 100644
--- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
@@ -103,7 +103,10 @@
     }
 
     public void setSpringAnimationHandler(SpringAnimationHandler springAnimationHandler) {
-        mSpringAnimationHandler = springAnimationHandler;
+        if (FeatureFlags.LAUNCHER3_PHYSICS) {
+            mSpringAnimationHandler = springAnimationHandler;
+            addOnScrollListener(new SpringMotionOnScrollListener());
+        }
     }
 
     @Override
@@ -485,6 +488,25 @@
                 y + mEmptySearchBackground.getIntrinsicHeight());
     }
 
+    private class SpringMotionOnScrollListener extends RecyclerView.OnScrollListener {
+
+        @Override
+        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+            if (mOverScrollHelper.isInOverScroll()) {
+                // OverScroll will handle animating the springs.
+                return;
+            }
+
+            // We only start the spring animation when we hit the top/bottom, to ensure
+            // that all of the animations start at the same time.
+            if (dy < 0 && !canScrollVertically(-1)) {
+                mSpringAnimationHandler.animateToFinalPosition(0, 1);
+            } else if (dy > 0 && !canScrollVertically(1)) {
+                mSpringAnimationHandler.animateToFinalPosition(0, -1);
+            }
+        }
+    }
+
     private class OverScrollHelper implements VerticalPullDetector.Listener {
 
         private static final float MAX_RELEASE_VELOCITY = 5000; // px / s