Add content descriptions for Display size and text previews

Bug: 395882764
Test: manually
Test: atest TextReadingPreviewControllerTest
Test: atest TextReadingPreviewPreferenceTest
Flag: EXEMPT bugfix
Change-Id: Ia8702c3d0bdbbfdd554c945000777fcee6714abe
diff --git a/res/values/config.xml b/res/values/config.xml
index c20f080..9d2e43d 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -810,13 +810,23 @@
     <!-- Allowed packages to show the confirmation dialog for a system locale suggestion  -->
     <string-array name="allowed_packages_for_locale_confirmation_diallog" translatable="false"/>
 
-    <!-- Array of text reading preview layouts. Must contain at least 1 layout -->
+    <!-- Array of text reading preview layouts. Must contain at least 1 layout.
+        Add content descriptions in the config_text_reading_preview_content_descriptions together
+        if adding more sample layouts here -->
     <array name="config_text_reading_preview_samples">
         <item>@layout/accessibility_text_reading_preview_app_grid</item>
         <item>@layout/screen_zoom_preview_1</item>
         <item>@layout/accessibility_text_reading_preview_mail_content</item>
     </array>
 
+    <!-- Array of text reading preview layouts' content descriptions.
+        The order should be the same as the layouts in config_text_reading_preview_samples -->
+    <array name="config_text_reading_preview_content_descriptions">
+        <item>@string/preview_pager_home_content_description</item>
+        <item>@string/preview_pager_message_content_description</item>
+        <item>@string/preview_pager_email_content_description</item>
+    </array>
+
     <!-- Package responsible for updating Mainline Modules -->
     <string name="config_mainline_module_update_package" translatable="false">com.android.vending</string>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2958559..b177185 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -78,6 +78,12 @@
 
     <!-- Content description for preview pager. [CHAR LIMIT=NONE] -->
     <string name="preview_pager_content_description">Preview</string>
+    <!-- Content description for home screen preview. [CHAR LIMIT=NONE] -->
+    <string name="preview_pager_home_content_description">Home screen preview</string>
+    <!-- Content description for message preview. [CHAR LIMIT=NONE] -->
+    <string name="preview_pager_message_content_description">Message preview</string>
+    <!-- Content description for email preview. [CHAR LIMIT=NONE] -->
+    <string name="preview_pager_email_content_description">Email preview</string>
     <!-- Content description for qrcode image. [CHAR LIMIT=none]-->
     <string name="qr_code_content_description">QR code</string>
     <!-- Previous button for preview pager. [CHAR LIMIT=NONE] -->
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewController.java b/src/com/android/settings/accessibility/TextReadingPreviewController.java
index 99f1f3f..e268aaa 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewController.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewController.java
@@ -104,11 +104,13 @@
         final boolean isLayoutRtl =
                 origConfig.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
         final int[] previewSamples = getPreviewSampleLayouts(mContext);
+        final int[] previewContentDescriptions = getPreviewSampleContentDescriptions(mContext);
         final PreviewPagerAdapter pagerAdapter = new PreviewPagerAdapter(mContext, isLayoutRtl,
                 previewSamples, createConfig(origConfig));
         mPreviewPreference.setPreviewAdapter(pagerAdapter);
         mPreviewPreference.setCurrentItem(
                 isLayoutRtl ? previewSamples.length - 1 : FRAME_INITIAL_INDEX);
+        mPreviewPreference.setContentDescription(previewContentDescriptions);
 
         final int initialPagerIndex =
                 mLastFontProgress * mDisplaySizeData.getValues().size() + mLastDisplayProgress;
@@ -188,6 +190,20 @@
         return previewSamples;
     }
 
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    static int[] getPreviewSampleContentDescriptions(Context context) {
+        TypedArray typedArray = context.getResources().obtainTypedArray(
+                R.array.config_text_reading_preview_content_descriptions);
+        int previewCount = typedArray.length();
+        int[] previewContentDescriptions = new int[previewCount];
+        for (int i = 0; i < previewCount; i++) {
+            previewContentDescriptions[i] =
+                    typedArray.getResourceId(i, R.string.preview_pager_content_description);
+        }
+        typedArray.recycle();
+        return previewContentDescriptions;
+    }
+
     private int getPagerIndex() {
         final int displayDataSize = mDisplaySizeData.getValues().size();
         final int fontSizeProgress = mFontSizePreference.getProgress();
diff --git a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
index 99e7125..513e247 100644
--- a/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
+++ b/src/com/android/settings/accessibility/TextReadingPreviewPreference.java
@@ -43,28 +43,11 @@
     private int mCurrentItem;
     private int mLastLayerIndex;
     private PreviewPagerAdapter mPreviewAdapter;
+    private int[] mContentDescriptions;
 
     private int mLayoutMinHorizontalPadding = 0;
     private int mBackgroundMinHorizontalPadding = 0;
 
-    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();
@@ -95,7 +78,23 @@
         adjustPaddings(previewLayout, backgroundView);
 
         final ViewPager viewPager = (ViewPager) holder.findViewById(R.id.preview_pager);
-        viewPager.addOnPageChangeListener(mPageChangeListener);
+        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int i, float v, int i1) {
+                // Do nothing
+            }
+
+            @Override
+            public void onPageSelected(int i) {
+                mCurrentItem = i;
+                viewPager.setContentDescription(getContext().getString(mContentDescriptions[i]));
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int i) {
+                // Do nothing
+            }
+        });
         final DotsPageIndicator pageIndicator =
                 (DotsPageIndicator) holder.findViewById(R.id.page_indicator);
         updateAdapterIfNeeded(viewPager, pageIndicator, mPreviewAdapter);
