Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2c53a20 authored by Candice Lo's avatar Candice Lo
Browse files

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
parent 5e8769bc
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -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.
+9 −0
Original line number Diff line number Diff line
@@ -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);
+22 −2
Original line number Diff line number Diff line
@@ -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