diff --git a/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java b/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java index 089dc7be535..4c860eb3519 100644 --- a/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java +++ b/src/com/android/settings/accessibility/PreviewSizeSeekBarController.java @@ -28,6 +28,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.widget.LabeledSeekBarPreference; +import com.android.settings.widget.SeekBarPreference; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnCreate; import com.android.settingslib.core.lifecycle.events.OnDestroy; @@ -52,11 +53,14 @@ abstract class PreviewSizeSeekBarController extends BasePreferenceController imp private AccessibilityQuickSettingsTooltipWindow mTooltipWindow; private final Handler mHandler; + private String[] mStateLabels = null; private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + setSeekbarStateDescription(progress); + if (mInteractionListener.isEmpty()) { return; } @@ -141,6 +145,7 @@ abstract class PreviewSizeSeekBarController extends BasePreferenceController imp if (mNeedsQSTooltipReshow) { mHandler.post(this::showQuickSettingsTooltipIfNeeded); } + setSeekbarStateDescription(mSeekBarPreference.getProgress()); } @Override @@ -153,6 +158,34 @@ abstract class PreviewSizeSeekBarController extends BasePreferenceController imp mInteractionListener.ifPresent(ProgressInteractionListener::onProgressChanged); } + /** + * Stores the String array we would like to use for describing the state of seekbar progress + * and updates the state description with current progress. + * + * @param labels The state descriptions to be announced for each progress. + */ + public void setProgressStateLabels(String[] labels) { + mStateLabels = labels; + if (mStateLabels == null) { + return; + } + updateState(mSeekBarPreference); + } + + /** + * Sets the state of seekbar based on current progress. The progress of seekbar is + * corresponding to the index of the string array. If the progress is larger than or equals + * to the length of the array, the state description is set to an empty string. + */ + private void setSeekbarStateDescription(int index) { + if (mStateLabels == null) { + return; + } + mSeekBarPreference.setSeekBarStateDescription( + (index < mStateLabels.length) + ? mStateLabels[index] : ""); + } + private void onProgressFinalized() { // Using progress in SeekBarPreference since the progresses in // SeekBarPreference and seekbar are not always the same. diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java index 97a9071066e..450aecad3f6 100644 --- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java +++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java @@ -170,6 +170,15 @@ public class TextReadingPreferenceFragment extends DashboardFragment { R.string.accessibility_font_scaling_auto_added_qs_tooltip_content); } }; + final String[] labelArray = new String[fontSizeData.getValues().size()]; + for (int i = 0; i < labelArray.length; i++) { + labelArray[i] = + context.getResources().getString( + com.android.settingslib.R.string.font_scale_percentage, + (int) (fontSizeData.getValues().get(i) * 100) + ); + } + fontSizeController.setProgressStateLabels(labelArray); fontSizeController.setInteractionListener(mPreviewController); getSettingsLifecycle().addObserver(fontSizeController); controllers.add(fontSizeController); diff --git a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java index 6b0f5c00413..1cea0566313 100644 --- a/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/PreviewSizeSeekBarControllerTest.java @@ -43,6 +43,7 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor; import com.android.settings.widget.LabeledSeekBarPreference; +import com.android.settings.widget.SeekBarPreference; import org.junit.Before; import org.junit.Test; @@ -75,6 +76,7 @@ public class PreviewSizeSeekBarControllerTest { private PreferenceViewHolder mHolder; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private PreferenceManager mPreferenceManager; + private SeekBar mSeekBar; @Mock private PreviewSizeSeekBarController.ProgressInteractionListener mInteractionListener; @@ -101,8 +103,10 @@ public class PreviewSizeSeekBarControllerTest { mSeekBarPreference.setKey(FONT_SIZE_KEY); LayoutInflater inflater = LayoutInflater.from(mContext); - mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate( - R.layout.preference_labeled_slider, null)); + mHolder = spy(PreferenceViewHolder.createInstanceForTests(inflater.inflate( + R.layout.preference_labeled_slider, null))); + mSeekBar = spy(new SeekBar(mContext)); + doReturn(mSeekBar).when(mHolder).findViewById(com.android.internal.R.id.seekbar); mSeekBarPreference.onBindViewHolder(mHolder); when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference); @@ -224,6 +228,22 @@ public class PreviewSizeSeekBarControllerTest { assertThat(getLatestPopupWindow().isShowing()).isTrue(); } + @Test + public void onProgressChanged_setCorrespondingCustomizedStateDescription() { + String[] stateLabels = new String[]{"1", "2", "3", "4", "5"}; + mSeekBarController.setProgressStateLabels(stateLabels); + mSeekBarController.displayPreference(mPreferenceScreen); + + int progress = 3; + mSeekBarPreference.setProgress(progress); + mSeekBarPreference.onProgressChanged(mSeekBar, + progress, + /* fromUser= */ false); + + verify(mSeekBarPreference).setSeekBarStateDescription(stateLabels[progress]); + assertThat(mSeekBar.getStateDescription().toString()).isEqualTo(stateLabels[progress]); + } + private static class TestFragment extends SettingsPreferenceFragment { @Override