Make preview pager and pager indicator screenreader-enabled

Bug: 27127738
Change-Id: I11a8589f4d8e1f15e895831dc3bd0cb7472e0591
diff --git a/res/layout/preview_seek_bar_view_pager.xml b/res/layout/preview_seek_bar_view_pager.xml
index d16a356..72aee10 100644
--- a/res/layout/preview_seek_bar_view_pager.xml
+++ b/res/layout/preview_seek_bar_view_pager.xml
@@ -24,8 +24,7 @@
         android:id="@+id/preview_pager"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="?android:attr/colorBackgroundFloating"
-        android:importantForAccessibility="noHideDescendants"/>
+        android:background="?android:attr/colorBackgroundFloating" />
 
     <View
         android:layout_width="match_parent"
diff --git a/res/layout/screen_zoom_preview_1.xml b/res/layout/screen_zoom_preview_1.xml
index 62cd093..a8408aa 100644
--- a/res/layout/screen_zoom_preview_1.xml
+++ b/res/layout/screen_zoom_preview_1.xml
@@ -20,7 +20,8 @@
     android:layout_height="match_parent"
     android:background="@color/conversation_background"
     android:padding="@dimen/conversation_message_list_padding"
-    android:orientation="vertical" >
+    android:orientation="vertical"
+    android:importantForAccessibility="noHideDescendants">
 
     <com.android.settings.display.ConversationMessageView
         android:layout_width="match_parent"
diff --git a/res/layout/screen_zoom_preview_2.xml b/res/layout/screen_zoom_preview_2.xml
index d9b748d..b61f92a 100644
--- a/res/layout/screen_zoom_preview_2.xml
+++ b/res/layout/screen_zoom_preview_2.xml
@@ -16,4 +16,5 @@
 <com.android.settings.display.AppGridView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent" />
+    android:layout_height="match_parent"
+    android:importantForAccessibility="noHideDescendants" />
diff --git a/res/layout/screen_zoom_preview_app_icon.xml b/res/layout/screen_zoom_preview_app_icon.xml
index b5ab4ac..7d7d983 100644
--- a/res/layout/screen_zoom_preview_app_icon.xml
+++ b/res/layout/screen_zoom_preview_app_icon.xml
@@ -16,7 +16,8 @@
 
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
-             android:layout_height="wrap_content">
+             android:layout_height="wrap_content"
+             android:importantForAccessibility="noHideDescendants">
 
     <LinearLayout
         android:layout_width="@dimen/screen_zoom_preview_app_icon_width"
diff --git a/res/layout/screen_zoom_preview_settings.xml b/res/layout/screen_zoom_preview_settings.xml
index cf9a8bd..2e68009 100644
--- a/res/layout/screen_zoom_preview_settings.xml
+++ b/res/layout/screen_zoom_preview_settings.xml
@@ -18,7 +18,8 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:scrollbars="none"
-    android:background="?android:attr/colorBackgroundFloating">
+    android:background="?android:attr/colorBackgroundFloating"
+    android:importantForAccessibility="noHideDescendants">
 
     <LinearLayout
         android:layout_width="match_parent"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7e5a557..6393bb7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -147,6 +147,9 @@
     <!-- Used for diagnostic info screens, precise translation isn't needed. Formats the SD card in the phone, meaning it will be erased and reformatted -->
     <string name="sdcard_format" product="default">Erase SD card</string>
 
+    <!-- Content description for dot pager indicator for preview pager. [CHAR LIMIT=NONE] -->
+    <string name="preview_page_indicator_content_description">Preview screen <xliff:g id="current_page" example="3">%1$d</xliff:g> of <xliff:g id="num_pages" example="9">%2$d</xliff:g></string>
+
     <!-- Summary of font size setting screen. [CHAR LIMIT=NONE] -->
     <string name="font_size_summary">Make the text on screen smaller or larger.</string>
 
