27
27
import com .google .android .material .textfield .TextInputLayout ;
28
28
import java .text .DateFormat ;
29
29
import java .text .ParseException ;
30
+ import java .text .SimpleDateFormat ;
30
31
import java .util .Date ;
31
- import java .util .Locale ;
32
32
33
33
abstract class DateFormatTextWatcher extends TextWatcherAdapter {
34
34
35
35
@ NonNull private final TextInputLayout textInputLayout ;
36
36
37
- private final String formatHint ;
38
- private final DateFormat dateFormat ;
37
+ private final SimpleDateFormat dateFormat ;
38
+ private final String datePattern ;
39
39
private final CalendarConstraints constraints ;
40
40
private final String outOfRange ;
41
41
private final Runnable setErrorCallback ;
@@ -45,12 +45,12 @@ abstract class DateFormatTextWatcher extends TextWatcherAdapter {
45
45
46
46
DateFormatTextWatcher (
47
47
final String formatHint ,
48
- DateFormat dateFormat ,
48
+ SimpleDateFormat dateFormat ,
49
49
@ NonNull TextInputLayout textInputLayout ,
50
50
CalendarConstraints constraints ) {
51
51
52
- this .formatHint = formatHint ;
53
52
this .dateFormat = dateFormat ;
53
+ this .datePattern = dateFormat .toPattern ();
54
54
this .textInputLayout = textInputLayout ;
55
55
this .constraints = constraints ;
56
56
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
85
85
textInputLayout .setError (null );
86
86
onValidDate (null );
87
87
88
- if (TextUtils .isEmpty (s ) || s .length () < formatHint .length ()) {
88
+ if (TextUtils .isEmpty (s ) || s .length () < datePattern .length ()) {
89
89
return ;
90
90
}
91
91
@@ -113,19 +113,19 @@ public void beforeTextChanged(@NonNull CharSequence s, int start, int count, int
113
113
114
114
@ Override
115
115
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 ) {
118
117
return ;
119
118
}
120
119
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 );
123
123
}
124
+ }
124
125
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' );
129
129
}
130
130
131
131
private Runnable createRangeErrorCallback (final long milliseconds ) {
0 commit comments