Skip to content

Commit 087da2f

Browse files
paulfthomaspekingme
authored andcommittedOct 3, 2022
[MaterialTimePicker] Pre-fill hour and minute edit texts in text input mode
Resolves #2862 PiperOrigin-RevId: 478507649
1 parent 15c7128 commit 087da2f

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed
 

‎lib/java/com/google/android/material/timepicker/ChipTextInputComboView.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,6 @@ public void setChecked(boolean checked) {
106106
chip.setVisibility(checked ? GONE : VISIBLE);
107107
if (isChecked()) {
108108
ViewUtils.requestFocusAndShowKeyboard(editText);
109-
if (!TextUtils.isEmpty(editText.getText())) {
110-
editText.setSelection(editText.getText().length());
111-
}
112109
}
113110
}
114111

@@ -118,10 +115,11 @@ public void toggle() {
118115
}
119116

120117
public void setText(CharSequence text) {
121-
chip.setText(formatText(text));
122-
if (!TextUtils.isEmpty(editText.getText())) {
118+
String formattedText = formatText(text);
119+
chip.setText(formattedText);
120+
if (!TextUtils.isEmpty(formattedText)) {
123121
editText.removeTextChangedListener(watcher);
124-
editText.setText(null);
122+
editText.setText(formattedText);
125123
editText.addTextChangedListener(watcher);
126124
}
127125
}

‎lib/java/com/google/android/material/timepicker/TimePickerTextInputKeyController.java

+11
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ private boolean onMinuteKeyPress(int keyCode, KeyEvent event, EditText editText)
112112
return true;
113113
}
114114

115+
clearPrefilledText(editText);
116+
115117
return false;
116118
}
117119

@@ -133,6 +135,15 @@ private boolean onHourKeyPress(int keyCode, KeyEvent event, EditText editText) {
133135
return true;
134136
}
135137

138+
clearPrefilledText(editText);
139+
136140
return false;
137141
}
142+
143+
// Improve UX by auto-clearing existing text when entering new time
144+
private void clearPrefilledText(EditText editText) {
145+
if (editText.getSelectionStart() == 0 && editText.length() == 2) {
146+
editText.getText().clear();
147+
}
148+
}
138149
}

‎lib/javatests/com/google/android/material/timepicker/TimePickerTextInputKeyControllerTest.java

+44
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,50 @@ public void controller_pressingBackSpace_switchesToHour() {
7777
assertThat(timeModel.selection).isEqualTo(HOUR);
7878
}
7979

80+
@Test
81+
public void controller_clearPrefilledText_shouldClearWhenSelection0() {
82+
EditText editText = hourInput.getTextInput().getEditText();
83+
editText.setText("00");
84+
editText.setSelection(0);
85+
pressKeys(editText, KeyEvent.KEYCODE_0);
86+
shadowOf(getMainLooper()).idle();
87+
88+
assertThat(editText.getText().length()).isEqualTo(0);
89+
}
90+
91+
@Test
92+
public void controller_clearPrefilledText_shouldNotClearWhenSelection1() {
93+
EditText editText = hourInput.getTextInput().getEditText();
94+
editText.setText("00");
95+
editText.setSelection(1);
96+
pressKeys(editText, KeyEvent.KEYCODE_0);
97+
shadowOf(getMainLooper()).idle();
98+
99+
assertThat(editText.getText().length()).isEqualTo(2);
100+
}
101+
102+
@Test
103+
public void controller_clearPrefilledText_shouldNotClearWhenSelection2() {
104+
EditText editText = hourInput.getTextInput().getEditText();
105+
editText.setText("00");
106+
editText.setSelection(2);
107+
pressKeys(editText, KeyEvent.KEYCODE_0);
108+
shadowOf(getMainLooper()).idle();
109+
110+
assertThat(editText.getText().length()).isEqualTo(2);
111+
}
112+
113+
@Test
114+
public void controller_clearPrefilledText_shouldNotClearWhenPartialText() {
115+
EditText editText = hourInput.getTextInput().getEditText();
116+
editText.setText("0");
117+
editText.setSelection(0);
118+
pressKeys(editText, KeyEvent.KEYCODE_0);
119+
shadowOf(getMainLooper()).idle();
120+
121+
assertThat(editText.getText().length()).isEqualTo(1);
122+
}
123+
80124
private static void pressKeys(EditText editText, int... keycodes) {
81125
for (int key : keycodes) {
82126
editText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, key, 0));

0 commit comments

Comments
 (0)
Please sign in to comment.