diff --git a/src/com/android/settings/PreviewPagerAdapter.java b/src/com/android/settings/PreviewPagerAdapter.java
index 72b0b2f..8032f92 100644
--- a/src/com/android/settings/PreviewPagerAdapter.java
+++ b/src/com/android/settings/PreviewPagerAdapter.java
@@ -50,6 +50,9 @@
         for (int i = 0; i < previewSampleResIds.length; ++i) {
             mPreviewFrames[i] = (TouchBlockingFrameLayout) LayoutInflater.from(context)
                     .inflate(R.layout.preview_frame_container, null);
+            mPreviewFrames[i].setContentDescription(
+                    context.getString(R.string.preview_page_indicator_content_description, i + 1,
+                            previewSampleResIds.length));
 
             for (Configuration configuration : configurations) {
                 // Create a new configuration for the specified value. It won't
diff --git a/src/com/android/settings/PreviewSeekBarPreferenceFragment.java b/src/com/android/settings/PreviewSeekBarPreferenceFragment.java
index ad32c2d..15baa38 100644
--- a/src/com/android/settings/PreviewSeekBarPreferenceFragment.java
+++ b/src/com/android/settings/PreviewSeekBarPreferenceFragment.java
@@ -20,10 +20,12 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.support.v4.view.ViewPager;
+import android.support.v4.view.ViewPager.OnPageChangeListener;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
 import android.widget.SeekBar;
 import android.widget.SeekBar.OnSeekBarChangeListener;
 import android.widget.TextView;
@@ -48,11 +50,12 @@
     /** Resource id of the layout for this preference fragment. */
     protected int mActivityLayoutResId;
 
-    /** Resource id of the layout that defines the contents instide preview screen. */
+    /** Resource id of the layout that defines the contents inside preview screen. */
     protected int[] mPreviewSampleResIds;
 
     private ViewPager mPreviewPager;
     private PreviewPagerAdapter mPreviewPagerAdapter;
+    private DotsPageIndicator mPageIndicator;
 
     private TextView mLabel;
     private View mLarger;
@@ -132,7 +135,7 @@
             seekBar.setEnabled(false);
         }
 
-        final Context context = getContext();
+        final Context context = getPrefContext();
         final Configuration origConfig = context.getResources().getConfiguration();
         Configuration[] configurations = new Configuration[mEntries.length];
         for (int i = 0; i < mEntries.length; ++i) {
@@ -143,14 +146,47 @@
                 configurations);
         mPreviewPager = (ViewPager) content.findViewById(R.id.preview_pager);
         mPreviewPager.setAdapter(mPreviewPagerAdapter);
+        mPreviewPager.addOnPageChangeListener(new OnPageChangeListener() {
+            @Override
+            public void onPageScrollStateChanged(int state) {
+                // Do nothing.
+            }
 
-        final DotsPageIndicator pageIndicator =
-                (DotsPageIndicator) content.findViewById(R.id.page_indicator);
+            @Override
+            public void onPageScrolled(int position, float positionOffset,
+                    int positionOffsetPixels) {
+                // Do nothing.
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                mPreviewPager.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
+            }
+        });
+
+        mPageIndicator = (DotsPageIndicator) content.findViewById(R.id.page_indicator);
         if (mPreviewSampleResIds.length > 1) {
-            pageIndicator.setViewPager(mPreviewPager);
-            pageIndicator.setVisibility(View.VISIBLE);
+            mPageIndicator.setViewPager(mPreviewPager);
+            mPageIndicator.setVisibility(View.VISIBLE);
+            mPageIndicator.setOnPageChangeListener(new OnPageChangeListener() {
+                @Override
+                public void onPageScrollStateChanged(int state) {
+                    // Do nothing.
+                }
+
+                @Override
+                public void onPageScrolled(int position, float positionOffset,
+                        int positionOffsetPixels) {
+                    // Do nothing.
+                }
+
+                @Override
+                public void onPageSelected(int position) {
+                    setPagerIndicatorContentDescription(position);
+                }
+            });
         } else {
-            pageIndicator.setVisibility(View.GONE);
+            mPageIndicator.setVisibility(View.GONE);
         }
 
         setPreviewLayer(mInitialIndex, false);
@@ -176,11 +212,19 @@
         mSmaller.setEnabled(index > 0);
         mLarger.setEnabled(index < mEntries.length - 1);
 
+        setPagerIndicatorContentDescription(mPreviewPager.getCurrentItem());
+
         mPreviewPagerAdapter.setPreviewLayer(index, mCurrentIndex, mPreviewPager.getCurrentItem(),
                 animate);
         mCurrentIndex = index;
     }
 
+    private void setPagerIndicatorContentDescription(int position) {
+        mPageIndicator.setContentDescription(
+                getPrefContext().getString(R.string.preview_page_indicator_content_description,
+                        position + 1, mPreviewSampleResIds.length));
+    }
+
     /**
      * Persists the selected value and sends a configuration change.
      */