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
This commit is contained in:
committed by
Daniel Sandler
parent
771d210ab2
commit
25ffc7ad95
@@ -120,12 +120,16 @@ public class TextClock extends TextView {
|
|||||||
|
|
||||||
private CharSequence mFormat12;
|
private CharSequence mFormat12;
|
||||||
private CharSequence mFormat24;
|
private CharSequence mFormat24;
|
||||||
|
private CharSequence mDescFormat12;
|
||||||
|
private CharSequence mDescFormat24;
|
||||||
|
|
||||||
@ExportedProperty
|
@ExportedProperty
|
||||||
private CharSequence mFormat;
|
private CharSequence mFormat;
|
||||||
@ExportedProperty
|
@ExportedProperty
|
||||||
private boolean mHasSeconds;
|
private boolean mHasSeconds;
|
||||||
|
|
||||||
|
private CharSequence mDescFormat;
|
||||||
|
|
||||||
private boolean mAttached;
|
private boolean mAttached;
|
||||||
|
|
||||||
private Calendar mTime;
|
private Calendar mTime;
|
||||||
@@ -300,6 +304,17 @@ public class TextClock extends TextView {
|
|||||||
onTimeChanged();
|
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
|
* Returns the formatting pattern used to display the date and/or time
|
||||||
* in 24-hour mode. The formatting pattern syntax is described in
|
* in 24-hour mode. The formatting pattern syntax is described in
|
||||||
@@ -347,6 +362,17 @@ public class TextClock extends TextView {
|
|||||||
onTimeChanged();
|
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
|
* 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
|
* 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) {
|
if (format24Requested) {
|
||||||
mFormat = abc(mFormat24, mFormat12, ld.timeFormat_Hm);
|
mFormat = abc(mFormat24, mFormat12, ld.timeFormat_Hm);
|
||||||
|
mDescFormat = abc(mDescFormat24, mDescFormat12, mFormat);
|
||||||
} else {
|
} else {
|
||||||
mFormat = abc(mFormat12, mFormat24, ld.timeFormat_hm);
|
mFormat = abc(mFormat12, mFormat24, ld.timeFormat_hm);
|
||||||
|
mDescFormat = abc(mDescFormat12, mDescFormat24, mFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hadSeconds = mHasSeconds;
|
boolean hadSeconds = mHasSeconds;
|
||||||
@@ -547,6 +575,7 @@ public class TextClock extends TextView {
|
|||||||
private void onTimeChanged() {
|
private void onTimeChanged() {
|
||||||
mTime.setTimeInMillis(System.currentTimeMillis());
|
mTime.setTimeInMillis(System.currentTimeMillis());
|
||||||
setText(DateFormat.format(mFormat, mTime));
|
setText(DateFormat.format(mFormat, mTime));
|
||||||
|
setContentDescription(DateFormat.format(mDescFormat, mTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
|
android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
|
||||||
android:textSize="@dimen/qs_time_collapsed_size"
|
android:textSize="@dimen/qs_time_collapsed_size"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Empty text view so we have the same height when expanded/collapsed-->
|
<!-- Empty text view so we have the same height when expanded/collapsed-->
|
||||||
@@ -46,4 +47,4 @@
|
|||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
|
android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
|
||||||
/>
|
/>
|
||||||
</com.android.systemui.statusbar.policy.SplitClockView>
|
</com.android.systemui.statusbar.policy.SplitClockView>
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ public class SplitClockView extends LinearLayout {
|
|||||||
}
|
}
|
||||||
mTimeView.setFormat12Hour(timeString);
|
mTimeView.setFormat12Hour(timeString);
|
||||||
mTimeView.setFormat24Hour(timeString);
|
mTimeView.setFormat24Hour(timeString);
|
||||||
|
mTimeView.setContentDescriptionFormat12Hour(formatString);
|
||||||
|
mTimeView.setContentDescriptionFormat24Hour(formatString);
|
||||||
mAmPmView.setFormat12Hour(amPmString);
|
mAmPmView.setFormat12Hour(amPmString);
|
||||||
mAmPmView.setFormat24Hour(amPmString);
|
mAmPmView.setFormat24Hour(amPmString);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user