Skip to content

Commit 18fa2a5

Browse files
committed
[DatePicker] Fix date input masks
1 parent 8ec6b77 commit 18fa2a5

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

lib/java/com/google/android/material/datepicker/DateFormatTextWatcher.java

+14-14
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@
2727
import com.google.android.material.textfield.TextInputLayout;
2828
import java.text.DateFormat;
2929
import java.text.ParseException;
30+
import java.text.SimpleDateFormat;
3031
import java.util.Date;
31-
import java.util.Locale;
3232

3333
abstract class DateFormatTextWatcher extends TextWatcherAdapter {
3434

3535
@NonNull private final TextInputLayout textInputLayout;
3636

37-
private final String formatHint;
38-
private final DateFormat dateFormat;
37+
private final SimpleDateFormat dateFormat;
38+
private final String datePattern;
3939
private final CalendarConstraints constraints;
4040
private final String outOfRange;
4141
private final Runnable setErrorCallback;
@@ -45,12 +45,12 @@ abstract class DateFormatTextWatcher extends TextWatcherAdapter {
4545

4646
DateFormatTextWatcher(
4747
final String formatHint,
48-
DateFormat dateFormat,
48+
SimpleDateFormat dateFormat,
4949
@NonNull TextInputLayout textInputLayout,
5050
CalendarConstraints constraints) {
5151

52-
this.formatHint = formatHint;
5352
this.dateFormat = dateFormat;
53+
this.datePattern = dateFormat.toPattern();
5454
this.textInputLayout = textInputLayout;
5555
this.constraints = constraints;
5656
this.outOfRange = textInputLayout.getContext().getString(R.string.mtrl_picker_out_of_range);
@@ -85,7 +85,7 @@ public void onTextChanged(@NonNull CharSequence s, int start, int before, int co
8585
textInputLayout.setError(null);
8686
onValidDate(null);
8787

88-
if (TextUtils.isEmpty(s) || s.length() < formatHint.length()) {
88+
if (TextUtils.isEmpty(s) || s.length() < datePattern.length()) {
8989
return;
9090
}
9191

@@ -113,19 +113,19 @@ public void beforeTextChanged(@NonNull CharSequence s, int start, int count, int
113113

114114
@Override
115115
public void afterTextChanged(@NonNull Editable s) {
116-
// Exclude some languages from automatically adding delimiters.
117-
if (Locale.getDefault().getLanguage().equals(Locale.KOREAN.getLanguage())) {
116+
if (s.length() == 0 || s.length() >= datePattern.length() || s.length() < lastLength) {
118117
return;
119118
}
120119

121-
if (s.length() == 0 || s.length() >= formatHint.length() || s.length() < lastLength) {
122-
return;
120+
char nextPatternChar = datePattern.charAt(s.length());
121+
if (isDelimiter(nextPatternChar)) {
122+
s.append(nextPatternChar);
123123
}
124+
}
124125

125-
char nextCharHint = formatHint.charAt(s.length());
126-
if (!Character.isLetterOrDigit(nextCharHint)) {
127-
s.append(nextCharHint);
128-
}
126+
private boolean isDelimiter(char ch) {
127+
return !(ch >= 'A' && ch <= 'Z')
128+
&& !(ch >= 'a' && ch <= 'z');
129129
}
130130

131131
private Runnable createRangeErrorCallback(final long milliseconds) {

0 commit comments

Comments
 (0)