Announce scaled value for font scaling seekbar in Talkback

1. Keeping state descriptions for the seekbar as an array in the
   PreviewSizeSeekBarController when we would like to customize the
   state description.
2. Setting the scaled value to be the state description for the font
   scaling seekbar when there is a progress change to the seekbar.

Bug: 269212483
Test: manually - attach videos to the bug
Test: make RunSettingsRoboTests ROBOTEST_FILTER=PreviewSizeSeekBarControllerTest
Change-Id: I8e9e3681a0174f454cac871ebf62d785962c7165
This commit is contained in:
Candice Lo
2023-03-30 17:56:56 +00:00
parent 5e8769bcc5
commit d2c53a2085
3 changed files with 64 additions and 2 deletions

View File

@@ -28,6 +28,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.widget.LabeledSeekBarPreference; 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.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnCreate; import com.android.settingslib.core.lifecycle.events.OnCreate;
import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnDestroy;
@@ -52,11 +53,14 @@ abstract class PreviewSizeSeekBarController extends BasePreferenceController imp
private AccessibilityQuickSettingsTooltipWindow mTooltipWindow; private AccessibilityQuickSettingsTooltipWindow mTooltipWindow;
private final Handler mHandler; private final Handler mHandler;
private String[] mStateLabels = null;
private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener = private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
new SeekBar.OnSeekBarChangeListener() { new SeekBar.OnSeekBarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
setSeekbarStateDescription(progress);
if (mInteractionListener.isEmpty()) { if (mInteractionListener.isEmpty()) {
return; return;
} }
@@ -141,6 +145,7 @@ abstract class PreviewSizeSeekBarController extends BasePreferenceController imp
if (mNeedsQSTooltipReshow) { if (mNeedsQSTooltipReshow) {
mHandler.post(this::showQuickSettingsTooltipIfNeeded); mHandler.post(this::showQuickSettingsTooltipIfNeeded);
} }
setSeekbarStateDescription(mSeekBarPreference.getProgress());
} }
@Override @Override
@@ -153,6 +158,34 @@ abstract class PreviewSizeSeekBarController extends BasePreferenceController imp
mInteractionListener.ifPresent(ProgressInteractionListener::onProgressChanged); 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() { private void onProgressFinalized() {
// Using progress in SeekBarPreference since the progresses in // Using progress in SeekBarPreference since the progresses in
// SeekBarPreference and seekbar are not always the same. // SeekBarPreference and seekbar are not always the same.

View File

@@ -170,6 +170,15 @@ public class TextReadingPreferenceFragment extends DashboardFragment {
R.string.accessibility_font_scaling_auto_added_qs_tooltip_content); 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); fontSizeController.setInteractionListener(mPreviewController);
getSettingsLifecycle().addObserver(fontSizeController); getSettingsLifecycle().addObserver(fontSizeController);
controllers.add(fontSizeController); controllers.add(fontSizeController);

View File

@@ -43,6 +43,7 @@ import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.testutils.shadow.ShadowFragment; import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor; import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
import com.android.settings.widget.LabeledSeekBarPreference; import com.android.settings.widget.LabeledSeekBarPreference;
import com.android.settings.widget.SeekBarPreference;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -75,6 +76,7 @@ public class PreviewSizeSeekBarControllerTest {
private PreferenceViewHolder mHolder; private PreferenceViewHolder mHolder;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private PreferenceManager mPreferenceManager; private PreferenceManager mPreferenceManager;
private SeekBar mSeekBar;
@Mock @Mock
private PreviewSizeSeekBarController.ProgressInteractionListener mInteractionListener; private PreviewSizeSeekBarController.ProgressInteractionListener mInteractionListener;
@@ -101,8 +103,10 @@ public class PreviewSizeSeekBarControllerTest {
mSeekBarPreference.setKey(FONT_SIZE_KEY); mSeekBarPreference.setKey(FONT_SIZE_KEY);
LayoutInflater inflater = LayoutInflater.from(mContext); LayoutInflater inflater = LayoutInflater.from(mContext);
mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate( mHolder = spy(PreferenceViewHolder.createInstanceForTests(inflater.inflate(
R.layout.preference_labeled_slider, null)); 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); mSeekBarPreference.onBindViewHolder(mHolder);
when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference); when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference);
@@ -224,6 +228,22 @@ public class PreviewSizeSeekBarControllerTest {
assertThat(getLatestPopupWindow().isShowing()).isTrue(); 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 { private static class TestFragment extends SettingsPreferenceFragment {
@Override @Override