Skip to content

Commit aa623f0

Browse files
Material Design Teamdsn5ft
authored andcommitted
[Slider][A11y] Fix slider D-Pad keys to modify value instead of focus
Previously, Up/Down arrow keys navigated focus instead of changing the slider value. This change updates keyboard handling so all D-Pad keys modify the slider value: Up/Down increment/decrement the value, and Left/Right increment/decrement based on layout direction. PiperOrigin-RevId: 821593460
1 parent a5be0f7 commit aa623f0

File tree

4 files changed

+78
-32
lines changed

4 files changed

+78
-32
lines changed

lib/java/com/google/android/material/slider/BaseSlider.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3877,20 +3877,18 @@ private Float calculateIncrementForKey(int keyCode) {
38773877
// Otherwise choose the smallest valid increment.
38783878
float increment = isLongPress ? calculateStepIncrement(20) : calculateStepIncrement();
38793879
switch (keyCode) {
3880+
// Numpad Plus == Shift + Equals, at least in AVD, so fall through.
3881+
case KeyEvent.KEYCODE_PLUS:
38803882
case KeyEvent.KEYCODE_DPAD_UP:
3881-
return isVertical() ? increment : null;
3883+
case KeyEvent.KEYCODE_EQUALS:
3884+
return increment;
38823885
case KeyEvent.KEYCODE_DPAD_DOWN:
3883-
return isVertical() ? -increment : null;
3886+
case KeyEvent.KEYCODE_MINUS:
3887+
return -increment;
38843888
case KeyEvent.KEYCODE_DPAD_LEFT:
38853889
return isRtl() ? increment : -increment;
38863890
case KeyEvent.KEYCODE_DPAD_RIGHT:
38873891
return isRtl() ? -increment : increment;
3888-
case KeyEvent.KEYCODE_MINUS:
3889-
return -increment;
3890-
case KeyEvent.KEYCODE_EQUALS:
3891-
// Numpad Plus == Shift + Equals, at least in AVD, so fall through.
3892-
case KeyEvent.KEYCODE_PLUS:
3893-
return increment;
38943892
default:
38953893
return null;
38963894
}

lib/javatests/com/google/android/material/slider/SliderKeyTestCommon.java

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -126,30 +126,6 @@ public void testMoveThumbFocus_tab_correctThumbHasFocus() {
126126
sendKeyEventThereAndBack(tab, shiftTab);
127127
}
128128

129-
@Test
130-
public void testFocusDefaultThumb_clickUpDPad_unhandled() {
131-
slider.requestFocus();
132-
133-
KeyEventBuilder up = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_UP);
134-
boolean handledDown = slider.dispatchKeyEvent(up.buildDown());
135-
boolean handledUp = slider.dispatchKeyEvent(up.buildUp());
136-
137-
assertThat(handledDown).isFalse();
138-
assertThat(handledUp).isFalse();
139-
}
140-
141-
@Test
142-
public void testFocusDefaultThumb_clickDownDPad_unhandled() {
143-
slider.requestFocus();
144-
145-
KeyEventBuilder down = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_DOWN);
146-
boolean handledDown = slider.dispatchKeyEvent(down.buildDown());
147-
boolean handledUp = slider.dispatchKeyEvent(down.buildUp());
148-
149-
assertThat(handledDown).isFalse();
150-
assertThat(handledUp).isFalse();
151-
}
152-
153129
@Test
154130
public void testFocusFirstThumb_shiftTab_unhandled() {
155131
slider.requestFocus();
@@ -179,6 +155,30 @@ public void testFocusLastThumb_tab_unhandled() {
179155
assertThat(handledUp).isFalse();
180156
}
181157

158+
@Test
159+
public void testKeyPress_dPadUp_incrementsValue() {
160+
slider.requestFocus();
161+
slider.setValues(50f);
162+
slider.setStepSize(1f);
163+
164+
KeyEventBuilder up = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_UP);
165+
up.dispatchEvent(slider);
166+
167+
assertThat(slider.getValues().get(0)).isEqualTo(51f);
168+
}
169+
170+
@Test
171+
public void testKeyPress_dPadDown_decrementsValue() {
172+
slider.requestFocus();
173+
slider.setValues(50f);
174+
slider.setStepSize(1f);
175+
176+
KeyEventBuilder down = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_DOWN);
177+
down.dispatchEvent(slider);
178+
179+
assertThat(slider.getValues().get(0)).isEqualTo(49f);
180+
}
181+
182182
protected void sendKeyEventThereAndBack(KeyEventBuilder there, KeyEventBuilder back) {
183183
for (int i = 1; i < countTestValues(); i++) {
184184
there.dispatchEvent(slider);

lib/javatests/com/google/android/material/slider/SliderKeyTestLtr.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,28 @@ public void testFocusThirdThumb_moveLeft_movesThirdThumbLeft() {
7272

7373
assertThat(slider.getValues()).doesNotContain(3.0f);
7474
}
75+
76+
@Test
77+
public void testKeyPress_dPadLeft_decrementsValue() {
78+
slider.requestFocus();
79+
slider.setValues(50f);
80+
slider.setStepSize(1f);
81+
82+
KeyEventBuilder left = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_LEFT);
83+
left.dispatchEvent(slider);
84+
85+
assertThat(slider.getValues().get(0)).isEqualTo(49f);
86+
}
87+
88+
@Test
89+
public void testKeyPress_dPadRight_incrementsValue() {
90+
slider.requestFocus();
91+
slider.setValues(50f);
92+
slider.setStepSize(1f);
93+
94+
KeyEventBuilder right = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_RIGHT);
95+
right.dispatchEvent(slider);
96+
97+
assertThat(slider.getValues().get(0)).isEqualTo(51f);
98+
}
7599
}

lib/javatests/com/google/android/material/slider/SliderKeyTestRtl.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,28 @@ public void testFocusThirdThumb_moveLeft_movesThirdThumbLeft() {
9191
// Moving left increments in RTL.
9292
assertThat(slider.getValues()).doesNotContain(3.0f);
9393
}
94+
95+
@Test
96+
public void testKeyPress_dPadLeft_incrementsValue() {
97+
slider.requestFocus();
98+
slider.setValues(50f);
99+
slider.setStepSize(1f);
100+
101+
KeyEventBuilder left = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_LEFT);
102+
left.dispatchEvent(slider);
103+
104+
assertThat(slider.getValues().get(0)).isEqualTo(51f);
105+
}
106+
107+
@Test
108+
public void testKeyPress_dPadRight_decrementsValue() {
109+
slider.requestFocus();
110+
slider.setValues(50f);
111+
slider.setStepSize(1f);
112+
113+
KeyEventBuilder right = new KeyEventBuilder(KeyEvent.KEYCODE_DPAD_RIGHT);
114+
right.dispatchEvent(slider);
115+
116+
assertThat(slider.getValues().get(0)).isEqualTo(49f);
117+
}
94118
}

0 commit comments

Comments
 (0)