Update page when scrolling/flinging in free-scroll.

Bug: 28054048
Change-Id: Ic22e7e717c3ead52dd6fb7495c37be3837e11030
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 6f7566f..e1cb082 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -400,7 +400,7 @@
         }
         scrollTo(newX, 0);
         mScroller.setFinalX(newX);
-        forceFinishScroller();
+        forceFinishScroller(true);
     }
 
     private void abortScrollerAnimation(boolean resetNextPage) {
@@ -412,11 +412,13 @@
         }
     }
 
-    private void forceFinishScroller() {
+    private void forceFinishScroller(boolean resetNextPage) {
         mScroller.forceFinished(true);
         // We need to clean up the next page here to avoid computeScrollHelper from
         // updating current page on the pass.
-        mNextPage = INVALID_PAGE;
+        if (resetNextPage) {
+            mNextPage = INVALID_PAGE;
+        }
     }
 
     private int validateNewPage(int newPage) {
@@ -538,7 +540,7 @@
             // in the free scroll mode, we make sure to end the scroll operation.
             if (!mScroller.isFinished() &&
                     (x > mFreeScrollMaxScrollX || x < mFreeScrollMinScrollX)) {
-                forceFinishScroller();
+                forceFinishScroller(false);
             }
 
             x = Math.min(x, mFreeScrollMaxScrollX);
@@ -1534,6 +1536,7 @@
     }
 
     private void setEnableFreeScroll(boolean freeScroll) {
+        boolean wasFreeScroll = mFreeScroll;
         mFreeScroll = freeScroll;
 
         if (mFreeScroll) {
@@ -1544,6 +1547,8 @@
             } else if (getCurrentPage() > mTempVisiblePagesRange[1]) {
                 setCurrentPage(mTempVisiblePagesRange[1]);
             }
+        } else if (wasFreeScroll) {
+            snapToPage(getNextPage());
         }
 
         setEnableOverscroll(!freeScroll);
@@ -1776,6 +1781,7 @@
                     mScroller.setInterpolator(mDefaultInterpolator);
                     mScroller.fling(initialScrollX,
                             getScrollY(), vX, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0);
+                    mNextPage = getPageNearestToCenterOfScreen((int) (mScroller.getFinalX() / scaleX));
                     invalidate();
                 }
                 onScrollInteractionEnd();
@@ -1936,9 +1942,13 @@
     }
 
     int getPageNearestToCenterOfScreen() {
+        return getPageNearestToCenterOfScreen(getScrollX());
+    }
+
+    private int getPageNearestToCenterOfScreen(int scaledScrollX) {
+        int screenCenter = getViewportOffsetX() + scaledScrollX + (getViewportWidth() / 2);
         int minDistanceFromScreenCenter = Integer.MAX_VALUE;
         int minDistanceFromScreenCenterIndex = -1;
-        int screenCenter = getViewportOffsetX() + getScrollX() + (getViewportWidth() / 2);
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; ++i) {
             View layout = (View) getPageAt(i);