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

Commit 25ffc7ad authored by Dan Sandler's avatar Dan Sandler Committed by Daniel Sandler
Browse files

Accessibility: Read the time correctly in quick settings.

The problem is that, for 12-hour locales, we cut the "a"
part of the time format out to show it in a separate
TextView so it can be animated independently of the actual
time. Unfortunately, while TTS is smart enough to pronounce
"1:15 AM" as /wʌn fɪftin eɪ ɛm/, "AM" on its own looks like
the English word "am" and is pronounced /æm/.

To fix this, a TextClock must be able to accept separate
formats for its content description than its presentation.
With this capability we can place the complete 12-hour time
format (including am/pm) in one of the views and suppress
the other one, so that the utterance creates an identical
experience to visual inspection: "1:15 AM" for all users.

Bug: 21718000
Change-Id: Ic9920d71ae4d4ad41ba86d7bd96f9a19b07e2108
parent 771d210a
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -120,12 +120,16 @@ public class TextClock extends TextView {

    private CharSequence mFormat12;
    private CharSequence mFormat24;
    private CharSequence mDescFormat12;
    private CharSequence mDescFormat24;

    @ExportedProperty
    private CharSequence mFormat;
    @ExportedProperty
    private boolean mHasSeconds;

    private CharSequence mDescFormat;

    private boolean mAttached;

    private Calendar mTime;
@@ -300,6 +304,17 @@ public class TextClock extends TextView {
        onTimeChanged();
    }

    /**
     * Like setFormat12Hour, but for the content description.
     * @hide
     */
    public void setContentDescriptionFormat12Hour(CharSequence format) {
        mDescFormat12 = format;

        chooseFormat();
        onTimeChanged();
    }

    /**
     * Returns the formatting pattern used to display the date and/or time
     * in 24-hour mode. The formatting pattern syntax is described in
@@ -347,6 +362,17 @@ public class TextClock extends TextView {
        onTimeChanged();
    }

    /**
     * Like setFormat24Hour, but for the content description.
     * @hide
     */
    public void setContentDescriptionFormat24Hour(CharSequence format) {
        mDescFormat24 = format;

        chooseFormat();
        onTimeChanged();
    }

    /**
     * Sets whether this clock should always track the current user and not the user of the
     * current process. This is used for single instance processes like the systemUI who need
@@ -460,8 +486,10 @@ public class TextClock extends TextView {

        if (format24Requested) {
            mFormat = abc(mFormat24, mFormat12, ld.timeFormat_Hm);
            mDescFormat = abc(mDescFormat24, mDescFormat12, mFormat);
        } else {
            mFormat = abc(mFormat12, mFormat24, ld.timeFormat_hm);
            mDescFormat = abc(mDescFormat12, mDescFormat24, mFormat);
        }

        boolean hadSeconds = mHasSeconds;
@@ -547,6 +575,7 @@ public class TextClock extends TextView {
    private void onTimeChanged() {
        mTime.setTimeInMillis(System.currentTimeMillis());
        setText(DateFormat.format(mFormat, mTime));
        setContentDescription(DateFormat.format(mDescFormat, mTime));
    }

    /** @hide */
+2 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
        android:singleLine="true"
        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
        android:textSize="@dimen/qs_time_collapsed_size"
        android:importantForAccessibility="no"
        />

    <!-- Empty text view so we have the same height when expanded/collapsed-->
+2 −0
Original line number Diff line number Diff line
@@ -101,6 +101,8 @@ public class SplitClockView extends LinearLayout {
        }
        mTimeView.setFormat12Hour(timeString);
        mTimeView.setFormat24Hour(timeString);
        mTimeView.setContentDescriptionFormat12Hour(formatString);
        mTimeView.setContentDescriptionFormat24Hour(formatString);
        mAmPmView.setFormat12Hour(amPmString);
        mAmPmView.setFormat24Hour(amPmString);
    }