Skip to content

Commit 380778f

Browse files
paulfthomasveganafro
authored andcommitted
[MaterialTimePicker][a11y] Give more context on hour/minute selection
PiperOrigin-RevId: 435119125
1 parent ccfc0ee commit 380778f

File tree

2 files changed

+48
-8
lines changed

2 files changed

+48
-8
lines changed

lib/java/com/google/android/material/timepicker/TimePickerClockPresenter.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import android.os.Build.VERSION_CODES;
3131
import android.view.View;
3232
import android.view.accessibility.AccessibilityManager;
33+
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
3334
import com.google.android.material.timepicker.ClockHandView.OnActionUpListener;
3435
import com.google.android.material.timepicker.ClockHandView.OnRotateListener;
3536
import com.google.android.material.timepicker.TimePickerControls.ActiveSelection;
@@ -56,8 +57,8 @@ class TimePickerClockPresenter
5657
private static final int DEGREES_PER_HOUR = 30;
5758
private static final int DEGREES_PER_MINUTE = 6;
5859

59-
private TimePickerView timePickerView;
60-
private TimeModel time;
60+
private final TimePickerView timePickerView;
61+
private final TimeModel time;
6162
private float minuteRotation;
6263
private float hourRotation;
6364

@@ -164,9 +165,28 @@ void setSelection(@ActiveSelection int selection, boolean animate) {
164165
timePickerView.setHandRotation(isMinute ? minuteRotation : hourRotation, animate);
165166
timePickerView.setActiveSelection(selection);
166167
timePickerView.setMinuteHourDelegate(
167-
new ClickActionDelegate(timePickerView.getContext(), R.string.material_hour_selection));
168+
new ClickActionDelegate(timePickerView.getContext(), R.string.material_hour_selection) {
169+
@Override
170+
public void onInitializeAccessibilityNodeInfo(
171+
View host, AccessibilityNodeInfoCompat info) {
172+
super.onInitializeAccessibilityNodeInfo(host, info);
173+
info.setContentDescription(
174+
host.getResources()
175+
.getString(
176+
R.string.material_hour_suffix, String.valueOf(time.getHourForDisplay())));
177+
}
178+
});
168179
timePickerView.setHourClickDelegate(
169-
new ClickActionDelegate(timePickerView.getContext(), R.string.material_minute_selection));
180+
new ClickActionDelegate(timePickerView.getContext(), R.string.material_minute_selection) {
181+
@Override
182+
public void onInitializeAccessibilityNodeInfo(
183+
View host, AccessibilityNodeInfoCompat info) {
184+
super.onInitializeAccessibilityNodeInfo(host, info);
185+
info.setContentDescription(
186+
host.getResources()
187+
.getString(R.string.material_minute_suffix, String.valueOf(time.minute)));
188+
}
189+
});
170190
}
171191

172192
@Override
@@ -182,7 +202,7 @@ public void onActionUp(float rotation, boolean moveInEventStream) {
182202

183203
AccessibilityManager am =
184204
getSystemService(timePickerView.getContext(), AccessibilityManager.class);
185-
boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled();
205+
boolean isExploreByTouchEnabled = am != null && am.isTouchExplorationEnabled();
186206
if (!isExploreByTouchEnabled) {
187207
setSelection(MINUTE, /* animate= */ true);
188208
}

lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import android.widget.LinearLayout;
4444
import android.widget.TextView;
4545
import androidx.annotation.ColorInt;
46+
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
4647
import com.google.android.material.button.MaterialButtonToggleGroup;
4748
import com.google.android.material.button.MaterialButtonToggleGroup.OnButtonCheckedListener;
4849
import com.google.android.material.color.MaterialColors;
@@ -95,7 +96,7 @@ public void afterTextChanged(Editable s) {
9596
private final EditText minuteEditText;
9697
private MaterialButtonToggleGroup toggle;
9798

98-
public TimePickerTextInputPresenter(LinearLayout timePickerView, TimeModel time) {
99+
public TimePickerTextInputPresenter(final LinearLayout timePickerView, final TimeModel time) {
99100
this.timePickerView = timePickerView;
100101
this.time = time;
101102
Resources res = timePickerView.getResources();
@@ -137,9 +138,28 @@ public void onClick(View v) {
137138

138139
controller = new TimePickerTextInputKeyController(hourTextInput, minuteTextInput, time);
139140
hourTextInput.setChipDelegate(
140-
new ClickActionDelegate(timePickerView.getContext(), R.string.material_hour_selection));
141+
new ClickActionDelegate(timePickerView.getContext(), R.string.material_hour_selection) {
142+
@Override
143+
public void onInitializeAccessibilityNodeInfo(
144+
View host, AccessibilityNodeInfoCompat info) {
145+
super.onInitializeAccessibilityNodeInfo(host, info);
146+
info.setContentDescription(
147+
host.getResources()
148+
.getString(
149+
R.string.material_hour_suffix, String.valueOf(time.getHourForDisplay())));
150+
}
151+
});
141152
minuteTextInput.setChipDelegate(
142-
new ClickActionDelegate(timePickerView.getContext(), R.string.material_minute_selection));
153+
new ClickActionDelegate(timePickerView.getContext(), R.string.material_minute_selection) {
154+
@Override
155+
public void onInitializeAccessibilityNodeInfo(
156+
View host, AccessibilityNodeInfoCompat info) {
157+
super.onInitializeAccessibilityNodeInfo(host, info);
158+
info.setContentDescription(
159+
host.getResources()
160+
.getString(R.string.material_minute_suffix, String.valueOf(time.minute)));
161+
}
162+
});
143163

144164
initialize();
145165
}

0 commit comments

Comments
 (0)