diff --git a/sdk/src/main/java/co/omise/android/ui/ExpiryDateEditText.kt b/sdk/src/main/java/co/omise/android/ui/ExpiryDateEditText.kt index 60585e501..3f91e1c11 100644 --- a/sdk/src/main/java/co/omise/android/ui/ExpiryDateEditText.kt +++ b/sdk/src/main/java/co/omise/android/ui/ExpiryDateEditText.kt @@ -9,6 +9,8 @@ import android.util.AttributeSet import co.omise.android.extensions.disableOptions import java.util.Calendar import java.util.GregorianCalendar +import java.util.regex.Matcher +import java.util.regex.Pattern /** * ExpiryDateEditText is a custom EditText for credit card expiration date field. This EditText @@ -37,7 +39,7 @@ class ExpiryDateEditText : OmiseEditText { addTextChangedListener(textWatcher) disableOptions() filters = arrayOf(InputFilter.LengthFilter(MAX_CHARS)) - inputType = InputType.TYPE_CLASS_PHONE + inputType = InputType.TYPE_CLASS_NUMBER } override fun onSelectionChanged(selStart: Int, selEnd: Int) { @@ -73,6 +75,15 @@ class ExpiryDateEditText : OmiseEditText { override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (s == null || s.length > MAX_CHARS) return + // Define a regular expression pattern to match non-numeric characters and DATE_SEPARATOR + val pattern: Pattern = Pattern.compile("[^0-9" + Pattern.quote(DATE_SEPARATOR) + "]") + + // Use a Matcher to find any non-numeric characters in the string + val matcher: Matcher = pattern.matcher(s) + if(matcher.find()){ + return + } + // On deleting if (s.length < beforeChangedText.length) { if (beforeChangedText[beforeChangedText.length - 1].toString() == DATE_SEPARATOR) { diff --git a/sdk/src/test/java/co/omise/android/ui/ExpiryDateEditTextTest.kt b/sdk/src/test/java/co/omise/android/ui/ExpiryDateEditTextTest.kt index 8c91df2ba..56696ce88 100644 --- a/sdk/src/test/java/co/omise/android/ui/ExpiryDateEditTextTest.kt +++ b/sdk/src/test/java/co/omise/android/ui/ExpiryDateEditTextTest.kt @@ -48,6 +48,15 @@ class ExpiryDateEditTextTest { assertEquals(Unit, editText.validate()) } + @Test + fun validate_ignoreSpecialCharactersInput() { + "*,.".forEach { editText.append(it.toString()) } + + assertEquals("", editText.text.toString()) + "1234".forEach { editText.append(it.toString()) } // 12/34 + assertEquals("12/34", editText.text.toString()) + } + @Test(expected = InputValidationException.EmptyInputException::class) fun validate_emptyValue() { "".forEach { editText.append(it.toString()) }