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.
*/