Loading src/com/android/deskclock/NumberPickerCompat.java +58 −1 Original line number Diff line number Diff line Loading @@ -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 */); } Loading @@ -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) Loading Loading @@ -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. Loading Loading @@ -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 src/com/android/deskclock/settings/CrescendoLengthDialog.java +19 −2 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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; Loading Loading @@ -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 Loading src/com/android/deskclock/settings/SnoozeLengthDialog.java +11 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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); } }); } Loading Loading
src/com/android/deskclock/NumberPickerCompat.java +58 −1 Original line number Diff line number Diff line Loading @@ -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 */); } Loading @@ -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) Loading Loading @@ -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. Loading Loading @@ -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
src/com/android/deskclock/settings/CrescendoLengthDialog.java +19 −2 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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; Loading Loading @@ -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 Loading
src/com/android/deskclock/settings/SnoozeLengthDialog.java +11 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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); } }); } Loading