Loading core/java/android/widget/TimePickerSpinnerDelegate.java +30 −17 Original line number Original line Diff line number Diff line Loading @@ -105,6 +105,10 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im private String mMinutePickerDescription; private String mMinutePickerDescription; private String mSelectMinutes; private String mSelectMinutes; // Most recent time announcement values for accessibility. private CharSequence mLastAnnouncedText; private boolean mLastAnnouncedIsHour; private Calendar mTempCalendar; private Calendar mTempCalendar; public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs, public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs, Loading Loading @@ -224,11 +228,11 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im // Enable or disable the AM/PM view. // Enable or disable the AM/PM view. updateHeaderAmPm(); updateHeaderAmPm(); // Update Hour and Minutes // Update Hour and Minutes updateHeaderHour(mInitialHourOfDay, true); updateHeaderHour(mInitialHourOfDay, false); // Update time separator // Update time separator updateHeaderSeparator(); updateHeaderSeparator(); // Update Minutes // Update Minutes updateHeaderMinute(mInitialMinute); updateHeaderMinute(mInitialMinute, false); // Invalidate everything // Invalidate everything mDelegator.invalidate(); mDelegator.invalidate(); } } Loading Loading @@ -293,7 +297,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return; return; } } mInitialHourOfDay = currentHour; mInitialHourOfDay = currentHour; updateHeaderHour(currentHour, true /* accessibility announce */); updateHeaderHour(currentHour, true); updateHeaderAmPm(); updateHeaderAmPm(); mRadialTimePickerView.setCurrentHour(currentHour); mRadialTimePickerView.setCurrentHour(currentHour); mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM); mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM); Loading Loading @@ -329,7 +333,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return; return; } } mInitialMinute = currentMinute; mInitialMinute = currentMinute; updateHeaderMinute(currentMinute); updateHeaderMinute(currentMinute, true); mRadialTimePickerView.setCurrentMinute(currentMinute); mRadialTimePickerView.setCurrentMinute(currentMinute); mDelegator.invalidate(); mDelegator.invalidate(); onTimeChanged(); onTimeChanged(); Loading Loading @@ -357,7 +361,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im generateLegalTimesTree(); generateLegalTimesTree(); int hour = mRadialTimePickerView.getCurrentHour(); int hour = mRadialTimePickerView.getCurrentHour(); mInitialHourOfDay = hour; mInitialHourOfDay = hour; updateHeaderHour(hour, false /* no accessibility announce */); updateHeaderHour(hour, false); updateHeaderAmPm(); updateHeaderAmPm(); updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing()); updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing()); mDelegator.invalidate(); mDelegator.invalidate(); Loading Loading @@ -604,19 +608,17 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im @Override @Override public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { if (pickerIndex == HOUR_INDEX) { if (pickerIndex == HOUR_INDEX) { updateHeaderHour(newValue, false); String announcement = String.format("%d", newValue); if (mAllowAutoAdvance && autoAdvance) { if (mAllowAutoAdvance && autoAdvance) { updateHeaderHour(newValue, false); setCurrentItemShowing(MINUTE_INDEX, true, false); setCurrentItemShowing(MINUTE_INDEX, true, false); announcement += ". " + mSelectMinutes; mRadialTimePickerView.announceForAccessibility(newValue + ". " + mSelectMinutes); } else { } else { updateHeaderHour(newValue, true); mRadialTimePickerView.setContentDescription( mRadialTimePickerView.setContentDescription( mHourPickerDescription + ": " + newValue); mHourPickerDescription + ": " + newValue); } } mRadialTimePickerView.announceForAccessibility(announcement); } else if (pickerIndex == MINUTE_INDEX){ } else if (pickerIndex == MINUTE_INDEX){ updateHeaderMinute(newValue); updateHeaderMinute(newValue, true); mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue); mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue); } else if (pickerIndex == AMPM_INDEX) { } else if (pickerIndex == AMPM_INDEX) { updateAmPmLabelStates(newValue); updateAmPmLabelStates(newValue); Loading Loading @@ -664,7 +666,16 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im CharSequence text = String.format(format, value); CharSequence text = String.format(format, value); mHourView.setText(text); mHourView.setText(text); if (announce) { if (announce) { mRadialTimePickerView.announceForAccessibility(text); tryAnnounceForAccessibility(text, true); } } private void tryAnnounceForAccessibility(CharSequence text, boolean isHour) { if (mLastAnnouncedIsHour != isHour || !text.equals(mLastAnnouncedText)) { // TODO: Find a better solution, potentially live regions? mDelegator.announceForAccessibility(text); mLastAnnouncedText = text; mLastAnnouncedIsHour = isHour; } } } } Loading Loading @@ -715,13 +726,15 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return -1; return -1; } } private void updateHeaderMinute(int value) { private void updateHeaderMinute(int value, boolean announceForAccessibility) { if (value == 60) { if (value == 60) { value = 0; value = 0; } } CharSequence text = String.format(mCurrentLocale, "%02d", value); final CharSequence text = String.format(mCurrentLocale, "%02d", value); mRadialTimePickerView.announceForAccessibility(text); mMinuteView.setText(text); mMinuteView.setText(text); if (announceForAccessibility) { tryAnnounceForAccessibility(text, false); } } } /** /** Loading Loading @@ -921,8 +934,8 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { int hour = mRadialTimePickerView.getCurrentHour(); int hour = mRadialTimePickerView.getCurrentHour(); int minute = mRadialTimePickerView.getCurrentMinute(); int minute = mRadialTimePickerView.getCurrentMinute(); updateHeaderHour(hour, true); updateHeaderHour(hour, false); updateHeaderMinute(minute); updateHeaderMinute(minute, false); if (!mIs24HourView) { if (!mIs24HourView) { updateAmPmLabelStates(hour < 12 ? AM : PM); updateAmPmLabelStates(hour < 12 ? AM : PM); } } Loading Loading
core/java/android/widget/TimePickerSpinnerDelegate.java +30 −17 Original line number Original line Diff line number Diff line Loading @@ -105,6 +105,10 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im private String mMinutePickerDescription; private String mMinutePickerDescription; private String mSelectMinutes; private String mSelectMinutes; // Most recent time announcement values for accessibility. private CharSequence mLastAnnouncedText; private boolean mLastAnnouncedIsHour; private Calendar mTempCalendar; private Calendar mTempCalendar; public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs, public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs, Loading Loading @@ -224,11 +228,11 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im // Enable or disable the AM/PM view. // Enable or disable the AM/PM view. updateHeaderAmPm(); updateHeaderAmPm(); // Update Hour and Minutes // Update Hour and Minutes updateHeaderHour(mInitialHourOfDay, true); updateHeaderHour(mInitialHourOfDay, false); // Update time separator // Update time separator updateHeaderSeparator(); updateHeaderSeparator(); // Update Minutes // Update Minutes updateHeaderMinute(mInitialMinute); updateHeaderMinute(mInitialMinute, false); // Invalidate everything // Invalidate everything mDelegator.invalidate(); mDelegator.invalidate(); } } Loading Loading @@ -293,7 +297,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return; return; } } mInitialHourOfDay = currentHour; mInitialHourOfDay = currentHour; updateHeaderHour(currentHour, true /* accessibility announce */); updateHeaderHour(currentHour, true); updateHeaderAmPm(); updateHeaderAmPm(); mRadialTimePickerView.setCurrentHour(currentHour); mRadialTimePickerView.setCurrentHour(currentHour); mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM); mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM); Loading Loading @@ -329,7 +333,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return; return; } } mInitialMinute = currentMinute; mInitialMinute = currentMinute; updateHeaderMinute(currentMinute); updateHeaderMinute(currentMinute, true); mRadialTimePickerView.setCurrentMinute(currentMinute); mRadialTimePickerView.setCurrentMinute(currentMinute); mDelegator.invalidate(); mDelegator.invalidate(); onTimeChanged(); onTimeChanged(); Loading Loading @@ -357,7 +361,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im generateLegalTimesTree(); generateLegalTimesTree(); int hour = mRadialTimePickerView.getCurrentHour(); int hour = mRadialTimePickerView.getCurrentHour(); mInitialHourOfDay = hour; mInitialHourOfDay = hour; updateHeaderHour(hour, false /* no accessibility announce */); updateHeaderHour(hour, false); updateHeaderAmPm(); updateHeaderAmPm(); updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing()); updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing()); mDelegator.invalidate(); mDelegator.invalidate(); Loading Loading @@ -604,19 +608,17 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im @Override @Override public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { if (pickerIndex == HOUR_INDEX) { if (pickerIndex == HOUR_INDEX) { updateHeaderHour(newValue, false); String announcement = String.format("%d", newValue); if (mAllowAutoAdvance && autoAdvance) { if (mAllowAutoAdvance && autoAdvance) { updateHeaderHour(newValue, false); setCurrentItemShowing(MINUTE_INDEX, true, false); setCurrentItemShowing(MINUTE_INDEX, true, false); announcement += ". " + mSelectMinutes; mRadialTimePickerView.announceForAccessibility(newValue + ". " + mSelectMinutes); } else { } else { updateHeaderHour(newValue, true); mRadialTimePickerView.setContentDescription( mRadialTimePickerView.setContentDescription( mHourPickerDescription + ": " + newValue); mHourPickerDescription + ": " + newValue); } } mRadialTimePickerView.announceForAccessibility(announcement); } else if (pickerIndex == MINUTE_INDEX){ } else if (pickerIndex == MINUTE_INDEX){ updateHeaderMinute(newValue); updateHeaderMinute(newValue, true); mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue); mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue); } else if (pickerIndex == AMPM_INDEX) { } else if (pickerIndex == AMPM_INDEX) { updateAmPmLabelStates(newValue); updateAmPmLabelStates(newValue); Loading Loading @@ -664,7 +666,16 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im CharSequence text = String.format(format, value); CharSequence text = String.format(format, value); mHourView.setText(text); mHourView.setText(text); if (announce) { if (announce) { mRadialTimePickerView.announceForAccessibility(text); tryAnnounceForAccessibility(text, true); } } private void tryAnnounceForAccessibility(CharSequence text, boolean isHour) { if (mLastAnnouncedIsHour != isHour || !text.equals(mLastAnnouncedText)) { // TODO: Find a better solution, potentially live regions? mDelegator.announceForAccessibility(text); mLastAnnouncedText = text; mLastAnnouncedIsHour = isHour; } } } } Loading Loading @@ -715,13 +726,15 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return -1; return -1; } } private void updateHeaderMinute(int value) { private void updateHeaderMinute(int value, boolean announceForAccessibility) { if (value == 60) { if (value == 60) { value = 0; value = 0; } } CharSequence text = String.format(mCurrentLocale, "%02d", value); final CharSequence text = String.format(mCurrentLocale, "%02d", value); mRadialTimePickerView.announceForAccessibility(text); mMinuteView.setText(text); mMinuteView.setText(text); if (announceForAccessibility) { tryAnnounceForAccessibility(text, false); } } } /** /** Loading Loading @@ -921,8 +934,8 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { int hour = mRadialTimePickerView.getCurrentHour(); int hour = mRadialTimePickerView.getCurrentHour(); int minute = mRadialTimePickerView.getCurrentMinute(); int minute = mRadialTimePickerView.getCurrentMinute(); updateHeaderHour(hour, true); updateHeaderHour(hour, false); updateHeaderMinute(minute); updateHeaderMinute(minute, false); if (!mIs24HourView) { if (!mIs24HourView) { updateAmPmLabelStates(hour < 12 ? AM : PM); updateAmPmLabelStates(hour < 12 ? AM : PM); } } Loading