2727import com .google .android .material .textfield .TextInputLayout ;
2828import java .text .DateFormat ;
2929import java .text .ParseException ;
30+ import java .text .SimpleDateFormat ;
3031import java .util .Date ;
31- import java .util .Locale ;
3232
3333abstract 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