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:
@@ -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.
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user