Announce scaled value for font scaling seekbar in Talkback

1. Keep state descriptions in the SeekBarWithIconButtonsView.
2. Set the scaled values to be the state descriptions for the font
   scaling seekbar.

Bug: 269680636
Test: manually - attach videos to the bug
Test: atest SeekBarWithIconButtonsViewTest
Change-Id: I12951446a4cd81838b8d5f875037874118fb1dd5
This commit is contained in:
Candice Lo
2023-03-01 15:23:41 +00:00
parent aeba685393
commit cc0f07cacb
4 changed files with 70 additions and 0 deletions

View File

@@ -1648,4 +1648,7 @@
<item>Move right</item>
<item>Move up</item>
</string-array>
<!-- Formatting states for the scale of font size, in percent. Double "%" is required to represent the symbol "%". [CHAR LIMIT=20] -->
<string name="font_scale_percentage"> <xliff:g id="percentage">%1$d</xliff:g> %%</string>
</resources>

View File

@@ -29,6 +29,7 @@ import com.android.systemui.R
import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.util.settings.SystemSettings
import kotlin.math.roundToInt
/** The Dialog that contains a seekbar for changing the font size. */
class FontScalingDialog(context: Context, private val systemSettings: SystemSettings) :
@@ -56,6 +57,16 @@ class FontScalingDialog(context: Context, private val systemSettings: SystemSett
doneButton = requireViewById(com.android.internal.R.id.button1)
seekBarWithIconButtonsView = requireViewById(R.id.font_scaling_slider)
val labelArray = arrayOfNulls<String>(strEntryValues.size)
for (i in strEntryValues.indices) {
labelArray[i] =
context.resources.getString(
com.android.settingslib.R.string.font_scale_percentage,
(strEntryValues[i].toFloat() * 100).roundToInt()
)
}
seekBarWithIconButtonsView.setProgressStateLabels(labelArray)
seekBarWithIconButtonsView.setMax((strEntryValues).size - 1)
val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, 1.0f)

View File

@@ -45,6 +45,7 @@ public class SeekBarWithIconButtonsView extends LinearLayout {
private SeekBar mSeekbar;
private SeekBarChangeListener mSeekBarListener = new SeekBarChangeListener();
private String[] mStateLabels = null;
public SeekBarWithIconButtonsView(Context context) {
this(context, null);
@@ -131,6 +132,30 @@ public class SeekBarWithIconButtonsView extends LinearLayout {
iconFrame.setEnabled(enabled);
}
/**
* 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) {
setSeekbarStateDescription();
}
}
/**
* 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() {
mSeekbar.setStateDescription(
(mSeekbar.getProgress() < mStateLabels.length)
? mStateLabels[mSeekbar.getProgress()] : "");
}
/**
* Sets a onSeekbarChangeListener to the seekbar in the layout.
* We update the Start Icon and End Icon if needed when the seekbar progress is changed.
@@ -173,6 +198,9 @@ public class SeekBarWithIconButtonsView extends LinearLayout {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mStateLabels != null) {
setSeekbarStateDescription();
}
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser);
}

View File

@@ -107,4 +107,32 @@ public class SeekBarWithIconButtonsViewTest extends SysuiTestCase {
assertThat(mSeekbar.getProgress()).isEqualTo(0);
}
@Test
public void setProgressStateLabels_getExpectedStateDescriptionOnInitialization() {
String[] stateLabels = new String[]{"1", "2", "3", "4", "5"};
mIconDiscreteSliderLinearLayout.setMax(stateLabels.length);
mIconDiscreteSliderLinearLayout.setProgress(1);
mIconDiscreteSliderLinearLayout.setProgressStateLabels(stateLabels);
final int currentProgress = mSeekbar.getProgress();
final CharSequence stateDescription = mSeekbar.getStateDescription();
assertThat(currentProgress).isEqualTo(1);
assertThat(stateDescription).isEqualTo(stateLabels[currentProgress]);
}
@Test
public void setProgressStateLabels_progressChanged_getExpectedStateDescription() {
String[] stateLabels = new String[]{"1", "2", "3", "4", "5"};
mIconDiscreteSliderLinearLayout.setMax(stateLabels.length);
mIconDiscreteSliderLinearLayout.setProgressStateLabels(stateLabels);
mIconDiscreteSliderLinearLayout.setProgress(1);
final int currentProgress = mSeekbar.getProgress();
final CharSequence stateDescription = mSeekbar.getStateDescription();
assertThat(currentProgress).isEqualTo(1);
assertThat(stateDescription).isEqualTo(stateLabels[currentProgress]);
}
}