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

Commit d6971004 authored by Dylan Phan's avatar Dylan Phan Committed by Android (Google) Code Review
Browse files

Merge "Add TalkBack announcements to number picker." into ub-deskclock-dazzle

parents 465f7d5f 40450d42
Loading
Loading
Loading
Loading
+58 −1
Original line number Diff line number Diff line
@@ -33,11 +33,27 @@ import java.lang.reflect.Field;
 * Subclass of NumberPicker that allows customizing divider color and saves/restores its value
 * across device rotations.
 */
public class NumberPickerCompat extends NumberPicker {
public class NumberPickerCompat extends NumberPicker implements NumberPicker.OnValueChangeListener {

    private static Field sSelectionDivider;
    private static boolean sTrySelectionDivider = true;

    private final Runnable mAnnounceValueRunnable = new Runnable() {
        @Override
        public void run() {
            if (mOnAnnounceValueChangedListener != null) {
                final int value = getValue();
                final String[] displayedValues = getDisplayedValues();
                final String displayedValue =
                        displayedValues == null ? null : displayedValues[value];
                mOnAnnounceValueChangedListener.onAnnounceValueChanged(
                        NumberPickerCompat.this, value, displayedValue);
            }
        }
    };
    private OnValueChangeListener mOnValueChangedListener;
    private OnAnnounceValueChangedListener mOnAnnounceValueChangedListener;

    public NumberPickerCompat(Context context) {
        this(context, null /* attrs */);
    }
@@ -45,11 +61,13 @@ public class NumberPickerCompat extends NumberPicker {
    public NumberPickerCompat(Context context, AttributeSet attrs) {
        super(context, attrs);
        tintSelectionDivider(context);
        super.setOnValueChangedListener(this);
    }

    public NumberPickerCompat(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        tintSelectionDivider(context);
        super.setOnValueChangedListener(this);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
@@ -99,6 +117,30 @@ public class NumberPickerCompat extends NumberPicker {
        setValue(instanceState.mValue);
    }

    @Override
    public void setOnValueChangedListener(OnValueChangeListener onValueChangedListener) {
        mOnValueChangedListener = onValueChangedListener;
    }

    @Override
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
        if (mOnValueChangedListener != null) {
            mOnValueChangedListener.onValueChange(picker, oldVal, newVal);
        }

        // Wait till we reach a value to prevent TalkBack from announcing every intermediate value
        // when scrolling fast.
        removeCallbacks(mAnnounceValueRunnable);
        postDelayed(mAnnounceValueRunnable, 200L);
    }

    /**
     * Register a callback to be invoked whenever a value change should be announced.
     */
    public void setOnAnnounceValueChangedListener(OnAnnounceValueChangedListener listener) {
        mOnAnnounceValueChangedListener = listener;
    }

    /**
     * The state of this NumberPicker including the selected value. Used to preserve values across
     * device rotation.
@@ -129,4 +171,19 @@ public class NumberPickerCompat extends NumberPicker {
                    public State[] newArray(int size) { return new State[size]; }
                };
    }

    /**
     * Interface for a callback to be invoked when a value change should be announced for
     * accessibility.
     */
    public interface OnAnnounceValueChangedListener {
        /**
         * Called when a value change should be announced.
         * @param picker The number picker whose value changed.
         * @param value The new value.
         * @param displayedValue The text displayed for the value, or null if the value itself
         *     is displayed.
         */
        void onAnnounceValueChanged(NumberPicker picker, int value, String displayedValue);
    }
}
 No newline at end of file
+19 −2
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ import android.view.View;
import android.widget.NumberPicker;
import android.widget.TextView;

import com.android.deskclock.NumberPickerCompat;
import com.android.deskclock.R;

/**
@@ -21,7 +22,7 @@ public final class CrescendoLengthDialog extends DialogPreference {
    private static final String DEFAULT_CRESCENDO_TIME = "0";
    private static final int CRESCENDO_TIME_STEP = 5;

    private NumberPicker mNumberPickerView;
    private NumberPickerCompat mNumberPickerView;
    private TextView mNumberPickerSecondsView;
    private int mCrescendoSeconds;

@@ -50,18 +51,34 @@ public final class CrescendoLengthDialog extends DialogPreference {

        mNumberPickerSecondsView = (TextView) view.findViewById(R.id.title);
        mNumberPickerSecondsView.setText(getContext().getString(R.string.crescendo_picker_label));
        mNumberPickerView = (NumberPicker) view.findViewById(R.id.seconds_picker);
        mNumberPickerView = (NumberPickerCompat) view.findViewById(R.id.seconds_picker);
        mNumberPickerView.setDisplayedValues(displayedValues);
        mNumberPickerView.setMinValue(0);
        mNumberPickerView.setMaxValue(displayedValues.length - 1);
        mNumberPickerView.setValue(mCrescendoSeconds / CRESCENDO_TIME_STEP);
        updateUnits();

        mNumberPickerView.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                updateUnits();
            }
        });
        mNumberPickerView.setOnAnnounceValueChangedListener(
                new NumberPickerCompat.OnAnnounceValueChangedListener() {
            @Override
            public void onAnnounceValueChanged(NumberPicker picker, int value,
                    String displayedValue) {
                final String announceString;
                if (value == 0) {
                    announceString = getContext().getString(R.string.no_crescendo_duration);
                } else {
                    announceString = getContext().getString(
                            R.string.crescendo_duration, displayedValue);
                }
                picker.announceForAccessibility(announceString);
            }
        });
    }

    @Override
+11 −5
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.view.View;
import android.widget.NumberPicker;
import android.widget.TextView;

import com.android.deskclock.NumberPickerCompat;
import com.android.deskclock.R;
import com.android.deskclock.Utils;

@@ -38,7 +39,7 @@ public final class SnoozeLengthDialog extends DialogPreference {

    private static final String DEFAULT_SNOOZE_TIME = "10";

    private NumberPicker mNumberPickerView;
    private NumberPickerCompat mNumberPickerView;
    private TextView mNumberPickerMinutesView;
    private final Context mContext;
    private int mSnoozeMinutes;
@@ -61,15 +62,20 @@ public final class SnoozeLengthDialog extends DialogPreference {
    protected void onBindDialogView(@NonNull View view) {
        super.onBindDialogView(view);
        mNumberPickerMinutesView = (TextView) view.findViewById(R.id.title);
        mNumberPickerView = (NumberPicker) view.findViewById(R.id.minutes_picker);
        mNumberPickerView = (NumberPickerCompat) view.findViewById(R.id.minutes_picker);
        mNumberPickerView.setMinValue(1);
        mNumberPickerView.setMaxValue(30);
        mNumberPickerView.setValue(mSnoozeMinutes);
        updateUnits();
        mNumberPickerView.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {

        mNumberPickerView.setOnAnnounceValueChangedListener(
                new NumberPickerCompat.OnAnnounceValueChangedListener() {
            @Override
            public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                updateUnits();
            public void onAnnounceValueChanged(NumberPicker picker, int value,
                    String displayedValue) {
                final String announceString = Utils.getNumberFormattedQuantityString(
                        mContext, R.plurals.snooze_duration, value);
                picker.announceForAccessibility(announceString);
            }
        });
    }