ViewPager size changes

Fix some bugs that happen when ViewPagers change size that could
cause pages to become misaligned.

Bug 6335994

Change-Id: Iada902dea1436858b902d2d85c81418a179af5a9
diff --git a/v4/java/android/support/v4/view/PagerTitleStrip.java b/v4/java/android/support/v4/view/PagerTitleStrip.java
index 1c91bf2..aa98ae2 100644
--- a/v4/java/android/support/v4/view/PagerTitleStrip.java
+++ b/v4/java/android/support/v4/view/PagerTitleStrip.java
@@ -238,7 +238,7 @@
         mLastKnownCurrentPage = currentItem;
 
         if (!mUpdatingPositions) {
-            updateTextPositions(currentItem, mLastKnownPositionOffset);
+            updateTextPositions(currentItem, mLastKnownPositionOffset, false);
         }
 
         mUpdatingText = false;
@@ -266,10 +266,10 @@
         }
     }
 
-    void updateTextPositions(int position, float positionOffset) {
+    void updateTextPositions(int position, float positionOffset, boolean force) {
         if (position != mLastKnownCurrentPage) {
             updateText(position, mPager.getAdapter());
-        } else if (positionOffset == mLastKnownPositionOffset) {
+        } else if (!force && positionOffset == mLastKnownPositionOffset) {
             return;
         }
 
@@ -394,7 +394,7 @@
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
         if (mPager != null) {
-            updateTextPositions(mPager.getCurrentItem(), 0.f);
+            updateTextPositions(mPager.getCurrentItem(), 0.f, true);
         }
     }
 
@@ -408,7 +408,7 @@
                 // Consider ourselves to be on the next page when we're 50% of the way there.
                 position++;
             }
-            updateTextPositions(position, positionOffset);
+            updateTextPositions(position, positionOffset, false);
         }
 
         @Override
diff --git a/v4/java/android/support/v4/view/ViewPager.java b/v4/java/android/support/v4/view/ViewPager.java
index 5b80232..5220d30 100644
--- a/v4/java/android/support/v4/view/ViewPager.java
+++ b/v4/java/android/support/v4/view/ViewPager.java
@@ -1247,24 +1247,25 @@
     }
 
     private void recomputeScrollPosition(int width, int oldWidth, int margin, int oldMargin) {
+        final int widthWithMargin = width + margin;
         if (oldWidth > 0 && !mItems.isEmpty()) {
             final int xpos = getScrollX();
-            final ItemInfo ii = infoForCurrentScrollPosition();
-            final float pageOffset = (((float) xpos / width) - ii.offset) / ii.widthFactor;
-            final int offsetPixels = (int) (pageOffset * width);
+            final int oldWidthWithMargin = oldWidth + oldMargin;
+            final float pageOffset = (float) xpos / oldWidthWithMargin;
+            final int newOffsetPixels = (int) (pageOffset * widthWithMargin);
 
-            scrollTo(offsetPixels, getScrollY());
+            scrollTo(newOffsetPixels, getScrollY());
             if (!mScroller.isFinished()) {
                 // We now return to your regularly scheduled scroll, already in progress.
                 final int newDuration = mScroller.getDuration() - mScroller.timePassed();
                 ItemInfo targetInfo = infoForPosition(mCurItem);
-                mScroller.startScroll(offsetPixels, 0, (int) (targetInfo.offset * width), 0,
-                        newDuration);
+                mScroller.startScroll(newOffsetPixels, 0,
+                        (int) (targetInfo.offset * widthWithMargin), 0, newDuration);
             }
         } else {
             final ItemInfo ii = infoForPosition(mCurItem);
             final int scrollPos =
-                    (int) ((ii != null ? Math.min(ii.offset, mLastOffset) : 0) * width);
+                    (int) ((ii != null ? Math.min(ii.offset, mLastOffset) : 0) * widthWithMargin);
             if (scrollPos != getScrollX()) {
                 completeScroll();
                 scrollTo(scrollPos, getScrollY());