Fix the preview should keep the same layer after font or display size change.

Bug: 259213786
Test: make RunSettingsRoboTests ROBOTEST_FILTER=TextReadingPreviewPreferenceTest
Change-Id: Ifc0047e47806662174712bb8628193bee906b384
diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
index 893837c..d1614ca 100644
--- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java
@@ -64,7 +64,12 @@
     static final String RESET_KEY = "reset";
     private static final String PREVIEW_KEY = "preview";
     private static final String NEED_RESET_SETTINGS = "need_reset_settings";
+    private static final String LAST_PREVIEW_INDEX = "last_preview_index";
+    private static final int UNKNOWN_INDEX = -1;
+
     private FontWeightAdjustmentPreferenceController mFontWeightAdjustmentController;
+    private TextReadingPreviewController mPreviewController;
+    private int mLastPreviewIndex = UNKNOWN_INDEX;
     private int mEntryPoint = EntryPoint.UNKNOWN_ENTRY;
 
     /**
@@ -95,14 +100,20 @@
     boolean mNeedResetSettings;
 
     @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
 
         mNeedResetSettings = false;
         mResetStateListeners = getResetStateListeners();
 
-        if (icicle != null && icicle.getBoolean(NEED_RESET_SETTINGS)) {
-            mResetStateListeners.forEach(ResetStateListener::resetState);
+        if (savedInstanceState != null) {
+            if (savedInstanceState.getBoolean(NEED_RESET_SETTINGS)) {
+                mResetStateListeners.forEach(ResetStateListener::resetState);
+            }
+
+            if (savedInstanceState.containsKey(LAST_PREVIEW_INDEX)) {
+                mLastPreviewIndex = savedInstanceState.getInt(LAST_PREVIEW_INDEX);
+            }
         }
     }
 
@@ -139,19 +150,19 @@
         final FontSizeData fontSizeData = new FontSizeData(context);
         final DisplaySizeData displaySizeData = createDisplaySizeData(context);
 
-        final TextReadingPreviewController previewController = new TextReadingPreviewController(
-                context, PREVIEW_KEY, fontSizeData, displaySizeData);
-        previewController.setEntryPoint(mEntryPoint);
-        controllers.add(previewController);
+        mPreviewController = new TextReadingPreviewController(context, PREVIEW_KEY, fontSizeData,
+                displaySizeData);
+        mPreviewController.setEntryPoint(mEntryPoint);
+        controllers.add(mPreviewController);
 
         final PreviewSizeSeekBarController fontSizeController = new PreviewSizeSeekBarController(
                 context, FONT_SIZE_KEY, fontSizeData);
-        fontSizeController.setInteractionListener(previewController);
+        fontSizeController.setInteractionListener(mPreviewController);
         controllers.add(fontSizeController);
 
         final PreviewSizeSeekBarController displaySizeController = new PreviewSizeSeekBarController(
                 context, DISPLAY_SIZE_KEY, displaySizeData);
-        displaySizeController.setInteractionListener(previewController);
+        displaySizeController.setInteractionListener(mPreviewController);
         controllers.add(displaySizeController);
 
         mFontWeightAdjustmentController =
@@ -206,6 +217,17 @@
         if (mNeedResetSettings) {
             outState.putBoolean(NEED_RESET_SETTINGS, true);
         }
+
+        outState.putInt(LAST_PREVIEW_INDEX, mPreviewController.getCurrentItem());
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        if (mLastPreviewIndex != UNKNOWN_INDEX) {
+            mPreviewController.setCurrentItem(mLastPreviewIndex);
+        }
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewController.java b/src/com/android/settings/accessibility/TextReadingPreviewController.java
index 29faaaa..8fa8dc7 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewController.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewController.java
@@ -133,6 +133,14 @@
         postCommitDelayed(CHANGE_BY_SEEKBAR_DELAY_MS);
     }
 
+    void setCurrentItem(int index) {
+        mPreviewPreference.setCurrentItem(index);
+    }
+
+    int getCurrentItem() {
+        return mPreviewPreference.getCurrentItem();
+    }
+
     /**
      * The entry point is used for logging.
      *
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
index 4b8ca39..cef6f25 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
@@ -37,6 +37,24 @@
     private int mLastLayerIndex;
     private PreviewPagerAdapter mPreviewAdapter;
 
+    private final ViewPager.OnPageChangeListener mPageChangeListener =
+            new ViewPager.OnPageChangeListener() {
+        @Override
+        public void onPageScrolled(int i, float v, int i1) {
+            // Do nothing
+        }
+
+        @Override
+        public void onPageSelected(int i) {
+            mCurrentItem = i;
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int i) {
+            // Do nothing
+        }
+    };
+
     TextReadingPreviewPreference(Context context) {
         super(context);
         init();
@@ -63,6 +81,7 @@
         super.onBindViewHolder(holder);
 
         final ViewPager viewPager = (ViewPager) holder.findViewById(R.id.preview_pager);
+        viewPager.addOnPageChangeListener(mPageChangeListener);
         final DotsPageIndicator pageIndicator =
                 (DotsPageIndicator) holder.findViewById(R.id.page_indicator);
         updateAdapterIfNeeded(viewPager, pageIndicator, mPreviewAdapter);
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
index 3dc82da..1688142 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
@@ -129,6 +129,17 @@
         verify(mPreviewPagerAdapter).setPreviewLayer(eq(index), anyInt(), anyInt(), anyBoolean());
     }
 
+    @Test
+    public void afterPagerChange_updateCurrentItem() {
+        final int currentItem = 2;
+        mTextReadingPreviewPreference.setPreviewAdapter(mPreviewPagerAdapter);
+        mTextReadingPreviewPreference.onBindViewHolder(mHolder);
+
+        mViewPager.setCurrentItem(currentItem);
+
+        assertThat(mTextReadingPreviewPreference.getCurrentItem()).isEqualTo(currentItem);
+    }
+
     private static Configuration[] createConfigurations(int count) {
         final Configuration[] configurations = new Configuration[count];
         for (int i = 0; i < count; i++) {