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

Commit 26c563b0 authored by Alan Viverette's avatar Alan Viverette
Browse files

Prevent excessive accessibility announcements in TimePicker

This is not a complete solution, and it's still awkward to use for
actually setting the time using the radial time picker. Better
software keyboard support and explore-by-touch CLs are still pending.

BUG: 17994166
Change-Id: Ia2871840a13cb00c140f7f2ab07fe03371acab2f
parent 12c84b5d
Loading
Loading
Loading
Loading
+30 −17
Original line number Diff line number Diff line
@@ -105,6 +105,10 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
    private String mMinutePickerDescription;
    private String mSelectMinutes;

    // Most recent time announcement values for accessibility.
    private CharSequence mLastAnnouncedText;
    private boolean mLastAnnouncedIsHour;

    private Calendar mTempCalendar;

    public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs,
@@ -224,11 +228,11 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
        // Enable or disable the AM/PM view.
        updateHeaderAmPm();
        // Update Hour and Minutes
        updateHeaderHour(mInitialHourOfDay, true);
        updateHeaderHour(mInitialHourOfDay, false);
        // Update time separator
        updateHeaderSeparator();
        // Update Minutes
        updateHeaderMinute(mInitialMinute);
        updateHeaderMinute(mInitialMinute, false);
        // Invalidate everything
        mDelegator.invalidate();
    }
@@ -293,7 +297,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
            return;
        }
        mInitialHourOfDay = currentHour;
        updateHeaderHour(currentHour, true /* accessibility announce */);
        updateHeaderHour(currentHour, true);
        updateHeaderAmPm();
        mRadialTimePickerView.setCurrentHour(currentHour);
        mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM);
@@ -329,7 +333,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
            return;
        }
        mInitialMinute = currentMinute;
        updateHeaderMinute(currentMinute);
        updateHeaderMinute(currentMinute, true);
        mRadialTimePickerView.setCurrentMinute(currentMinute);
        mDelegator.invalidate();
        onTimeChanged();
@@ -357,7 +361,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
        generateLegalTimesTree();
        int hour = mRadialTimePickerView.getCurrentHour();
        mInitialHourOfDay = hour;
        updateHeaderHour(hour, false /* no accessibility announce */);
        updateHeaderHour(hour, false);
        updateHeaderAmPm();
        updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing());
        mDelegator.invalidate();
@@ -604,19 +608,17 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
    @Override
    public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
        if (pickerIndex == HOUR_INDEX) {
            updateHeaderHour(newValue, false);
            String announcement = String.format("%d", newValue);
            if (mAllowAutoAdvance && autoAdvance) {
                updateHeaderHour(newValue, false);
                setCurrentItemShowing(MINUTE_INDEX, true, false);
                announcement += ". " + mSelectMinutes;
                mRadialTimePickerView.announceForAccessibility(newValue + ". " + mSelectMinutes);
            } else {
                updateHeaderHour(newValue, true);
                mRadialTimePickerView.setContentDescription(
                        mHourPickerDescription + ": " + newValue);
            }

            mRadialTimePickerView.announceForAccessibility(announcement);
        } else if (pickerIndex == MINUTE_INDEX){
            updateHeaderMinute(newValue);
            updateHeaderMinute(newValue, true);
            mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue);
        } else if (pickerIndex == AMPM_INDEX) {
            updateAmPmLabelStates(newValue);
@@ -664,7 +666,16 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
        CharSequence text = String.format(format, value);
        mHourView.setText(text);
        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;
        }
    }

@@ -715,13 +726,15 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
        return -1;
    }

    private void updateHeaderMinute(int value) {
    private void updateHeaderMinute(int value, boolean announceForAccessibility) {
        if (value == 60) {
            value = 0;
        }
        CharSequence text = String.format(mCurrentLocale, "%02d", value);
        mRadialTimePickerView.announceForAccessibility(text);
        final CharSequence text = String.format(mCurrentLocale, "%02d", value);
        mMinuteView.setText(text);
        if (announceForAccessibility) {
            tryAnnounceForAccessibility(text, false);
        }
    }

    /**
@@ -921,8 +934,8 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
        if (!allowEmptyDisplay && mTypedTimes.isEmpty()) {
            int hour = mRadialTimePickerView.getCurrentHour();
            int minute = mRadialTimePickerView.getCurrentMinute();
            updateHeaderHour(hour, true);
            updateHeaderMinute(minute);
            updateHeaderHour(hour, false);
            updateHeaderMinute(minute, false);
            if (!mIs24HourView) {
                updateAmPmLabelStates(hour < 12 ? AM : PM);
            }