From 36e89f644ef7d8886aaee519302bc35b04aafa8b Mon Sep 17 00:00:00 2001 From: Noah Wang Date: Thu, 3 Mar 2016 20:05:14 -0800 Subject: [PATCH] Make preview pager and pager indicator screenreader-enabled Bug: 27127738 Change-Id: I11a8589f4d8e1f15e895831dc3bd0cb7472e0591 --- res/layout/preview_seek_bar_view_pager.xml | 3 +- res/layout/screen_zoom_preview_1.xml | 3 +- res/layout/screen_zoom_preview_2.xml | 3 +- res/layout/screen_zoom_preview_app_icon.xml | 3 +- res/layout/screen_zoom_preview_settings.xml | 3 +- res/values/strings.xml | 3 + .../android/settings/PreviewPagerAdapter.java | 3 + .../PreviewSeekBarPreferenceFragment.java | 58 ++++++++++++++++--- 8 files changed, 66 insertions(+), 13 deletions(-) diff --git a/res/layout/preview_seek_bar_view_pager.xml b/res/layout/preview_seek_bar_view_pager.xml index d16a356c084..72aee10e9ec 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" /> + android:orientation="vertical" + android:importantForAccessibility="noHideDescendants"> + 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 b5ab4acb1b5..7d7d983ff40 100644 --- a/res/layout/screen_zoom_preview_app_icon.xml +++ b/res/layout/screen_zoom_preview_app_icon.xml @@ -16,7 +16,8 @@ + android:layout_height="wrap_content" + android:importantForAccessibility="noHideDescendants"> + android:background="?android:attr/colorBackgroundFloating" + android:importantForAccessibility="noHideDescendants"> Erase SD card + + Preview screen %1$d of %2$d + Make the text on screen smaller or larger. diff --git a/src/com/android/settings/PreviewPagerAdapter.java b/src/com/android/settings/PreviewPagerAdapter.java index 72b0b2fcdc8..8032f92002a 100644 --- a/src/com/android/settings/PreviewPagerAdapter.java +++ b/src/com/android/settings/PreviewPagerAdapter.java @@ -50,6 +50,9 @@ public class PreviewPagerAdapter extends PagerAdapter { 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 ad32c2dce37..15baa38204b 100644 --- a/src/com/android/settings/PreviewSeekBarPreferenceFragment.java +++ b/src/com/android/settings/PreviewSeekBarPreferenceFragment.java @@ -20,10 +20,12 @@ import android.content.Context; 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 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc /** 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 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc 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 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc 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 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc 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. */