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

Commit baf689c1 authored by Angela Wang's avatar Angela Wang
Browse files

Make SliderPreference compatible with a11y services

1. Prevent accessibility services focus on no-action view
2. Enable setting the content description on the slider

Flag: EXEMPT bugfix
Bug: 397355964
Bug: 397355156
Bug: 397354989
Bug: 397134669
Test: manually test with Voice Access/Switch Access/TalkBack
Change-Id: I0992666e7ca652212d41f80602b6d2f0a62d30fa
parent 12bc9136
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
@@ -72,6 +73,7 @@ public class SliderPreference extends Preference {
    private int mSliderIncrement;
    private boolean mAdjustable;
    private boolean mTrackingTouch;
    private CharSequence mSliderContentDescription;

    /**
     * Listener reacting to the user pressing DPAD left/right keys if {@code
@@ -143,6 +145,7 @@ public class SliderPreference extends Preference {
            @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setLayoutResource(R.layout.settingslib_expressive_preference_slider);
        setSelectable(false);

        TypedArray a = context.obtainStyledAttributes(
                attrs, androidx.preference.R.styleable.SeekBarPreference, defStyleAttr,
@@ -265,6 +268,14 @@ public class SliderPreference extends Preference {
        } else {
            mSliderIncrement = (int) (mSlider.getStepSize());
        }
        final CharSequence title = getTitle();
        if (!TextUtils.isEmpty(mSliderContentDescription)) {
            mSlider.setContentDescription(mSliderContentDescription);
        } else if (!TextUtils.isEmpty(title)) {
            mSlider.setContentDescription(title);
        } else {
            mSlider.setContentDescription(null);
        }
        mSlider.setValueFrom(mMin);
        mSlider.setValueTo(mMax);
        mSlider.setValue(mSliderValue);
@@ -273,6 +284,8 @@ public class SliderPreference extends Preference {
        mSlider.clearOnChangeListeners();
        mSlider.addOnChangeListener(mChangeListener);
        mSlider.setEnabled(isEnabled());
        mSlider.setFocusable(isSelectable());
        mSlider.setClickable(isSelectable());

        // Set up slider color
        mSlider.setTrackActiveTintList(mTrackActiveColor);
@@ -471,6 +484,19 @@ public class SliderPreference extends Preference {
        setValueInternal(sliderValue, true);
    }


    /**
     * Sets the content description of the {@link Slider}.
     *
     * @param contentDescription The content description of the {@link Slider}
     */
    public void setSliderContentDescription(@Nullable CharSequence contentDescription) {
        mSliderContentDescription = contentDescription;
        if (mSlider != null) {
            mSlider.setContentDescription(contentDescription);
        }
    }

    @Override
    protected void onSetInitialValue(@Nullable Object defaultValue) {
        if (defaultValue == null) {