@@ -122,6 +121,10 @@
                 viewPager.setCurrentItem(getCurrentItem() + 1));
         previousButton.setContentDescription(getContext().getString(
                 R.string.preview_pager_next_button));
+
+        // Initialize the content description since the OnPageChangeListener#onPageSelected won't
+        // be called during setup.
+        viewPager.setContentDescription(getContext().getString(mContentDescriptions[0]));
     }
 
     @Override
@@ -170,6 +173,10 @@
         );
     }
 
+    void setContentDescription(int[] stringIds) {
+        mContentDescriptions = stringIds;
+    }
+
     void setPreviewAdapter(PreviewPagerAdapter previewAdapter) {
         if (previewAdapter != mPreviewAdapter) {
             mPreviewAdapter = previewAdapter;
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
index 375952f..81c869d 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.accessibility;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -77,6 +79,15 @@
     }
 
     @Test
+    public void numberOfPreviewSamples_numberOfPreviewContentDescription_isEqual() {
+        int[] previewSamples = TextReadingPreviewController.getPreviewSampleLayouts(mContext);
+        int[] previewContentDescriptions =
+                TextReadingPreviewController.getPreviewSampleContentDescriptions(mContext);
+
+        assertThat(previewSamples.length).isEqualTo(previewContentDescriptions.length);
+    }
+
+    @Test
     public void initPreviewerAdapter_verifyAction() {
         when(mPreferenceScreen.findPreference(PREVIEW_KEY)).thenReturn(mPreviewPreference);
         when(mPreferenceScreen.findPreference(FONT_SIZE_KEY)).thenReturn(mFontSizePreference);
diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
index 4ca1dca..9cd8fa2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreviewPreferenceTest.java
@@ -49,29 +49,48 @@
  */
 @RunWith(RobolectricTestRunner.class)
 public class TextReadingPreviewPreferenceTest {
-
+    private Context mContext;
     private TextReadingPreviewPreference mTextReadingPreviewPreference;
     private PreferenceViewHolder mHolder;
     private ViewPager mViewPager;
     private PreviewPagerAdapter mPreviewPagerAdapter;
     private int mPreviewSampleCount;
+    private int[] mPreviewContentDescriptions;
 
     @Before
     public void setUp() {
-        final Context context = ApplicationProvider.getApplicationContext();
-        final int[] previewSamples = TextReadingPreviewController.getPreviewSampleLayouts(context);
+        mContext = ApplicationProvider.getApplicationContext();
+        mPreviewContentDescriptions =
+                TextReadingPreviewController.getPreviewSampleContentDescriptions(mContext);
+        final int[] previewSamples = TextReadingPreviewController.getPreviewSampleLayouts(mContext);
         mPreviewSampleCount = previewSamples.length;
         final Configuration[] configurations = createConfigurations(mPreviewSampleCount);
-        mTextReadingPreviewPreference = new TextReadingPreviewPreference(context);
+        mTextReadingPreviewPreference = new TextReadingPreviewPreference(mContext);
         mPreviewPagerAdapter =
-                spy(new PreviewPagerAdapter(context, /* isLayoutRtl= */ false,
+                spy(new PreviewPagerAdapter(mContext, /* isLayoutRtl= */ false,
                         previewSamples, configurations));
-        final LayoutInflater inflater = LayoutInflater.from(context);
+        final LayoutInflater inflater = LayoutInflater.from(mContext);
         final View view =
                 inflater.inflate(mTextReadingPreviewPreference.getLayoutResource(),
-                        new LinearLayout(context), false);
+                        new LinearLayout(mContext), false);
         mHolder = PreferenceViewHolder.createInstanceForTests(view);
         mViewPager = view.findViewById(R.id.preview_pager);
+        mTextReadingPreviewPreference.setContentDescription(mPreviewContentDescriptions);
+    }
+
+    @Test
+    public void changePreviewPage_getExpectedContentDescription() {
+        mTextReadingPreviewPreference.setPreviewAdapter(mPreviewPagerAdapter);
+        mTextReadingPreviewPreference.onBindViewHolder(mHolder);
+
+        // Verify the initial content description
+        assertThat(mViewPager.getContentDescription().toString())
+                .isEqualTo(mContext.getString(mPreviewContentDescriptions[0]));
+
+        // Change the preview page
+        mViewPager.setCurrentItem(1);
+        assertThat(mViewPager.getContentDescription().toString())
+                .isEqualTo(mContext.getString(mPreviewContentDescriptions[1]));
     }
 
     @Test